2008/10/23
cake中的布局(layout)确实不错,可惜不能包含多个模板文件(view)进来。
前几天在网上看到一个实现方法,http://www.xuzhousoft.cn/content/view/48/1/ ,看了一下代码,是用helper来实现的,感觉有点费劲。从代码看,其view文件中应该不支持$session,$html之类的了。
下面介绍一款简单实用的方法。先来看看cake的layout是如何实现下面这个的:
1 <?php echo $content_for_layout; ?>
在cake/libs/view/view.php中有个方法叫做: function renderLayout()其中有$data_for_layout如下:
01 <?php
02 $data_for_layout = array_merge($this->viewVars,
03 array(
04 'title_for_layout' => $pageTitle,
05 'content_for_layout' => $content_for_layout,
06 'scripts_for_layout' => join("\n\t", $this->__scripts),
07 'cakeDebug' => $debug
08 )
09 );
10 ?>
也就是说实现的数据都是准备好的,从这一点上来讲就很难扩展了,因为变量就那么几个啊。
下面介绍一个方法,看代码:
01 <?php
02 /**
03 * 引入其他view文件,在layout中支持多个view
04 *
05 * @param string $name 在view目录下的文件
06 * @return string
07 *
08 */
09 function template($name) {
10 $s = addslashes( ROOT.DS.APP_DIR.DS.'views'.DS.$name.'.ctp' );
11 return "require(\"$s\");";
12 }
13 ?>
将这个函数添加到你的项目中去,然后在你的layout中添加如下代码即可包含多个view:
view/layout/default.ctp
1 ...
2 <?php
3 //包含模板 include you template
4 eval(template('elements'.DS.'hello'));
5 ?>
6 ...
view/elements/hello.ctp
1 <?php
2 echo 'yes!';
3 //可以支持controller中声明的所有变量和helper
4 echo $session->read('Login.name');
5 ?>
呵呵,很简单吧!
No comments:
Post a Comment