2011/03/31

symfonyで掲示板作成、画像ファイル

php講習 3/31

掃除は西浜側でした。
今日も天気がいい。

1時間目
・昨日の続きで、返信の処理が出来ていない人は作成。

2時間目
・返信処理の答え合わせ
 
・名前の規則
テーブルのカラム名: comment_id
get                   getCommentId()
set                   setCommentID($tmp)

3時間目
・symfony,画像のアップロード
  formタグにenctypeの指定が必要
  <form action="/default/confirm"  method="post" enctype="multipart/form-data">
・動作確認
アクション
フォーム
・データ取得確認
次のプログラムの処理が終わるまでの間、一時ファイルとして保存される。
処理が終わればファイルは消されます。

Array
(
    [name] => title_oyama.jpg     # ファイル名
    [type] => image/jpeg          # 
    [tmp_name] => /tmp/phpkunfO6  # 一時ファイル置き場
    [error] => 0                  # 
    [size] => 5632                # ファイルサイズ
)

・ファイルはプログラムで移動しておく
if($photo["tmp_name"] != '') {
  session_regenerate_id();
  $tmpname = 'photo_' . session_id() .myUtil::getFileExt( $photo["tmp_name"] );

  $this->getRequest()->moveFile('photo',sfConfig::get('sf_upload_dir').'/tmp/'.$tmpname);
  $this->photo = $tmpname;
 }
4時間目
・ライブラリにファイルを追加
「symfony cc」してなかったら、クラスがないと言われてしまった。
・confirmアクションに追加
<?php if ($photo !=''):?>
<br>画像<br>
<img src="/uploads/tmp/<?php echo $photo ?>">
<input type="hidden" name="photo" value="<?php echo $photo ?>"><br />
<?php endif;?>

5時間目
・commentテーブルに項目photoを追加
alter table comment add photo text;
追加後、schema.yml作成、モデル作成
・画像の表示
indexSuccess.phpに追記
・時間のある人は返信にも画像を表示する。

6時間目
・投稿の表示順の指定方法追加
・ディレクトリ、ファイルの権限について説明
今回の場合だと、ディレクトリの所有者は一般ユーザ
画像ファイルをアップしたとき保存するのはapacheサーバ
なので、apacheユーザがファイルを書き込める設定にしている必要がある。

・返信の画像アップ機能を追加
テーブルに項目追加、yml、モデル作成
> alter table reply add photo text;
$ symfony propel-build-schema
$ symfony propel-build-model
$ symfony cc
replyディレクトリ作成
$ mkdir reply
$ chmod 777 reply

・処理変更(アクション、)

formタグにenctypeの指定が必要

・ファイルを複数送れるようにする。

2011/03/30

smartyで掲示板、設定ファイル

php講習 3/30

・今日は中の掃除当番、陽気がいいので掃除しているだけで暑い。

1時間目
・カテゴリを追加する処理
カテゴリボックスを作成
カテゴリテーブルから持ってくる。

投稿をカテゴリ分けするため、コメントテーブルにも項目追加

右カラムのメニューに「カテゴリ」を追加
テーブルに入っている項目の一覧を表示、選択出来るようにする。

・default/indexの記事返信表示で、データの取得方法を教えてもらう。
BaseCommentに、以下の処理追加
public function getReplys() {
  $c = new Criteria();
  $c->add(ReplyPeer::COMMENT_ID, $this->id);
  return ReplyPeer::doSelect($c);
 }
indexSuccess.phpにてreplyの記事を表示するタイミングで呼ぶ
<?php $replys = $comment->getReplys();?>
あとは、$replysをforeachで回す。

・vhostの設定を変更してみた。
/etc/httpd/conf/httpd.conf
alias  /sf /usr/share/pear/data/symfony/web/sf

・不具合と思われるところ
記事を投稿しても1行にまとまってしまい、改行が正しく認識されていない。

・テーブルにカテゴリ項目(Categories)追加
ALTER TABLE comment ADD COLUMN categorie int AFTER content;
・カテゴリテーブルを追加(idはautoincrementしない方が良かった)
CREATE TABLE categorie(
id int not null auto_increment,
categorie text,
created_at datetime,
primary key(id)
) ;
ID,カテゴリ名(データ入力も)
insert into categorie (categorie, created_at)
VALUES ("日記", now());
・テーブル、項目追加のモデルへの反映
$ symfony propel-build-schema
$ symfony propel-build-model
$ symfony cc

・default/indexのフォームにカテゴリ項目(ドロップダウンリスト)追加
  読み込み
 
・投稿画面、確認画面にカテゴリ項目追加
・default/indexの右側にカテゴリ表示追加

・答え合わせ

4時間目
・設定ファイル、yamlの基本
CSVならカンマ区切りで、XMLならタグでというように、
yamlは半角スペース(2個単位)でデータ構造を表現する
階層は半角スペース2つでインデント
.(ドット)で始まる行はコメント

