2012年05月30日
講義073日目
------------------------------1H------------------------------
★symfony
●検索機能の追加
・画像の検索
actions.class.phpの検索フォームの取得に
"photo" => $this->getRequestParameter("photo"),を追加
三パターンの条件
有だけチェック
無だけチェック
有無両方チェック無し
case "photo":
if($v == "y"){
$c1 = $c->getNewCriterion(self::PHOTO, "", Criteria::NOT_EQUAL);
$c2 = $c->getNewCriterion(self::PHOTO, NULL, Criteria::NOT_EQUAL);
$c1->addAnd($c2);
$c->add($c1);
}elseif($v == "n"){
$c1 = $c->getNewCriterion(self::PHOTO, "");
$c2 = $c->getNewCriterion(self::PHOTO, NULL);
$c1->addOr($c2);
$c->add($c1);
}
break;
☆$c->getNewCriterion()で条件を増やす場合
$c1 = $c->getNewCriterion()
$c2 = $c->getNewCriterion()
$c3 = $c->getNewCriterion()
$c4 = $c->getNewCriterion()
をどれか一つにまとめる
$c1->addAnd($c2);
$c1->addAnd($c3);
...
などのようにして最終的に
$c->add($c1);
にまとめる
一つのカラムに対する条件の指定は一つにしておく
------------------------------2H------------------------------
★symfony
●検索機能の追加
・urlの検索
actions.class.phpの検索フォームの取得に
"url" => $this->getRequestParameter("url"),を追加
三パターンの条件
有だけチェック
無だけチェック
有無両方チェック無し
case "url":
if($v == "y"){
$c1 = $c->getNewCriterion(self::URL, "", Criteria::NOT_EQUAL);
$c2 = $c->getNewCriterion(self::URL, NULL, Criteria::NOT_EQUAL);
$c1->addAnd($c2);
$c->add($c1);
}elseif($v == "n"){
$c1 = $c->getNewCriterion(self::URL,"");
$c2 = $c->getNewCriterion(self::URL,NULL);
$c1->addOr($c2);
$c->add($c1);
}
break;
・ieなどで画像を取得しようとして画像無いです表示を回避するために
indexSuccess.php
<?php if($comment->getPhoto() != ""):?>
<?php echo image_tag("comment/".$comment->getPhoto(),array("width" => 100))?><br>
<?php endif;?>
・検索フォームリセットボタン
_kensaku.php
<?php echo reset_tag("検索条件をリセット")?>
検索後の内容はリセットできないっぽい
検索後のjavascriptで実装するのがいいっぽい
・replyの内容も検索したい場合
$c->add($ReplyPeer::CONTENT, "%{$v}%", Criteria::LIKE);
とか追加して(そこからロジックを調整)
●ちゃんとMODEL化する
actionsにあるCriteriaの処理をmodelに移行する
・component.class.php
$result = ReplyPeer::countCommentId();
・replyPeer.php
☆最後に渡したい値をreturnして、ReplyPeer::countCommentId()を呼び出してるところに渡せるようにしておく
------------------------------3H------------------------------
★symfony
●MODEL
・
オブジェクトから得られるメソッドを増やしたいときにはPeerの付いてない
例えば/lib/model/Comment.phpを使う
例)CommentPeer.php
動的に動作させる関数を記述する
各テーブルごとに取得したいデータ郡など呼び出す時に「CommentPeer::hoge()」
例)Comment.php
インスタンス化されたオブジェクトから使用する
メソッドを追加できる
インスタンス化してから呼び出すときに「$Comment->hoge()」
indexSuccess.php
リプライ
<?php foreach($comment->getReplys() as $reply):?>
↓
//Comment.phpに記述したメソッドを使って返信を取得
<?php foreach($comment->getReplysFromCommentId() as $reply):?>
Comment.php
//自身のIDを元にして、付いている返信のオブジェクト配列を取得
public function getReplysFromCommentId()
{
$c = new Criteria;
$c->add(ReplyPeer::COMMENT_ID, $this->getId());
$c->addDescendingOrderByColumn(ReplyPeer::CREATED_AT);
$rtn = ReplyPeer::doSelect($c);
return $rtn;
}
------------------------------4H------------------------------
★symfony
●お問い合わせ
・mailモジュールを作る
[nishi@localhost sf.shonanbbs.com]$ symfony cc
・contact/actions.class.php
$this->getPresentationFor()
指定したモジュールの出力を取得する
public function executeSubmit()
{
$contact = $this->flow->getData('contact');
$contact->save();
//メール送信
//文字コードを設定する
mb_language("Ja");
mb_internal_encoding("ECU-JP");
//各データを変数に分けておく
$mailto = "root";
$title = "タイトル";
//mailモジュールで使用するために、セッションに保存
$this->setflash("contact", $contact);
//指定したモジュールの出力を取得する
$content = $this->getPresentationFor("mail", "sendToContact");
$header = "From:", mb_encode_mineheader("サーバー管理者");
if(mb_send_mail($mailto, $title, $content, $header)){
$contact->setSendFlg("y");
$contact->save();
}
$this->flow->transitOnSuccess();
return $this->flow->execute();
}
------------------------------5H------------------------------
★symfony
●お問い合わせ
・front/mailモジュールを作る
/mail/actions.class.php
public function executeSendToContact()
{
$this->contact = $this->getflash('contact');
//セッション情報の開放
$this->setflash("contact",NULL);
return sfView::SUCCESS;
}
/mail/templates/sendToContactSuccess.php
TO:<?php echo $contact->getName()?>様
お問い合わせありがとうございます。
・お問い合わせ内容
<?php echo $contact->getContent()?>
このメールに心当たりのない場合は無視してください
-------------------------------
ほげ山ほげ男
Email:hogehoge.com
-------------------------------
・ymlファイルの設定
/mail/config/view.yml
default:
has_layout: off
・rootに送るようにテストしてみる
業務では複数にメールを送ることが多い
●sendmail
/var/log/maillogでエラーなどのログをチェックすることができる
●ブラックリスト
公開されてるブラックリストなどもある
------------------------------6H------------------------------
★symfony
●Pager機能
CommentPeer.php
//ページフローチェック用の値でテスト、後で消す
$perpage=3;
$page=1;
//ページ数とページ位置により、表示する内容を操作するクラス
$pager = new sfPropelPager("Comment",$perpage);
$pager->setCriteria($c);
$pager->setPage($page);
$pager->init();
return $pager->getResults();
・pagerを機能させる
CommentPeer.php
static function getBbsArticles($search_arr = array())の引数にpagerの設定を記述
static function getBbsArticles($search_arr = array(), $page = 1, $perpage = 10)
default/action.class.php
pageの値を受け取ったりする
$page = $this->getRequestParameter("page");
if($page <= 1){
$page = 1;
}
$this->pager = CommentPeer::getBbsArticles($this->search_arr, $page);
$this->comments = $this->pager->getResults();
indexSuccess.php
pagerの表示場所をつくる
<?php include_partial("global/pager",
array("pager" => $pager.
"query" => $sf_context->getModuleName().
"/".
$sf_context->getActionName().
"?"
)
)?>
/front/templates/_pager.php
にダウンロードしたpagerを設置
-----------------------------memo------------------------------
0 件のコメント:
コメントを投稿