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 件のコメント:
コメントを投稿