Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 26-08-2009 14:21:07

osdave
Membre
Date d'inscription: 07-07-2009
Messages: 14

[résolu]vues des requêtes AJAX

bonjour,
D'après l'information que j'ai trouvé sur internet, quand une action est appelée de façon asynchrone je dois créer une vue avec une "pré-extension" selon le format qui sera renvoyé (.ajax pour html, .json pour json, etc...).
Pour que mon site soit accesible sans javascript je crée aussi la vue normale (.phtml).

J'ai pas l'impression d'être très clair, prenons un exemple:
controler: user
action: login

Puisque le login peut se faire AJAX-style, j'ai 2 fichiers de vue pour cette action: login.phtml et login.ajax.phtml
Le contenu des 2 est identique.
C'est pas super pour la maintenance...

Ma question est: il n'y a pas moyen de faire en sorte que un seul fichier se charge des 2 cas?
merci d'avance,
david

Dernière modification par osdave (26-08-2009 15:11:15)

Hors ligne

 

#2 26-08-2009 14:53:53

Eureka
Membre
Date d'inscription: 18-07-2009
Messages: 81

Re: [résolu]vues des requêtes AJAX

Si tu utilises l'aide d'action ContextSwitch il existe une méthode setSuffix(<params>) visant à spécifier le suffixe à accoler au nom du fichier de vue. Dans les contextes fournis par Zend un suffixe par défaut est présent en général, il pourrait suffire de le réinitialiser via cette méthode en passant une chaîne vide pour le suffixe, dès lors le fichier .phtml serait utilisé (au lieu de .ajax.phtml par exemple)

Hors ligne

 

#3 26-08-2009 15:10:43

osdave
Membre
Date d'inscription: 07-07-2009
Messages: 14

Re: [résolu]vues des requêtes AJAX

comment dit-on "tu as trouvé" en grec ancien?
Efectivement, j'utilise ContextSwitch (plus particulièrement AjaxContext) et setSuffix('html', '') fait exactement ce que je veux.
Merci pour cette rapide et excelente réponse!
@+

Hors ligne

 

#4 28-08-2009 18:32:54

martinsupiot
Membre
Lieu: Nantes
Date d'inscription: 20-03-2007
Messages: 52
Site web

Re: [résolu]vues des requêtes AJAX

Pour ma part je n'ai pas le rendu voulu en Json, je pense avoir correctement suivi la doc à savoir :

Code:

<?php
class AjaxController extends Zend_Controller_Action
{
    /**
     * Initialise le contrôleur
     * 
     * Si requete ajax on désactive les layouts
     * Ce qui DOIT être toujours le cas avec ce contrôleur normalement !
     * 
     * (non-PHPdoc)
     * @see Controller/Zend_Controller_Action#init()
     */
    public function init()
    {
        // Désactivation du layout
        $this->_helper->layout->disableLayout();
        
        // Activation du contecte Ajax/Json
        $contextSwitch = $this->_helper->getHelper('AjaxContext');
        $contextSwitch->addActionContext('testAjax', 'json')
                      ->initJsonContext();
    }
    
    /**
     * Action ajax de test
     * 
     * @return Json object
     * 
     * Exemple de test : http://www.domain.fr/en/ajax/test-ajax/format/json
     */
    public function testAjaxAction()
    {
        // Affichage du résultat
        $this->view->json = 'test';
    }
}

Hors ligne

 

#5 01-09-2009 10:24:23

osdave
Membre
Date d'inscription: 07-07-2009
Messages: 14

Re: [résolu]vues des requêtes AJAX

chez moi, pour que ça fonctionne, il faut que j'ajoute dans l'url /format/json.
je pensais que en utilisant jQuery ZF déterminerais tout seul que c'est une requête AJAX, mais non sad

Hors ligne

 

#6 01-09-2009 10:31:27

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [résolu]vues des requêtes AJAX

non tu n'as rien à ajouter dans l'URL
dans ton contrôleur tu ajoute un appel à isXmlHttpRequest (objet request)

