2011/04/27

php講習 4/27

<午前>
・昨日に引き続き自主課題を使ってsfPageFlowの練習

<午後>
午後のテーマは2つ
(1)掲示板でsfpageflowを使い、お問い合わせフォームを作成
・パラメータの使い方など
フォームでラジオボタン作成
セレクトタグ作成
チェックボックス作成
テキストエリア作成
・これだけでも結構一杯いっぱい。
(2)メールの送信


<午前>
・BBS、front/member_editでニックネームの重複チェック
(カスタムチェックmyNicknameValidator.class.php)
ログイン状態なので、自分のニックネームはあるが、
それ以外と重複しているか、IDで確認。sfpageflowでIDが渡せないトラブル。

<対応>
(1)pageflow.ymlにてパラメータidを受け渡すよう記述追加
 ProcessValidate:
    entry:
     - acceptRequests:
       params:  [id, nickname, mailaddress, password, admin_yn, ]
(2)Initializeアクションにてidをセット
     $this->flow->setData('id', $member->getId());
(3)displayFormテンプレートにてidをパラメータで渡す
<?php echo input_hidden_tag('id', $flow->getData('id')) ?>
(4)カスタムバリデーションにて受け取り、チェック
     if ($member[0]->getId()==$request->getParameter('id')) {
・判ってしまえば、昨日やったことの復習だった。


<午後>
・まず、contentテーブル作成
create文は、メールで送付されています。
もし、contentテーブルが既にある人は、一度テーブルをdropして下さい。
テーブルが出来たら、スキーマ、モデルも作成しておく。
symfony ccも忘れずに。

・お問い合わせ入力フォームの作成
symfony propel-generate-create front contact_add Contact

作成したら、メッセージを日本語にするなど、レイアウト調整。

・昨日の復習、sfpageflowでのパラメータの渡し方の解説
(重要な(混乱しやすい)ことは繰り返し説明してくれるので、ここは重要と認識)

・sfPageFlowでは、データはFlowオブジェクトに持つ。(デジャヴ?)
(Flowオブジェクトを経由して受け渡し)
参照するときは、
アクションは、$this->flow
テンプレートは、$flow
(pageflow.ymlにてパラメータの追加も忘れずに)

・通常のsymfonyのアクションで使う下記の記述は使えない。
sfPageFlowでは、必ずフローオブジェクトを使用する。
$this->name

・チェックボックスの記述は複雑だが、例のとおり書くと覚えておく。
分からない人はプログラムを読んで理解して。
<?php if ($sf_request->haserror('kind')) :?>class="errortd"<?php endif;?>>
<?php echo checkbox_tag('kind[]', 1,in_array(1, $flow->getData('kind'))); ?>資料請求<br>
<?php echo checkbox_tag('kind[]', 2,in_array(2, $flow->getData('kind'))); ?>商品について<br>
<?php echo form_error('kind'); ?>
・チェックボックスデータのDB保存
    $contact->setKind($this->getRequestParameter('kind'));
    kind[]は配列なので、そのままDBには入らないため、文字列にする。
    $contact->setKind(implode(',',$this->getRequestParameter('kind')));
・ちなみにこちらは逆の処理(DBから呼び出すとき?)
explode() - 文字列を文字列により分割する、文字列の配列を返します。

・お問い合わせフォームはメールで送付されているので、詳細はそちらを
確認して下さい。


(2)メール送信処理
・その1:問い合わせデータ保存のタイミングで、メール送信
// $bodyにメール本文
$body = "以下の内容でお問い合わせいただきました。\n\n" ;
$body .= "お名前".$contact->getName();

mb_internal_encoding("utf-8");
mb_language("japanese") ;
mb_send_mail('tmp@localhost',
"subject:test",$message_for_user,$body,
"From:".mb_encode_mimeheader('担当者'). "<tmp@localhost>") ;

・その2:本文を別に作成
・使うための記述
        $this->setFlash('contact', $contact) ;
        $message_for_user =
        $this->getPresentationFor('mail','sendUserAfterContact') ;
・作るための記述
(1)mailモジュール、sendUserAfterContactアクションを作成
(こちらは素のsymfonyです、混乱しないように)
(2)アクション
$this->contact = $this->getFlash('contact') ;
$this->setFlash('contact', null) ;
return sfView::SUCCESS;
(3)テンプレート
お問い合わせありがとうございます。
以下の内容でお問い合わせを承りました。
お名前:<?php echo $contact->getName();?>
<?php $pref = sfConfig::get('sf_pref');?>
都道府県: <?php echo $pref[$contact->getPref()];?>

・メールのあて先は、自分のメールアドレスでテスト。
・残りの時間は(明日も)、自主課題への反映で練習。

2011/04/26

symfonyのsfpageflow

php講習 4/26

<今日の内容>
・フォームを簡単にするためのプラグイン
・symfonyのコマンドに追加する(タスクの追加)
  sfpageflowを使って自動生成する、  今回コマンドの作り方はやらない

<説明>
・sfPageFlowとは
    * フォームのページ遷移をyml で管理し
    * 煩雑なフォーム処理をシンプルに構築できる。
・本日は、sfPageFlowを使って、入力、確認、保存の流れを
  自動生成する機能を実習
・使用するファイルはそれぞれWebテキストからダウンロード可能です。

(1)pluginの設置
/plugins/sfPageFlowPlugin

(2)自動生成タスクの設置
/bbs2/data/tasks/に設置

(3)addonファイルの設置
・設置場所確認
$ whereis pear
pear: /usr/bin/pear /etc/pear.conf /etc/pear /usr/share/pear
/usr/share/pearにsymfonyはある

・ここからは、rootになってaddonファイルを移動後、展開
# mv addon.zip /usr/share/pear/symfony/addon/prople/generator
# unzip addon.zip
Archive:  addon.zip
replace sfPropelCrudGenerator.class.php? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
 inflating: sfPropelCrudGenerator.class.php
 inflating: sfPropelEditGenerator.class.php
 inflating: sfPropelListGenerator.class.php
# ll
合計 24
-rw-r--r-- 1 usr usr 4926  4月 26 10:41 addon.zip
-rw-r--r-- 1 root root 1766  3月 11 14:39 sfPropelAdminGenerator.class.php
-rw-r--r-- 1 root root 3991  7月  2  2009 sfPropelCrudGenerator.class.php
-rw-r--r-- 1 root root 3991  7月  2  2009 sfPropelEditGenerator.class.php
-rw-r--r-- 1 root root 3991  7月  2  2009 sfPropelListGenerator.class.php
# rm addon.zip

(4)スケルトンファイルの設置(generator.zip)
# pwd
/usr/share/pear/data/symfony
# ll
合計 60
drwxr-xr-x 2 root root  4096  3月 11 14:39 bin
drwxr-xr-x 2 root root  4096  3月 11 14:39 config
drwxr-xr-x 2 root root  4096  3月 11 14:39 data
drwxr-xr-x 4 root root  4096  4月 26 11:06 generator
-rw-r--r-- 1 usr usr 13994  4月 26 11:02 generator.zip
drwxr-xr-x 2 root root 12288  3月 11 14:39 i18n
drwxr-xr-x 3 root root  4096  3月 11 14:39 modules
drwxr-xr-x 7 root root  4096  3月 11 14:39 skeleton
drwxr-xr-x 2 root root  4096  3月 11 14:39 tasks
drwxr-xr-x 4 root root  4096  3月 11 14:39 web

・今あるgeneratorは、バックアップし、generator.zipを展開
# mv generator generator_bk
# unzip generator.zip

(5)ヘルパー追加
/lib/helper/下に設置
・このファイルはメールで送付されています。

・これで準備が整いました。

(6)自動生成(symfonyのユーザコマンド)、bbsを使って説明
#CREATE
$ symfony propel-generate-create アプリケーション名  モジュール名  モデル名
$ symfony propel-generate-create front testmember_add Member

#EDIT
$ symfony propel-generate-edit アプリケーション名  モジュール名  モデル名
$ symfony propel-generate-edit front  testmember_edit  Member

#LIST
$ symfony propel-generate-list アプリケーション名  モジュール名  モデル名
$ symfony propel-generate-list front  testmember_list  Member
listはsfpageflowは使っていないとのこと

・新規登録
$ symfony propel-generate-create front testmember_add Member
実行結果にエラーが出なければOK
・確認
http://www.bbs.com/testmember_add/flow
・sfPageFlowのアクションは必ずflow(inputではない)

・一覧表
symfony propel-generate-list front testmember_list Member
実行結果にエラーが出なければOK
・listは、自動生成したものに対して、作業がある。
アクションの関数をmodelに移動
http://www.bbs.com/testmember_list/index

・フロー制御(pageflow.yml)
firstState: ProcessInitialize
lastState:  DisplayResult
state:
  DisplayForm:
    transition:
      doInput:   ProcessValidate
  DisplayConfirm:
    transition:
      doConfirm: ProcessSubmit
      doCancel:  ProcessSetup
  DisplayResult:
  ProcessInitialize:
    transition:
      onSuccess: ProcessSetup
  ProcessValidate:
    entry:
      - acceptRequests:
        params:  [nickname, mailaddress, password, admin_yn, ]
    transition:
      onSuccess: DisplayConfirm
      onError:   DisplayForm
・命名規則
display はテンプレート、process はアクション
transition: 遷移
ProcessValidate:(バリデーション)
entry: 入力値(ここの書いているパラメータがバリデーションに渡る)
逆に記述されていないものは渡らない

・入力、確認、保存をする場合はプログラムを変更しなくていい。
・pageflow.ymlは、自分で追って復習して下さい。

・入力フォームを変更して、メッセージを日本語にする。
<th><span class="required"></span>nickname</th>
 ↓
<th><span class="required"></span>ニックネーム</th>

・入力フォームのパラメータに次の作業(transition:遷移)が指定されている。
DisplayForm.php
<?php echo input_hidden_tag('pageflow_event', 'doInput') ?>
pageflow.yml
  DisplayForm:
    transition:
      doInput:   ProcessValidate

・これまでの処理では、post/sessionでデータを渡していた。
ページフローでは、セッションのフローオブジェクト(flow object)に
パラメータがある。
・このため値の参照方法が今までと変わる。フロー制御では、以下の通り。
アクションでの記述
$this->flow->
テンプレートでの参照
$flow
・これまでの$this->nameでは値は渡らないので注意。
テンプレートに渡すとき
$this->flow->setData('msg', '入力画面です。') ;
アクションで受け取るとき
$member = $this->flow->getData('member');
テンプレートで受け取るとき
$flow->getData('msg')

・アクション、executeValidateでは、パラメータ受け取りの処理がない。
フローオブジェクトが自動的にセットされている。
(あえて言うまでもないかもしれないけど、executeSubmit()でも
パラメータの受け取り処理はない)

・DBのアクセス方法も変わる。(プログラムactions.class.php参照)
confirmで$memberを作成、セッションに持たせておく
resultで$memberを受け取り、保存

・バリデーションは、受け取るアクション.yml
validate.yml
fields:
  nickname:
    required:
      msg: ニックネームを入力してください。

・一覧から編集
$ symfony propel-generate-edit front testmember_edit Member

・画面が出来たら、メッセージを日本語に修正、編集を呼び出せるようにする。
<td><?php echo link_to("編集","testmember_edit/flow?id=".$item->getId());?></td>

・編集
$ symfony propel-generate-list front  testmember_list  Member

・編集完了後、完了画面でF5を押すとエラーになる。
完了でセッションは切れるので、セッション情報はない。
編集画面に必要なidがパラメータで取得できないためエラーになる。
・対応
       $member = MemberPeer::retrieveByPk($this->getRequestParameter('id'));
       if (!$member) {
           $this->redirect('testmember_list/index') ;
       }

・削除は、list処理に含まれているので呼び出す処理を追加。
<td><?php echo link_to("編集","testmember_edit/flow?id=".$item->getId());?> |
 <a onclick="return confirm('削除しますか?');" href="testmember_list/index?delete=on&id=<?php echo $item->getId();?>">削除</a>
</td>

・削除後、F5でエラーになる。URLにIDが残るため、if文を加える。
       if ($this->getRequestParameter('delete') == 'on') {
           $member = MemberPeer::retrieveByPk($this->getRequestParameter('id'));
           if ($member) {
               $member->delete();
           }
       }

・以上の機能を使えば、F5、戻るボタンなどを自分で組まないといけない
ところが自動で組み込まれる。
今後は、sfPageFlowで組んで下さい。

・残りの時間は、自主課題にsfPageFlowを組み込んで練習する。

<環境設定> 
(プロジェクト毎に必要なのは1,2,5、アプリケーションごとに必要なのは6)
(1)pluginの設置
/plugins/sfPageFlowPlugin
(2)自動生成タスクの設置
/data/tasks/myPakePropelEditGenerator.php,他2
(3)addonファイルの設置(共通)
(4)スケルトンファイルの設置(共通)
(5)MyUtilityHelper.phpの設置
(6)templates/_pager.phpの設置(入れ替え、アプリケーションごと、メールで送付されてます)
(共通)部分は、bbsで設定している(はず)なので、既に設定済みのもの

*  sfPageFlowのスケルトンをテンプレートにしている。
何か表示を加えたいときは、スケルトンファイルに加える。
興味のある人は中を見ておいて。

・今週の残りの時間は、自主課題に組み込み練習を積んで下さい。

2011/04/25

symfony エラーチェック(バリデーション)

php講習 4/25
本日のテーマ
・エラーチェック(バリデーション)

(1)値を渡す先のアクション名.ymlをvalidateディレクトリに置く
input -> confirmなので、confirm.ymlをmember_addモジュールの
validateディレクトリに置く

(2)ymlファイルにチェックのルールを記述
fields:
  nickname:
    required:
      msg: ニックネームを入力してください。

(3)エラーだった場合の遷移先をアクション定義する。
handleErrorアクション名
  public function handleErrorConfirm()
  {
      $this->forward('member_add','input');
  }

(4)tmpファイル(input)にエラーの表示を設定する。
バリデーションヘルパ、エラーメッセージの表示
<?php use_helper('Validation');?>
<?php if ($sf_request->haserror('nickname')):?>
<div style="background-color: #ff8888;">
<?php echo form_error('nickname')?>
</div>
<?php endif;?>

(5)エラーメッセージのデフォルト表示変更(エラーメッセージ矢印の設定を消す)
front/config/setting.yml
    validation_error_prefix:    ' '
    validation_error_suffix:    ' '
・記述が終わったら、symfony cc

(6)エラーとなる値を入れ、エラーメッセージの表示と、
入力値が残ることを確認する。


リダイレクト:post(get)された値は引き継がない
フォワード:post(get)された値を引き継ぐ
・handleErrorConfirmでパラメータが引き継がれている。
・inputテンプレートで受け取っているので表示されている。
$sf_params->get('nickname')

<その他のチェック>
・文字列のバリデーター
    sfStringValidator:
     min:          2
     min_error:    少なくとも2文字入力してください
・メールアドレス
    sfEmailValidator:
     email_error:  このメールアドレスは無効です

・数字のチェック
・チェックの項目は覚えなくてもいい。

<練習>
・掲示板で、ニックネームと投稿に必須入力のチェックを追加

・symfonyで用意されているチェックで足りないのは、DBにある情報とのチェック
ニックネームが重複していないか?

・カスタムバリデータ
    myNicknameValidator:
      nickname_error: そのニックネームは既に使われています。
class myNicknameValidator extends sfValidator作成

・動作確認

<追加の情報>
・バリデートでエラーを呼ぶとき、吐き出されるタグがクラスform_error
setting.ymlまたは、cssのクラス指定でスタイルを変更可能
<div id="error_for_nickname" class="form_error" style="">
このニックネームは既に利用されています </div>

・残りの時間は、課題にバリデートを適用
少なくとも、1つ、カスタムバリデータを作る

・ログインユーザの自分の情報を変更するとき、ニックネームを変更しなければ
DBにはニックネームがあるので、必ず1以上が返る。
(処理作成中)

2011/04/23

php講習 4/22

・午前中は、引き続き自主制作課題
動作確認と、レイアウト調整
セキュリティのチェック追加

・午後から、発表
<コメント>
・ログイン設定、セキュリティは始めの方で組み込む。
 セキュリティのチェックを外して機能確認する。

<その他のコメント>
・レイアウト調整はあとで、時間を取られて進まなくなるので。

・来週から、アクセス制御、エラーチェックの予定。
 但し、今のsymfonyの仕組みが判っていないと、混乱するだけなのでもう一度
 課題を見直しておいて下さい。
・課題で指摘のあった項目について修正

課題のファイルをメールで送ること。
 内容を見てコメントする。

php講習 4/21

・引き続き自主課題の制作

・本日は、ログイン設定とセキュリティの実装を行った。
セッションから情報を取得する処理に変更するまでやるのに1日かかった。
セキュリティ設定をすると、機能確認のデバックに支障があるかと思って、
遅らせていたのが裏目に出た。
どのタイミングでログイン、セキュリティを実装するのか、タイミングが難しい。

2011/04/20

symfonyのsfPropelPager

php講習 4/20

昨日、委員長から教えてもらった「徹底攻略」に記述のあったsfPropelPager
自宅で実装した。今日、午前中MisのPCに設定した。
sfPropelPagerは、一覧表などでデータが大きいとき、ページ毎のデータを
作ってくれるsymfony(Prople)の用意してくれたクラス。

午後
・ページャの設定方法練習
bbs2に適用するときの例
使用するとき使う処理はメールで2ファイル送付されています。
前提として、掲示板の投稿一覧が表示されていること。

・アクション(front/default/index)
<いままでの処理>
$this->comments = CommentPeer::doSelect($c);

<ページャでの処理>(この処理に置き換える)
// pager
// ページあたりのレコード数
$per_page =10;
$page = $this->getRequestParameter('page');
$c = new Criteria();
$c->addDescendingOrderByColumn(CommentPeer::CREATED_AT);

$pager = new sfPropelPager('Comment', $per_page);

$pager->setCriteria($c);
//  現在のページ
$pager->setPage($page) ;
$pager->init();

// print_r($pager);  // 内容確認
$this->pager = $pager;
$this->comments = $this->pager->getResults();


<$pagerオブジェクトの内容確認>

必要なものは既に揃っているので、呼び出すだけ。
    [peer_method_name:protected] => doSelect
    [peer_count_method_name:protected] => doCount
    [page:protected] => 1
    [maxPerPage:protected] => 10
    [lastPage:protected] => 4
    [nbResults:protected] => 35
    [class:protected] => Comment
    [tableName:protected] => comment
    [objects:protected] =>
    [cursor:protected] => 1
    [parameters:protected] => Array

(2)メールで送付されたphpファイルの置き場所
/bbs2/lib/helper/MyPagerQueryHelper.php
(helperフォルダは無ければ作る)
/bbs2/app/front/templates/_pager.php
(パーシャルなので置き場所はあえて書く必要がない?)

(3)テンプレートの変更(default/index)
・テンプレートの最初でヘルパーを呼ぶ
<?php use_helper('MyPagerQuery')?>

・投稿一覧のテンプレートで、一覧表示の前に、pagerパーシャル(_pager.php)を呼ぶ。
このときクエリパラメータも一緒に渡す。(パーシャルがページの切替になります)
今回は必要ないかもしれない部分が含まれていますが、このまま書く。
(一覧表で検索条件が必要になったときに使います)
<?php include_partial('global/pager', array('pager' => $pager,
'query' => parameter_to_query($sf_context->getModuleName(),
$sf_context->getActionName(), $query_parameters)));?>


・ページ処理以外の引数を渡す処理
(一覧表に検索条件のフォームがあった場合、アクションにパラメータを渡す必要がある)
parameter_to_query()   // helperに定義されている。

(4)CommentPeerに関数を追加
// 1ページのレコード数、現在のページ、パラメータ
static public function getPager($perpage, $page, $parameters)
{
 $c = new Criteria() ;
 //  検索条件に入力があれば、Criteriaに追加
 if ($parameters["keyword"] != '' ) {
  $c->add(self::CONTENT, "%".$parameters["keyword"]."%",
  Criteria::LIKE) ;
 }

 $pager = new sfPropelPager('Comment', $perpage);
 $pager->setCriteria($c);
 //  現在のページ
 $pager->setPage($page) ;
 $pager->init();

 return $pager;
}

・以上で、掲示板のデフォルト画面のページャができました。
・なお、興味のある人はプログラムを追って下さい、とのことです。
クラスのソースは以下にあります。
/usr/share/pear/symfony/addon/sfPager.class.php
/usr/share/pear/symfony/addon/propel/sfPropelPager.class.php

・課題に教わったpagerを実装、1時間以上かかった。

・ログイン、セキュリティ設定を実装

php講習 4/19

1-2時間目
・自主課題4日目
午後の中間発表のために、動きを確認。エラーは出ない。
バッチでのデータ取得、crontabに設定し、データが更新されることを確認。

3時間目
・中間発表
 やっぱり、セッキー、委員長、ヤギーの出来はいい。

4時間目
・引き続き発表

<コメント>
・何か編集画面を作る
・コンポーネットの部品を使う
・ログイン画面(セキュリティ、ユーザ)管理を実装する

・ページャの設定
 委員長が実装していたので、やり方を教わった。
 出来れば実装したい。

5時間目
comment_edit作成

6時間目
ログイン設定作成、権限を確認中に時間切れ

ページャの設定を見たがよく判らず、委員長に教わって自宅で作業した。
詳細は後日追記。


2011/04/19

CentOSのコマンド登録

CentOSのコマンドで省略形が登録できます。

毎回「mysql -u user -p -Dstudy」と入力するのが面倒な人向けのコマンド登録方法です。

シェルにalias登録が出来ます。
現在の設定は以下のコマンドで参照できます。
$ alias

また、以下の登録をすると、次回以降「mys」でコマンド実行出来ます。
$ alias mys='mysql -u user -p -Dstudy'

便利な機能ですが、一度ログアウトすると消えてしまいます。
このため、ログイン設定に組み込むことをお勧めします。
ログイン設定は、ユーザのホームディレクトリにあります。
~/.bashrc
このファイルの最後に追加しておきます。これで、次回のログインときでも使用できます。
# User specific aliases and functions
alias mys='mysql -u user -p  -Dstudy'

設定が終わったら、一度ログオフしてログインしなおし「alias」コマンドで登録されている
ことを確認しましょう。
または、以下のコマンドを入力
$ source ~/.bashrc

なお、この設定はユーザごとの設定になります。
* 参考 bash 入門

2011/04/18

symfonyでlogviewer、続き

php講習 4/18

今日は昨日と打って変わって肌寒い

1-2時間目
週末に自宅で作業した内容を反映
バッチ処理
ソート、抽出
環境を合わせる

3-6時間目
クーロンタブにログの差分データ作成シェルを設定
シェルは不得意だ。


バッチ処理によるデータアップロードのテスト
フォームに検索条件を残すように変更
ソート指定のラジオボタン追加
レイアウト調整(CSSがよくわからないため、画面が崩れる)

授業でやっていない範囲の実装は、時間を見て追記します。
明日は午後途中経過の発表なので、資料を整理する予定。

2011/04/15

symfonyでlogviewer、続き

php講習 4/15

自主課題2日目

本日も引き続き自主課題の作成作業。
作業を進めるごとに、概略設計していたところの矛盾が表面化。
あちこちぶつかりながらの作業なので、進捗が遅い。
遅いどころか、後ろに戻ってる?

・ログのアップロード処理を作った。
画像アップの処理と同じ作り。
入力、確認、完了(保存)の間で渡すデータは、ログデータが大きいことを考え、データではなく、ファイル名になった。

・ログの日時が、mySQLのデータタイプdaytimeと合っていない。
そのため、保存のとき変換をかけなければならない。
月:Apr -> 4
時間: hh:mm:dd -> hh , mm , dd
変換処理作成に時間がかかった。
mktime($h,$m,$s,$m,$d,$y)

・テーブル間でカラム名に不一致あり。
DB側の修正とプログラムの修正。
テーブルにテストデータが少ししか入っていないので救われた。
テストデータが溜まってからの変更だと、とんでもないことになった。
xampp環境ではないので、DBユーティリティが使えないのは痛い。

・機能を呼び出すため、URLを入力する代わりにサイドメニューを作成。

・作成途中で気が付いた細かいところを整理。
これから1つずつ片付けて行くための時間が足りない。

・symfonyでは、テーブル名とカラム名は同じにしない。

・4/19(火)PMに途中経過の発表をすることになりました。

2011/04/14

symfonyでlogviewer環境設定

php講習 4/14

自主課題1日目

自主課題の作成作業、ログビューアを作ることにしました。

作業を整理、DBと環境作りから始めました。

詳細はあとで書き直します。

2011/04/13

symfonyでlogviewer概略設計

php講習 4/13

1-2時間目
昨日に引き続き自主課題の概略設計

3-4時間目
・各自の課題発表

<自主課題:ログビューア>
・各種ログをWeb画面で参照する。
サンプルとしてsymfonyのログを参照できるようにする。
ログにコメントが書けるようにする。

<コメント>
・ログの取り込みは自動にした方が実用的
こちらは、ログの取り込みで差分ファイルを用意しないといけない。
symfonyのログは差分ファイルになっていないので差分ファイルを
作る処理をcronで作成する確認が取れなかったため、今回は、
ログファイルのアップロードにしています。
出来れば指摘の通りにしたい。

<その他のコメント>
・カラム名などに意味のない名前は付けない。
カラム名などは誰が見ても分かる名前にする。
・symfonyでは、テーブル名、カラム名にuserという名前は使わない。
その他予約語は避ける。(mySQLの予約語
(他の予約語についてはあとで調べます、たぶん)
・モジュール、アクションの名称は統一する。
モジュール名はcomment_addなど、機能(テーブルにレコードを追加してる
こと)が分かるものにする。
アクションはinput,confirm,resultと、入力の流れを統一する。

5-6時間目
・発表が終わったので、実装を始める
その前に作業の整理をしたが、なかなか整理が進まない。
(何から手を付けていいやら)

2011/04/12

symfony、自主制作課題、企画

php講習 4/12
今日も良い天気です。

1-6時間目
本日より自主課題、明日午後、概要のプレゼンテーション。
来週金曜日までの作成期間。

<自主制作課題概要>

(1)システム概要
・どんなシステムを作るのか
・ターゲットユーザ
・収益モデル

(2)DBテーブル構成

(3)アプリケーションモジュール構成

(4)各モジュールの遷移図

4/13PM企画発表
4/22PM発表

今日は認定日のため、午後ハローワークに行ってきました。

2011/04/11

symfonyで掲示板作成、部品化の復習、セッション

php講習 4/11

・今日は室内の当番だった、動くと暑い。

1時間目
・ログイン画面が出来ていない人は、
メールで送付したログインモジュールをfrontに入れてください。
ログイン後、一般ユーザでmypageが表示されるところで一度環境を合わせます。


2時間目
・アプリケーションを作ったらリライトルール等環境を整えるのは、
デフォルトでやって下さい。
・部品化のところから分からなくなった人が多かったので今日はです。
mypage/templates/layout.phpにヘッダーとフッターをパーシャル化する。

・mypageのCSSが反映されていない。
HTMLを参照するとCSSフォルダの参照は href="/mypage/css/main.css"となっている。
/はCentOS上は/bbs2/webなので、mypage用にcssのリンクを張る。
・パンくずリストのパーシャル化

・今やっていることは、backendと同じレイアウトを作ろうとしているので復習です。
・部品化はもう復習しないので、わからない人は自分で復習して下さい。

・メニューをスロットにする
スロットを読み込みたい場所にスロットを呼ぶ
・テンプレートにスロットの定義

・各テンプレートにメニューを追加することになる。
メニューを部品化
・メニューの内容をパーシャル化する。
<?php include_partial("global/menu");?>
_menu.phpへ内容を移す。

・午後はログインしたあとの処理


3時間目
・front/ログイン画面での練習
  print_r($this->getUser());で情報出力を確認する。
・ヘッダーにセッションで保存したニックネームを表示する
php  $this->getUser()->getAttribute('nickname', null, sfConfig::get('sf_session_name'))
テンプレート sf_user->getAttribute('nickname', null, sfConfig::get('sf_session_name'))

・mypageにログアウトモジュールを作成する
$ symfony init-module mypage logout
・ログアウトの処理は、認証、権限をクリアして、トップページにリダイレクト

・セキュア設定していて、認証されていないユーザがアクセスした場合の処理
symfonyでエラーになる。
default/login
権限を持っていないユーザがアクセスした場合
default/secure
設定していないので、エラー表示が出ている
Oops! An Error Occurred
The server returned a "500 Internal Server Error".
sfController->forward('default', 'login')

・setting.ymlの設定
#    login_module:           default   # To be called when a non-authenticated user
#    login_action:           login     # Tries to access a secure page
#
#    secure_module:          default   # To be called when a user doesn't have
#    secure_action:          secure    # The credentials required for an action

・次の時間でこの部分の処理を作成
mypageにmember_editモジュールを作成
$ symfony init-module mypage member_edit
inputのアクション
inputSuccess.php
パンくずとメニューを表示する。

4時間目
・member_editの処理でやっていることは、今までの処理と変わらない
テーブルからデータを取り出し、入力、確認、保存の流れ
・最初がセッションのメンバIDからテーブルに問い合わせて、あとは同じ流れ
$member_id = $this->getUser()->getAttribute('member_id', null, sfConfig::get('sf_session_name'));

・member_editが出来なかった人は自分で復習して下さい。

5時間目
・comment_listモジュールを作成する
$ symfony init-module mypage comment_list

・comment_listでは、自分のコメント一覧を表示したい
カラム追加
alter table comment add member_id int;
投稿したとき、自分のIDを入れる。

・セッションの値を表示する($this->getUser())

・セキュリティの関数
未認証済みにする     $this->getUser()->setAuthenticated(false);
認証済みかどうか     $this->getUser()->isAuthenticated();
権限を追加する     $this->getUser()->addCredential("member");
権限を持つかどうか     $this->getUser()->hasCredential("member");

・コメント編集で、フォームの前にチェックを入れIF文で分岐
コメントのmember_idとログインユーザのIDが一致していることを確認する。

・ログインして記事を投稿、member_idを設定する。
テーブルにmember_idのデータが入ることを確認する。

6時間目
・セッションからIDとニックネームを取得しているので、投稿の画面にある
ニックネームの入力をセッションからの出力に変更する。
・mypageに何かやるときはチェックする。
・コメント_editにIDを渡して編集している
$ symfony init-module mypage comment_edit
受け取る方で修正IDを受け取っている。
それをコメントテーブルに問い合わせて修正している。
ログインしているとき、別のIDを修正できてしまう。
これを防ぐために、コメントを投稿したIDとセッションのIDを比較する。
異なる場合は、/へリダイレクトする。
(そのコメントの編集権限がない)


今後の作業について
・明日から自主制作
水曜午後から企画の概要を発表:
サービス、DB構成、ページ遷移図(入力、確認、完了)
アプリケーション、モジュールの構成、フロント、バックエンドの機能など。
4/22金 午後発表

最終課題
自主制作課題を最終課題にしてもいい

2011/04/09

eclipseからCentOSのmySQLに接続

・windows上のphp開発環境では、xampp上からmySQLを操作していました。
しかし、symfonyになって開発環境をCentOSに移してから、mySQLの操作はSQL文で直接操作しています。GUIでの操作に慣れているので少し面倒で、GUIで出来ないかと思っていました。
そこで、たまたまeclipse上の環境を見ていたところ、JDBCコネクタ経由でmysqlの接続情報がありました。

・Webで調べた情報で、ローカルPCのeclipseからCentOSのmySQLに接続出来ました。
設定方法のポイントは以下の3点です。

(1)mysql(サーバ)のユーザ情報は、接続先情報も保持しているので、ローカル(CentOSにあるmysqlから見てローカル)以外から接続するためには、ユーザ情報と共に接続先情報の設定も必要。
(2)mysql接続用「JDBCコネクタ」ドライバをeclipseに設定する。
・接続情報はeclipseにサンプルとして付属しています。しかし、ドライバは
(私のインストールしたpleiades 3.6)eclipseには付いていませんでした。
pleiadesには、いくつかセットがあるので、JDBCドライバが含まれるものも
あるかもしれません。
(3)eclipseで接続情報を設定する。
JDBCの画面から「新規」接続すれば、DBを参照・更新出来ます。

なお、この設定は開発環境を想定していますので、セキュリティは考慮していません。
セキュリティを考慮する必要がある場合は、必要な設定をして下さい。


(1)mySQLのユーザ情報の設定・確認
・まず、環境確認のため、WindowsのコマンドプロンプトからCentOSのmysqlに接続します。
(windowsにはxampp環境があり、mysqlクライアントがインストールされていることが前提です)
> mysql -h CentOSのIPアドレス -u user -p
> Enter password:パスワード入力
これで「mysqlにログイン出来れば、そのユーザ(user)はeclipseからJDBCの接続に使うことが出来ます。

・mysqlのログインがエラーになった場合
ERROR 1130 (HY000): Host 'windowsのIPアドレス' is not allowed to connect to this MySQL server
mysqlのユーザがローカル接続用になっています。
このため、JDBCの接続に使うためにはMySQL(サーバ)の設定追加が必要です。

・外部接続用ユーザ設定のため、centOS上からmySQLのrootユーザでmySQLに接続します。
$ mysql -u root
・新たに外部接続用ユーザを設定します。(xpは、外部接続PC)
mysql> GRANT ALL PRIVILEGES ON *.* TO user@"xp"
    -> IDENTIFIED BY 'password' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
・この設定、何故か反映に時間がかかるときがあります。 理由がわかったら追記します。

・なお、CentOSがvmware上でnat接続だと、xpにあたる部分がCentOS上のmysqlから見て、ロ-カルIPではありません。(PCのipconfigで表示されるVMnet8のアドレスです)
PCからvmware上のCentOSにtenletで接続していれば、whoコマンドで接続PCのipが表示されます。このipアドレスを指定して下さい。
またセキュリティを犠牲にするなら%が使えます。詳細はmysqlのマニュアルを参照して下さい。

・設定の確認
mysql> select Host,User from mysql.user;

・ユーザの準備が出来たので、PCのWindowsコマンドプロンプトから確認
> mysql -h CentOSのIPアドレス -u user -p
> Enter password:パスワード入力
これで「mysqlにログイン出来れば、そのユーザ(user)はeclipseからJDBCの接続に使うことが出来ます。

参照元:MySQL のインストールと接続設定 - nova の日記


(2)「JDBCコネクタ」ドライバをeclipseに設定する。
・参照元に手順の詳細がありますので参考にして下さい。
以下は、手順概略です。
mySQLのサイトから、ダウンロードページに行って、
「Connectors」「Connector/J」とたどり「Source and Binaries (zip)」
をダウンロードする。
ダウンロードには、mySQLのサイトへのログインを求められます。
アカウントを持っていない場合は、ユーザ登録をする必要があるかもしれません。
eclipseで使用するドライバなのでwindows用(zip)を落として下さい。
ダウンロードしたら、ファイルを解凍。解凍したフォルダの中にドライバがあります。

私の使ったものは、以下のファイル名でした。
mysql-connector-java-5.1.15-bin.jar

これを、eclipseのフォルダに入れます。
eclipseからあとで参照するのでとりあえずどこでも良さそうです。

参照元:Java初心者入門講座: Java MySQL用のJDBCドライバを入手する方法。


(3)eclipseの接続情報を設定する。
・eclipseの接続情報
メニューから、ウインドウ/設定
設定画面から、DBViewer プラグイン/接続文字列
JDBCドライバ:com.mysql.jdbc.Driver
接続文字列:jdbc:mysql://user@CentOSipアドレス:3306/study
最後の「study」はデフォルト接続のDB名です。

・eclipse画面右上のパースペクティブを開く
その他で、DBViewerを選択
・左にDBツリービューが開くので、
DVBiewerPluginで、右クリックして「登録」
・データベース定義の登録画面にて、JDBCドライバから「ファイルの追加」でダウンロードしたドライバを選択、「次へ」
・接続情報の設定画面にて、接続ユーザ、パスワードを入力、「テスト接続」で「接続に成功しました」と表示されれば、接続テストはOKです。
{次へ」で進み「完了」
これで左のDBツリービューにmysqlのDBが表示されます。

なお、OpenOfficeでもMySQLのデータを参照出来ます。

2011/04/08

symfonyで掲示板作成、セキュリティ、権限

php講習 4/8

・今日は天気が悪いけど、まだ雨は降ってません。


1時間目
・昨日の課題を自習
・1時間以上かけて色々試したり、Webを検索したが、ルーティング情報は
反映されている。しかし、URLの表示は直らない。


2時間目
・投稿(コメント)一覧、戻るリンクを設定
・投稿編集、更新完了画面で、戻るリンクを設定

・写真の表示は対応、編集は未対応

・返信一覧のモジュール作成
$ symfony init-module front reply_list
・アクセス確認
/front_dev.php/reply_list/index

・返信一覧の画面設定追加(default/indexからコピー)
パンくずリスト追加

・コメント一覧に、返信数を表示する。
コメント一覧から、返信一覧にリンクを作成
・コメント一覧、コメント編集のパンくずリスト修正

・(メンバ登録、パンくずリストなし)フロントは使わない。


3時間目
・アクセス制御(ログイン画面)
  セッションでlogin_ynの判断

・front-appにloginモジュールを作成
$ symfony init-module front login
/loginでアクセス出来るようにする。

・メールアドレス、パスワードを受け取るログインフォームを作成
昨日の練習はこれを問題なく作るためだったんでしょうか。
・ログインフォームの飛び先は自分で、受け取ったパラメータ から、
メンバテーブルを読みメンバがいるか確認する。
・メンバテーブルを読む処理は、アクションに記述せず、関数にして
MemberPeerに記述する。
ログインしたメンバの名前を表示して確認する。

・メールアドレス、パスワードをチェックするとき、SQL文(チェック関数)は
memberPeerに関数として定義する。


4時間目
・権限
権限は追加できる
(「,」区切りで[[]]で複数指定できるが今回は使わない。)
・設定前の画面確認
/backend/member_list
・権限の制限設定(モジュール毎の制御では、/mod-id/config/security.yml)
  backend/config/security.ymlの設定
default:
  is_secure: off   -> on
  credentials: [member]
設定したら、symfony ccを忘れずに。
・確認(バックエンド以下がsecureになった)
/backend/member_list
    →ログインせず直接アクセスでエラー
 Login Required
This page is not public.


・ログイン画面で認証できたら、バックエンドに飛ばす処理を追加。
$this->redirect('/backend') ;

セキュリティとしてsymfonyのUserオブジェクトに設定するもの
Authenticated = 認証
Credential    = 権限

securiry.ymlで設定する項目
is_secure = 認証
credentials = 権限

・権限の関数は、通常使うものはテキストにあるものくらい。

<課題> ログイン確認できたら、ログアウト機能を追加
・まず、ログアウトモジュール作成
$ symfony init-module backend logout

・次に、サイドメニューにログアウトを追加、リンク先をログアウトモジュールにする。
(ログアウトしたあとはとりあえず、ログイン画面にしておきました)
・バックエンド側のサイドメニューにログアウト項目追加、リンク先をlogoutにする。
ログアウトしたときは、認証と権限をクリアする。
・フロント側のサイドメニューにログイン項目追加、リンク先をloginにする
・確認
/login
/backend/backend_dev.php

settings.yml
#    login_module:           default   # To be called when a non-authenticated user
#    login_action:           login     # Tries to access a secure page
コメントを外す

5時間目
・バックエンドが表示されない
securty.ymlのadmin権限の書き方の問題だった。

<課題>ログイン処理が出来たので、backendは管理者の設定にする。
・管理者の判断のためメンバーテーブルにadmin_ynカラム追加 varchar(1)
> ALTER TABLE member ADD COLUMN admin_yn varchar(1) ;
> desc member;
$ symfony propel-build-schema
$ symfony propel-build-model
$ symfony cc

・ログインでadmin_yn="Y"ならバックエンドへ
  ログインの処理変更
・テストユーザ設定
> update member set admin_yn='Y';
> update member set admin_yn='n' where id=1;

・ログインユーザのセッションの値セット
ログインしたとき、よく使うデータを入れておく。
セッション内に名前空間を作る 第3引数
$this->getUser()->setAttribute('member_id',$member->getId(),sfConfig::get('sf_session_name'));
$this->getUser()->setAttribute('nickname',$member->getNickname(),sfConfig::get('sf_session_name'));

・ログアウトしたときに、名前空間ごと削除する

・パラメータの受け渡し確認のため、バックエンドのテンプレートにニックネームを表示する。

・ログインするとき
backend-app
権限 admin
credetail

mypage-appにとばす(ログイン画面と同じ)
権限  member
画面はトップページ(掲示板)

$ symfony init-app mypage
$ symfony init-module mypage default

6時間目
・答え合わせ
・mypageのアクセス確認は各自で実施する。アクセス出来ている前提。
(これって結構作業量ある)
・mypage-appのアクセス、/mypageになるように設定
$ cd web
$ mkdir mypage
$ mv my*php ./mypage/
$ cp .haccess ./mypage/
$ cd mypage
$ vi .htaccess
$ vi mypage.php
$ vi mypage_dev.php
$ ln -s /usr/share/pear/data/symfony/web/sf ./sf
$ ln -s ../css ./css
/config/setting.ymlの設定変更(リンクヘルパ用)
all:
    no_script_name:         on       # Enable the front controller name in generated URLs

・セキュリティ設定
security.ymlの設定変更
default:
  is_secure: on
  credentials:  [ member ]
・アクセス確認(エラーになる)
/mypage
Oops! An Error Occurred
The server returned a "500 Internal Server Error".

・バックエンド側の権限設定変更
backend
  credentials:  [ admin ]

<課題>mypage にログインユーザの情報を表示
・ログインのアクションで、情報をセット
$this->getUser()->setAttribute('member_id', $member->getId(),sfConfig::get('sf_session_name'));
$this->getUser()->setAttribute('nickname', $member->getNickname(), sfConfig::get('sf_session_name'));

・mypageのアクションで情報を取得、テンプレートで表示
$this->id = $this->getUser()->getAttribute('member_id', null,  sfConfig::get('sf_session_name')); 
$this->nickname = $this->getUser()->getAttribute('nickname', null, sfConfig::get('sf_session_name'));

・symfonyで残った機能
バリデート(エラーチェック)
応用、プラグイン
・あとは、習うより慣れろってことでしょうか
・いままで習った範囲の知識で出来ること
ユーザごとのコメント一覧
自分のコメントを削除

・symfonyの説明が終わったら、自由課題を2週間ほどやる予定。

2011/04/07

symfonyで掲示板作成、サイドメニュー

php講習 4/7

今日も天気がいいが、湿気を感じる。
明日は天気が悪くなるそうなので、湿度が高いのかもしれない。

1時間目
・コンポーネントの復習

・課題:メニューに返信数の多いコメントランキングを作成する
コメントテーブルに返信数のカラムを追加
ここでソート、上位5件を取得する。

・コメントテーブルにカラム追加
reply_cnt int
ALTER TABLE comment ADD COLUMN reply_cnt int;

・スキーマ生成、モデル作成
$ symfony propel-build-schema
$ symfony propel-build-model
$ symfony cc

・replyテーブルに保存したタイミングで、
コメントテーブルに問い合わせして、カウントを+1する。

・メニューに表示のスロット追加

・作業実施

2時間目
20分まで作業、少し猶予の時間。
・カウントが1以上入らないため、SQLでチェック。
select id,nickname,reply_cnt from comment ;
select id,nickname,comment_id from reply;

3時間目
・コンポーネントの復習
コメントに詳細を見るリンクを張る。

(1)コメントに詳細を見るリンクを作成
・indexSuccexx.phpのコメントに詳細のリンク設定
・モジュール作成detail/index、答え合わせでは、default/ditailだった。
$ symfony init-module front detail
・routing.ymlでIDのパスを設定

(2)default/detailでコメント詳細ページ表示
表示する内容は、indexと同じ
(長い文章があるとき、全体を表示する場合に対応)

(3)commentテーブルにaccess_cntカラム追加
$ ALTER TABLE comment ADD COLUMN access_cnt int;

・スキーマ、モデル作成

(4)詳細(detail)を見るたびにaccess_cntを+1
・detailアクション追加
・SQLで確認
select id,nickname,access_cnt from comment ;

(5)shard/accessrankingコンポーネントでアクセス数が多い5件のコメントを表示
<?php include_component("shared", "commentranking");?>
・サイドメニューに追加

5時間目
・/でアクセス、投稿画面で、詳細のリンクを確認
・/default/detail/id/1でアクセスすると
  /symfony/detail/となる。
  ルーティングルールの変更が反映していないようだ。
  symfony ccを実行しても結果が変わらない。

・コメント一覧、返信件数を表示する。
リンクを張る
routing.ymlでURLからアクセス出来る
ことを確認する

6時間目
・これまでの復習
frontにexerciseモジュール作成(アクションはindex)
stage2アクションを作成

・コメントテーブルから全データを取得
$commentsでテンプレートに渡す
パラメータの受け渡しと、取得方法は問題なく書けるようにしておいて下さい。
(10回くらい書けば覚えるらしい、漢字練習を思い出す)

・明日、午前中は代わりの講師が来ます。
その時間は、自習になるので、コメント一覧を実装、終わった人は、
リプライリスト、返信の編集をして下さい、とのことでした。

・プロジェクトディレクトリへの移動
$ cd ~/bbs2

2011/04/05

symfonyで掲示板作成、管理画面と部品化

php講習 4/5

・今日は、花粉症の薬をきちんと飲んだせいか昨日より楽です。

今日は作業量が多く、テキストに整理できていないのと、
用事があるので、ブログの更新は明後日やります。

<今日やったこと>
パーシャル
globalは、アプリケーションのテンプレートパスへ

スロット
アクションごとにレイアウトを変えたい場合に使用
タイトル、パンくず、ヘッダータグのキーワードなど

課題:backendアプリケーションにmember_listモジュールを作りアクセス出来るようにする。
$ symfony init-module backend member_list


3時間目
・コンポーネントの復習
member_edit モジュール作成
$ symfony init-module backend member_edit
アプリケーション/モジュール/アクションを意識する。
フロントコントローラ以外は省略できない。

・クライテリアは、Peerクラスに定義する。

5時間目
・管理画面を完成させる
・会員情報を入力編集保存
・会員一覧から、編集保存する。
・パスワードも変更可能にする。

・これから、テーブルへの問い合わせはアクションに書くのではなく
Peerに関数の形で書くようにする。
データの保存は、アクションに書く。
・IDから、関数を作成呼び出す。

・出来た人はコメント一覧とコメント編集を作成する。
忙しかったのでメモを作る余裕が無かった。

明日はお休みです。

2011/04/04

symfonyで掲示板作成、部品化

php講習 4/4

・今日は天気が良いためか、花粉症がかなり悪化、きつい。

1時間目
・ヘルパーと返信が終わっている人は、アンケートの入力処理を作成
・アンケート項目(enquete_add)
名前、性別、興味のあること(居、食、住)、コメント、画像3件

・アンケートの実装作業
  モジュール作成
  テーブル作成
  モデル化

  設定作成(性別、興味)
  /config/setting.yml
    gender:
      ## 性別リスト:
      1: 男性
      2: 女性
    interest:
      ## 興味リスト:
      1: 居
      2: 食
      3: 住
      9: 他
ymlファイル作成では、入力時のスペースの数に注意して下さい。

・アクション作成
  input,  confirm,  result
・テンプレート作成
  inputSuccess.phpに入力フォーム(ヘルパー使用)
  confirmSuccess.php確認、結果


3時間目
・ルーティング
URLから、モジュール、アクションを使うかを設定する。
アプリケーションごとに設定(routing.yml)する。

default_index:
  url:   /:module
  param: { action: index }
モジュール名しか指定のない場合は、アクション名はindex

default:
  url:   /:module/:action/*
/aaa/bbbで書かれていたら、/モジュール名/アクション名と判断する。

default_symfony:
  url:   /symfony/:action/*
  param: { module: default }
/symfony/cccで書かれていたら、/defaultモジュール/アクション名cccと判断する。
これは使うところが決まっていたので、あとで説明します。

・/news/indexを/news/listにしたいとき、ルーティングルールを設定
追記するときは、「# default rules」の上に記述する。
(上に書いたものが優先される)
newslist:
  url:   /news/list
  param: { module: news, action: index }

・モジュール名/アクション名が基本であることは忘れないように!
  その上に追記する。
・「# default rules」以下はいじらない。
・必要なときだけルーティングを使用する。

・newsモジュールにdetailアクションを作成
/news/detail
同じページにパラメータを渡すことは良いとはされない。
実際にページが100あるとき、1ページにされる。

・ルーティング設定
newsdetail:
  url:   /news/detail/:id
  param: { module: news, action: detail }
・アクセス確認
/news/detail/10
→/news/detail?id=10

・リンク先にルーティング名を使用する
<?php echo link_to("詳細はこちら","@newsdetail?id=10");?>

4時間目
・(テンプレートの)部品化 
部品化には、パーシャル、スロット、コンポーネントという機能がある。
パーシャル:ロジックを含まない部品化
スロット:テンプレートからレイアウトを変更するための部品化
コンポーネント:パーシャルにロジックが加わったもの
コンポーネントスロットは、使う機会が少ないのでやらないそうです。

・パーシャルの例
front/layout.php
MENU<br />
<?php echo link_to("会員登録","/");?>

front/layout.php
<?php include_partial('global/menu'); ?>
アプリケーション全体で使うときは、「global」でlayout.phpと同じところに置く
(アプリケーションのテンプレートフォルダ:ファイル名は、_menu.php)

・同様にヘッダー、フッターも部品化する。

・shareモジュール作成
$ symfony init-module front share
デフォルトモジュールのindexSuccess.phpから呼ぶ

member_add/inputにも読み込む

・スロット
アクションで作成された画面以外で、テンプレートからレイアウトを追加する。
<?php echo $sf_data->getRaw('sf_content') ?>

indexSucces.php(アクションのテンプレート)
<?php slot('pankuzu');?>
HOME
<?php end_slot();?>

<?php include_partial("shared/message")?>

layout.php
<div id="pankuzu">
<?php include_slot('pankuzu');?>
</div>

・help画面にもindexSucces.phpに追加したものと同じものを追加


5時間目
パンくずの解説

・タイトルをスロットにする
layout.php
<?php include_title() ?>

<title><?php include_slot("title")?></title>

indexSuccess.php
<?php slot('title');?>
TOP | SHONANBBS
<?php end_slot();?>

課題:サイドメニューをスロットとパーシャルの組み合わせで作成
メニューをパーシャル化した。
<?php include_partial('global/menu', array('now' => 'top')); ?>
ここをlayout.phpから呼び出すためにスロットにする。
<?php include_slot('sidemenu'); ?>
メニューの具体的な内容は、以下へ記述
backend/template/_menu.php
サイドメニューをパーシャルにするということは、layout.phpに1度だけ記述していたものから、
全テンプレートでサイドメニューのパーシャルを呼ぶことになる。

・パーシャルに値を渡すことも出来る
第2引数に配列で記述する。

6時間目
・広告スペースをメニューにパーシャルで追加
・タイトルタグと、パンくず以外はスロットはあまり使わない。

・コンポーネント
部品を作成するためにデータベースからデータを取得する必要がある場合
(例)メンバーリストを表示

・コンポーネントの練習その2
最新記事5件を右サイドバーのメニューの下に表示

今日は、内容の把握が不十分なので、あとで整理します。

2011/04/03

eclipseに登録するフォームのヘルパー設定

・eclipseに登録するフォームのヘルパー定義の設定方法

eclipseでsymfonyを入力していてヘルパー定義を軽減出来ないか試してみました。

eclipseで、ウインドウメニュー/設定から、設定ウインドウを開く
Web/HTMLファイル/エディタ/テンプレートを選択
新規ボタンで以下を入力

名前:syform
コンテキスト:HTMLタグ
説明:symfony form tag
パターン:<?php echo form_tag("/","method=post multipart=true") ?>
(これは登録例です)

あとのヘルパー定義は、自分の好みを登録して下さい。
登録した内容は、HTMLを入力する画面(symfonyではテンプレートファイル)で
ctrl+スペースで呼び出せます。

2011/04/01

symfonyで掲示板作成、ヘルパー

php講習 4/1

・今日も天気がいい。掃除は東浜でした。
・花粉症の症状が軽かったので、油断していたら、昨日の午後から悪化。
薬を飲んだけど、朝まで効果がなかった。やっと今ころになって回復。

1時間目
・返信に画像をアップロードする機能を追加出来ていない人は
引き続き作業
・終わった人は、画像を3つ同時にアップロードできるように
機能追加

・まず投稿部分より作業
・テーブルに項目追加、yml、モデル作成
> alter table comment add photo2 text;
> alter table comment add photo3 text;
> desc comment;
$ symfony propel-build-schema
$ symfony propel-build-model
$ symfony cc

・モデルへの項目追加を確認する
bbs2/lib/model/om/BaseComment.php

・投稿処理変更(アクション、テンプレート)
executeIndex()は作業なし
executeConfirm()は、アップロードファイルの受け取り処理追加
executeResult()は、パラメータの受け取りと保存処理追加
indexSuccess.phpは、ファイルアップロードのタグ追加と、投稿の画像表示追加
confirmSuccess.phpは、アップロードファイルの処理追加
resultSuccess.phpは、作業なし

2時間目
・次に返信部分作業
・テーブルに項目追加、yml、モデル作成
> alter table reply add photo2 text;
> alter table reply add photo3 text;
> desc comment;
$ symfony propel-build-schema
$ symfony propel-build-model
$ symfony cc

・モデルへの項目追加を確認する
bbs2/lib/model/om/BaseReply.php

・投稿処理変更(アクション、テンプレート)
executeIndex()は変更なし
executeConfirm()は、アップロードファイルの受け取り処理追加
executeResult()は、パラメータの受け取りと保存処理追加
indexSuccess.phpは、ファイルアップロードのタグ追加と、投稿の画像表示追加
confirmSuccess.phpは、アップロードファイルの処理追加
resultSuccess.phpは、作業なし

・追加対応
投稿の改行未対応を調査

・テストデータ整理のためのSQL
> delete from comment where id=35;

3時間目
・午後はヘルパー機能の説明
ヘルパーを使う利点は、HTMLのコーディング量を減らせます。
現在、には
・ヘルパーを使うとき、リンクタグでフロントコントローラ名を取る
config/settings.yml
all:
    no_script_name: on
$ symfony cc
・リンクヘルパー
・フォームヘルパーに閉じタグは用意されていない。
  テキストボックス
  テキストエリア
  チェックボックス
 
4時間目
・ラジオボタン
セレクトボックス
・以降は、ヘルパーをつかってもあまり効率は変わらないので、
使っても使わなくても良い。
ファイル選択項目

・ヘルパーの定義練習をする。

・ヘルパーの雛形をエディタに登録しておくと、ヘルパーの記述作業が効率的になる。
エディタのワード+スペースキー

・掲示板のフォームタグをヘルパーで書き換える。
投稿処理の変更

5時間目
・掲示板のフォームタグをヘルパーで書き換える。
返信処理の変更、メニュー部分の変更

6時間目
・返信の表示方法について
投稿の表示をforeachで回す。
そのとき、replyのデータを取得したいので、Comment.phpのcommentクラスにgetReplys()関数を追加する。
public function getReplys() {
        $c = new Criteria();
        $c->add(ReplyPeer::COMMENT_ID, $this->id);
        return ReplyPeer::doSelect($c);
    }

・関数追加の練習、ニックネームに「さん」を付けた関数getSanzuke()を設定する。
    public function getSanzuke() {
        return $this->getNickname()."さん";
    }

・オーバーライド
親クラスの関数を再定義。
    public function getNickname() {
        return parent::getNickname()."さん";
    }

・残りの時間は、返信の処理と、ヘルパーでの書き換え作業

・来週いっぱいは、掲示板の機能を拡張するので、復習をしておいて下さい。