Обновление JavaScript в теге body с использованием Zend Framework - PullRequest
1 голос
/ 20 июля 2009

Привет, я не уверен, возможно ли это или нет, но я хочу программно обновить теги , чтобы изменить функцию загрузки в моем приложении Zend Framework.

Приложение использует макеты, поэтому тег body в настоящее время выглядит следующим образом

Однако в одном из моих представлений у меня загружается карта из Google, и для этого конкретного вида необходимо следующее:

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

Как это можно сделать программно, если это вообще возможно? Я использую функции headScript, чтобы добавить javascript, так есть ли эквивалент для тега body?

Заранее спасибо ...

Ответы [ 5 ]

3 голосов
/ 21 июля 2009

Первый подход - использовать переменную макета

Одна идея будет следующей:

<body class="trandra" <?php echo $this->layout()->bodyScripts ?>>

А по вашему мнению:

<?php
   $this->layout->bodyScripts = 
       'onload="initialize()" onunload="GUnload()"';

Второй подход - дополнительный JS-файл, добавляющий обработчики событий

Другой подход, который менее навязчив и не влияет на HTML, заключается в добавлении дополнительного JS-файла в представление, которое требует обработчиков onload и onunload. Это может выглядеть примерно так:

<?php
   $this->headScript()->appendScript(
                         '/path/to/javascripts/loadGMaps.js');

В вашем loadGMaps.js (используется прототип )

Event.observe(window, 'load', function onLoadHandler() {
    // Code for initializing Google maps here
});

Event.observe(window, 'unload', function onUnloadHandler() {
    // Code for unloading Google maps here
});
2 голосов
/ 21 июля 2009

Вместо того, чтобы помещать свой Javascript прямо в код, вы также можете использовать ненавязчивый подход: подключать JavaScript, когда страница полностью загружена.

Посмотрите, например, на функцию addOnLoadEvent (ее можно найти на многих сайтах ^^)

Если вы используете JS Framework, он, безусловно, имеет такую ​​функцию:

Если вы регистрируете «плагин» с помощью headScript, не нужно изменять тег напрямую.

1 голос
/ 22 августа 2010

Недавно разработал что-то вроде этого, я написал об этом здесь: http://www.evilprofessor.co.uk/311-zend-framework-body-tag-view-helper/

Демо на сайте и код доступен через github.

0 голосов
/ 09 января 2013

Я знаю, что это старая ветка, но я просматривал некоторые из предложенных решений и придумал одну из моих собственных, подыгрывая некоторым из идей, которые я видел. Я расширил Zend_View в своих собственных файлах библиотеки (я использую ванильный макет MVC, но аналогичные вещи можно сделать с помощью файла bootstrap.php вместо класса Bootstrap, описанного ниже)

class Custom_View extends Zend_View
{
    protected $bodyAttrs = array();

    public function _setBodyAttr($attrName,$attrValue=null) {
        $attrName = strtolower(strval($attrName));
        if(!(in_array($attrName, HTML::getValidBodyAttrs()))) {
            throw new Zend_Exception(__METHOD__." attrName '$attrName' is not a valid BODY attribute!");
        }
        $this->bodyAttrs[$attrName] = strval($attrValue);
    }

    public function _getBodyAttrsAsString() {
        $bodyAttrs = "";
        if(count($this->bodyAttrs) > 0) {
            $attrs = array();
            foreach($this->bodyAttrs as $_k => $_v) {
                array_push($attrs,sprintf("%s=\"%s\"", $_k, $_v));
            }
            $bodyAttrs = " " . implode(" ", $tags);
        }
        return $bodyAttrs;
    }
}

// some useful tag definitions for HTML
class HTML
{
    // HTML attributes as described by W3C
    public static $BODY_ATTRIBUTES          = array('alink','background','bgcolor','link','text','vlink');
    public static $GLOBAL_ATTRIBUTES         = array('accesskey','class','contenteditable','contextmenu','dir','draggable','dropzone','hidden','id','lang','spellcheck','style','tabindex','title');
    public static $WINDOW_EVENT_ATTRIBUTES   = array('onafterprint','onbeforeprint','onbeforeunload','onerror','onhaschange','onload','onmessage','onoffline','ononline','onpagehide','onpageshow','onpopstate','onredo','onresize','onstorage','onundo','onunload');
    public static $MOUSE_EVENT_ATTRIBUTES    = array('onclick','ondblclick','ondrag','ondragend','ondragenter','ondragleave','ondragover','ondragstart','ondrop','onmousedown','onmousemove','onmouseout','onmouseover','onmouseup','onmousewheel','onscroll');
    public static $KEYBOARD_EVENT_ATTRIBUTES = array('onkeydown','onkeypress','onkeyup');
    public static $FORM_EVENT_ATTRIBUTES     = array('onblur','onchange','oncontextmenu','onfocus','onformchange','onforminput','oninput','oninvalid','onreset','onselect','onsubmit');
    public static $MEDIA_EVENT_ATTRIBUTES    = array('onabort','oncanplay','oncanplaythrough','ondurationchange','onemptied','onended','onerror','onloadeddata','onloadedmetadata','onloadstart','onpause','onplay','onplaying','onprogress','onratechange','onreadystatechange','onseeked','onseeking','onstalled','onsuspend','ontimeupdate','onvolumechange','onwaiting');

    public static function getValidBodyAttrs() {
        return array_merge(self::$BODY_ATTRIBUTES,self::$GLOBAL_ATTRIBUTES,self::$WINDOW_EVENT_ATTRIBUTES,self::$MOUSE_EVENT_ATTRIBUTES,self::$KEYBOARD_EVENT_ATTRIBUTES);
    }
}

после создания этого файла я добавил метод _initView в файл Bootstrap.php, на который указывают index.php и application.ini в корне каталога приложения:

protected function _initView()
{
    // Custom_View extends Zend_View
    $view = new Custom_View();

    // Add it to the ViewRenderer
    $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper( 'ViewRenderer' );
    $viewRenderer->setView($view);

    return $view;
}

Новый расширенный Zend_View теперь позволяет добавлять теги вашего тела вместе с простой проверкой правильности. Измените тег body вашего макета, чтобы получить атрибуты:

  <body<?= $this->_getBodyAttrs(); ?>>

Как только вы это настроите, вы можете добавить свои теги тела в любой вид

в контроллере с

$this->view->_setBodyAttr('key','val');

или в виде с

$this->_setBodyAttr('key','val');
0 голосов
/ 21 июля 2009

Я не эксперт по Zend Framework, поэтому я не знаю, есть ли встроенные функции для этого, но вы могли бы сделать что-то вроде этого: В файле макета: body_params? >>

И затем в вашем контроллере вы устанавливаете или добавляете в body_params:

$this->view->body_params='onload="initialize()" onunload="GUnload()"';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...