在Zend framework中使用“用户控件”

听到用户控件,一定会想到asp.net中那个方便的可以随便拖拽到任何页面中使用的小东西。做了多年的.net,其中的许多概念已经扎根在意识里面,以至于现在做一些zend framework的东西,还要怀念.net中的概念。所以这篇文章,如果你也是一直做.net开发,现在刚开始做php,那么应该会更容易理解。

这两天做一个使用zend framework的项目,遇到一个很小的问题,就是要在不同的页面中显示同样的一段内容,这段内容可能需要后台代码的支持。无奈对zend framework只知道皮毛,于是各种搜索,并群里面提问。但我提的问题,纯粹的phper并不明白,于是有了许多关于第三方实现控件的回答,因为他们并不了解用户控件是什么意思,而zend framework并没有用户控件这个概念。

所以我想,到底应该从哪个方向(名词)或思路来入手呢?

向来针对实现一个功能,我都认为是比较简单的。如果没成功,要么就是思路错了,要么就是自己对概念了解不甚清楚。因为当今的搜索引擎这么强大,在清楚问题的时候,找到某具体问题的实现方式并不难。而我,就是卡在了对当前问题实现思路的问题上。另外由于对zend framework理解不深,一些问题的处理上还比较死板。

这是一个很复杂的功能么?当然不是。如果只是页头或页尾,我们完全可以通过layout完成(layout就是.net中的母版页)。而页面中随便一个位置的内容呢?实际上我们只是需要把同一段代码放入不同的视图中而已。

等等!这里出现一个视图的名词,这是zend framework中的一个概念。实际上就是MVC中的那个V,就是用来提供展示的。而所谓的展示,无非就是形成html代码么。

其实本人倒并不是第一次做php的项目,之前这种情况,就是使用@inculde把对应的php代码包含进来就行了,另外有require once。但zend 对url进行了重写,代码执行或许会遇到某些问题。于是仔细查看了下zend framework的文档,发现如下一段代码。
<?php
//使用一个模型来获取书籍作者和标题相关数据。
$data = array(
array(
'author' => 'Hernando de Soto',
'title' => 'The Mystery of Capitalism'
),
array(
'author' => 'Henry Hazlitt',
'title' => 'Economics in One Lesson'
),
array(
'author' => 'Milton Friedman',
'title' => 'Free to Choose'
)
);
//传递数据给Zend_View类的实例 
Zend_Loader::loadClass('Zend_View');
$view = new Zend_View();
$view->books = $data;

//解析一段View代码"booklist.php"来显示数据
echo $view->render('booklist.php');

似乎很简单的一段代码,我只是注意到最后一行:
echo $view->render('booklist.php');

这个render实际上是把所要的结果生成了一段文本(用词莫怪,文本中可能包含html)。这个似乎就是我所需要的啊,我们只需要在我们的View中,把对应的所谓用户控件生成的html代码作为变量就可以了,我们在后台把render的结果复制给该变量即可实现。于是参照该代码进行试验,无奈程序中是报错说找不到视图booklist.php。

又查阅多篇关于zend framework视图的文章,结合测试,发现如下写法可行:
Zend_Loader::loadClass('Zend_View');
$view = new Zend_View();
$view->setScriptPath('./application/modules/default/views/scripts/component/');

$shotliststr=$view->render('shotlist.php');
$this->view->shotlist=$shotliststr;

也就是说需要指定路径否则就找不到,当然,这么写也可以
$view->setScriptPath('.');
$shotliststr=$view->render('./application/modules/default/views/scripts/component/shotlist.php');

但是我测试了其他写法,比如/开头的写法,都找不到,现在对路径的写法还不是特别明白,希望有明白人指教。

标题说的是实现zend framework中的用户控件,这里其实就是把类提了出来,代码如下:
class Custom_Common_UserControl extends Zend_View
{
function __construct(){

$this->setScriptPath('./application/modules/default/views/scripts/usercontrol/');
}
}

这里把路径指过去了,不用每次使用的时候重新指定路径了。具体使用的时候只需要:
$view = new Custom_Common_UserControl();
$shotliststr=$view->render('shotlist.php');

看着还是比较初级。不知道有没有什么更好点的实现方法。

评论

此博客中的热门博文

搜索即服务平台searchify的基本概念

部分开放平台url分享统计api

域名从sinaapp转到这里来了