ZF sais s'il s'agit d'ajax

A+JYT

Hors ligne

 

#7 01-09-2009 11:28:18

martinsupiot
Membre
Lieu: Nantes
Date d'inscription: 20-03-2007
Messages: 52
Site web

Re: [résolu]vues des requêtes AJAX

Pour ma part que je le mette ou pas, ca ne fonctionne pas avec l'exemple ci dessus

Hors ligne

 

#8 01-09-2009 11:36:05

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [résolu]vues des requêtes AJAX

Hello,

Le ContextSwitch ne fonctionnera effectivement que si la variable 'format' existe dans l'url.

Pour tester l'ajax dans ton action directement, tu peux faire comme le dit sekaijin :

Code:

public function indexAction() {
    if ($this->getRequest()->isXmlHttpRequest()) {
        // désactivation du layout et/ou de la vue
    }
    // le reste de mon code
}

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#9 01-09-2009 11:53:29

martinsupiot
Membre
Lieu: Nantes
Date d'inscription: 20-03-2007
Messages: 52
Site web

Re: [résolu]vues des requêtes AJAX

En fait j'utilise plus précisément l'ajaxContext, et j'ai bien l'entête X_REQUESTED_WITH.

Je voudrai donc ne pas utiliser de vue, pour avoir un rendu automatique des variables de la vue.
Mais quand j'essaie de voir si j'ai bien un contexte Json, je ne l'ai pas.

Du coup je suis obligé d'avoir une vue telle que :

Code:

<?php
header('Content-Type: application/json');
echo Zend_Json::encode(get_object_vars($this));

Hors ligne

 

#10 01-09-2009 12:15:51

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [résolu]vues des requêtes AJAX

pour ma part je fais des contrôleur ajax et des contrôleur webapp
pour les contrôleur ajax je les fais dériver de la classe suivante

Code:

class Application_Controllers_Ajax extends Zend_Controllers_Action
{

    /**
     * initialise le controleur
     * tout les controleur ajax ne retourne pas de vue
     * ils envoient du json au client
     */
    public function init()
    {
        parent::init();
        $this->getFrontController()->setParam('noViewRenderer', true);
        if ($this->_request->isXmlHttpRequest()) {
            $this->_response->setHeader('Content-Type', 'application/json; charset=UTF-8', true);
        } else {
            // on envoie la reponse en texte lors d'une invocation via le navigateur
            // cela permet de tester la réponse.
            $this->_response->setHeader('Content-Type', 'text/plain; charset=UTF-8', true);
        }
        $this->response = array();
    }

    public function postDispatch() {
        Zend_Loader::loadClass('Zend_Json_Encoder');
        echo utf8_encode(ereg_replace('"__className":"[^\"]+",', '',Zend_Json_Encoder::encode($this->response)));
        parent::postDispatch();

    }
}

le ereg_replace supprime le nom de la classe dans le json envoyé lorsqu'on envoie un objet typé

pour l'utiliser il suffit d'ajouter des élément dans $this->response
comme on le fait pour une vue

A+JYT

Hors ligne

 

#11 01-09-2009 12:26:26

GueloSuperStar
Membre
Lieu: Paris
Date d'inscription: 05-08-2009
Messages: 107

Re: [résolu]vues des requêtes AJAX

ereg_replace :

Warning
This function has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged.

http://www.php.net/manual/en/function.ereg-replace.php

=>preg_replace()
http://fr.php.net/manual/en/function.preg-replace.php

Dernière modification par GueloSuperStar (01-09-2009 12:27:45)


A+ Guelo Super Star

Hors ligne

 

#12 01-09-2009 13:42:45

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [résolu]vues des requêtes AJAX

je sais mais c'est un code déjà ancien qui doit évoluer

A+JYT

Hors ligne

 

#13 01-09-2009 14:08:48

throrin19
Membre
Date d'inscription: 01-03-2009
Messages: 318
Site web

Re: [résolu]vues des requêtes AJAX

à remplacer par preg_replace si je ne me trompe pas

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages