CakePHP中文手册【翻译】-View

View

1

View

一个View就是一个页面模版,通常是在一个动作之后命名。例如,PostsController::add()的视图是/app/views/posts/add.thtml.Cake view是非常简单的PHP文件,因此你可以在他们内部使用任何PHP代码。尽管大多数的view文件包含HTMLview也可以是某些特定数据的任何表现形式,可以是XML,图像等。

view模版文件中,你可以使用来自相应Model的数据。将会把此数据传递给一个称为$data的数组。在Controller里,用set()方法处理的任何view数据现在在你的view里也可用了。

缺省的,HTML Helper在每个view里都是可用的,到目前为止,在view中它是最常用的helper。在创建表单,当然包含脚本,媒体,链接以及数据验证时,它显得非常有用。请参看Helper那章的第一节的关于HTML helper的讨论。

view中大多数可用函数都由Helper提供。Cake有一些非常棒的helper(他们会在Helper这章中讨论),而且你也可以包含你自己的。因为view不会包含太多的逻辑,因此在view类里,并无太多使用得非常好的公共函数。其中有一个有用的是renderElement(),它将在1.2节中讨论。

布局(Layout

一个布局包含了所有表现的代码,这些代码组成一个view。在所有view中你想看见的任何东西应该放在布局里。

布局文件放在/app/views/layouts. Cake缺省的布局可以由一个新的缺省的布局重写。这个布局在/app/views/layouts/default.thtml.一旦创建一个新的缺省布局,当render页面时,controller view代码就会放在缺省的布局里。

当创建一个布局时,你需要告诉Cake将你的controller view代码放在哪里:为了实现此,确保你的布局为$content_for_layout包含一个位置(可选的,, $title_for_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>

 

为了设置布局的标题(title),在controller中最简单的方法是使用$pageTitle controller变量。

class UsersController extends AppController
{
    function viewActive()
    {
        $this->pageTitle = 'View Active Users';
    }
}

只要愿意,你可以为你的Cake站点创建任意多的布局,只需要将他们放在app/views/layouts目录下即可,在Controller的动作(action)里,使用Controller$layout变量或者setLayout()函数来选择他们。

例如,如果站点的某一部分(section)包含一个比较小的广告条空间,我可以创建一个新的布局,而且这个布局有一个小的广告空间,并向所有controller的动作指定该布局,如下:

var $layout = 'default_small_ad';

元素

很多应用程序有一些小的表现代码段,它们在不同的页面中需要重复,有时是在某布局的不同地方。Cake能帮助你重复使用站点中需要重用的部分。这些重用的部分称为元素(Element)。在Cake中,广告,帮助框,导航控件,额外菜单,以及调用通常作为元素来实现的。基本上,一个元素是一个迷你view,它也可能包含在其他View里。

元素在/app/views/elements/文件夹下,并且.thtml是其文件扩展名。

缺省的,元素不会访问任何数据。为了给它这个权限,你需要将它作为一个数组中的命名参数来发送。

无参调用元素

<?php echo $this->renderElement('helpbox'); ?>

调用一个元素传递一个数据数组

<?php echo
$this->renderElement('helpbox', array("helptext" => "Oh, this text is very helpful."));
 ?>

在元素文件里,所有传递的变量都作为他们在传递数组的键名(非常类似在Controllerset()是如何和view工作的)来应用。在上面的例子中,/app/views/elements/helpbox.thtml 文件可以使用$helptext变量。当然,将数组传递到元素中会更加有用。

通过将重复的元素render到它们自己的文件中,元素会让view变得更加具有可读。在你的站点里,他们也可帮助你重用内容块。

Last Updated:2006-12-03
posted @ 2006-11-17 11:13 Confach 阅读(1332) 评论(14)  编辑 收藏

 回复 引用   
#1楼 2006-12-02 10:36 zhang[匿名][未注册用户]
首先感谢***翻译
我最近才开始看cake的
调试的时候不知道为什么在view文件中加入这段代码
echo($this->renderElement('errorMessage', array('message' => $error->showMessage('User/login'))
就报下面的错误
Fatal error: Call to a member function on a non-object in e:\www3\app\views\users\login.thtml on line 11
是不是我的配置有问题呢?
希望不吝赐教
另:程序是我在cakephp.com上下载的user组件

 回复 引用 查看   
#2楼[楼主] 2006-12-02 17:54 LIVE      
首先感谢你的关注。
这种错误其实它提示的比较清楚了,就是第11行有个对象为null或者其他什么的。举个例子吧,如果你执行$db->query("select * from user"),如果$db为null,那么也会报出类似的错误。
希望以上的回复对你友帮助!

 回复 引用   
#3楼 2006-12-04 09:24 zhang[匿名][未注册用户]
谢谢你的回复
这个错误的基本意义我是清楚的
但是为什么会出现如上的错误呢?
这个应该就是cake自动包含的类吧,是不是我哪里没有配置成功呢,还是我的下载的版本和我的demo版本不符?(因为我需要修改N多地方才可以勉强运行起来)

 回复 引用 查看   
#4楼[楼主] 2006-12-04 09:30 LIVE      
不好说,可以告诉我login.thtml 的11行代码是什么呢?
 回复 引用 查看   
#5楼 2006-12-04 14:07 MinisFox      
问题解决了,谢谢楼上
我把问题和解决方法都写下吧,避免有人重复范这样的错误^_^
症状:经常无缘无故地调不到cake的类库,报错为某个类没有事例化或者调用某个空对象的方法,例如:
echo($this->renderElement('errorMessage', array('message' => $error->showMessage('User/login'))
就报下面的错误
Fatal error: Call to a member function on a non-object in e:\www3\app\views\users\login.thtml on line 11
界面也显示不正常(主要是图片和css调用不到)
问题所在:cake需要mod_rewrite的支持,我查了下我的apache有包含mod_rewrite,但是我没有注意到我的apache里面在根下面 .htaccess文件不能起作用,也就是
<Directory />
Options FollowSymLinks ExecCGI Indexes
AllowOverride Options FileInfo ( 原先是none ,.htaccess就不起作用,不知道为什么,可能是权限的问题,能否解答下?)
</Directory>
今天在CNBLOGS里面我也找了个地方,有相关问题可以交流下
http://www.cnblogs.com/fjytzh/

 回复 引用 查看   
#6楼[楼主] 2006-12-04 14:22 LIVE      
@MinisFox
你用的是Windows吧?如果是Windows一般会有这样的问题的。

 回复 引用 查看   
#7楼[楼主] 2006-12-04 14:29 LIVE      
@MinisFox
请参看安装CakePHP(http://www.cnblogs.com/confach/articles/547091.html)中的第5节:配置Apache 和 mod_rewrite,希望对你有帮助

 回复 引用 查看   
#8楼 2006-12-04 14:52 MinisFox      
thank you !
可能我对这句话没有理解透^_^:
http://www.cnblogs.com/confach/articles/547091.html
第5节的line:4
“务必使AllowOverride 对正确的Directory设置为All”
建议改为
“务必使AllowOverride 对对应的Directory设置为All”

 回复 引用 查看   
#9楼[楼主] 2006-12-04 15:33 LIVE      
@MinisFox
thanks,接受你的建议,已经改正。
由于这只是翻译的初稿,肯定会有很多不妥之处,希望能得到你的建议和帮助。

 回复 引用   
#10楼 2007-05-24 10:47 color[未注册用户]
CakePHP Rapid Development
Missing controller
You are seeing this error because controller PostsController could not be found.

Notice: If you want to customize this error message, create app\views/errors/missing_controller.thtml.

Fatal: Create the class below in file : app\controllers\posts_controller.php

<?php
class PostsController extends AppController {
var $name = 'Posts';
}
?>

这个错误是什么意思啊?

 回复 引用 查看   
#11楼[楼主] 2007-05-24 13:25 Confach      
@color
因为你没有创建Post的controller,所以你需要创建PostsController.
就如你的评论里的最后几行代码一样.

 回复 引用 查看   
#12楼[楼主] 2007-05-24 13:28 Confach      
@color
说的具体一点吧,比如说,你想查看id为1的post
可能的URL位http://youdomain/post/view/1,这个时候可以定义其Controller,如下:
<?php
class PostController extends AppController
{
function view($id)
{
/* your code here*/
}
}
?>

然后建立一个view页面与之对应即可

 回复 引用   
#13楼 2007-08-10 17:09 omiyang[未注册用户]
我现在有个问题,我使用cakePHP开发了一个网站,但是服务器不允许使用.htaccess,我应该在vhosts文件里怎么配置才能让项目跑起来呢?
以下是我的vhost配置,跑的时候就报400错误

<VirtualHost *:80>
DocumentRoot "E:\workspace\...\app\webroot"
ServerName www.XXX.com

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ webroot/index.php?url=$1 [QSA,L]

<Directory "E:\workspace\...\app\webroot">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

 回复 引用   
#14楼 2007-08-10 17:10 omiyang[未注册用户]
一开始是这样写的,但是也不行
<VirtualHost *:80>
DocumentRoot "E:\workspace\...\app\webroot"
ServerName www.XXX.com

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

<Directory "E:\workspace\...\app\webroot">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

Blackberry Document