Автоматически очищать захваченное содержимое помощника вида помощника после его отображения
Генерируя почтовое сообщение частично, я использую помощник вида заполнителя следующим образом:
<?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);