2010-09-23 19 views
0

J'ai besoin d'une méthode d'insertion de javascript qui soit spécifique au contrôleur/à l'action dans une mise en page. Ce javascript doit aller à l'intérieur du <head> du document, loin de l'endroit où le contenu normal est placé. Je l'ai déjà en place une infrastructure qui permet d'utiliser plusieurs vues par page, et Zend_Layout je l'ai déjà tire pleinement parti de ceci:Zend_Framework - Comment mettre du Javascript dans la mise en page?

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

Cependant, je voudrais la sortie de script pour sélectionner automatiquement, juste comme la vue normale est automatiquement placée dans $this->layout()->content de la mise en page par défaut. Je comprends que cette fonctionnalité est fournie par la classe ViewRenderer. Fondamentalement, ce que je voudrais faire est de vérifier une instance de /VIEWPATH/scripts/CONTROLLER/ACTION.js.php, et le rendre comme le segment de sortie nommé script s'il existe.

Je pourrais créer relativement simplement un Zend_Controller_Plugin qui le ferait automatiquement après la distribution, mais alors les contrôleurs n'auraient aucun moyen de définir des valeurs dans la vue du script. J'aurais également besoin d'un moyen de répliquer comment le plugin du contrôleur ViewRenderer infléchit les noms des contrôleurs et des actions.

Idéalement, je voudrais juste ajouter quelque chose à l'aide de ViewRenderer, mais cela ne semble pas supporter ce genre de chose.

Est-ce que je vais tout à fait faux? Existe-t-il un mécanisme d'intégration de Javascript spécifique à la page dans le framework? (Je ne peux pas être la seule personne avec ce problème ....)

Billy3

+0

Avez-vous déjà vu "$ this-> headScript() -> captureStart()"? Je me demandais ce que vous faisiez pour avoir besoin de construire des choses de cette façon ... pouvez-vous me montrer un usage spécifique avec action.js.php? –

+0

@Keyne: Non, je n'avais pas vu ça. Peut-être devriez-vous mettre cela dans une réponse pour que cela puisse être surclassé. (Parce que c'est exactement ce que je cherchais et n'est pas évident dans les docs Zend_Layout ou Zend_Controller) –

Répondre

1

Je pense qu'il n'y a pas d'accumulation dans le mécanisme. Iam en utilisant un petit plugin contrôleur comme ceci:

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 


      ); 
     } 
    } 
} 

Il ajoute un fichier js par nom du contrôleur. Mise en page iam en écho

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

Vous pouvez l'étendre pour utiliser l'action. Je suis sûr qu'il y a de meilleurs moyens, mais ça marche!

+0

Oui, mais ce dont il a vraiment besoin c'est la possibilité de créer des fichiers js à la volée en fonction des valeurs spécifiées dans le script de vue. . –

1

Zend Framework a des aides de vue pour ajouter un fichier javascript (premier extrait) + javascript texte (deuxième extrait) vous pouvez ajouter des fichiers 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(); 

?> 

puis dans certains où d'autre, vous pouvez ajouter

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

Les hypothèses suivantes:

Le script seront ajoutés à la pile . Si vous souhaitez qu'il remplace la pile ou soit ajouté au début, vous devrez passer respectivement 'SET' ou 'PREPEND', , comme premier argument à captureStart(). Le type de script MIME est supposé être 'texte/javascript'; Si vous souhaitez spécifier un type différent, vous devrez le passer comme deuxième argument à captureStart().Si vous souhaitez spécifier d'autres attributs pour l'étiquette, transmettez-les dans un tableau en tant que troisième argument pour capturerStart(). À captureStart().

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