Zend_Framework - Как мне разместить Javascript в макете? - PullRequest
0 голосов
/ 23 сентября 2010

Мне нужен метод вставки JavaScript, который зависит от контроллера / действия в макете.Этот javascript должен находиться внутри <head> документа, далеко от того места, где размещается нормальное содержимое.У меня уже есть инфраструктура, которая позволяет использовать несколько просмотров на страницу, и Zend_Layout, который у меня уже есть, в полной мере использует это:

<?php
     $script = $this->layout()->script;
     if (!is_null($script)) : ?>
<script type="text/javascript"> // <![CDATA[
  <?php echo $script; ?>
// ]]>
</script>
<?php endif; ?>

Однако я хотел бы, чтобы выходные данные скрипта были автоматически выбраныточно так же, как обычный вид автоматически помещается в $this->layout()->content макета по умолчанию.Я понимаю, что эта возможность предоставляется классом ViewRenderer.По сути, я хотел бы проверить экземпляр /VIEWPATH/scripts/CONTROLLER/ACTION.js.php и отобразить его как именованный выходной сегмент script, если он существует.

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

В идеале я бы просто как-то привязал это к помощнику ViewRenderer, но, похоже, он не поддерживает это.такие вещи.

Я поступаю по этому поводу совершенно неправильно?Есть ли какой-то механизм для встраивания Javascript для конкретной страницы в фреймворк?(Я не могу быть единственным человеком с этой проблемой ....)

Billy3

Ответы [ 3 ]

1 голос
/ 23 сентября 2010

В Zend Framework есть помощники вида для добавления файла javascript (первый фрагмент) + текстовый javascript (второй фрагмент), в который вы можете добавлять файлы javascript

<?php
    $this->headScript()->appendFile($this->baseUrl("js/jquery-1.4.2.min"))
        ->appendFile($this->baseUrl("js/jquery-ui-1.8.2.custom.min"));
    $this->headScript()->appendScript("js/dummy.js");
    echo $this->headScript();

?>

, а в некоторых других местах вы можете добавить

    <?php $this->headScript()->captureStart() ?>
// start jquery functions 
    var action = '<?php echo $this->baseUrl ?>'; 
    $('foo_form').action = action;
// end jquery functions 
    <?php $this->headScript()->captureEnd() ?>

Сделаны следующие предположения:

Сценарий будет добавлен в стек.Если вы хотите, чтобы он заменил стек или был добавлен в начало, вам нужно будет передать соответственно «SET» или «PREPEND» в качестве первого аргумента для captureStart ().Предполагается, что MIME-тип сценария будет «text / javascript»;если вы хотите указать другой тип, вам нужно будет передать его в качестве второго аргумента для captureStart ().Если вы хотите указать какие-либо дополнительные атрибуты для тега, передайте их в массиве в качестве третьего аргумента для captureStart (). To captureStart ().

source: http://framework.zend.com/manual/en/zend.view.helpers.html

1 голос
/ 24 сентября 2010

Расширение моего комментария

Вот документ, который вы ищете:

http://framework.zend.com/manual/1.12/en/zend.view.helpers.html#zend.view.helpers.initial.headscript

Вы можете использовать captureStart ()и создавать свои сценарии динамически внутри каждого связанного представления.При таком подходе вам не нужно создавать файлы * .js.php.

1 голос
/ 23 сентября 2010

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

class My_Controller_Plugin_JavaScript extends Zend_Controller_Plugin_Abstract

{

/**
 * preDispatch
 * Check controller name, and include javaScript library
 *
 * @param Zend_Controller_Request_Abstract $request
 * @return void
 */
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
    $layout = Zend_Layout::getMvcInstance();
    $view = $layout->getView();
    $controller = $request->getControllerName();

    $jsFile = $controller . '-lib.js';
    $jsPath = $view->baseUrl() .
               '/js/' . $controller .
               '/';

    $sPath = PUBLIC_PATH . DIRECTORY_SEPARATOR . 'js' . DIRECTORY_SEPARATOR;
    $sPath .= $controller . DIRECTORY_SEPARATOR . $jsFile;

    if (file_exists($sPath)) { // load as last js (offset 100)
        $view->headScript()->offsetSetFile(
            100,
            $jsPath . $jsFile


           );
        }
    }
}

Добавляет файл js по имени контроллера.Layout iam echoing it

<?= $this->headScript(); ?>

Вы можете расширить его, чтобы использовать действие.Я уверен, что есть лучшие способы, но это работает!

...