Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
j'essaie actuellement de récupérer dans mon javascript, une variable au format json.
J'ai suivi la documentation sur le AjaxContext.
Voici mon problème.
AjaxController :
class AjaxController extends Zend_Controller_Action { public function init(){ $this->_helper->layout()->disableLayout(); $ajax = $this->_helper->getHelper('AjaxContent'); // on autorise l'action jsonbadge à répondre aux requêtes ajax $ajax->addActionContext('jsonbadge','json') ->initContext(); } public function jsonbadgeAction(){ $id = $this->_getParam('id'); $TBadges = new TRefBadges(); $badge = $TBadges->getJsonBadge($id); // retour du résultat au format json $this->view->jsonBadge = Zend_Json::encode($badge); } }
Fichier javascript :
$.getJSON(urlBase+'/ajax/jsonbadge/format/json/id/'+id, function(json){ alert(json); alert('dans getJson'); });
Je ne rentre jamais dans le getJSON et je ne sais pas comment faire.
Merci d'avance pour votre aide.
Dernière modification par Godzinho (03-02-2010 12:47:36)
Hors ligne
Salut,
Tu as une petite erreur de syntaxe ici :
$ajax = $this->_helper->getHelper('AjaxContent'); // <- AjaxContext
Mais je ne sais pas si c'est ça ou une erreur de recopie
A priori ton code devrait fonctionner.
Par contre, inutile de désactiver le layout, le switcher de context s'en occupe.
A+ benjamin.
Hors ligne
Précision, il me semble qu'il n'est pas nécessaire d'encoder en JSON car, le helper ajaxonctext de type Json, active un "serialiseur" qui va sérialiser en json les variables de la vue (c'est clair ?)
Sinon, pour ton problème, il faut voir tout ton code javascript
Hors ligne
Très bien merci pour vos informations. Cela fonctionne maintenant.
Il s'agissait surement du "AjaxContent" mais également du urlBase dans mon javascript.
En effet j'ai essayé un alert sur urlBase et rien ne s'affichait.
Sur vos conseils j'ai également enlevé la désactivation du layout et l'enodage en Json.
Ma question maintenant est : comment récupérer mon urlBase pour m'éviter de taper le chemin complet dans le javascript, sachant que mes traitements ajax sont dans un fichier assign.js qui n'a pas accès au Front Controller ?
Encore merci.
Hors ligne
Ma solution perso (a prendre ou pas) :
Dans mon bootstrap :
$view->headScript()->prependScript('app = { baseUrl: "'.$view->baseUrl().'" };');
Hors ligne
Comment initialises-tu $view dans ton bootstrap ?
En faisant un simple
$view = new Zend_View();
et en mettant la ligne de code que tu m'as donné, mon appli ne fonctionne plus.
J'ai essayé autrement en fonction des autres fonctions proposés par l'autocomplétion, mais je n'y arrive pas.
Dernière modification par Godzinho (03-02-2010 09:34:03)
Hors ligne
Godzinho a écrit:
Comment initialises-tu $view dans ton bootstrap ?
En faisant un simpleCode:
$view = new Zend_View();et en mettant la ligne de code que tu m'as donné, mon appli ne fonctionne plus.
J'ai essayé autrement en fonction des autres fonctions proposés par l'autocomplétion, mais je n'y arrive pas.
Nan
T'as pas lu la doc de Zend_Application Toi... :p
protected function _initHeadView() { $this->bootstrap('view'); $view = $this->getResource('view'); $view->headLink()->appendStylesheet($view->baseUrl('/css/style.css')); $view->headScript()->prependScript('site = { baseUrl: "'.$view->baseUrl().'" };'); }
Dernière modification par nORKy (03-02-2010 10:56:33)
Hors ligne
Je n'utilise pas Zend_Application, je dois faire une mauvaise utilisation du framework.
Du coup je n'ai pas de bootstrap à proprement parler. J'initialise tout dans mon index.php. J'ai compris que mon index.php était mon bootstrap.
Est-il possible de fonctionner ainsi ?
Voici le code de mon index.php
<?php // définition des chemins utiles $rootPath = dirname(dirname(__FILE__)); $appPath = $rootPath . DIRECTORY_SEPARATOR . 'application'; $confPath = $appPath . DIRECTORY_SEPARATOR . 'configs'; // configuration de l'include_path PHP pour l'autoload set_include_path(get_include_path() . PATH_SEPARATOR . $appPath . PATH_SEPARATOR . $rootPath . DIRECTORY_SEPARATOR . 'library' . PATH_SEPARATOR . $appPath . DIRECTORY_SEPARATOR . 'models'); // Utilisation de Zend_Loader require_once 'Zend/Loader.php'; // Chargement automatique des classes Zend_Loader::registerAutoload(); Zend_Registry::set('rootPath',$rootPath); // UrlBase pour javascript // Récupération des objets de configuration $configAppli = new Zend_Config_Ini($confPath . DIRECTORY_SEPARATOR . 'application.ini', 'dev'); $configMain = new Zend_Config_Ini($confPath . DIRECTORY_SEPARATOR . 'config.ini', 'dev'); $configSession = new Zend_Config_Ini($confPath . DIRECTORY_SEPARATOR . 'session.ini','dev'); Zend_Session::setOptions($configSession->toArray()); // Partage (et création ou restauration) de l'objet de session dans le registre // Ce premier appel à new Zend_Session_Namespace démarre la session PHP Zend_Registry::set('session', $session = new Zend_Session_Namespace($configSession->name)); try { $db = Zend_Db::factory($configMain->database); $db->query("SET NAMES 'UTF8'"); // Passage de la connexion à toutes les classes passerelles Zend_Db_Table_Abstract::setDefaultAdapter($db); } catch (Zend_Db_Exception $e) { // on passe l'exception sous silence, elle sera gérée dans le système MVC plus tard } // Ajout du chemin des aides d'action dans le gestionnaire d'aides MVC Zend_Controller_Action_HelperBroker::addPrefix('Arbo_Controller_ActionHelpers'); // Configuration du contrôleur frontal $fc = Zend_Controller_Front::getInstance(); $fc->setControllerDirectory($appPath . DIRECTORY_SEPARATOR . 'controllers'); $fc->throwExceptions(true); // par défaut // propagation de paramètres dans le système MVC $fc->setParam('debug', $configMain->debug); $fc->setParam('config', $configMain); $options = array('layoutPath' => $appPath . DIRECTORY_SEPARATOR . 'views' . DIRECTORY_SEPARATOR . 'layouts'); Zend_Layout::startMvc($options); try { $fc->dispatch(); } catch (Zend_Exception $e) { echo $e->getMessage(); } ?>
Dernière modification par Godzinho (03-02-2010 11:25:43)
Hors ligne
Salut,
Tu peux aussi utiliser la ligne que t'as filé nORKy directement dans la vue ou dans le layout en remplaçant $view par $this :
$this->headScript()->prependScript('site = { baseUrl: "'.$this->baseUrl().'" };');
Sinon, pour faire comme nORKy sans Zend_Application il te faudra, dans ton bootstrap (ou initializer) instancier toi même la vue, ajouter le script et passer la vue au view renderer
$view = new Zend_View(); $view->headScript()->prependScript('site = { baseUrl: "'.$view->baseUrl().'" };'); $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); $viewRenderer->initView(); $viewRenderer->setView($view);
Ou sinon par un helper d'action ou encore par un controller d'action commun à tous tes controlleurs.
Mais Zend_Application c'est le bien !
A+ benjamin.
Hors ligne
Très bien merci à tous les deux.
Je ne connaissais cette méthode pour passer une variable du php vers le javascript.
Je peux me mettre au boulot !!!
Hors ligne
En fait, les méthodes prependScript ou appendScript ne font que créer une balise <script> dans ton code qui contient ce que tu passes en paramètres.
Tu pourrais aussi le faire à la mano si tu le fais directement la vue ou le layout hein
L'avantage est aussi de pouvoir le préparer avant le rendu.
A+ benjamin.
Hors ligne
Pages: 1