2009-07-20 16 views
1

Hallo nicht sicher, ob dies möglich ist oder nicht, aber ich möchte die < Körper > Tags zu aktualisieren, um die Onload-Funktion in meiner Zend Framework-Anwendung zu ändern.Aktualisieren von JavaScript im Body-Tag mit Zend Framework

Die App wird mit Layouts, damit der Körper Tag sieht zur Zeit wie dieser < Körper class = „trandra“ >

jedoch in einem meiner Ansichten habe ich eine Karte von Google geladen, und es muss die folgende im Body-Tag dieser spezielle Ansicht < body onload = "initialisieren()" onunload = "GUnload()" >

wie Sie wissen, ich dies in meinem Layout fest einprogrammiert wird nicht wollen, da dies dazu führen, alles von Albträumen mit den verschiedenen Ansichten.

Wie kann dies programmatisch geschehen, wenn überhaupt? Ich benutze die headScript-Funktionen, um das Javascript hinzuzufügen, also gibt es ein Äquivalent für das body-Tag?

Vielen Dank im Voraus ...

Antwort

3

Ansatz ein - Verwenden Sie die folgenden sein, ein Layout Variable

Eine Idee wäre:

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

Und aus Ihrer Sicht:

Ansatz zwei - Zusätzliche JS-Datei, die Event-Handler

Ein anderer Ansatz fügt hinzu, die weniger aufdringlich und nicht die HTML wirkt sich auch immer ist, eine zusätzliche JS-Datei in der Ansicht hinzuzufügen, die erforderlich Onload- und On-User-Handler. Es könnte wie folgt aussehen:

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

In Ihrem 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

Statt Ihre Javascript direkt im Code setzen, können Sie auch einen nicht-penetranten approch verwenden: Einstecken des Javascript, wenn die Seite vollständig geladen ist.

Werfen Sie einen Blick, zum Beispiel an einer Funktion addOnLoadEvent genannt

Wenn Sie einen JS-Framework verwenden, es hat sicherlich diese Art von Funktion (kann auf vielen Websites ^^ finden):

Wenn Sie das "Einstecken in" mit h registrieren eadScript sollte das Tag nicht direkt geändert werden müssen.

0

Ich bin kein Experte auf dem Zend Framework, so dass ich weiß nicht, ob es eine eingebauten Funktion hierfür ist, aber man kann so etwas tun: In Layout-Datei: body_params?>>

Und dann in Ihrem Controller, setzen Sie oder den body_params hinzufügen:

$this->view->body_params='onload="initialize()" onunload="GUnload()"'; 
0

Ich weiß, dass dies ein alter Thread ist, aber ich habe mir einige der vorgeschlagenen Lösungen angeschaut und mir ein eigenes ausgedacht, in dem ich einige der Ideen ausgespielt habe, die ich gesehen habe. Was ich tat, war ich Zend_View in meinen eigenen Bibliothek-Dateien (ich bin mit einem Vanille-MVC-Layout aber ähnliche Dinge können einen bootstrap.php mit eher als die Bootstrap Klasse weiter unten beschrieben durchgeführt werden) erweitert

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

danach die Schaffung Datei hinzugefügt ich eine Methode _initView zum Bootstrap.php-Datei im Stammverzeichnis des Anwendungsverzeichnisses durch die index.php und application.ini zeigte:

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

die neue, erweiterte Zend_View erlaubt nun Ihren Körper-Tags hinzufügen entlang mit etwas einfacher Überprüfung auf Gültigkeit. Ändern Sie bitte Ihre Layout des Body-Tag, um die Attribute zu erhalten:

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

Sobald Sie diese einrichten Sie Ihren Body-Tags zu einem bestimmten Ansicht hinzufügen können

in der Steuerung mit

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

oder in die Ansicht mit

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