2011/03/28

symfonyで掲示板作成、criteria

php講習 3/28

天気が良いので外は気持ちいい。
しかし、花粉が心配。

1時間目
・先週の復習
  criteria
・symfony、「モデルによるCRUD」から
  Webアプリでは、DB操作で下記4つの機能で実現できます。
  Create
  Read
  Update
  Delete

・モデルでの書き方
memberの場合、IDとcreated_atは記述しない。モデルで自動的にセットする。
・action.class.phpで記述をして、アクセスし、データがinsertされることを確認する。
・commentテーブルでも同様の記述を行い、データがinsertされることを確認する。

2時間目
・insert,delete
・オブジェクトを使ってDBを操作、ORマッピング
Web開発の現場では、SQLは使わずORマッピングで開発しています。

・以上の使い方に慣れる
member_addモジュールを作成。
$ symfony init-module front member_add
insert,confirm,resultアクション作成。
inputSuccess.php
confirmSuccess.php
resultSuccess.php


3時間目
・午前の答え合わせ
class member_addActions extends sfActions
{
 public function executeInput()
 {
  return sfView::SUCCESS;
 }
 public function executeConfirm()
 {
  //  パラメータで受け取る
  $this->nickname  = $this->getRequestParameter('nickname') ;
  $this->mailaddress  = $this->getRequestParameter('mailaddress') ;
  return sfView::SUCCESS;
 }
 public function executeResult()
 {
  //  パラメータで受け取る
  $nickname  = $this->getRequestParameter('nickname') ;
  $mailaddress  = $this->getRequestParameter('mailaddress') ;
  // symfonyでモデルの書き方(CRUD:insert)
  // まず、空の行を作る
  $member = new Member();
  // データをセットする
  $member->setNickname($nickname) ;
  $member->setMailaddress($mailaddress);
  // 保存する
  $member->save();
  return sfView::SUCCESS;
 }
}
・今やっているところは、アプリケーション名、モジュール名(アクション名)の関係が
わかるようになって下さい。
・会員一覧ページを作る(app:member_list/index)
一覧表はfrontモジュールのincexアクションと同じことをやっているので参考にして下さい。
$ symfony init-module front member_list
・編集ボタンで編集できるようにする。(app:member_edit)
$ symfony init-module front member_edit
indexSuccess.php
・編集用アクションinput,confirm,resultを作成する。
inputSuccess.php
confirmSuccess.php
resultSuccess.php

4時間目
・答え合わせ

5時間目
・答え合わせ、member_list/indexSuccess.php

6時間目
・答え合わせ、member_edit/inputSuccess.php,confirmSuccess.php,resultSuccess.php
public function executeInput()
 {
  $id = $this->getRequestParameter('id') ;
  $this->member = MemberPeer::retrieveByPK($id) ;
  return sfView::SUCCESS;
 }

 public function executeConfirm()
 {
  $this->id          = $this->getRequestParameter('id') ;
  $this->nickname    = $this->getRequestParameter('nickname') ;
  $this->mailaddress = $this->getRequestParameter('mailaddress') ;
  return sfView::SUCCESS;
 }

 public function executeResult()
 {
  //  パラメータで受け取る
  $id          = $this->getRequestParameter('id') ;
  $nickname    = $this->getRequestParameter('nickname') ;
  $mailaddress = $this->getRequestParameter('mailaddress') ;
  // 更新したい行(オブジェクト)をまず取得する
  $member = MemberPeer::retrieveByPK($id) ;
  $member->setNickname($nickname) ;
  $member->setMailaddress($mailaddress);
  // 保存する
  $member->save();
  return sfView::SUCCESS;
 }

・一覧画面に削除リンクを付け、削除処理を追加する。
モジュールはmember_list
public function executeDelete()
 {
  // DBアクセス
  $id = $this->getRequestParameter('id') ;
  $member = MemberPeer::retrieveByPK($id) ;
  // データを削除する(一度削除するともうないので判断を入れる)
  if ($member) {
   $member->delete();
  }
  return sfView::SUCCESS;
 }

・明日はdeleteを解説
・今日やったところであやふやな部分がある人はモジュールをlinux上でリネームして
復習をして下さい。
(eclipseでリネームすると文字化けすることがあるのでlinux上でリネームする)

2011/03/25

symfonyで掲示板作成(復習)

php講習 3/25

・作業の前に
vmwareを起動し、linux(CentOS)を立ち上げる
puttyでlinuxに一般ユーザでログイン、プロジェクトのディレクトリに移動
eclipseを起動
ブラウザを起動、Webテキストを開いておく


1時間目
今日、午前中は昨日の復習
プロジェクトbbs2のディレクトリをバックアップ(bk.bbs2)
ディレクトリbbs2作成
(1)プロジェクト作成
symfony init-project bbs2

