2009-07-20 6 views
1

Salut pas sûr si cela est possible ou non, mais je tiens à mettre à jour de manière programmatique les balises <corps> pour changer la fonction onload dans mon application cadre zend.mise à jour de javascript dans la balise body en utilisant zend framework

L'application utilise layouts de sorte que la balise body ressemble actuellement à cette < classe body = « trandra » >

Cependant, dans un de mes opinions que j'ai une carte de Google en cours de chargement et il a besoin de ce qui suit dans la balise body ce point de vue particulier < body onload = « initialize() » onunload = « GUnload() » >

comme vous pouvez le comprendre, je ne veux pas que ce soit hardcoded dans ma mise en page que cela entraînera toute la matière des cauchemars avec les différents points de vue.

Comment cela peut-il être fait par programme, si c'est possible? Im en utilisant les fonctions headScript pour ajouter le javascript alors y at-il un équivalent pour l'étiquette du corps?

Merci à l'avance ...

Répondre

3

approche un - Utilisez une disposition des variables

Une idée serait la suivante:

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

Et à votre avis:

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

approche deux - JS-fichier supplémentaire qui ajoute des gestionnaires d'événements

Une autre approche, qui est moins importune et ne touche pas le HTML est que ce soit d'ajouter un fichier JS-supplémentaire dans la vue qui exige la onload- and onunload-handlers. Il pourrait ressembler à ceci:

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

Dans votre loadGMaps.js (utilisant prototype)

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

Au lieu de mettre votre Javascript directement dans le code, vous pouvez également utiliser un approch non obstrusive: brancher le javascript lorsque la page est complètement chargée.

Jetez un oeil, par exemple, à une fonction appelée addOnLoadEvent (peut être trouvé sur de nombreux sites ^^)

Si vous utilisez un cadre JS, il a certainement ce genre de fonction:

Si vous enregistrez le "branchement en" avec h eadScript, il ne devrait pas être nécessaire de modifier le tag directement.

0

Je ne suis pas expert sur le framework Zend, donc je ne sais pas s'il y a une accumulation de fonctions pour cela, mais vous pouvez faire quelque chose comme ceci: Dans Disp fichier: body_params?>>

Et puis dans votre contrôleur, vous définissez ou ajouter aux body_params:

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

Je sais que c'est un vieux fil, mais je regardais à travers quelques-unes des solutions suggérées et est venu avec un de mes propres jeux de certaines des idées que j'avais vues. Ce que j'ai été j'étendu Zend_View dans mes propres fichiers de bibliothèque (j'utilise une mise en page de MVC de vanille, mais les choses similaires peut être fait en utilisant un bootstrap.php plutôt que la classe Bootstrap décrit ci-dessous)

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

après avoir créé cette fichier que j'ai ajouté une méthode _initView au fichier Bootstrap.php pointé par le index.php et application.ini à la racine du répertoire d'application:

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

le nouveau Zend_View étendu permet maintenant d'ajouter vos étiquettes de corps le long avec quelques vérifications simples pour la validité. Modifier la balise body de votre mise en page pour obtenir les attributs:

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

Une fois que vous avez cette configuration, vous pouvez ajouter vos balises de corps à une vue donnée

dans le contrôleur avec

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

ou la vue avec

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