作者:老王 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來實現,但這畢竟不是內核級實現,多少還是有些不爽。 |