(2)アプリケーション作成
$ symfony init-app front
$ symfony init-app backend
$ symfony init-app mypage

(3)各アプリケーションにデフォルトモジュール作成、アクセス確認
$ symfony init-module front default
$ symfony init-module backend default
$ symfony init-module mypage default
・アクセスで使うviewアクションを指定
/bbs2/apps/front/modules/default/actions/actions.class.php
/bbs2/apps/front/modules/default/templates/indexSuccess.php
/bbs2/apps/backend/modules/default/actions/actions.class.php
/bbs2/apps/backend/modules/default/templates/indexSuccess.php
/bbs2/apps/mypage/modules/default/actions/actions.class.php
/bbs2/apps/mypage/modules/default/templates/indexSuccess.php

(4)backend,mypage各ページに/区切りのURLでアクセス
・アクセスパスの調整
使ったコマンドは、実行の順番に並んでいないので注意!
$ mkdir backend
$ mkdir mypage
$ mv backend.php backend_dev.php backend
$ mv mypage.php mypage_dev.php mypage
$ cp .htaccess backend
$ cp .htaccess mypage
$ cd backend/
$ cd mypage/

$ vi .htaccess
$ vi backend.php
$ vi .htaccess
$ vi mypage.php

(5)レイアウトを昨日のソースを参照して作る。
Viewの説明
「レイアウトテンプレート」+「アクションで作成されるテンプレート」の組み合わせである
レイアウト
/bbs2/apps/front/templates/layout.php
CSS
/web/css/main.css
設定変更を反映する
$ symfony cc
・レイアウトとスタイルはメールで送付します。

(6)DBのアクセス情報を設定する
・DB定義
/bbs2/config/databases.yml
/bbs2/config/propel.ini

・schema.ymlを作成する
$ symfony propel-build-schema

・モデルファイルを作成する
$ symfony propel-build-model
bbs2/lib/modelにモデルファイルが作成されている

・DBアクセスし確認する
PHPファイル
$this->member = MemberPeer::retrieveByPk(1);
テンプレートファイル
<?php print $member->getNickname();?>

・URLとモジュール/アクションの関係は理解していないと先に進んだとき
何処を修正したら良いか分からなくなります。
・フロントコントローラ
アクセスがあったとき、どのモジュールに処理を渡すかコントロールする部分

2時間目
・引き続き課題
・答え合わせ

3時間目
・答え合わせ、続き

4時間目
・答え合わせ、続き、DB接続から
symfonyの関数名、大文字で書かないとエラーになるところとエラーにならないところがある。
これは、覚える以外にない。

・エラーがでたとき、以下にアクセスして確認
/front_dev.php

・画面の画像が化けるとき
symfony設定ファイルのシンボリックリンクを作成
/usr/share/pear/data/symfony/web/sfフォルダが/home/teacher/bbs2/web/sfで参照できるようシンボリックリンクを貼る
$ cd /home/teacher/bbs2/web/
$ ln -s /usr/share/pear/data/symfony/web/sf ./sf


・backend(mypage)にも設定
backend_dev.phpのパスも修正
$ ln -s ../sf ./sf

・本番環境で、リリースする場合は、_devは削除しておく。
残してあるとセキュリティホールになります。

5時間目
Peerでアクセス
Criteria(クライテリア)による条件指定
SQLでDBに問い合わせをするとき条件は、where句を使用していました。
Criteria基準
$c = new Criteria();
$c->add(テーブル名Peer::カラム大文字, 指定する値)

$c = new Criteria();
$c->add(MemberPeer::ID, 1)
条件を複数指定可能
全てのデータを取得したい場合、条件を空にする。
$member = MemberPeer::doSelect($c);
doSelectは配列でデータを受け取る。
・テンプレート側
<?php foreach ($members as $member):?>
<?php print $member->getNickname();?><br />
<?php endforeach;?>

foreach でmembersとmemberの書き方も習慣として書く
・ニックネームとメールアドレスを表示し、テーブルタグにする
テーブルタグは書けるようになっておいて下さい。
・memberができたら、commentテーブルも表示して下さい。

6時間目
・条件設定
カラム名は大文字で記述する。

複数条件の指定
$c = new Criteria();
$c1 = $c->getNewCriterion(MemberPeer::CREATED_AT, "2011/01/10" ,Criteria::GREATER_THAN);
$c2 = $c->getNewCriterion(MemberPeer::NICKNAME, "%wata2%" ,Criteria::LIKE);
$c1->addOr($c2);
$c->add($c1);
$this->member = MemberPeer::doSelect($c);
・複数条件しては、orのときしか使わない、andのときはほとんど使わない。