2012年5月25日金曜日

2012年05月24日 講義070日目

2012年05月24日
講義070日目
------------------------------1H------------------------------
★symfony
●detailのアクションを通るたびにカウントアップしていくロジック
・comment/action.class.php
    public function executeDetail()
    {
        $comment_id = $this->getRequestParameter("id");
        $this->comment = CommentPeer::retrieveByPk($comment_id);

        //access_cntの値をカウントアップ
        $access_cnt = $this->comment->getAccessCnt();
        $access_cnt++;
        $this->comment->setAccessCnt($access_cnt);
        $this->comment->save();

        $this->categorys = sfConfig::get("sf_categorys");

        return sfView::SUCCESS;
    }
・component.class.php
    public function executeAccessCountRanking()
    {
        $c = new Criteria;
        $c->addDescendingOrderByColumn(CommentPeer::ACCESS_CNT);
        $c->setLimit(5);
        $this->access_ranks = CommentPeer::doselect($c);

        //確認用↓
        //print_r($this->access_ranks);

    }

・_accessCountRanking
<?php use_helper("MyUtility")?>
<div class="componentBox" >
<h3>アクセスランキング</h3>
<?php foreach($access_ranks as $v):?>
<p>
  アクセス数:<?php echo $v->getAccessCnt()?><br>
  記事:<a href="/comment/detail/id/<?php echo $v->getId()?>"><?php echo my_mb_truncate_text($v->getContent())?></a>
</p>
<?php endforeach;?>
</div>

・ランキングを時間によって切り替えるロジックを入れてみる
<div id="contentRight">
<?php if(date("i") < 30):?>
<?php include_component("default","replyRanking");?>
  <?php else:?>
<?php include_component("default","accessCountRanking");?>
<?php endif;?>
</div>

●Criteriaでsql文を使う
発行されるSql文を参照する関数「toString」
echo $c->toString();exit;
SELECT FROM ORDER BY comment.ACCESS_CNT DESC
がメッセージとして表示される

------------------------------2H------------------------------
★symfony
●機能別にモジュールやアクションを増やす
・news
モジュール
  一日おきに削除フラグで表示しないようにcrontabで自動化
テーブルの構成
  id
  title text
  article text
  delete char(1)
  created_at datetime
 
・contact
モジュール
  お問い合わせが完了したらテーブルに保存メールを投げる
テーブルの構成
  id
  mailaddress text
  name text
  contact text
  send_flg char(1)
  created_at datetime
     
・sitemapアクション
サイトマップ
特に増える要素が無いので
・indexSuccessで表示できるように追加
<div id="header">
<?php echo link_to("トップへ","/")?>
 |
<?php echo link_to("NEWS","/news/")?>
 |
<?php echo link_to("お問い合わせ","/contact/")?>
 |
<?php echo link_to("サイトマップ","/sitemap/")?>
 |
<?php echo link_to("管理者用ページへ","/backend/")?>
</div>
------------------------------3H------------------------------
★symfony

・newsの一覧がページに表示される
毎日15時に、newsテーブル内のデータを参照し
作成時間から1週間以上経過してるレコードは削除フラグを立てて表示しないようにする
・テスト用のデータをデータベースに入れる
insert into news (title, article, delete_flg, created_at)
values("ニュース1","テスト用の記事です","n","2012-05-16 00:00:00");
・schema.ymlの中のデータベースの外部キーの設定を維持するために
sf.shonanbbs.com/config/schema.yml
    comment_id:
      type: INTEGER
      required: true
      foreignTable: comment
      foreignReference: id
をどこかにコピーしておく

mysqlで外部キー設定をしておけばこの設定は消えない
・symfony propel-build-schema
schema.ymlにコピーしておいた部分を貼り付ける
☆インデントに注意しないとsymfony propel-build-modelを打ったときにエラーがでる

schema.ymlがデータベースの構成の元に新たに作成された
・symfony propel-build-model
モデルを作成する
------------------------------4H------------------------------
★symfony


  public function executeIndex()
  {

      $c = new Criteria;
      $c->add(NewsPeer::DELETE_FLG,"y",Criteria::NOT_EQUAL);
      $c->addDescendingOrderByColumn(NewsPeer::CREATED_AT);
      $this->news_arr = NewsPeer::doSelect($c);


      return sfView::SUCCESS;
    //$this->forward('default', 'module');
  }



------------------------------5H------------------------------
★symfony
●batchフォルダ
・symfonyにおいて、自動的に動く処理をおいてくのが推奨されてる
プロジェクト/batch/にnewsAutoDelete.phpの作成

・外部からsymfonyのプロジェクト内の処理を操りたい場合、
  フロントコントローラと同様の記述が必要
フロントコントローラの記述をコピー
index.phpからコピー
define('SF_ROOT_DIR',    realpath(dirname(__FILE__).'/..'));
define('SF_APP',         'front');
//define('SF_ENVIRONMENT', 'prod');
//define('SF_DEBUG',       false);
define('SF_ENVIRONMENT', 'dev');
define('SF_DEBUG',       true);

require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');

・データベースに接続するための処理を書く
$sfDataBaseManager = new sfDataBeseManager;
$sfDataBaseManager->initialize();
と記述するとデータベースに接続できるようになる

------------------------------6H------------------------------
★symfony
●データベースを使う処理を作ってみる
①Criteriaを使って、Newsテーブル内でdelete_flgが"y"でないものを取得

②①で取得した配列をループし、現在の時刻一週間よりも前のレコードがあったら、
delete_flgを"y"に書き換える
・デバックしたい場合は
echo date(strtotime("-1 week",time()));
などをファイルに記述しputtyからコマンドを打って表示を確認する
[nishi@localhost batch]$ php ./newsAutoDelete.php
1337238315[nishi@localhost batch]$

・デリートフラグを書き換える処理
$c = new Criteria;
$c->add(NewsPeer::DELETE_FLG,"y",Criteria::NOT_EQUAL);
$news_arr = NewsPeer::doselect($c);

$del_date = date("Y-m-d H:i:s", strtotime("-1 week"));
foreach($news_arr as $v){
    if($del_date > $v->getCreatedAt()){
        $v->setDeleteFlg("y");
        $v->save();
    }
}

・crontabの設定
[root@localhost batch]# crontab -e
* 12 * * * /usr/bin/php /home/nishi/sf.shonanbbs.com/batch/newsAutoDelete.php
毎日昼の12時に動くようになる
-----------------------------memo------------------------------

0 件のコメント:

コメントを投稿