今天忙里偷闲,继续对我的藏书管理程序进行Symfony的改造。界面效果如下:
首先,当然是routying.yml的编辑:
book_list:
url: /books/search
class: sfPropelRoute
options:
model: BookBook
type: object
param:
module: books
action: search
然后是在action.class.php中加入对search动作的处理:
public function executeSearch(sfWebRequest $request)
{
$this->pager=new sfPropelPager('BookBook', sfConfig::get('app_records_on_book_search'));
$this->pager->setPage($request->getParameter('p',1));
$this->pager->init();
}
这个函数中用到的分页处理是标准的Symfony处理方式。对pager的进一步处理都将在具体的模板中处理——我个人认为这个不是最好的方法,不过貌似也没有更好的方法了:
<?php slot('title', '任氏有无轩:书籍列表') ?>
<?php include_partial('books/list', array('books'=>$pager->getResults())) ?>
<?php if($pager->haveToPaginate()): ?>
<div class="page">
<a href="<?php echo url_for('book_list')?>?p=1">
<img src="/images/first.png" alt="First Page" />
</a>
<a href="<?php url_for('book_list')?>?p=<?php echo $pager->getPreviousPage() ?>">
<img src="/images/previous.png" alt="Previous Page" />
</a>
<?php
foreach ($pager->getLinks() as $page)
{
if($page==$pager->getPage())
{
echo $page;
}
else
{
?>
<a href="<?php echo url_for('book_list')?>?p=<?php echo $page ?>"><?php echo $page ?></a>
<?php
}
}
?>
<a href="<?php url_for('book_list')?>?p=<?php echo $pager->getNextPage() ?>">
<img src="/images/next.png" alt="Next Page" />
</a>
<a href="<?php url_for('book_list')?>?p=<?php echo $pager->getLastPage() ?>">
<img src="/images/last.png" alt="Last Page" />
</a>
</div>
<?php endif; ?>
这里的处理无非是将结果集提出来,然后根据目前的页数设置不同的图标的链接。这里我也用到了include_partial来包含另一个模板,在那个模板中当然只是简单的循环显示书籍的信息而已。
有一个小问题,在_list.php中,我首先是对奇偶行进行不同CSS类的设置,同时用jQuery对mouseover/mouseout进行处理:
$(".list_cs_a").mouseover(
function(event)
{
$(this).removeClass("list_cs_a");
$(this).addClass("a_over");
}).mouseout(
function(event)
{
$(this).removeClass("a_over");
$(this).addClass("list_cs_a");
}
);
在编写这个函数时,一开始我犯了经验主义的错误,我认为一旦我addClass后,原来的$()选择子将无法进行:因为该DOM元素的CSS类变化了,而我正是根据CSS类来进行选择的呀……但是,事实证明,我这样写是对的。显然,在选择后对象已经生成了,此时改变对象的属性并不能改变对象本身……
Leave a Reply