2012年5月25日金曜日

2012年05月22日 講義069日目

2012年05月22日
講義069日目
------------------------------1H------------------------------
★symfony
●部品化
・パーシャル
  テンプレートの部品化
・スロット
  データの部品化
・コンポーネント
  アクションとテンプレートで部品を作る
  部品化したいが、その部品を作成するためにはデータベースからデータを取得する必要がある場合に使用される
●コンポーネント化する
・/front/modules/default/actions/components.class.phpを作成
class モジュール名Components extends sfComponents としてクラスを定義
これまでactions.classに書いていたように、components.classにロジックを書き、テンプレートを用意する
<?php
class defaultComponents extends sfComponents{
    public function executeReplyRaning()
    {
        //return sfView::SUCCESS;
        //↑はいらないっぽい
    }
}
?>
コンポーネントだけしかないモジュールを作るのも管理が楽で良い場合がある

・/front/modules/default/templates/_replyRanking.php
何か表示テストに記述しておく
・/front/modules/default/templates/indexSuccess.php
コンポーネントを呼び出す
ウィジットが入る予定だったところに呼んでみる
<div id="contentRight">
<?php include_component("default","replyRanking");?>
</div>

●コンポーネントで掲示板のサイドバーに返信の多い記事ランキングを表示する
SELECT count(id),comment_id FROM reply GROUP BY comment_id ORDER BY count(id) DESC;
+-----------+------------+
| count(id) | comment_id |
+-----------+------------+
|         5 |          0 |
|         4 |         89 |
|         4 |         78 |
|         3 |          9 |
|         3 |          1 |
|         3 |         37 |
|         2 |       NULL |
|         1 |         10 |
|         1 |         11 |
|         1 |         15 |
|         1 |         17 |
|         1 |          2 |
+-----------+------------+
12 rows in set (0.01 sec)
を表示させる
------------------------------2H------------------------------
★symfony
●部品化
・Criteria
doSelect()
doSelectOne()
↑ではカラム名を指定してデータを取得することはできない
doSelectRS()
を使うとデータを絞り込める
リソース型で取得
doSelectRS()でデータを絞り込んで取得する方法
doSelect()でデータを取得して、その後ロジックで絞り込む方法
・components.class.php
doSelectRS()を使う
<?php
class defaultComponents extends sfComponents{
    public function executeReplyRanking()
    {
        //返信の多いランキングを表示する

        //doSelectRS()で実装
        $c = new Criteria();

        //選択するカラムの設定をクリア
        $c->clearSelectColumns();

        //必要なカラムを設定
        $c->addSelectColumn(ReplyPeer::COMMENT_ID);
        $c->addSelectColumn("COUNT(COMMENT_ID)");

        //GROUP BY命令を指定
        $c->addGroupByColumn(ReplyPeer::COMMENT_ID);

        //doSelectRSで取得し、配列に格納
        $result = array();
        $rs = ReplyPeer::doSelectRS($c);
        $rs->setFetchMode(ResultSet::FETCHMODE_ASSOC);
        while ($rs->next()) {
            $result[] = $rs->getRow();
        }
        print_r($result);

    }
}
?>
・_replyRanking.php
テンプレート側で表示の外枠だけ作っておく
<div class="componentBox" >
<h3>返信数ランキング</h3>
<p>
  返信数:10<br>
  記事:<a href="/">この投稿はテスト...</a>
</p>
<p>
  返信数:4<br>
  記事:<a href="/">この投稿はテスト...</a>
</p>
</div>
------------------------------3H------------------------------
★symfony
●部品化
・取得したデータをロジックで絞り込む
返信数が多い順の配列になること
要素数が5つの配列になること

・コンポーネントに追記
        $arr = array();
        foreach($result as $value){
            if(CommentPeer::retrieveByPk($value["COMMENT_ID"])){
                $arr[$value["COMMENT_ID"]] = $value["COUNT(COMMENT_ID)"];
            }
        }
        arsort($arr);
        $this->replyranks = array();
        $cnt = 0;
        foreach($arr as $k => $v){
            $this->replyranks[]=array("cnt" => $v,"obj" => CommentPeer::retrieveByPk($k));
            $cnt++;
            if($cnt >= 5){
                break;
            }
        }
        //表示テスト↓
        //print_r($this->replyranks);exit;

・テンプレート
<?php use_helper("MyUtility")?>
<div class="componentBox" >
<h3>返信数ランキング</h3>
<?php foreach($replyranks as $v):?>
<p>
  返信数:<?php echo $v["cnt"]?><br>
  記事:<a href="/"><?php echo my_mb_truncate_text($v["obj"]->getContent())?></a>
</p>
<?php endforeach?>
<p>
  返信数:test<br>
  記事:<a href="/">この投稿はテスト...</a>
</p>
</div>
※my_mb_truncate_text()で表示を短くしたりは好みで
------------------------------4H------------------------------
------------------------------5H------------------------------
------------------------------6H------------------------------
★symfony
●部品化
・コメントの詳細ページを作り、アクセス数をログ、サイドバーにアクセス数ランキングを表示する
  「アクセス数ランキングを出力するコンポーネント」を作成すること
  アクション名:accessCountRanking

●実際にやってみる
・コメントの詳細ページを作る
  comment モジュールを作成
  default アクションを作成
    idを受け取って、そのid番号のコメントと返信のみを出力するページ
    機能として、そのアクションが読み込まれた回数を記録しておく
・commentテーブルに「access_cnt」カラムをint型で作成し、アクションが読み込まれるたびにカウントアップしていくようにする!!!注意点!!
    カラムを新規追加した後はpropel-build-schema、propel-build-modelを実行するが、
    schema.ymlに手動で追加した外部キー設定などが残るか確認しておく

☆作業中に引っかかったところ
●コメントの詳細ページを作る
・executeDetail()に対応させるべきdetailSuccess.phpを作成してなかった
・symfony propel-build-modelを打ってなかった
・schema.ymlに手動で追加した外部キー設定などが残るか確認しておく
    残って無かったから追記した
    comment_id:
      type: INTEGER
      required: true
      foreignTable: comment
      foreignReference: id
・actionでカテゴリーを読み込んでなかった
    $this->categorys = sfConfig::get("sf_categorys");

●commentテーブルに「access_cnt」カラムをint型で作成し、アクションが読み込まれるたびにカウントアップしていくようにする!・sqlコマンドを忘れてた(phpmyadminでやった)→ALTER TABLE `comment` ADD `access_cnt` INT NOT NULL AFTER `created_at`
-----------------------------memo------------------------------

0 件のコメント:

コメントを投稿