ラベル symfony の投稿を表示しています。 すべての投稿を表示
ラベル symfony の投稿を表示しています。 すべての投稿を表示

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のときはほとんど使わない。

2011/03/24

symfonyで掲示板作成

php講習 3/24

今日も外の掃除は寒かった。

1時間目
・昨日の復習
プロジェクトの確認
アプリケーションの確認
プロジェクト直下でモジュール作成
フォルダ構成の確認

・eclipse,phpソースの整形方法(便利)
Ctr + Shift + F

・昨日の課題の答え合わせ
アクション(action.class.php)
テンプレート(inputSuccess.php,confirmSuccess.php,resultSuccess.php)

2時間目
・続き、テンプレート(confirmSuccess.php)

・入力画面にメールアドレス(mailaddress)を追加し、完了画面まで渡す。(作業時間10分で)
アクション(action.class.php)
テンプレート(inputSuccess.php,confirmSuccess.php)

・今回の作業であやしい人は、新しい変数を追加して手順を確認する。

・昨日は、bbs2プロジェクトで、frontアプリケーションを作った
URLとモジュール、アクションの関係

正しくは、http://ドメイン名/アプリケーションのフロントコントローラ名/モジュール名/アクション名
一番最初に作成したフロントコントローラ名は省略可能

/bbs2/web/index.php
アプリケーションのフロントコントローラ
(全てのリクエストを受け取るところ)

・バックエンドアプリケーション(backend)作成
プロジェクト直下へ
symfony init-app backend
管理機能画面
アプリケーションごと(backend)のリクエストを受け取るフロントコントローラは、backend.php

・デフォルトモジュール作成
symfony init-module backend default
結果を確認

・バックエンドの機能確認

http://ドメイン名/アプリケーションのフロントコントローラ名/モジュール名/アクション名
backend.php/default/index
業界として、phpが付くのはかっこ良くない。
ここをbackendでアクセスできるようになる。設定と説明は午後。

3時間目
最初に作ったアプリケーションのモジュールにアクセスするときだけ、
フロントコントローラ名は省略出来ます。
2番目以降に作ったものは省略出来ません。
(backendは省略出来ません)

・backend.phpをbackendにする作業は、
今後アプリケーションを追加するときその都度作業するので忘れないように。
・アプリケーション名のディレクトリを作成
cd bbs2/web
mkdir backend
mv backend.php backend_dev.php ./backend
cp .htaccess ./backend

apacheの設定ファイルを変更
vi .htaccessで以下の2行を修正
  RewriteBase /
  RewriteRule ^(.*)$ /backend/backend.php [QSA,L]

パスを変更
backend.phpを修正
define('SF_ROOT_DIR',    realpath(dirname(__FILE__).'/../..'));
スタイルシートへのパスが切れているので、文字のサイズは変わった。

・アプリケーションを作成
・デフォルトモジュールを作成
・フロントモジュールでアクセス出来ることを確認
・設定を変更し、アプリケーション名でアクセス出来ることを確認する。

・アプリケーションを作成
symfony init-app backend
symfony init-app mypage

・デフォルトモジュールを作成
symfony init-module backend default
symfony init-module mypage default

・フロントモジュールでアクセス出来ることを確認
まず、アクションで出力
      print "backend" ;
      return sfView::SUCCESS;
次に、URLでアクセス

・設定を変更し、アプリケーション名でアクセス出来ることを確認する。
ディレクトリを作成し移動と、コピー
アクセスのための設定変更対象
.htaccess
backend.php

・出来た人は、別のアプリケーション(mypage)を作成して同じ作業を行う。
アクセス出来ないときは、ブラウザを一度閉じてから開くとアクセス出来ることがある。

4時間目
・作業をmypageで実施。
・作業手順があやふやな人は、アプリケーション、モジュールを作って作業をやってみる。

・会員登録のリンク
<a href="/member_add/input">会員登録</a>

・layout.phpの説明
<head>タグの内容は記述されていないが、以下のファイルで修正可能
設定ファイルを修正したら、コマンドを実行
symfony cc
  →変更が反映されなかった
>> file-  Permission denied in /usr/share/pear/symfony/vendor/pake/pakeFunction.php on line 197
# chomod 777 -R front
symfony ccをrootで実行すると権限がおかしくなることがあるらしい。

5時間目
keywords 検索エンジンで引くキーワード、カンマ区切り
個別に行うときは、部品化、もしくは、viewから削除

スタイルシートの指定も可能
デフォルトはmain /web/css/main.css
複数指定は、カンマ区切り
javascriptはいまは何もしない。
haslayout レイアウトを使わない設定も可能。
複数のレイアウトを使う設定も可能。

