IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend Framework PHP Discussion :

[ZF 2.x] Renvoyer un flux javascript depuis un controller


Sujet :

Zend Framework PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut [ZF 2.x] Renvoyer un flux javascript depuis un controller
    Bonjour,

    Je voudrais renvoyer un flux javascript depuis un controller. Le problème est que zend essaye de charger un renderer et vue que le fichier phtml n'existe pas pour mon action il génère une exception.

    J'ai réussi à faire quelque chose d'équivalent pour renvoyer du JSon. POur celà dans le fichier de config de mon module j'ai rajouté :
    'strategies' => array(
    'ViewJsonStrategy',
    ),
    Dans le view manager.

    Mais je ne vois pas comment faire pour le javascript. Voici une partie du code de mon action :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    function getImageListJSAction()
    {
     
    		$output = ''; 
    		$delimiter = "n"; // for eye candy... code gets new lines		
    		$output .= 'var tinyMCEImageList = new Array(';
    		$directory = "./public/img/";
                    ....
    		if (is_dir($directory)) {
    		    $direc = opendir($directory);
     
    		    while ($file = readdir($direc)) {
    		             if (is_file("$directory/$file") && getimagesize("$directory/$file") != FALSE) {
    		                // We got ourselves a file! Make an array entry:
    		                $output .= $delimiter
    		                    . '["'
    		                    . utf8_encode($file)
    		                    . '", "'
    		                    . utf8_encode("$abspath/$directory/$file")
    		                    . '"],';
    		            }
    		    }
     
    		    $output = substr($output, 0, -1); // remove last comma from array item list (breaks some browsers)
    		    $output .= $delimiter;
     
    		    closedir($direc);
    		}
     
    		// Finish code: end of array definition. Now we have the JavaScript code ready!
    		$output .= ');';
     
    		// Make output a real JavaScript file!
    		header('Content-type: text/javascript'); // browser will now recognize the file as a valid JS file
     
    		// prevent browser from caching
    		header('pragma: no-cache');
    		header('expires: 0'); // i.e. contents have already expired
     
    		$output = $output . "\n\n";
    		// Now we can send data to the browser because all headers have been set!
    		echo $output;
    	}
    Et voici le flux retourné par le serveur :
    var tinyMCEImageList = new Array(n["en_US.gif", "//./public/img//en_US.gif"],n["favicon.ico", "//./public/img//favicon.ico"],n["fr_FR.gif", "//./public/img//fr_FR.gif"],n["glyphicons-halflings.png", "//./public/img//glyphicons-halflings.png"],n["top_bg.png", "//./public/img//top_bg.png"],n["client_logo.png", "//./public/img//client_logo.png"]n);

    <br />
    <font size='1'><table class='xdebug-error' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
    <tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Fatal error: Uncaught exception 'Zend\View\Exception\RuntimeException' with message 'Zend\View\Renderer\PhpRenderer::render: Unable to render template "nav-site/ajax/get-image-list-js"; resolver could not resolve to a file' in C:\eclipse\workspace\client\vendor\zendframework\zendframework\library\Zend\View\Renderer\PhpRenderer.php on line <i>461</i></th></tr>
    <tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Zend\View\Exception\RuntimeException: Zend\View\Renderer\PhpRenderer::render: Unable to render template "nav-site/ajax/get-image-list-js"; resolver could not resolve to a file in C:\eclipse\workspace\client\vendor\zendframework\zendframework\library\Zend\View\Renderer\PhpRenderer.php on line <i>461</i></th></tr>
    <tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
    merci

  2. #2
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut
    Ma solution a été de créer un layout vide de l'associé à l'action. Mettre le contenu javascript dans une vue et de faire un renderer phtml qui ne renvoie que le cotenu. Il dois surement y avoir un autre moyen qui permet de retourner une chaine de caractères tel quelle sans charger de renderer....

    Action :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function monAction(){
    	// génération de mon contenu JS dans $output
    	$this->layout('layout/empty');
    	$view = new ViewModel();
    	$view->content = $output;
     
    	return $view;
    }
    layout/empty
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $this->content; ?>
    Mon renderer phtml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $this->content; ?>
    Je ne met pas résolu car ma solution est moche...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 7
    Par défaut
    A part si je n'ai pas compris la question , dans ton action tu desactive le layout et le render. Ainsi tu récupère que le code souhaité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $this->_helper->layout()->disableLayout(); 
    $this->_helper->viewRenderer->setNoRender(true);

  4. #4
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut
    Merci pour ta réponse se serait effectivement quelque chose du genre. Par contre, zend me lance une exception me disant qu'il ne connait pas "$this->_helper".

  5. #5
    Membre émérite Avatar de tdutrion
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2009
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 561
    Par défaut
    Pour le layout, Akrabat (Rob Allen) propose un controller avec plusieurs manipulations sur les layouts : ZF2TestApp/module/Application/src/Application/Controller/ViewController.php.

    Pour désactiver à la fois la vue et le layout, il faut renvoyer un objet response :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    <?php
     
    namespace SomeModule\Controller;
     
    use Zend\Mvc\Controller\ActionController,
        Zend\View\Model\ViewModel;
     
    class SomeController extends ActionController
    {
        public function someAction()
        {
            $response = $this->getResponse();
            $response->setStatusCode(200);
            $response->setContent("Hello World");
            return $response;
        }   
    }
    Source : http://stackoverflow.com/a/9870758

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP-JS] Faire un appel JavaScript depuis PHP
    Par davinout dans le forum Langage
    Réponses: 4
    Dernier message: 29/05/2006, 20h03
  2. Declenchement d'un javascript depuis une autre page
    Par mcrbe dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/03/2006, 11h30
  3. Faire apelle a une fonction javascript depuis un onclick=&am
    Par pierrot10 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/12/2005, 21h41
  4. Comment appeler une fonction JavaScript depuis Delphi ?
    Par Alfred12 dans le forum Web & réseau
    Réponses: 4
    Dernier message: 17/06/2005, 18h15
  5. [debutant]renvoyer sur une jsp depuis une servlet
    Par omega dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 23/03/2004, 11h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo