这个例子同时显示了一个Symfony链接帮助器:link_to_unless()会在作为第一个参数的测试为假的情况下输出一个常规link_to(),否则会输出一个非链接的文本,并使用简单的<span>包装。
我们测试这个页面了吗?我们应进行测试。直到我们用我们自己的眼睛来验证,这个修改才算结束。要进行测试,打开在第三天所创建的测试数据文件,并且为要显示的页面浏览添加一些问题。重新运行导入数据批处理文件,然后再一次请求主页。
为子页添加路由规则
默认情况下,页面规则如下:
现在我们利用路由规则使用这些页面更易于理解:
打开apps/frontend/config/routing.yml文件并且在顶部添加下面内容:
复制代码 代码如下:
popular_questions:
url: /index/:page
param: { module: question, action: list }
并且为登陆页面添加另外的路由规则:
复制代码 代码如下:
login:
url: /login
param: { module: user, action: login }
重构
模型
question/list动作执行与模型相关的代码,这也就是我们为什么要将这些代码移动到模块中的原因。用下面的代码来代替question/list动作:
复制代码 代码如下:
public function executeList ()
{
$this->question_pager = QuestionPeer::getHomepagePager($this->getRequestParameter('page', 1));
}
并且在lib/model中的QuestionPeer.php类中添加下面的方法:
复制代码 代码如下:
public static function getHomepagePager($page)
{
$pager = new sfPropelPager('Question', sfConfig::get('app_pager_homepage_max'));
$c = new Criteria();
$c->addDescendingOrderByColumn(self::INTERESTED_USERS);
$pager->setCriteria($c);
$pager->setPage($page);
$pager->setPeerMethod('doSelectJoinUser');
$pager->init();
return $pager;
}
同样的想法也适用于我们昨天编写的question/show动作:Propel对象由其剥离的标题取回问题的用法应属于这个模块。所以用下面的代码来变更question/show动作代码:
复制代码 代码如下:
public function executeShow()
{
$this->question = QuestionPeer::getQuestionFromTitle($this->getRequestParameter('stripped_title'));
$this->forward404Unless($this->question);
}
在QuestionPeer.php文件中添加下面的代码:
复制代码 代码如下:
public static function getQuestionFromTitle($title)
{
$c = new Criteria();
$c->add(QuestionPeer::STRIPPED_TITLE, $title);
return self::doSelectOne($c);
}
模板
在question/templates/listSuccess.php中显示的问题列表在将来的某些地方还会用到。所以我们将显示问题列表的模板代码放在一个_list.php片段中,并且用下面的简单代码来代替listSuccess.php的内容:
复制代码 代码如下:
<h1>popular question</h1>
<?php echo include_partial('list',array('question_pager'=>$question_pager)) ?>