・設定ファイルの設置場所
プロジェクト、アプリケーション、モジュール
プロジェクト以外はあまり使うことはない。

・環境別の影響度
/web/index.phpの
define('SF_ENVIRONMENT', 'prod');
たとえば、下記で設定値が異なる。
/apps/front/config/settings.yml
今すぐにつかうことはないが、あとで確認したいとき、出来るように。

・設定ファイル一覧
プロジェクトルート/configに設置されるファイル
config.php     symfonyのライブラリへのパスを指定

プロジェクトルート/apps/アプリケーション名/configに設置されるファイル
settings.yml     アプリケーション全体の設定
#allに書かれている内容は、デフォルトでこの設定になっている。
変更する必要があれば、コメントを外して設定する。
routing.yml     ルーティングの設定
→URLでアクセスしたとき、どのモジュールで処理をするか。
ここをいじると何処にアクセスしているか分からなくなる。
別項目で詳細を説明
filters.yml     フィルタ処理の設定
→これもあとでやります。

プロジェクトルート/apps/アプリケーション名/modules/モジュール名/configに設置されるファイル
今は何もありませんが、設定したいときここに置きます。
設定ファイルには、コメントを入れないと値が反映されない。

・設定ファイルからの値の取得
ここは、必ず使うので出来るようにする。
ymlファイルを設定したときは必ず「symfony cc」する。

・設定ファイルの練習
setting.ymlに値と配列をセットして、参照出来ることを確認する。
アクションでもテンプレートでも呼び出し可能。

・県コード県名の配列データを作成し、フォームを作成する。

・アプリケーションごとに設定する変数の練習
プロジェクトルート/apps/アプリケーション名/config/app.ymlに同じように定義し
参照する場合はsfConfig::get('app_設定したキー名');という形で参照できる。
(あまり使いどころはありません)

5時間目
・カテゴリ機能追加の続き
indexにてカテゴリを表示する機能作成

・メニューにカテゴリを追加

6時間目
・ntpサービスのインストール
時刻が合っていないので、5分ごとに時間を合わせる。
crontabに設定、作業はrootで実行すること。

今使っているサーバは開発用なのでntpの設定をしていますが、
本番機サーバでは設定しないことをお勧めします。
開発機、本番機サーバとntpサーバの時刻が異なることは良くあります。
今回の事例では、サーバの時刻を進めることになりますが、
サーバの時刻が戻ると、DBが壊れる可能性があります。
DBは内部で時刻を管理情報に使っているため、サーバの時刻が
戻るとDBの内部で矛盾が生じ、最悪起動できなくなります。
運用担当者の胃が痛くなるDBリストアにならないことを祈ります。

・メニューにカテゴリを追加、作業の続き

・明日は、返信のところを答え合わせ
次はファイルのアップロード

2011/03/29

symfonyで掲示板作成、返信処理

php講習 3/29

・今日も朝から天気がいい、今日は特に暖かい春の日和だ。
でも花粉が心配、天気予報では花粉多目。

1時間目
・昨日の復習から
・データベースstudyにcontactテーブルを作成、データは入れなくていい。
id int auto-increment
name text
content text
create_at datetime
create table contact(
id int not null auto_increment,
name text,
content text,
created_at datetime,
primary key(id)
) ;

・DB操作、schema.ymlを作成する
$ symfony propel-build-schema
bbs2/config/schema.ymlの内容を確認、contactテーブルのデータが反映されている。
・モデルファイルを作成する
$ symfony propel-build-model
bbs2/lib/modelにモデルファイルが作成されていることを確認


2時間目
・モデルでデータを作成し、URLでアクセス。
結果をmysqlで表示し確認する。
・readは何回かやっているので、今回はやりません。
・UPDATEでデータを更新、URLでアクセス。
結果をmysqlで表示し確認する。
・まとめてread
・削除

・contact_addモジュール作成
$ symfony init-module front contact_add
・input,confirm,resultアクション作成


午後
3時間目
・引き続き、contact_addの作業
・出来た人は、アンケート用テーブルを作成し、スキーマ、モジュールを作成
enquete_add
・enqueteテーブルの項目
性別(男性・女性)、都道府県、興味のある事(スポーツ、料理、その他)、名前
各項目はコード化
create table enquete(
id int not null auto_increment,
name text,
gender tinyint(1),
pref   tinyint(2),
hoby   varchar(10),
created_at datetime,
primary key(id)
) ;

・DB操作、schema.ymlを作成する
$ symfony propel-build-schema
bbs2/config/schema.ymlの内容を確認、contactテーブルのデータが反映されている。
・モデルファイルを作成する
$ symfony propel-build-model
bbs2/lib/modelにモデルファイルが作成されていることを確認
$ symfony cc

