6.9视图助手(Helper)
视图脚本里经常有一些繁杂的事情,比如格式化日期、产生表单元素等等。这些可以用助手帮我们来完成。
助手类其实是一些以Zend_View_Helper_开头的类,类名的最后一段是助手的名字,助手的名字必须是首字母大写的,该类必须至少有一个以助手名字命名的方法。助手名通常是驼峰式命名,即它不会是大写字母开头的。类名是混合大小写字格式。方法名也是驼峰式命名。
默认的助手的路径通常指向Zend/View/Helper。即使用setHelperPath()方法重新指定了路径,该路径也会保持以使默认的助手能够工作。
6.9.1ZF自带的助手
示例代码:
<?php
echo $this->form('frm1', array('action'=>'action.php', 'method'=>'post'), false) ."\n";
echo $this->formHidden('id', 'submited');
$content = 'Your Name:' . $this->formText('name', '', array('size' => 20)) .'<br>';
$content .= 'Password:' . $this->formPassword('pass', '', array('size' => 20));
echo $this->fieldset('flst', $content, array('legend'=>'Name:', 'style'=>'width:200pt')) .'<br>';
echo $this->formLabel('email', 'Your Email:');
echo $this->formText('email', [email=]'you@example.com'[/email], array('size' => 32)) .'<br>';
echo 'Your Country:';
echo $this->formSelect('country', 'us', null, $this->countries) .'<br>';
echo 'Would you like to opt in?';
echo $this->formCheckbox('opt_in', 'yes', null, array('yes', 'no')) .'<br>';
echo 'Choose them:';
echo $this->formMultiCheckbox('chkbox', 'A', null, array('A'=>'valA','B'=>'valB','C'=>'valC','D'=>'valD'), '<br>') .'<br>';
echo 'Choose one:';
echo $this->formRadio('radio', 'A', null, array('A'=>'valA','B'=>'valB','C'=>'valC','D'=>'valD'), '') .'<br>';
echo $this->htmlList($this->countries) .'<br>';
echo $this->url(array('k1'=>'v1','k2'=>'v2','k3'=>'v3')) .'<br>';
echo $this->formTextarea('ta', '', array('rows'=>'5','cols'=>'25')) .'<br>';
echo $this->formFile('file', '', array()) .'<br>';
echo $this->formButton('btn', 'BUTTON', array('onClick'=>''));
echo $this->formSubmit('OK', 'OK');
echo $this->formReset('reset', 'Reset');
?>
6.9.2动作(Action)助手
允许我们在视图脚本里执行某个控制器里的动作方法。
示例:
<div id="sidebar right">
<div class="item">
<?= $this->action('assign1', 'Book'); ?>
</div>
</div>
6.9.3区域(Partial)助手
区域助手的基本用法是在它自己的视图范围内解析另一个模板的片段,类似视图脚本嵌套调用。
区域助手的基本用法:
示例:
booklist.php文件包含脚本片段:
<?php
if ($this->books):
?>
<table border=1>
<tr>
<th>作者</th>
<th>书名</th>
</tr>
<?php
foreach ($this->books as $key => $val):
?>
<tr>
<td><?php echo $this->escape($val['author']) ?></td>
<td><?php echo $this->escape($val['title']) ?></td>
</tr>
<?php endforeach; ?>
</table>
<?php
else:
?>
<p>There are no books to display.</p>
<?php
endif;
?>
在另一个视图脚本通过Partial助手调用booklist.php文件:
<?= $this->partial('booklist.php', array(
'books' => array(
array('author'=>'zhangqing','title'=>'《book for php》'),
array('author'=>'zhangking','title'=>'《book for JSP》'),
array('author'=>'zhanghing','title'=>'《book for ASP.NET》'),
)));
?>
<?php echo str_repeat('-', 60). '<br>'; ?>
<?php
$model = array(
array('key' => 'Mammal', 'value' => 'Camel'),
array('key' => 'Bird', 'value' => 'Penguin'),
array('key' => 'Reptile', 'value' => 'Asp'),
array('key' => 'Fish', 'value' => 'Flounder'),
);
?>
<dl>
<?= $this->partialLoop('partialLoop.phtml', $model) ?>
</dl>
使用 PartialLoop 来解析可迭代的(Iterable)的模型
示例:
<?php
$model = array(
array('key' => 'Mammal', 'value' => 'Camel'),
array('key' => 'Bird', 'value' => 'Penguin'),
array('key' => 'Reptile', 'value' => 'Asp'),
array('key' => 'Fish', 'value' => 'Flounder'),
);
?>
<dl>
<?= $this->partialLoop('partialLoop.phtml', $model) ?>
</dl>
以上代码中partialLoop 调用了以下partialLoop.phtml的内容:
<dt><?= $this->key ?></dt>
<dd><?= $this->value ?></dd>
6.9.4占位(Placeholder)助手
示例:
<?= $this->doctype('XHTML1_STRICT') ?>
<?php
// setting meta keywords
$this->headMeta()->appendName('keywords', 'framework php productivity');
$this->headMeta()->appendHttpEquiv('expires', 'Wed, 26 Feb 1997 08:21:57 GMT')
->appendHttpEquiv('pragma', 'no-cache')
->appendHttpEquiv('Cache-Control', 'no-cache');
$this->headMeta()->appendHttpEquiv('Content-Type', 'text/html; charset=UTF-8')
->appendHttpEquiv('Content-Language', 'en-US');
$this->headMeta()->appendHttpEquiv('Refresh', '3;URL=http://www.some.org/some.html');
echo $this->headMeta();
$this->headScript()->appendFile('/js/prototype.js')
->appendScript('xx.js');
// Putting scripts in order
// place at a particular offset to ensure loaded last
$this->headScript()->offsetSetScript(100, '/js/myfuncs.js');
// use scriptaculous effects (append uses next index, 101)
$this->headScript()->appendScript('/js/scriptaculous.js');
// but always have base prototype script load first:
$this->headScript()->prependScript('/js/prototype.js');
echo $this->headScript();
// setting links in a view script:
$this->headLink()->appendStylesheet('/styles/basic.css')
->headLink(array('rel' => 'favicon', 'href' => '/img/favicon.ico'), 'PREPEND')
->prependStylesheet('/styles/moz.css', 'screen', true);
// rendering the links:
echo $this->headLink();
?>
<?php
$this->placeholder('foo')->setPrefix("<ul>\n<li>")
->setSeparator("</li><li>\n")
->setIndent(4)
->setPostfix("</li></ul>\n");
$this->placeholder('foo')->set("Some text for later-1");
$this->placeholder('foo')->bar = "Some text for later-2";
echo $this->placeholder('foo');
$foo = $this->placeholder('foo');
echo $foo[0] .'<br>';
echo $foo['bar'] .'<br>';
?>
<!-- Default capture: append -->
<?php
$this->placeholder('hoo')->captureStart();
foreach ($this->data as $datum)
{
?>
<div class="hoo">
<h2><?= $datum['title'] ?></h2>
<p><?= $datum['content'] ?></p>
</div>
<?php
}
$this->placeholder('hoo')->captureEnd();
?>
<?php
echo $this->placeholder('hoo')
?>
<!-- Capture to key -->
<?php
$this->placeholder('woo')->captureStart('SET', 'data');
foreach ($this->data as $datum):
?>
<div class="woo">
<h2><?= $datum['title'] ?></h2>
<p><?= $datum['content'] ?></p>
</div>
<?php
endforeach;
$this->placeholder('woo')->captureEnd();
?>
<?php
echo $this->placeholder('woo')->data;
?>
6.9.4自定义助手
编写及调用自定义助手的方法:
The class name must, at the very minimum, end with the helper name itself, using MixedCaps. E.g., if you were writing a helper called "specialPurpose", the class name would minimally need to be "SpecialPurpose". You may, and should, give the class name a prefix, and it is recommended that you use 'View_Helper' as part of that prefix: "My_View_Helper_SpecialPurpose". (You will need to pass in the prefix, with or without the trailing underscore, to addHelperPath() or setHelperPath()).
The class must have a public method that matches the helper name; this is the method that will be called when your template calls "$this->specialPurpose()". In our "specialPurpose" helper example, the required method declaration would be "public function specialPurpose()".
In general, the class should not echo or print or otherwise generate output. Instead, it should return values to be printed or echoed. The returned values should be escaped appropriately.
The class must be in a file named after the helper class. Again using our "specialPurpose" helper example, the file has to be named "SpecialPurpose.php".
Place the helper class file somewhere in your helper path stack, and Zend_View will automatically load, instantiate, persist, and execute it for you.
示例:
<?php
//Custom Helper "myFieldset"
echo $this->myFieldset('This my custom Helper.').'<br>';
echo $this->myFieldset('This my custom Helper.').'<br>';
echo $this->myFieldset('This my custom Helper.').'<br>';
?>
调用代码:
function customhelperAction()
{
$view = new Zend_View();
$view->setScriptPath('views');
$view->setHelperPath('views/helpers', 'My_View_Helper');
echo $view->render('my_custom_helper.php');
}
张庆(网眼)文章出处phpchina
分享到:
相关推荐
Zend Framework 3.0(简称ZF3)是一个基于PHP编程语言的开源Web应用程序框架,它遵循模型-视图-控制器(MVC)架构模式,并提供了丰富的工具和组件来帮助开发者构建高质量的Web应用。这个框架的核心理念是模块化、可...
- Zend Framework鼓励模块化开发,允许开发者创建自己的模块或使用社区开发的第三方模块。 **8. 性能优化** - ZF提供了各种策略和最佳实践,以提高应用程序的性能,包括缓存、优化的数据库查询和减少HTTP请求数量...
- `/library` 存放第三方库 - `/public` - `/images` 存放图片资源 #### 九、总结 通过上述分析可以看出,**Zend框架入门教程**不仅提供了一份详尽的学习指南,还深入介绍了Zend框架的基本概念、开发流程以及...
9. **服务容器**:`Zend\ServiceManager`是Zend Framework 2及更高版本中的一个重要组件,但也可以通过第三方库在旧版本中使用。它允许你定义服务并按需注入,提高了代码的可测试性和灵活性。 10. **组件化**:Zend...
1. **入门指南**:介绍如何安装Zend Framework,设置开发环境,以及创建第一个项目。 2. **组件详解**:详细阐述每个组件的功能、用法和示例,如控制器、视图助手、模型、数据库访问等。 3. **最佳实践**:提供了...
- Zend Framework是一个MVC(模型-视图-控制器)架构的PHP框架,它遵循面向对象编程原则,提供了一系列独立且可重用的组件,如路由、控制器、视图助手等。 - 在本项目中,`index.php`是入口文件,负责初始化Zend ...
3. **依赖注入**:Zend Framework 鼓励使用依赖注入来管理对象间的依赖关系,这有助于提高代码的可测试性和可维护性。您可以使用 Zend Service Manager 来实现这一设计模式。 4. **数据库操作**:通过 Zend\Db,您...
这个“最新Zend Framework文档”很可能是官方或社区维护的指南,旨在帮助开发者掌握框架的最新特性和最佳实践。 Zend Framework的核心设计理念是“组件式”,这意味着你可以根据项目需求选择和组合不同的模块,而...
在第一章,我们将介绍 Zend Framework 的设计理念,包括MVC(模型-视图-控制器)模式、依赖注入、面向对象编程等原则。此外,还会讨论 Zend Framework 如何与其他PHP库和框架集成,以及如何利用其强大的组件化设计来...
尽管 Zend Framework 默认不绑定任何特定模板引擎,但可以轻松集成如 `Twig` 或 `Phly.Mustache` 等第三方模板库,实现灵活的视图渲染。 **9. 服务导向架构(SOA)** Zend Framework 支持 SOA 架构,可以与 `ZF2 ...
3. Zend框架:Zend Framework是一款企业级的PHP框架,强调组件式设计,提供了一套强大的工具和服务,用于构建可扩展和高性能的Web应用。理解Zend框架的MVC(Model-View-Controller)模式,以及其服务、控制器、模型...
**Zend Framework 2**(简称ZF2)是基于PHP的一个开源Web应用程序框架。它提供了大量的组件和服务,旨在帮助开发者构建高性能且易于维护的应用程序。ZF2强调模块化设计,允许开发者选择所需的功能组件来构建应用。 ...
在本案例中,你可能看到 Zend_Mail 用于发送确认邮件,Zend_Payment 或第三方支付接口用于处理支付流程,以及使用 Zend_Cache 进行缓存优化,提高系统的响应速度。 此外,案例中还可能包含用户注册、登录、权限管理...
3. **框架原理**:理解 MVC 模式的工作流程,探究 Zend Framework 的内部实现。 4. **设计模式**:熟悉并能灵活运用多种设计模式,如工厂模式、单例模式、观察者模式等。 5. **前端技术**:掌握 HTML、CSS、...
8. **服务和API**:了解如何利用Zend Framework构建RESTful API,以及如何集成第三方服务,如支付网关或社交媒体API。 9. **安全性与性能优化**:书中会讨论如何确保应用的安全性,包括输入验证、防止SQL注入、XSS...
MVC是一种软件设计模式,它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。模型负责处理业务逻辑和数据操作,视图负责展示数据,而控制器则作为模型和视图之间的桥梁,处理用户...
【标题】"基于Zend Framework 2的PHP电子商务系统"是一个使用PHP编程语言和 Zend Framework 2 框架开发的Web应用程序,专为电子商务场景设计。这个系统包含了完整的前后端功能,可以支持在线购物、订单处理、用户...