Изменить стек в помощнике по Zend HeadScript View - PullRequest
2 голосов
/ 16 февраля 2010

Я пытаюсь атаковать эту проблему с совершенно другой точки зрения, потому что не похоже, что я смогу достичь своей цели таким образом.

Я хочу перебрать стек элементов в HeadScript View Helper и внести в него изменения. Документация для этого и некоторых других помощников вида делает следующее утверждение:

HeadScript переопределяет каждый из append (), offsetSet (), prepend () и set () для применять специальные методы как указано выше. Внутренне, это хранит каждый элемент в качестве токена stdClass, который позже он сериализуется с использованием Метод itemToString (). Это позволяет вам выполнять проверки на предметы в стек, и при желании изменить эти элементы, просто изменив объект вернулся.

Так, где этот "возвращаемый объект"? Мне не хватает части головоломки здесь.

Спасибо за вашу помощь!

1 Ответ

4 голосов
/ 16 февраля 2010

В 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);
    }
}

В Bootstrap.php следующие строки указывают на моих помощников:

$this->bootstrap('view');
$view = $this->getResource('view');
$view->addHelperPath('My/View/Helper', 'My_View_Helper');

В моем макете у меня есть эта строка:

<?php echo $this->headScript(); ?>

Если мое решение каким-либо образом неясно, дайте мне знать, и я уточню его для уточнения.

...