Zend Framework从Zend_View_Helper调用视图助手
-
05-07-2019 - |
题
我有一个名为 Zend_View_Helper_FormVars
的助手,我的一个模块使用过它。
我在 application / common / helpers / GeneralFunctions.php
我正在尝试从 GeneralFunctions.php
中的 Zend_View_Helper_FormVars
调用一个函数。
以下是 Zend_View_Helper_FormVars
的简短版本:
class Zend_View_Helper_FormVars
{
public $reqFieldVisual='<span class="req">*</span>';
public $roles=array('admin'=>'admin', 'user'=>'user');
public $paymentMethods=array('1'=>'Check', '2'=>'Credit Card',
'3'=>'Cash', '4'=>'Other');
public function formVars(){
$this->baseUrl=Zend_Controller_Front::getInstance()->getBaseUrl();
return $this;
}
public function mkCategoryCodeSelectGroup($codeTypeArr=array(),
$codesArr=array()) {
$html='';
$html.=Zend_View_Helper_GeneralFunctions::generalFunctions()->progressMeter();
return $html;
}
}
以下是 GeneralFunctions.php
:
class Zend_View_Helper_GeneralFunctions
{
public function generalFunctions(){
$this->baseUrl=Zend_Controller_Front::getInstance()->getBaseUrl();
return $this;
}
public function progressMeter() {
$html='';
$html.='<span id="progressWrapper">';
$html.='<span id="progressMeter"></span>';
$html.='</span>';
$html.='';
return $html;
}
}
另外,忘了提到我在Bootstrap中自动加载了 GeneralFunctions
帮助器,它已经可用于我的所有模块了:
$view->addHelperPath(APPLICATION_PATH .'/common/helpers', 'View_Helper');
这是我尝试过的,但是收到了错误:
// application/Bootstrap.php ----------->
function _initViewHelpers() {
// add a helper for use for all modules
$view->addHelperPath(APPLICATION_PATH .'/Common/Helper', 'Common_Helper');
}
//-------------------->
// application/common/helpers/General.php ----------->
class Zend_View_Helper_General extends Zend_View_Helper_Abstract
{
public function general(){
return $this;
}
public function test(){
return 'test 123';
}
}
//-------------------->
// application/modules/dashboard/views/helpers/DashboardHelper.php ----------->
class Zend_View_Helper_DashboardHelper extends Common_Helper_General
{
public function dashboardHelper(){
return $this;
}
public function dashboardTest(){
return 'from dashboard';
}
}
//-------------------->
// application/modules/dashboard/views/scripts/index/index.phtml ----------->
echo $this->dashboardHelper()->test();
//-------------------->
我收到错误消息:
致命错误:第2行的/Applications/MAMP/htdocs/mysite/application/modules/dashboard/views/helpers/DashboardHelper.php中找不到“Common_Helper_General”类
解决方案
调用另一个View Helper实际上非常简单。
确保您的视图助手扩展 Zend_View_Helper_Abstract
,以便它可以访问 $ view
。然后你可以像在视图中那样简单地调用助手,即
$this->view->generalFunctions()->progressMeter();
根据您的上述示例:
<?php
class Zend_View_Helper_FormVars extends Zend_View_Helper_Abstract {
/* ... */
public function mkCategoryCodeSelectGroup($codeTypeArr=array(),
$codesArr=array()) {
$html='';
$html. $this->view->generalFunctions()->progressMeter();
return $html;
}
}
其他提示
您可能尚未将自动加载器配置为从 application / common / helpers /
文件夹加载类。
有关默认路径,请参阅 Zend_Application_Module_Autoloader
。您应该将新文件夹添加到此。
我发现您提供的代码存在一些问题。
- 你试图将
Zend_View_Helper_GeneralFunctions :: generalFunctions()
作为一个静态方法,当它被声明为一个类方法(即你必须实例化一个类的实例来使用它)时您遗漏了static
关键字。 - 如果你实际上想要使用
generalFunctions()
作为静态方法并更正它,那么你需要使baseUrl
成为静态属性,否则你将需要实例化该类的实例,然后返回该实例。 - 使用
GeneralFunctions
类作为直接调用的静态方法的容器的想法实际上是更深层问题的症状,并且正确地标记为代码气味。如果您认为我在说谎,请查看Zend Framework 2.0的高优先级项目(提示:它涉及从框架中删除所有静态方法)。或者你可以随时询问他们对静态方法的看法:-)。
醇>
- 您需要让每个辅助类都为
GeneralFunctions
类创建子类,以便所有助手都可以使用这些函数。基本上,问问自己,你的帮助者是否都是以GeneralFunction
帮助者开始生活的,其中包含扩展功能。此解决方案使用继承来解决您的问题。 -
每个视图助手都应包含要对其执行的View对象的实例。因此理论上你应该能够通过magic
__ call
方法访问任何其他视图助手(我认为还有一个显式方法,但我总是使用魔术方法)。在你的场景中可能看起来像这样:public function mkCategoryCodeSelectGroup($codeTypeArr=array(), $codesArr=array()) { $html=''; $html.= $this->generalFunctions()->progressMeter(); return $html; }
在这种情况下,
__ call
方法将加载GeneralFunctions
帮助程序,然后从调用
helper。progressMeter()
方法GeneralFunctions现在您的
GeneralFunctions
帮助程序类可能如下所示:class Zend_View_Helper_GeneralFunctions { public function __construct() { $this->baseUrl = Zend_Controller_Front::getInstance()->getBaseUrl(); } public function progressMeter() { $html=''; $html.='<span id="progressWrapper">'; $html.='<span id="progressMeter"></span>'; $html.='</span>'; $html.=''; return $html; } }
醇>
查看一般函数类 Zend_View_Helper_GeneralFunctions
的给定类名,并给出当前场景,您尝试在另一个帮助器中使用 GeneralFunctions
帮助器,我会猜测你真的需要做两件事之一。
你在没有实例化的情况下调用你的类。
你的 generalFunctions()
函数使用 $ this
指针,它不起作用;它也不是一种静态方法。
一个选项是将进度表设置为静态函数并直接调用它:
Zend_View_Helper_GeneralFunctions::progressMeter();
另一个选择是首先实例化你的课程。