2011/03/23

symfony概要説明

php講習 3/23

・今日は、外の掃除。意外と寒い。

1時間目
・昨日の復習から
Webテキストに従って、symfonyの概要説明
プロジェクト、アプリケーション作成
phpプログラムを変更して表示出来るようにした。

・linuxで作業するときは、自分のいるところ(フォルダ)を認識しておく
$ pwd
/home/user/bbs2/apps/front

・モジュールは、modulesディレクトリに入っています。
defaultモジュールを確認する。

・プロジェクト直下(bbs2直下)に移動
  一度、front以下を削除
  再度、frontアプリケーションを作成
  $ symfony init-app front
  defaultモジュール作成
  $ symfony init-module front default


2時間目
・「actions.class.php」は処理を書くところ、アクションの説明はあとで
/home/teacher/bbs2/apps/front/modules/default/actions/actions.class.php
記述を修正
関数executeIndex()の「execute」を除いた部分がアクション名(index)
return sfView::SUCCESS;
→テンプレートでindexSuccess.phpを使う。

・アクションの説明
データベース操作(CRUD)
create
read
update
delete

・アクションの機能
   1. リクエストパラメータ(GETやPOSTで渡ってくる値)の取得
   2. モデルを使用したデータベース操作(CRUD)
   3. viewに渡す変数のアサイン
   4. テンプレートの種類の決定
smartyで3の機能は使ったし、4のテンプレートも使っています。

1.リクエストパラメータの取得
・getでurlから渡す方法
http://www.user.com/?id=20
print $this->getRequestParameter('id');
パラメータをテンプレートに渡す
(Webテキストはスペルが違っているのでコピーするときは注意)

・URLでパラメータを設定し、テンプレートに渡す
http://www.user.com/?name=name&adr=pref


3時間目
・2時間目の答え合わせ(アクションで受け取る、テンプレートに渡す)
・POSTで渡せるようフォームを作成
フォームのタグは問題なく書けるようになっておいて下さい。
→今日の最後の課題で実際使いました。

1.リクエストパラメータの取得
3:viewに渡す変数のアサイン

4:テンプレートの種類の決定
「sfView::SUCCESS」以外のアクションの種類はあまり使わない。
基本的には、「sfView::SUCCESS」をreturnする。

return sfView::XXXXX (SUCCESS)アクション名 + ビューの種類.php(例 indexSuccess.php)

アクションを追加して動きを確認する
executeNews()
executeArticle()

テンプレートも追加
newsSuccess.php
articleSuccess.php

呼び出し
ドメイン名 + /default(モジュール名)/action名
何もなしだと、/default/indexアクションに飛ぶ
それ以外だと、指定(/モジュール名/アクション名)が必要


4時間目
・URLとモジュール/アクション/関数名の関係は重要です。
(これが今日の授業のポイントです)
・アクションを5個新たに作成して表示する。
・blogモジュールを追加して、indexアクションから表示する。

・フォームのモジュール名、アクション名を指定してパラメータを受け渡す。
フォームの飛び先は(ドメイン名+)/モジュール名/アクション名

5時間目
・Viewの説明
   1. 「レイアウトテンプレート」+「アクションで作成されるテンプレート」の組み合わせである
→これから説明
   2. HTMLの記述や、処理を簡略化するためのヘルパーという機能が使える
     →ヘルパーの項目で説明(明日以降?)
   3. 共通で使うViewを部品化できる(パーシャル、スロット、コンポーネント)
     →別の機会に説明(明日以降?)
   4. テンプレートには素のPHPを記述できる
     →いままで作業してきた通り。
      smartyのように特殊な書き方はありません。

・Webで表示されたsymfonyページのソースを参照(ctr+U)
テンプレートの記述にあるソース(indexSuccess.php)と比較する。
bodyタグ以外の部分の記述は、以下のファイルに記述(アプリケーション共通部分)
apps/front/templates/layout.php
アプリケーション共通部分以外は、以下に入る。
<?php echo $sf_data->getRaw('sf_content') ?>

・CSSの記述
<link rel="stylesheet" type="text/css" media="screen" href="/css/main.css" />
symfonyのcssはプロジェクト直下にある。
web/css/main.css

・CSSの解説
idはページ内に1つだけ
クラスは、同じページに何個あってもいい
headerの場合、ページ内にheaderを記述するのは1回のみなのでIDで設定。


6時間目
CSSを別(main.css)に記述
layout.phpで、HTMLの可読性が上がっていることがわかる。

・今日最後の課題:member_add modを作成し、アクション3個設定
input、confirm、resultアクションを作成
$ symfony init-module front member_add

