Going for Symfony | 第二天

第一天的过程中,完成了数据库建模,今天要实现前端的模块。在这个模块中我们将实现如下的效果(当然只是部分——因为数据库还没有完全建立起来):

day-2

首先需要创建这个模块。我们可以简单的将模块理解为一个应用中的一个有机组成部分:

symfony propel:generate-module --with-show --non-verbose-templates frontend
books BookBook

Symfony会在apps/frontend/modules/books下根据BookBook类再次创建一系列文件夹和文件:

  • /actions: 模块可进行的操作——动作
  • /templates: 模块对应的模板

缺省情况下,模块可进行的操作有:index, new, show, edit, delete, create, update等7个。具体的作用这里不详细描述。

一旦模块创建完成,我们就已经可以用http://localhost/frontend_dev.php/books 来进行访问了。此时的页面将列出所有的书本的所有信息。这往往不是我们所想要的。所以我们需要对模板进行定制。

Symfony支持嵌套模板的定义。整个frontend都将基于apps/frontend/templates下的layout.php文件,我将其重新改造:

<?php if (!include_slot('title')): ??>
任氏有无轩:藏书、读书及其它
<?php endif; ??>
<div class="p_bot">
<div class="float_left">
    <img alt="p_botl" src="/images/p_botl.gif"></img></div>
<div class="float_right">
    <img alt="p_botr" src="/images/p_botr.gif"></img></div>
</div>
<?php include _partial('books/bottom', array('thisyear'=?>date('Y'))) ?>

这里我还用到了子模板。子模板存放在apps/frontend/modules/books/templates下面,命名的约定是在top之前加一个_符号。

剩下的操作就比较简单了。编写各种BookBookPeer里的静态函数来返回数据集。这里需要说明一点,Propel对SQL统计的支持不是很好,这也是一直一来为人诟病的地方。在Propel中要使用SQL统计(比如SUM操作)需要进行一些代码编写:

static private function doSelectSum($field)
{
    $criteria=new Criteria();
    $criteria->clearSelectColumns();
    $criteria->addSelectColumn('sum('.$field.')');
    $result=BookBookPeer::doSelectStmt($criteria);
    $row=$result->fetchAll();
    return $row[0][0];
}

然后通过变量传递和循环就可以显示记录了:

day-2-2

仔细看产生的链接:http://localhost/frontend_dev.php/books/98.html 。这个链接是通过修改routing.yml和使用link_to函数实现的:

#routing.yml
books:
  url: /books
  class: sfPropelRouteCollection
  options:
    model: BookBook
book_show:
  url: /books/:id.html
  class: sfPropelRoute
  options:
    model: BookBook
    type: object
  param:
    module: books
    action: show
  requirements:
    id: w+
    sf_method: [get]

//_index_left.php
<div>
<?php echo $book-?>getPurchdate('Y-m-d') ?>  <?php echo link_to(truncate_text($book-?>getTitle(), 12, '...'), 'book_detail', $book) ?>
</div>

通过一些简单的设置,我们在构建URI的时候,只要传入对应的路径和对象即可,link_to函数会根据路径的要求,从对象中获得需要的参数而构建出合适的URI。很简单啊……

Comments

Leave a Reply

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