Going for Symfony | 第五天

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

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *