今天忙里偷闲,继续对我的藏书管理程序进行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类来进行选择的呀……但是,事实证明,我这样写是对的。显然,在选择后对象已经生成了,此时改变对象的属性并不能改变对象本身……

No Comments