Автоматически очищать захваченное содержимое помощника вида помощника после его отображения

Генерируя почтовое сообщение частично, я использую помощник вида заполнителя следующим образом:

<?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() метод), создавая пользовательский view-helper (расширяет стандарт Placeholder view-helper) и указание view-helper использовать пользовательский класс контейнера.

Но я продолжаю сталкиваться с некоторой ошибкой, связанной с отсутствующим объектом просмотра. Понятно, что я что-то упускаю из-за того, как все взаимодействуют объект представления, контейнер и реестр - и, возможно, даже из-за того, как система плагинов загружает их все.

Любые советы и общие объяснения приветствуются.

2 ответа

Решение

Вам нужно установить этот контейнер в Placeholder посмотреть помощник, потому что в противном случае Zend_View_Helper_Placeholder_Registry загружает автоматически Zend_View_Helper_Placeholder_Container, Итак, сначала вам нужно установить свой пользовательский контейнер вручную. В скрипте вида:

$this->getHelper('placeholder')
     ->getRegistry()
     ->setContainerClass('My_View_Helper_Placeholder_Container');

Или для exameple в _initCustomContainer() в вашем Bootstrap.php:

$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);

В скрипте вида используйте:

$this->placeholder('mykey')->captureStart('SET');

или используя константу класса:

$this->placeholder('mykey')->captureStart(Zend_View_Helper_Placeholder_Container_Abstract::SET);

Другие вопросы по тегам