・enquete_addモジュール作成
$ symfony init-module front enquete_add


4-6時間目
・contact_addの答え合わせ
・enquete_addは別の機会に作業する。

・bbs2をバックアップ
・掲示板プロジェクトを作成
default/index、掲示板の入力フォーム、記事
一覧表示、返信ボタン(リンク:IDを渡す)
default/confirm、値の確認
default/result、完了(値の保存)
reply_add/index
reply_add/confirm
reply_add/result
・replyテーブルはxamppから持って来る。
・プロジェクト作成
$ symfony init-project bbs2
・アプリケーション作成
$ symfony init-app front
・モジュール作成
$ symfony init-module front default
$ symfony init-module front reply_add
・replyテーブル作成

・データベース接続情報設定
・DB定義
/bbs2/config/databases.yml、propel.in
・schema.ymlを作成する
$ symfony propel-build-schema
・モデルファイルを作成する
$ symfony propel-build-model
bbs2/lib/modelにモデルファイルが作成されている

・レイアウト調整
/bbs2/apps/front/templates/layout.php
 CSS
/web/css/main.css
・ロジックを組むinputSuccess.php,confirmSuccess.php,resultSuccess.phps

  返信の表示処理が正しいのか不安

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

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

2011/03/16

phpで楽天 ジャンル配列データの作成

今週は休校が決まりました。

楽天のジャンルデータの作成は、XMLのデータが取得できますが、
手作業で配列データを作成するのは少し手間がかかります。

Excelで作成するのは慣れていましたが、OpenOfficeはまだ慣れていないので配列としてデータを加工するのに時間がかかります。

折角なので、phpで出来ないものか探したところ、同じことをしてくれた人がいました。
Pear XML_Serializerを使ってみた - Webtech Walkerを参考に配列データを作りました。
require_once 'XML/Unserializer.php';

$xml = file_get_contents("http://api.rakuten.co.jp/rws/3.0/rest?developerId=(開発者ID)&operation=GenreSearch&version=2007-04-11&genreId=0");
$Unserializer =& new XML_Unserializer();
$Unserializer->setOption('parseAttributes', TRUE);
$status = $Unserializer->unserialize($xml);
if ($status === true) {
  $res_array = $Unserializer->getUnserializedData();
  // print_r($res_array);
  foreach ($res_array['Body']['genreSearch:GenreSearch']['child'] as $key => $value) {
   $genre_array[] = $value ;
  }
//  print_r($genre_array) ;
}

$genre_array[][genreId]にジャンルコード
$genre_array[][genreName]に名称
が入っています。セレクトの部分はこのようになります。

<select name="genre">
 <?php foreach ($genre_array as $key1=>$value) { ?>
  <option value="<?php echo $value[genreId] ?>" <?php if ($value[genreId] == $genre ) { 
echo 'selected="selected"' ;} ?>><?php echo $value[genreName] ?></option>
 <?php } ?>
 </select>

2011/03/15

phpでAPI

php講習 3/15

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

<2時間目>
最後に少しだけ出席、授業内容わからず、PCを起動して
eclipse、XAMPP、VMwareの環境を起動したことこでお昼。
楽天の何かをやってました。
(楽天て聞くと円天を思い出すのは考えすぎか)
今日は、出席者が少ないため、symfonyはやらないそうです。

<3時間目>
お昼休みに、Webの手順どおり(おまけ/API)と聞いたので、とりあえず
その通りにやってみる。
(1)楽天のデベロッパーIDとアフィリエイトIDを取得
(2)PEARライブラリの設置(パスは間違えないように)
(3)サンプルコードに取得したIDを入れ、ローカルで実行。
require_once 'Services/Rakuten.php';

$api = new Services_Rakuten('デベロッパーID', 'アフィリエイトID');
$api->doItemSearch("山", "101070", array('sort' => '-reviewCount','page' => 1,'imageFlag' => 1));
$data = $api->getResultData();

print_r($data);

