在partial中生成邮件消息,我使用占位符view-helper,如下所示:
<?php $this->placeholder('mykey')->startCapture() ?>
Some content here that is actually more complicated than just text.
Trust me that, in this case the, using the placeholder for capturing
is desirable.
<?php
$this->placeholder('mykey')->endCapture();
echo $this->placeholder('mykey');
?>
问题在于,如果我在同一请求中的不同邮件消息的不同部分中使用相同的密钥,则此捕获的内容仍然存储在该密钥的容器中。原则上,我希望部分人可以自由使用他们想要的任何占位符键,而不必担心其他部分人正在使用的内容。
我知道我可以在不同的部分中使用不同的键。或者,我可以在使用/显示之后手动清除内容,例如:
$this->placeholder('mykey')->set('');
但我不想把所有这些的负担放在使用占位符的视图脚本上。
我怀疑我想要做的是创建我自己的自定义占位符视图助手,在输出后自动清除捕获的内容。
我尝试过创建自定义占位符容器(扩展Standalone
容器,覆盖toString()
方法),创建自定义视图助手(扩展标准Placeholder
view-helper),并告诉view-helper使用自定义容器类。
但是我一直在碰到与缺少视图对象相关的一些错误。显然,我错过了关于视图对象,容器和注册表如何相互作用的一些东西 - 甚至可能是插件系统如何加载它们的一些东西。
非常感谢任何建议和一般性解释。
答案 0 :(得分:1)
您需要在Placeholder
视图助手中设置此容器,否则Zend_View_Helper_Placeholder_Registry
会自动加载Zend_View_Helper_Placeholder_Container
。因此,首先需要手动设置自定义容器。在视图脚本中:
$this->getHelper('placeholder')
->getRegistry()
->setContainerClass('My_View_Helper_Placeholder_Container');
或者对于Bootstrap.php中的_initCustomContainer()中的exameple:
$view = $this->bootstrap('view')->getResource('view');
$view->getHelper('placeholder')
->getRegistry()
->setContainerClass('My_View_Helper_Placeholder_Container');
然后,您需要根据Zend_View_Helper_Placeholder_Container
(而不是Zend_View_Helper_Placeholder_Container_Standalone
创建此类。我建议您保持选项打开以重置内容,不是吗?有一个二传手:
class My_View_Helper_Placeholder_Container
extends Zend_View_Helper_Placeholder_Container
{
protected $_resetCapture = true; // defaults true for new behaviour
public function setResetCapture($flag)
{
$this->_resetCapture = (bool) $flag;
return $this;
}
public function toString($indent = null)
{
$return = parent::toString($indent);
if ($this->_resetCapture) {
$this->exchangeArray(array());
}
return $return;
}
}
默认情况下,重置捕获已经打开,但要将其关闭并开始捕获:
$this->placeholder('my_key')->setResetCapture(false)->startCapture();
然后再次打开它:
$this->placeholder('my_key')->setResetCapture(true);
答案 1 :(得分:1)
在视图脚本中,使用:
$this->placeholder('mykey')->captureStart('SET');
或使用类常量:
$this->placeholder('mykey')->captureStart(Zend_View_Helper_Placeholder_Container_Abstract::SET);