・機能
名前入力 →postで名前を渡す
確認画面 →post(hidden)で名前を渡す
完了画面

・出来たら、メニューの下に「会員登録」でリンクを張る
リンク先は、ドメイン名+/モジュール名/アクション名(/member_add/input)
・解説は明日

2011/03/22

symfony入門

php講習 3/22

久々の授業でしたが、雨で掃除はありませんでした。

今日は、節電のため電車の暖房が無くとても寒かった。

1時間目
・VMWareにてCentOS起動
puttyにでログイン

・symfonyは、1ケ月位は(慣れるまで)何をやっているか分からない状態が続きます。
なれれば、通常のPHPに戻るのが面倒になるくらいになります。

・停電のときのために、Webテキストをローカル環境に作成する。
まず、デスクトップにkikinフォルダをコピー

・symfony環境(テキスト環境)のためユーザ追加 kikin
# useradd  kikin
# passwd   kikin

・ffftpで、kikinユーザでログイン
  ffftpには新規接続設定を追加
kikinフォルダのデータ(内容)を/home/kikinにコピー

・設定変更、バーチャルホストの設定を説明
(/xampp/apach/conf/extra/httpd/v-hosts.conf)
/etc/httpd/conf/httpd.conf
バーチャルホスト設定のとき、「NameVirtualHost *:80」をコメントから外すのを忘れないように。

ここで停電のためPCのバッテリーが切れました。

2時間目
・各自希望のWebアプリを設計する
DB設計
画面遷移

3時間目
停電が復旧しました。

・バーチャルホストの設定を実施
# vi /etc/httpd/conf/httpd.conf

・apache再起動
# /etc/rc.d/init.d/httpd restart

・windowsのhostsファイルにホスト名追加
 windowsのコマンドラインから バーチャルホスト名にpingして、戻ることを確認する。

・config.phpのsymfonyのパスをlinuxにあわせる
# vi  /home/kikin/config/config.php
(viは、これから良く使うので慣れるしかありません)

・権限設定(テキストがapachから見えるように)
# chmod -R 755 /home/kikin

・画像データをメールで送付したので、ftpで転送する。ユーザはkikin
  転送先は、/home/kikin/web、展開のコマンドは以下の通り。
$ tar -xvzf img.tar.gz
テキストの図が表示されていればOK。

4時間目
・ローカルのWeb画面を見て、画像が表示されていればOK
  ローカルの画面が見れない人は、今回はオンラインの画面を見て作業を進める。

・以下、テキストに従いフレームワークの説明
Mojaviを元に開発されたフレームワーク
symfonyのルールに従って開発、

・MVCモデルの図の説明
現状では、理解していなくてもOK

・徹底的にYAML 化された設定
→定義をYAMLの書式で記述

・OR マッパーPropel との融合
→DBとの接続

・symfonyのプロジェクト作成、一般ユーザにて作業
$ su - user
$ mkdir bbs2
$ cd bbs2
$ symfony init-project bbs2

・アプリケーションの初期化
$ symfony init-app front

・モジュール作成
symfonyのコマンドを入れるときは、プロジェクトディレクトリ直下で実行すること
(実行ユーザは一般ユーザで)
$ symfony init-module front default

・バーチャルホストの設定
# vi /etc/httpd/conf/httpd.conf

・サーバ再起動
# /etc/rc.d/init.d/httpd restart

・権限がないため、ユーザのホームディレクトリ権限変更
$ su -
# cd /home
# chmod -R 755 user
Webでアクセスしたとき以下の表示
Oops! An Error Occurred
The server returned a "500 Internal Server Error".


・eclipseにて、CentOSのファイルアクセス設定、phpソースの修正
ウインドウ/パースペクティブ/リモートシステムエクスプローラ
新規接続で、linuxユーザを設定、homeディレクトリが見れるようにする。
  phpファイル修正
bbs2/apps/front/modules/default/actions/actions.class.php
    →executeIndex()を、return sfView::SUCCESS;
同/templates/indexSuccess.php
→Helloのコメントを記入
(この部分はWebテキストに記述があります)
eclipseでlinux上のphpソースが編集できることが判って非常に便利。
毎回ftpで送らないといけないと思ってました。

・コメントが表示されない人は、以下の操作を実施
$ su ユーザ
$ cd /home/user/bbs2
$ symfony fix-perms
$ symfony cc

ちなみに、うまくアクセス出来ないときは、/var/log/httpd/にバーチャルホストで
指定したログが出ているので、見てみれば何かヒントがあるかもしれません。
 #  tail xxxx-error_log

・解説は明日(お休みの予定だったけど地震で休校になった時間の振り替え)