実行結果画面で出力された$dataから、XMLデータを取得する。
Array
(
    [count] => 112959
    [page] => 1
    [first] => 1
    [last] => 30
    [hits] => 30
    [carrier] => 0
    [pageCount] => 100
    [Items] => Array
        (
            [Item] => Array
                (
                    [0] => Array
                        (
                            [itemName] => ★あす楽対応★★レビューを書いて2点以上ご注文
...
                            [itemCode] => vvv:10002539
                            [itemPrice] => 2079
...

サンプルのデータでキーワードは「山」、商品コード「101070」(スポーツ・アウトドア)
このデータから、商品の情報を取得するためのphpコードを作成。

ここまでは準備で、ここからが本題。
(4)XMLのデータ($data)から、商品一覧を表示するテーブルをHTMLで作成する。
使う項目は「mediumImageUrl」 「itemName」それとあとで「itemCode」
ただし、以下のコードはブログを保存すると壊れるので、一部コードを変更しています。
そのままコピーしてもつかえません。

<table border='1'>
<php
foreach ($data["Items"]["Item"] as $item) {
    print "tr" ;
    print "td" ;
    print "<img src=\"" . $item["mediumImageUrl"] . "\">";
    print "/td" ;
    print "td" ;
    print "商品 : " . $item["itemName"] ;
    print "<br />";
    print "価格 : " . $item["itemPrice"] ;
    print "/td" ;
    print "/tr" ;
}
>
<table>

さらににアフェリエイトのリンクも張った。
print "<td><a href=\"".$item["affiliateUrl"]. "\">" ;
 print "<img src=\"" . $item["mediumImageUrl"] . "\">";
 print "</a></td>" ;
<4時間目>
(5)一覧が出来たら、フォームで、キーワード、ジャンルを指定して検索できるようにする。
if (isset($_POST["keywd"])) {
$keywd = $_POST["keywd"] ;
} else {
$keywd = "山" ;
}
if (isset($_POST["genre"])) {
$genre = $_POST["genre"] ;
} else {
$genre = "101070" ;
}

$api = new Services_Rakuten('デベロッパーID', 'アフィリエイトID');
$api->doItemSearch($keywd, $genre, array('sort' => '-reviewCount','page' => 1,'imageFlag' => 1));
$data = $api->getResultData();

(6)一度入力した情報は、検索フォームに残すほうが親切。
キーワード:
<input type="text" name="keywd" size="30" value="<?php echo $keywd ?>"/>

(7)ジャンルはポップアップにする。
ポップアップのための配列データ取得は、「楽天ジャンル検索API」から取得する。
http://api.rakuten.co.jp/rws/3.0/rest?
developerId=[YOUR_developerID]
&operation=GenreSearch
&version=2007-04-11
&genreId=0

この実行結果から得られるXMLデータから、商品コードの配列を作成
<child>
<genreId>101070</genreId>
<genreName>スポーツ・アウトドア</genreName>
<genreLevel>1</genreLevel>
</child>

<child>
<genreId>100938</genreId>
<genreName>ダイエット・健康</genreName>
<genreLevel>1</genreLevel>
</child>
$data_array = array(
101070 => 'スポーツ・アウトドア' ,
100938 => 'ダイエット・健康' ,
); 
検索条件のjジャンルをフォームのセレクトにする。
商品:
 <select name="genre">
 <?php foreach ($data_array as $key1=>$value) { ?>
  <option value="<?php echo $key1 ?>" <?php if ($key1 == $genre ) { 
echo 'selected="selected"' ;} ?>><?php echo $value ?></option>

 <?php } ?>
 </select>
一覧表のカラムにadd.phpのリンクを追加し、add.phpで商品コードを受け取る。
print "<td>" ;
 print "<a href=\"add.php?itemCode=".$item["itemCode"] . "\">追加する</a>" ;
 print "</td>" ;

結果としてこちらになりました。

<5時間目>
add.phpの作成、コメントを入力できるようにする。
投稿結果をcommentテーブルに入れる。
そのとき、以下の項目も入れられるように、commentテーブルもカラム追加しておく。
ItemCode
など5項目ほどあり、ここはメモをPCに残して来たので詳細は木曜日に追記します。

<6時間目>
授業を始めようとしたことろで、停電のため中止。
みんなしぶしぶ帰宅。

これだと何をしているか判らないと思うので、
phpのコードと作業の詳細は、PCのpearの環境を作ってからもう少し整理して追記します。
明日は、お休みです。

2011/03/11

CentOSにsymfonyをインストール

訓練記録 3/11

・掃除は今日も花粉症でお休みでした。

<1時間目>
・firewallの設定(iptables)
今回は開発環境の設定なので、本番環境とは異なることを認識して下さい。
デフォルトでは、ファイアーウォールの設定がされていますが、これをとめます。
内容はテキストどおり、保存したらサーバ再起動
/etc/sysconfig/selinux
SELINUX=enforcing

SELINUX=disabled

getenforce コマンドでdisabledを確認


iptables -P INPUT ACCEPT
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

#ルールクリア
iptables -F

#icmp(ping) と自端末からの入力を許可
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

#Web、FTP、POP、smtp による接続を許可
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 25 -j ACCEPT

#ssh による接続を許可
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

#TCP の接続開始と応答、FTP データなどを許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#ルールをセーブする
/etc/init.d/iptables save

cat /etc/sysconfig/iptables

# vi /etc/sysconfig/iptables
#INPUTがDROPになっていたら修正
:INPUT DROP [0:0]

:INPUT ACCEPT [0:0]


<2時間目>
・Apacheのインストール
テキストのとおり
yumは、ソフトをインストールするためのコマンド
オプションの-y は、インストールの問い合わせに対して「y」と回答する
・Apacheの設定
/etc/init.d/httpd start
/etc/init.d/httpd restart
httpdのデーモン起動確認のコマンド
> ps -ef | grep httpd
PCからfirefoxで、ipアドレスを指定してapacheの画面が出ればOK

・mysqlのインストールと設定
/etc/init.d/mysqld start
デーモン確認のコマンド
> ps -ef | grep mysqld

・phpのインストール
時間がないので、午後

・vsftpdのインストール
ffftpで接続確認、サーバはCentOS(VMware)、ユーザは作った一般ユーザ
# /etc/init.d/vsftpd start
デーモン確認のコマンド
#ps -ef | grep vsftpd

<3時間目>
・ffftpでftpサーバへの接続確認
PCからffftpで、ipアドレスを指定して一般ユーザでログインが出きればOK

・phpインストール(今回)は、symfony 1.0.20をインストールするためphpは5.2)
PHP 5.2.16
# php -v

・pearをインストール
・symfonyをインストール、確認
# symfony -V
インストールモジュール確認

# pear list


・環境を落とす
vmware,ptty,ffftp

・vmwareからcentOSを一度削除して再度インストール作業

<4時間目>
・vmwareからcentOSを一度削除して再度インストール作業、続き

<5時間目>
・phpinfo()でphp動作を確認
mysqlのユーザを追加しようとして、エラーとなる
flush privileges;
ERROR 1146 (42S02): Table 'mysql.servers' doesn't exist
対応は、リンク先を参照した。

・今日は地震で電車が止まって帰れない。

2011/03/10

symfony環境設定の準備、その2

 訓練記録 3/10

・今日も花粉症で掃除はお休みでした。
今日初めて掃除機で掃除してるの見た。

<1時間目>
・火曜日から引き続きVMwareでCentOSを動かしてます。
(1)一般ユーザでログイン
(2)/home/ユーザ名/0310.txtを作成
(3)yahooの記事内容をコピー
(4)テキストの検索まで動作確認

・puttyでの自動ログイン設定
まず、puttyでCeontOSにログイン中のセッションを保存する。
puttyでログインするとき、ショートカットでリンク先をCentOSに指定。 
"C:\Program Files\PuTTY\putty.exe" -load 接続セッション名 -l "ユーザ名" -pw "パスワード"
ショートカットをランチャにドラックして登録、登録名を決める。

・ランチャー(CraftLaunch)の登録結果を確認
Ctrl+Shift+Space でランチャ起動を登録(ホットキーの割り当ては別に記述します)
ここで、先ほどのputtyでVMwareのログイン名を指定して起動できることを確認する。

<2時間目>
・viの操作復習と新しい操作方法
  カーソル移動コマンド

<3時間目>
・viの操作復習
phpの開発では、linux環境ではviかemacsで作業
・linuxのコマンド(個々の説明はWebのテキストを参照)
個々のコマンド、パイプ、リダイレクトの説明
コマンドのヒストリ機能
ディレクトリ操作


<4ー5時間目>
・コマンドの説明、続き
top load avg
crontab (symfonyを使うとき利用するのでそのとき説明します)

・ログの見方は、サーバ構築のあとで

・lnコマンドは、あとでsymfonyを使ったとき使うコマンドなので詳しくはそのときやります。
使い方は、windowsのショートカットと同じようなものです。

<6時間目>
・今日やったコマンドの復習(自習)

2011/03/08

symfonyをlinux環境で使うための準備

訓練記録 3/8

・掃除は花粉症なのでお休みしました。

<1-2時間目>
・VMWare、CentOSインストーラのコピー
クラス全員がダウンロードしているためか、ネットワークが遅いため時間がかかった。

<3時間目>
VMwareとCentOSのインストール、インストール後CentOSを再起動しrootユーザでログイン確認。
インストール手順は、時間があれば整理します。

<4時間目>
・vmware上のCentOS上から、ifconfigでIPアドレスを確認
# ifconfig
  vmware上でCentOSのコマンドを入力することができますが、使いにくいので、puttyを使い操作します。puttyからの接続先としてIPアドレスを確認しておきます。

・puttyからCentOSのIPアドレスを指定して、rootでログイン確認
・作業用ユーザの追加、ログイン確認
(symfonyを使い出すと一般ユーザで作業することになります)
# useradd user
# passwd user
一般ユーザで再びログイン、rootユーザに切り替え
(-を付けると環境変数を引き継ぐ、場合によって使い分ける)を確認
$ su -
・ここで、ヤギーから質問、「ユーザを切り替えたらプロンプトが変わってた」
さすがに鋭い。プロンプトで、「#」はrootユーザ、「\」は一般ユーザとして区別してます。

・puttyの端末の文字コード変更
設定の変更/変換/文字コードの設定/UTF-8(C,F)、保存を忘れずに
・ユーザ追加の練習、もう一人ユーザを追加してログインを確認する。

・スピーカーの音を消す設定
putty - 端末/ベル
VMware - サウンドカード

<5ー6時間目>
・今日は何回か停電があり、プロジェクタが使えなくて説明が止まってます。
・linuxコマンドの説明
(各コマンドはWeb上に説明のページが山ほどあるので、自分にあった見やすいところを
探しましょう)
$ pwd
$ ls -al
$ vi
また、linuxはmanコマンドがあります。でもlinuxの画面になれるまでは、
Webの利用をお勧めします。
$ man ls

・一般ユーザを使って、vi(委員長の推奨ページ)でテキスト編集の練習
コマンドモードでのカーソルの移動、「h」「j」「k」「l」の各キーの動き
(端末の設定によっては、カーソル移動は矢印キーも使えます。しかし、矢印キーは
使えない場合もありますので、キーの使い方は慣れておくほうが無難です)
・コマンドモードと入力モードの切り替え
・ウインドウ上のテキストのコピー&ペースト
キーワード検索
・テキストファイルの内容確認
> cat  xxxxx.txt
・linuxを使う上で、コマンドとviは必要な機能です。自分で最低限の作業が出来る程度に
なれば困りません。

・Linux(シェル)のテキスト補完機能
ファイル名を途中まで入力して、TABキーでファイル名を補完
シェルは、2種類(Bshell,Cshell)あって、 今の設定は、Bshell系のbashになってます。

明日(3/9)はお休みです。
(木)はLinuxコマンドの予定

smartyで九九

smartyで九九の表を作成

kuku.php
「../libs/Smarty.class.php」のパスは環境に合わせて調整が必要です。
<?php
/**
 * Smarty問題
 * 九々
 * kuku.php - kuku.tpl
 * @package smarty_lesson
 * @author
 * @since
 */

for ( $i = 1; $i <= 9; $i ++){
    for ( $j = 1; $j <= 9; $j ++){
        //2次元配列の作成
        $num[$i][] = $i*$j;
    }
}

require( "../libs/Smarty.class.php" );
$smarty = new Smarty();
$smarty -> assign( "num", $num );
$smarty -> display( "kuku.tpl" );

kuku.tpl
<html>
<body>
<table border = "1">
<caption>【九九の表】</caption>
<tr><th width="30"><br></th>
{for $j=1 to 9}
    <th width="70">
    {$j}
    </th>
{/for}
</tr>
{{foreach $num as $key1=>$row}}
    <tr>
    <th>{$key1}</th>
    {{foreach $row as $key2=>$col}}
        <td  align=center>{$key1}*{$key2+1} = {$col}</td>
    {/foreach}
    </tr>
{/foreach}
</table>
</body>
</html>

2011/03/07

smartyで掲示板

php講習 3/7 14週目

・掃除はなんと雪でお休みでした。
・今日までSmartyの予定でしたが、お休みが多い。
・今日は4時間です。さらに、今週は水曜日がお休み

<1時間目>
九九の表をsmartyで、今日はメールで送付しなくていい。
九九の表の解説、2次元配列に値を入れる仕組みについて。
smartyで、{foreach}を2重に記述する。(くわっちの例とは違うけど)
{{foreach $num as $key1=>$row}}
    
    {{foreach $row as $key2=>$col}}
        

テーブルタグ<tr><td>の位置に注意
ソースはメールで送付されました。
・BBSの続き
返信の出し方について、解説。
コメントの出力が出ている人は、返信の出し方について、九九の表を参考に。
テーブルを2つ使うときは、if文を使って条件判断をして出力する。

<2時間目>
・BBSの続き、デバック
(1)投稿のニックネームのリンクの表示がおかしい。テーブルタグは正しいが、表示のみ余分な文字列が付く。
<a href="www.yahoo.co.jp">smarty</a> さんの投稿<br />
→仕様? データにhttp://が付いていないとFirefoxが補完機能を働かせて?「http://localost/bbs_smarty/」を付ける
(2)返信のニックネームの表示に余分な文字が付く
→修正
(3)emailが表示されない。
→emailの保存/表示処理がない

・くわっちの一言:テンプレートで出力を確認する際は、一度に全てのカラムを表示させるのでは
なく、1つだけ表示して、うまくいったら他のカラムも表示する、という手順にしましょう。また、
IF文など、複雑な部分も一旦とっぱらって、後からにしましょう。

<3時間目>
・BBSの続き、デバック

<4時間目>
・BBSの解説
メールで資料が配布されているので、参照する。
パラメータを1つで渡す方法と、2つで渡す方法があります。
/imgフォルダの指定は、index.tplのhtmlタグで指定していますが、
index.phpからの相対パスで、index.tplからの相対パスではありません。
・comment.id = reply.comment_idの判断をどこでやるか。
phpで多次元配列を作り、テンプレートに渡す。
ロジックを書くのは、プログラマ。
デザイナには負担はかけないほうがいい。
・配布したソースでは、セッションの使い方など、今まで説明した機能はなるべく使っています。
smartyの書き方の参考にして下さい。

ごごは、すっかり雨もあがった。

今日は、くわっちの最後の日でした。

*サクラエディタでのphpの設定について

2011/03/05

smartyでfizzbuzz

smartyでfizzbuzzを作ったサンプルです。

fizzbuzz.php
<?php

/***
 *
 * phpで配列「num_list」に1~100までの整数をセット
 * tplで「if」と「foreach」を使ってFIZZBUZZを表示
 * 3の倍数はFIZZ
 * 5の倍数はBUZZ
 * 3と5の公倍数はFIZZBUZZ
 * それ以外は数字を表示
 *
 */

require("../libs/Smarty.class.php");
$smarty = new Smarty();

for ($i = 1; $i <= 100; $i++) {
    $num_list[$i] = $i ;
}
$smarty -> assign("num_list", $num_list);
$smarty -> assign("fizz", "FIZZ");
$smarty -> assign("buzz", "BUZZ");
$smarty -> display("fizzbuzz.tpl");
?> 

fizzbuzz.tpl
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

{foreach from = $num_list item = num_i key = num}
    {if $num is div by 3}
        {if $num is div by 5}
            {$fizz}{$buzz}<br />
        {else}
            {$fizz}<br />
        {/if}
    {else}
        {if $num is div by 5}
            {$buzz}<br />
        {else}
            {$num}<br />
        {/if}
    {/if}
{/foreach}

</body>
</html> 

2011/03/04

smartyで掲示板

php講習 3/4

・掃除も花粉症でお休みしました。
 今日は目が異常にかゆい。
<1時間目>
・今日もsmartyでfizzbuzz
半分以上は出来るまで、毎日続く?

<2時間目>
・今日もsmartyでfizzbuzzと解説
smartyのif,elseifはphpと処理が逆になっています。
phpは上から順に処理されますが、smartyはヒットした条件で処理されるので、
書き方の順は逆になります。
・九九の表

<3-5時間目>
・BBSのindex.phpをsmartyで書き直す
2次元配列の2次元目を設定するところがわからなかった。
1次元での例からの応用が利かない。頭が固くなってます。
$row1['reply'][] = $row2;
・実習の間に、PCのメモリ増設作業がありました。
デスクトップはやったことあったけど、ノートは経験が無かったので、作業は
委員長にお願いしました。ありがとうございます。

<6時間目>
・BBSのsubmit.phpをsmartyで書き直す
作業の残りは、3/7(月)にやってください。
なお、月曜日は4時間です。

・smartyのテンプレートファイルをeclipseで書いていて不便だったので、
  せめて、htmlファイルとだけ関連付けしました。

2011/03/03

smarty講習

php講習 3/3

・掃除は花粉症でお休みしました。
今日は目が異常にかゆい。

<1時間目>

<2時間目>
・smartyでfizzbuzz、続き
 出来ない人は16時半以降続きを。。。
・smartyで、smartyクラスの継承
デリミタの変更
(デリミタ「{」「}」はjavascriptと競合する可能性があるので、そのままで使うことは
あまりないとのこと)
<3時間目>
・mysqlで環境設定
 DB作成
 Table作成
・DBのtableからデータを取得(今までの復習)
・配列変数でのデータ取得
・テーブルの行データ取得を2次元配列で扱う
行データは連想配列に入っているので、smartyでは、「.」(ドット)+「カラム名」で参照する。

<4時間目>
・smarty課題の練習

<5時間目>
・smarty課題の練習、続き

<6時間目>
・smartyでlogin.phpとlogin.tplに分ける
phpの課題でもやっていた、phpとhtmlのタグを分ける作業の延長

「|escape」に関連し、default_modifiersのURL紹介があったので少し調べました。
この関数default_modifiersはなかなか曲者のようで、別の記事もありました。

Smartyのバグ ~default_modifiers~
Webでよく調べたらもっと出るのかもしれないし、
3.0.6になって改善されているかもしれない。

☆追記、escapeの除外方法
smarty 2では、{$body|smarty:nodefaults}だったが、
smarty 3では、{$body nofilter}に変わったようです。
日本語版マニュアルはまだですが、英語版には反映されています。

2011/03/02

smarty講習

php講習 3/2

・掃除は雨でお休みでした。
・今日も雨だが、花粉症で目がかゆい。

<1時間目>
・apacheのバーチャルホストの説明
httpd-vhosts.conf設定変更
設定は環境をlinuxで作ったときに行うので一度戻しましょう。

<2時間目>
・資料がメールで送付されたので、参照して下さい。
・PHPの基礎の話し。
・php.iniのerror_reportingについて
eclipseの変数表示、「緑の○」
この表示がない変数は定義されていない(目安になる)
連想配列$_POSTの事前定義は、冗長になるので「@」を付ける
エラーの原因がわかっている場合のみ使用可能。
・現場の状況によって使い分ける。
全部宣言すると、javaと同じになり、phpのメリットがない。
ちなみに、php.iniのerror_reporting設定はphpスクリプトの関数でも実行できるみたい。
error_reporting(E_ALL);

・サーバ上のフォルダにindex.phpがないとき、ディレクトリが見えてしまう。
公開するサーバではまずいので、linuxの環境を作ったとき設定をします。

<3時間目>
・smartyの話し。
・再度メールで資料が2件送付されています。
 昨日同様に資料を展開して、フォルダーをプロジェクトに。

<4時間目>
・課題1、2の説明と、練習
 代入文
 if文

<5時間目>
・課題3の説明、{foreach}
・セレクト部品の処理をsmartyで書く

<6時間目>
・セレクト部品の処理をsmartyで書く(続き)
ブラウザ?でキャッシュされているため、selectを変更したあと
画面をリフレッシュしても、現在の日付に戻らなかった。
毎回画面を閉じて、開きなおすと動いた。

・明日は、smartyでDBの処理だそうです。
・また、smartyは今週で終わりで、来週からlinuxだそうです。
そのlinuxも数日で、次がsymfonyの予定だそうです。
メモリは間に合ったのだろうか?

2011/03/01

xampp環境にsmartyインストール、環境設定

訓練記録 3/1

・今日から3月です。訓練も半分終わってしまいました。
・掃除は雨でお休みでした。

<1時間目>
・昨日のclassサンプルプログラム修正版がメールで送付されたので差し替え
・クラス、オブジェクト指向、テンプレートエンジンの説明用資料配布、内容の説明

・UMLでの開発について
大規模なシステムの場合、パーツに分けてそれぞれ担当が開発する。

・MVCモデル、テンプレートエンジン
モデル 
ビュー 
コントローラ 
smartyはビューの部分を切り離すもの
モデルは自分で作らなくてはならない。
・PHP開発者は、ほぼsmartyは経験している。
それ以降、フレームワークはそれぞれの会社等で使っているものを使用。

・PHPフレームワーク、3大フレームワーク
Zend,Symfony,Cake
開発の仕事をするためには、いずれか1つ使いこなしていることは必要。
googleトレンドにてシェアを見てみる。
・開発する場合、現場では使用するフレームワークは用意されている。
・過去の案件でメンテナンスする場合もあるが、大きい開発の場合、
smartyは使わない。
・カスタマイズになった場合、フレームワークは選べない。

・phpメーリングリスト
登録することをお勧め。
phpで判らないことがあったとき、ここの過去ログにたどり着くことが多い。
メールは、毎回受け取るよりは、毎日1回にしておくことをお勧め。

phpの開発者も参加している。(はてなのユーザIDでもログインできます)

以下、Webのテキストを参考に作業(xampp環境にインストール)
・smarty(3.0.7)インストール
(このサイトでマニュアルもダウンロードできますが、オンラインでも見れます)
smarty用のプロジェクトを作成
C:\pleiades\xampp\apache\conf\extra\httpd-vhosts.conf
### Smarty サンプル ###
<VirtualHost *:80>
ホストのIP設定(windows)
C:\WINDOWS\system32\drivers\etc\hosts
127.0.0.1       Smarty_sample

キーワード検索(時間のある人は調べておく)
・バーチャルホスト
・hostsファイル
・127.0.0.1
・localhost
・名前解決
dns
・nslookup
・Webアプリ
・get/put
・キャッシュ(cashとcacheは違います)
・サーバサイド(スクリプト)
・クライアントサイド(スクリプト)
ちなみにphpはサーバサイドスクリプト

smartyの環境設定(フォルダ作成:Example 2.5、Example 2.9参照)
    * templates
    * templates_c
    * config
    * cache

smartyのリンク (初心者向け自己学習の参考にして)
smartyのリンク (その2)

・smartyファイル作成
hello.php(smartyのテンプレート呼び出し)
hello.tpl(smartyのテンプレート、templatesフォルダへ入れる)
テンプレートファイルの拡張子は「.tpl」を使いましょう。

・smartyソース(hello.php)の解説
ライブラリ(libs)
テンプレートディレクトリ(template_dir)
コンパイルディレクトリ(compile_dir)
phpと違って、変数名?の先頭に$は付かなくてもいい?

・セキュリティ上問題があるので、今回作成したディレクトリは通常サーバの
公開されるディレクトリには置かない。
(公開領域(htdocフォルダ内)には、smarty関連フォルダは置かない)

・smarty 配列変数での出力
 JSP

* 何回も更新してごめんなさい。思い出しながら書いてます。