今天继续加深书籍详细信息页面的构造。
在G+上95对我的进展发了一个评论:
再加上点自动抓取网上共享章节的功能
对这个要求,我只能说我只能实现一点点。我将在详细信息页面中构造一个显示豆瓣对应书籍的信息的部分。
另外,我要实现一个功能是在这个页面中编辑书籍tags的功能。
今天继续加深书籍详细信息页面的构造。
在G+上95对我的进展发了一个评论:
再加上点自动抓取网上共享章节的功能
对这个要求,我只能说我只能实现一点点。我将在详细信息页面中构造一个显示豆瓣对应书籍的信息的部分。
另外,我要实现一个功能是在这个页面中编辑书籍tags的功能。
重构进入第二天——熟悉我风格的人都知道,这不是真正的第二天。
今天主要进行书籍详细信息页面的创建,以及对书籍封面的处理。
页面的创建继续使用Bootstrap来完成,用到的元素包括Hero Unit,Table等。我这里不进行详细的展开。
相较之前的页面,我准备在新的页面中加入书籍的封面。这里的一个问题是:不是所有我收藏的书我都扫描了封面——以后也许会的,但是目前的话,我觉得用一个类似缺省封面的设计是比较好的。
Symfony是我最喜欢用的PHP框架,没有之一。我从2009年1月开始用Symfony 1.2(系列教程第一篇:Going for Symfony | 第一天)重建我的“任氏有无轩”,然后在2011年3月用Symfony 1.4.9(系列教程第一篇:重构狗屎皮:第一天)重建“狗屎皮”,一直就没有离开过Symfony这个环境。
我一直关注Symfony这个框架。最近这个框架推出了Symfony 2,其官方站点也迁移到了http://symfony.com/。目前这个框架还没有正式发布,写作本文时可以下载到的是PR10版本(下载地址请戳这里)。
请注意:Symfony 2需要PHP 5.3的支持,因为它用到了PHP的新特性namespace。
在第六天,重构后的狗屎皮终于上线了:http://www.go4pro.org 。总结一下,目前新版的狗屎皮的架构是这样的:
第一大功能模块是后台的机器人抓取模块,由猛禽开发,使用的语言是Python。机器人负责遍历所有的文章来源的RSS并取出新的文章并存入数据库。
第二大功能模块是前台,由TR开发,使用的语言是PHP+Symfony 1.4。这个模块用来显示数据库里的文章等。
今天进入了狗屎皮重构的第三天。今天要解决一个很关键的问题:如何让用户贴出评论?
先看界面:
这时一个标准的主从表界面:帖子内容、已经有了的评论内容再加上一个表单方便用户提交评论。
我本来认为要完成用户提交评论,在Symfony下是很简单的——简单到你可以不用写任何额外的代码,但实际情况并不如此。
主要的一些修改如下。
首先,要修改article的action.class.php文件中的executeShow函数:
class articleActions extends sfActions
{
public function executeShow(sfWebRequest $request)
{
$article=$this->getRoute()->getObject();
$this->article = $article;
$this->comments=Doctrine_Core::getTable('g4pcomment')->getComments($article->getId());
$this->form=new G4pCommentForm();
}
......
}
上述代码中必须人肉创建了一个comment的表单,并传递到模板中进行进一步处理。
在showSuccess.php模板中,通过include_partial来显示comment表单:
include_partial('comment/form', array('form'=>$form, 'article_id'=>$article->getId()));
注意,我还额外传递了一个article_id参数进去,这是为了后续的处理。
修改comment表单文件如下,让它带一个article_id的参数:
<?php echo form_tag_for($form, '@comment') ?>
最后,修改comment的create以及processForm函数:
public function executeCreate(sfWebRequest $request)
{
$this->forward404Unless($request->isMethod(sfRequest::POST));
$aid=$request->getParameter('aid');
$nc=new G4pComment();
$nc->set('article_id', $aid);
$nc->set('created_at', date('Y-m-d H:i:s'));
$this->form = new G4pCommentForm($nc);
$this->processForm($request, $this->form);
//$this->setTemplate('article/show');
}
protected function processForm(sfWebRequest $request, sfForm $form)
{
$form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
if ($form->isValid())
{
$comment = $form->save();
$article=$comment->getG4pArticle();
//var_dump($article);
$this->redirect($this->generateUrl('show_article', array('id'=>$article->getId(), 'title_slug'=>$article->getTitleSlug())));
}
}
在executeCreate函数中,设置了一个comment的外键article_id(从前一个页面传递过来),设置了comment创建的时间。
在processForm函数中,需要修改一下处理完毕后的重定向,回到原来的帖子的页面,显示帖子、评论等。
最后,我不得不说两句。我认为这个要求是几乎所有WEB程序都会用到的,但是我提问到Symfony的官方论坛后三天没有人回答!最后还是靠自己解决了问题……
(本文收录于[go4pro.org])