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] Refresh AJAX vue


Sujet :

Zend Framework PHP

  1. #1
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 42
    Par défaut [ZF 2] Refresh AJAX vue
    Bonjour,

    Je prends mes marques sur le framework ZEND (version 2), et développe divers
    modules.
    Sur le dernier, j'ai une liste de données dans un tableau, que je pagine avec "Paginator", cela fonctionne bien.
    En javascript, je modifie les liens de la pagination afin de recharger en AJAX le tableau.

    Dans mon controleur, je retourne dans indexAction, et capte l'événement AJAX avec $this->getRequest()->isXmlHttpRequest().

    Maintenant, impossible de charger une autre vue que index.phtml.
    J'ai créer deux vues, une au premier chargement, l'autre pour l'ajax :

    index.phtml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    	$title = 'My Sample Data';
    	echo $this->headTitle($title);
    	?>
    	<h1><?php echo $this->escapeHtml($title); ?></h1>
     
    	<p><a href="<?php echo $this->url('SanSamplePagination/default', array(
    			'action'=>'add'));?>">Add new Sample Data</a></p>
    	<div id="winpopup"></div>
    	<div id="div_content_pagination">
    	<?php require_once('list.phtml'); ?>
    	</div>
    list.phtml :
    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
    <?php
    echo ( count($this->sample) > 0 ) ? $this->paginationControl($this->sample, 'Sliding', 'pager.phtml') : ""; ?>
    <table class="table">
        <tr>
            <th>Id</th>
            <th>Name</th>
            <th>Gender</th>
            <th></th>
        </tr>
        <?php foreach($this->sample as $row) : ?>
        <tr>
            <td><?php echo $this->escapeHtml($row['id']); ?></td>
            <td><?php echo $this->escapeHtml($row['name']); ?></td>
            <td><?php echo ($row['gender'] == 2) ? 'Female' : 'Male'; ?></td>
            <td>
            <a href="<?php echo $this->url('SanSamplePagination/sample-id',
                array('action'=>'edit', 'id' => $row['id'], 'controller'=>'tablesample'));?>">Edit</a>
            <a href="<?php echo $this->url('SanSamplePagination/sample-id',
                array('action'=>'delete', 'id' => $row['id']));?>">Delete</a>
        </td>
        </tr>
        <?php endforeach; ?>
    </table>
     
    <?php echo ( count($this->sample) > 0 ) ? $this->paginationControl($this->sample, 'Sliding', 'pager.phtml') : ""; ?>
    Comment faire dans le contrôleur pour appeler uniquement list.phtml, et non index.phtml ? Peut-être créer une nouvelle action dans celui-ci ?
    Quelques exemples ? Car malheureusement, la version 2 n'est pas encore très bien documentée/partagée sur le net...

    Merci,

  2. #2
    Membre émérite
    Avatar de amoiraud
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2006
    Messages : 606
    Par défaut
    Salut,

    Pour afficher une vue différente, tu peut faire comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $viewModel = new ViewModel();
    $viewModel->setTemplate('technicalerror');
    $viewModel->setVariable('variable', 'valeur');
    return $viewModel;
    N'oublie pas de mapper ta vue dans ton module.config.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    'view_manager' => array(
        'template_map' => array(
            'technicalerror' => __DIR__ . '/../view/application/index/technicalerror.phtml',
        );
    );

  3. #3
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 42
    Par défaut
    Merci pour ta réponse,

    J'ai cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call to a member function setTemplate()
    Il me manque peut être un use ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    use Zend\Mvc\Controller\AbstractActionController;
    use Zend\View\Model\ViewModel;
    use SanSamplePagination\Form\SampleForm;
    use SanSamplePagination\Model\Sample;
     
    class TablesampleController extends AbstractActionController
    {
        protected $sampletable;
        public $viewmodel; 
     
        public function indexAction()
        { 
    ...

  4. #4
    Membre émérite
    Avatar de amoiraud
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2006
    Messages : 606
    Par défaut
    Non tu a le namespace qu'il faut (Zend\View\Model\ViewModel)

    Tu peut faire voir le reste du code de ton controller ?

  5. #5
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 42
    Par défaut
    Oui bien sûr, je limite le c/c à l'action "index" :

    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
    <?php
    /**
     * Zend Framework (http://framework.zend.com/)
     *
     * @link      http://github.com/zendframework/SanSamplePagination for the canonical source repository
     * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
     * @license   http://framework.zend.com/license/new-bsd New BSD License
     */
     
    namespace SanSamplePagination\Controller;
     
    use Zend\Mvc\Controller\AbstractActionController;
    use Zend\View\Model\ViewModel;
    use SanSamplePagination\Form\SampleForm;
    use SanSamplePagination\Model\Sample;
     
    class TablesampleController extends AbstractActionController
    {
        protected $sampletable;
        public $viewmodel; 
     
        public function indexAction()
        { 
            $viewmodel = new ViewModel;
            $matches = $this->getEvent()->getRouteMatch();
            $page      = $matches->getParam('page', 1);
            $iteratorAdapter = new \Zend\Paginator\Adapter\ArrayAdapter(  $this->getSampleTable()->fetchAll() );
            $paginator = new \Zend\Paginator\Paginator($iteratorAdapter);
     
            $paginator->setCurrentPageNumber($page);
            $paginator->setItemCountPerPage(2);
     
            $viewmodel->setVariable('sample', $paginator);
    		if ($this->getRequest()->isXmlHttpRequest()){
    			$viewModel->setTemplate('ajaxList');
    			$viewModel->setVariable('isajax', '1');
    		}
     
            return array(
                'sample'  => $paginator,
            );
        }
    }
    Erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Call to a member function setTemplate() on a non-object in /home/intranetdauchez/www/module/SanSamplePagination/src/SanSamplePagination/Controller/TablesampleController.php on line 35
    Merci !

  6. #6
    Membre émérite
    Avatar de amoiraud
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2006
    Messages : 606
    Par défaut
    L'erreur vient du fait que tu à mal orthographié le nom de la variable dans ton if (tu passe de $viewmodel à $viewModel)

  7. #7
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 42
    Par défaut
    Ok... J'étais fatigué hier soir !
    Merci.

    Celà fonctionne, par contre il passe toujours par index.phtml, et recharge entièrement le layout (tous le head avec les fichiers JS / CSS sont rechargés).

    J'aimerais que mon contrôleur prenne uniquement le list.phtml, afin de rafraichir le tableau uniquement.

    Dans le module.config j'ai bien défini mon template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'view_manager' => array(
            'template_path_stack' => array(
                'SanSamplePagination' => __DIR__ . '/../view',
            ), 
            'template_map' => array(
    			'ajaxList' => __DIR__ . '/../view/tablesample/list.phtml',
            ), 
        ),
    J'ai également positionné le "ajaxList" dans le template_path_stack (ce qui n'est pas utile puisqu'il charge le dossier) pour le test, idem.

  8. #8
    Membre émérite
    Avatar de amoiraud
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2006
    Messages : 606
    Par défaut
    Salut,

    Pour qu'il ne passe pas par l'index.phtml, tu doit faire un return de ton viewmodel dans l'action index (si j'ai bien compris ton besoin, met ca dans le if isXmlHttpRequest).

    Pour ce qui est de la desactivation du layout, essaye d'ajouter cette ligne après l'instanciation de ton viewModel dans le controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $viewmodel = new ViewModel();
    $viewmodel->setTerminal(true);

  9. #9
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 42
    Par défaut
    Ok, je comprends bien mieux.

    D'ailleurs, dans cet exemple pris sur github, je ne vois pas pourquoi il ne retourne pas le viewmodel directement.
    J'ai modifié :

    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
    public function indexAction()
        { 
            $viewmodel = new ViewModel;
            $matches = $this->getEvent()->getRouteMatch();
            $page      = $matches->getParam('page', 1);
            $iteratorAdapter = new \Zend\Paginator\Adapter\ArrayAdapter(  $this->getSampleTable()->fetchAll() );
            $paginator = new \Zend\Paginator\Paginator($iteratorAdapter);
            $paginator->setCurrentPageNumber($page);
            $paginator->setItemCountPerPage(2);
     
            $viewmodel->setVariable('sample', $paginator);
     
    		if ($this->getRequest()->isXmlHttpRequest()){
    			$viewmodel->setTemplate('ajaxList');
    			$viewmodel->setTerminal(true);
    		}
    		return $viewmodel;
        }
    Le comportement est ok (vu dans firebug).
    Par contre il ne rentre pas dans le fichier list.phtml, malgré la déclaration dans le module.config.

    Si je commente le setTemplate, celà fonctionne mais il repasse par index.phtml (logique).
    Est ce parce qu'il ne trouve pas le template ? Dans ce cas il devrait me jeter avec une erreur ?

    Je te remercie,

  10. #10
    Membre émérite
    Avatar de amoiraud
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2006
    Messages : 606
    Par défaut
    Tu peut nous montrer l'arborescence de ton dossier de vues ?

    J'ai l'impression qu'il manque un dossier dans le lien que tu à défini dans ton module.config.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    'ajaxList' => __DIR__ . '/../view/tablesample/list.phtml',
    Logiquement ca devrait être view/[module]/[controller]/list.phtml

  11. #11
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 42
    Par défaut
    Mon dieu... J'aurai réussi à faire 2 posts inutiles dans ce topic.

    Merci amoiraud, ça fonctionne au top.

    Bonne journée,

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

Discussions similaires

  1. [AJAX] refresh ajax IE8
    Par ZnhaarX dans le forum AJAX
    Réponses: 3
    Dernier message: 27/06/2011, 20h36
  2. problème session avec refresh ajax
    Par fraternity dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 26/04/2011, 18h05
  3. Récupérer valeurs avant refresh(Ajax.PeriodicalUpdater)
    Par jcaction dans le forum Servlets/JSP
    Réponses: 0
    Dernier message: 17/07/2009, 14h48
  4. [Prototype] Refresh Ajax Php
    Par ccsuperstar dans le forum Bibliothèques & Frameworks
    Réponses: 13
    Dernier message: 17/03/2008, 09h38
  5. Réponses: 2
    Dernier message: 06/12/2004, 14h43

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