Я пытаюсь атаковать эту проблему совершенно по-другому, потому что это не похоже на то, что я могу достичь своей цели.
Я хочу перебрать стек элемента в помощнике представления HeadScript и внести изменения в него. Документация для этого и некоторых других помощников в представлении делает следующее утверждение:
HeadScript переопределяет каждый из append (), offsetSet (), prepend () и set () для принудительного использования специальных методов, перечисленных выше. Внутренне он хранит каждый элемент в качестве токена stdClass, который позже сериализуется с использованием метода itemToString (). Это позволяет выполнять проверки элементов в стеке и, возможно, изменять эти элементы, просто изменяя возвращаемый объект.
Итак, где этот «объект возвращен»? Здесь я не вижу кусочка головоломки.
Спасибо за вашу помощь!
В методе toString()
Zend_View_Helper_HeadScript
я заметил цикл foreach()
на $this
, поэтому я попробовал это, и он сработал. Вот расширение HeadScript, которое я написал, что иллюстрирует решение:
class My_View_Helper_HeadScript extends Zend_View_Helper_HeadScript { public function toString($indent = null) { $files = array(); foreach ($this as $key => $item) { if (!empty($item->attributes) && array_key_exists('src', $item->attributes) && ('scripts' == substr($item->attributes['src'], 1, 7))) { $files[] = $item->attributes['src']; unset($this[$key]); } } if (0 < count($files)) { $this->prependFile('/combo.php?type=scripts&files=' . implode(',', $files)); } return parent::toString($indent); } }
сclass My_View_Helper_HeadScript extends Zend_View_Helper_HeadScript { public function toString($indent = null) { $files = array(); foreach ($this as $key => $item) { if (!empty($item->attributes) && array_key_exists('src', $item->attributes) && ('scripts' == substr($item->attributes['src'], 1, 7))) { $files[] = $item->attributes['src']; unset($this[$key]); } } if (0 < count($files)) { $this->prependFile('/combo.php?type=scripts&files=' . implode(',', $files)); } return parent::toString($indent); } }
В Bootstrap.php
следующие строки указывают на мои помощники:
$this->bootstrap('view'); $view = $this->getResource('view'); $view->addHelperPath('My/View/Helper', 'My_View_Helper');
В моем макете у меня есть эта строка:
<?php echo $this->headScript(); ?>
Если мое решение неясно каким-либо образом, дайте мне знать, и я обновлю его, чтобы уточнить.