一个view是一个页面模版,通常按action的名字命名。例如,PostsController::add的view位于/app/views/posts/add.thtml。Cake view是非常简单的PHP文件,因此你可以在其中使用任何PHP代码。尽管你的大多数view文件包含HTML代码,一个view可以是对一个特定数据集的任意表示,XML,图像,等等。
在view模版文件里,你可以使用相关model提供的数据。这些数据通过$data数组传递过来。你在controller里边使用set()方法递交给view的所有数据也是可用的。
默认情况下,HTML helper对于每一个view都是可用的,并且到目前为止它是view里边最常用的helper。它对于创建表单,插入客户端脚本和多媒体,协助数据验证都是非常有用的。关于HTML helper的详细讨论,请参见“Helpers”章的Section 1。
在view里使用的大多数功能都是由helper提供的。Cake提供了许许多多的helper(在“Helpers”章里讨论),并且你也可以定义自己的helper。由于view不应该包含太多业务逻辑,view类并没有提供太多广泛使用的公共方法。其中一个很有用的是renderElement(),我们将在section 1.2看到它。
Layouts 布局
一个layout(布局)包含了所有包裹在view之外的表现代码。Layout文件都放在/app/views/layouts目录里。你可以重写一个默认的layout来取代位于/app/views/layouts/default.thtml的Cake默认layout。一但创建了新的默认layout,当页面render的时候controller view的内容会被替换到默认layout中。
当你创建一个layout的时候,你需要告诉Cake在哪里放置controller view的内容:确保你的layout包含$content_for_layout(还有$title_for_layout,不过它是可选的)。以下是一个默认layout的示例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title><?php echo $title_for_layout?></title> <link rel="shortcut icon" href="favicon.ico" type="image/x-icon"> </head> <body> <!-- If you'd like some sort of menu to show up on all of your views, include it here --> <div id="header"> <div id="menu">...</div> </div> <!-- Here's where I want my views to be displayed --> <?php echo $content_for_layout ?> <!-- Add a footer to each displayed page --> <div id="footer">...</div> </body> </html>
要为layout设置标题(title),最简单的办法是在controller里使用$pageTitle变量来设置。
class UsersController extends AppController { function viewActive() { $this->pageTitle = 'View Active Users'; } }
只要需要,你可以随意为你的Cake站点创建任意数量的layout,只要把他们放在app/views/layouts目录,并且在你的controller action里边使用controller的$layout变量或者setLayout()方法来切换layout。
比如,我的站点中有一个包含小型广告区域的部分,我也许可以创建一个具有更小的广告区域的layout并且使用以下语句来指定它为所有controller action的layout:
var $layout = 'default_small_ad';
Elements 元素
许多应用程序都会有一些在各个页面见不停重复的表现层代码,有时他们只是在layout里的不同地方。Cake可以帮助你复制站点中的某些区块,如果需要的话。 我们将这些可重用的页面区块称为Element(元素)。广告,帮助框,导航栏,菜单和插图都被Cake实现成为element。一个element其实可以看作是可以包含在其他view里边的mini-view。
所有element都生活在/app/views/elements目录下,并且文件扩展名为.thtml。
默认情况下,element访问不到任何数据。想让它具有对数据的访问权,你需要将数据放在数组里传递给它,并不要忘了为这些数据带上名字(键-值对数组)。
无参数地调用一个element
<?php echo $this->renderElement('helpbox'); ?>
调用一个element,并传入包含数据地数组
<?php echo $this->renderElement('helpbox', array("helptext" => "Oh, this text is very helpful.")); ?>
在element文件里,所有传入的变量都可以通过他们在参数数组里的键名来使用(有点类似于在view里边使用controller用set()设置的变量)。在上边这个例子中,/app/views/elements/helpbox.thtml文件可以使用$helptext变量。当然,如果传递一个数组给element会更佳有用。
element使view具有更佳的可读性,而把render重复的element的部分放在对应的element文件中。它们也可以帮助你重用站点中的内容区块。
来源: http://www.1x3x.net/cakephp/view.html