作者:老王 CakePHP的模板技术基本上沿用了Rails的方式,也使用了layout技术(链接),子模板的内容会替换layout中的$content_for_layout变量。这样的方式很简单,但它也有很多弊端,比如说title的渲染是由layout中的$title_for_layout变量负责的,通常CakePHP程序员是通过在Controller里使用$this->pageTitle的方式来设置title的,但是因为title的内容会涉及很多显示逻辑(比如为了SEO),所以在Controller里设置title是丑陋的,同样的情况也会出现在诸如meta等情况里。 下面看看Django里的视图技术(链接): {% extends "base_generic.html" %} {% block title %}{{ section.title }}{% endblock %} {% block content %} <h1>{{ section.title }}</h1> {% for story in story_list %} <h2> <a href="{{ story.get_absolute_url }}"> {{ story.headline|upper }} </a> </h2> <p>{{ story.tease|truncatewords:"100" }}</p> {% endfor %} {% endblock %} Django的模板同样很简单,即使你不了解Django的语法也能大概猜出上面代码的意思。这里extends的作用其实就是layout的作用,在父模板里有若干个block,在子模板里也有若干个block,子模板里的block可以覆盖(也可以不覆盖)父模板里的block,这样,就不会再有上面提到的title,meta等坏味道了。 换个角度看,CakePHP的模板技术算是Django的一个简化版本,如果你想在CakePHP中实现Django的block功能,可以通过自定义helper来实现,但这毕竟不是内核级实现,多少还是有些不爽。 |