是否可以使用自动加载器覆盖现有的类定义,使加载器首先找到我的代码并加载它而不是zend库代码?这样我就可以编写自己的Zend_View_Helper_FormText
并让所有文字Form_Elements
自动获取我的版本而不是默认版本?
答案 0 :(得分:0)
<强>更新强>
所以我想确保我是正确的,因为它已经使用了ZF。以下为我开箱即用。
使用'setHelperPaths`方法在YourNamespace_Application_Resource_View
中创建自定义LIBRARY_PATH/YourNamespace/Application/Resource/View
- 或者在配置中调用它的任何内容。
class YourNamespace_Application_Resource_View extends Zend_Application_Resource_View
{
public function setHelperPaths($paths){
if(!empty($paths)){
$view = $this->getView();
foreach($paths as $ns => $path) {
$view->addHelperPath($path, $ns);
}
}
}
}
然后在你的配置中做一些像:
all:
pluginPaths:
'YourNamespace_Application_Resource_': <?php echo LIBRARY_PATH ?>/YourNamespace/Application/Resource
resources:
view:
helperPaths:
'YourNamespace_View_Helper': <?php echo LIBRARY_PATH ?>/YourNamespace/View/Helper
显然,这并没有完全取代你已配置的任何东西......除此之外。此外,我在Zend_Tool中设置了我的项目生成器,使用YAML(使用sfYaml)作为我的配置格式,因此如果使用INI或XML,则需要进行适当的转换。
然后你只需创建你的cutom助手,其名称与你要覆盖的zend名称相同。我在测试中使用了以下示例:
// File in LIBRARY_PATH/YourNamespace/View/Helper/FormText.php
class YourNamespace_View_Helper_FormText extends Zend_View_Helper_FormText
{
public function formText($name, $value = null, $attribs = null)
{
$xhtml = parent::formText($name, $value, $attribs);
$xhtml .= '<br /> <pre>'.__CLASS__.'</pre>';
return $xhtml;
}
}
然后它自动运作。如果它对你不起作用,那么混合中可能还有其它东西会给它带来问题。
为什么不在自己的“命名空间”(例如Someguy_View_Helper_FormText
)中创建自己的实现,然后加载? If you put it on top of the helper path stack the plugin loader will use that instead of the Zend version automatically