显示后自动清除捕获的占位符视图辅助内容

时间:2011-11-24 05:25:03

标签: zend-framework zend-view

在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使用自定义容器类。

但是我一直在碰到与缺少视图对象相关的一些错误。显然,我错过了关于视图对象,容器和注册表如何相互作用的一些东西 - 甚至可能是插件系统如何加载它们的一些东西。

非常感谢任何建议和一般性解释。

2 个答案:

答案 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);