Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 18-03-2014 21:20:50

arnica33
Membre
Date d'inscription: 23-11-2013
Messages: 25

Nesting view

bonjour,
je cherche ajouter une vue 'bilandumois' à une vue mère 'selectoperationparmois'.
Dans mon controler, j'ai fais ça :

Code:

[lang=php]
//...
            $view = array(
                    'NumMois'=> $id,
                'creditparmois' => $this->getOperationTable()->CreditParMois($id),
                'debitparmois' => $this->getOperationTable()->DebitParMois($id),
                    );
            
            $bilanView = array('bilanparmois' => $this->getServiceTraitement()->getBilanparmois($id));
            var_dump($bilanView);
            $bilanView->setTemplate('operation/bilandumois'); //ligne 174
 //           var_dump($bilanView);
            
            $view->addChild($bilanView,'bilanparmois');
            
            return $view;
//...

ce qui me renvoie une erreur Call to a member function setTemplate() on a non-object in /opt/lampp/htdocs/compte_courant_test/module/Operation/src/Operation/Controller/OperationController.php on line 174

$bilanview est bien renseigné, j'en déduis que le programme ne reconnait pas le template  'operation/bilandumois'. Je l'ai défini dans le module.config.php associé à mon module :

Code:

[lang=php]
//...
    'view_manager' => array(
        'template_path_stack' => array(
            'operation' => __DIR__ . '/../view',
                ),
        'template_map' => array(
                    'operation/bilandumois' => __DIR__ . '/../view/operation/operation/bilandumois.phtml',
          ),
    ),

Je m'en remets au forum parce que là je sèche.
merci d'avance pour votre aide
bonne soirée
Arnica

Hors ligne

 

#2 19-03-2014 09:07:59

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: Nesting view

Hello smile

tu devrais déclarer ta vue :

Code:

[lang=php]$bilanview = new ViewModel();

idem pour ton $view




EDIT : Alors je viens de te relire, c'est un peu fouilli, enfait tu mélange un peu la vue et le contenu.
C'est pas dans bilanview que tu devrais mettre ton Settemplate, mais dans ta view normale, et faire plutôt une variable bilan que tu passera en paramètre de ta vue ensuite ^^

Si tu tiens vraiment à avoir bilanview, fais en une viewModel, mais passe qu'en même par $bilan où tu y mettra ton array();

En résumé, un truc du style:

Code:

[lang=php]...
$bilan = array(getmesdonnées);
$bilanvue = new viewModel();
$bilanvue->addchild('bilan', $bilan);
$bilanvue->setTemplate(montemplate);
$view = new viewModel();
$view->addchild('bilanvue', $bilanvue);
...

Dernière modification par flobrflo (19-03-2014 12:13:38)

Hors ligne

 

#3 19-03-2014 10:56:08

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Nesting view

Salut, comme l'a dit Flobrflo ta variable $view est un array auquel tu veux ajouter un template et un enfant forcément ça peut pas marcher wink.

En fait quand tu fais un retour dans une action pour retourner une vue le ZF2 va tester si c'est de type array il va créer un ViewModel et lui passer ton array en paramètre. Je te conseil tout de même de créer toi même le ViewModel avant de le retourner c'est plus propre.

Code:

[lang=php]
return new ViewModel(array('param1' => 'value1', 'param2' => 'value2');

Ensuite pour les vues enfant tu peux le faire de différente manière. Soit directement dans ton template en utilisant l'aide de vue partial en indiquant ton template et tes paramètres (je préfère comme ça mais ça implique que tu peux pas gérer de cas facilement), soit comme tu le fais via le addChild wink.

Hors ligne

 

#4 19-03-2014 11:57:25

arnica33
Membre
Date d'inscription: 23-11-2013
Messages: 25

Re: Nesting view

merci à tous les 2 et toutes mes excuses, j'ai mal copié mon code, j'ai bien initialisé les vues. voici le code entier de la fonction. Mais je pense que vos remarques sont toujours valables.

Code:

[lang=php]
    public function selectoperationparmoisAction() //selectionne les operations du mois 
    {
        $view = new ViewModel();
        $bilanView = new ViewModel();
        
        //vérifier que 1<$id<12
        $id = (int) $this->params()->fromRoute('id', 0);
        if (!$id || $id < 1 || $id > 12) {
                    return $this->redirect()->toRoute('operation', array(
                    'action' => 'selectoperationparmois',
                    'id' => '1',
            ));
        }
        
        try {
            
            $view = array(
                    'NumMois'=> $id,
                'creditparmois' => $this->getOperationTable()->CreditParMois($id),
                'debitparmois' => $this->getOperationTable()->DebitParMois($id),
                    );
            
            $bilanView = array('bilanparmois' => $this->getServiceTraitement()->getBilanparmois($id));
            var_dump($bilanView);
            $bilanView->setTemplate('operation/bilandumois');
 //           var_dump($bilanView);
            
            $view->addChild($bilanView,'bilanparmois');
            
            return $view;
}
        catch (\Exception $ex) {
                                return $this->redirect()->toRoute('operation', array(
                    'action' => 'selectoperationparmois',
                    'id' => '1',
            ));
        }
      }

Hors ligne

 

#5 19-03-2014 12:09:52

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: Nesting view

Oui, tu peu pas transformer ta view $bilanview en array ^^
tu doit passer par une variable intermédiaire => $bilan

Dernière modification par flobrflo (19-03-2014 12:10:02)

Hors ligne

 

#6 19-03-2014 14:11:48

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Nesting view

Non tu as mal initialisé les vue ... Regarde par toi même tu fais :

Code:

[lang=php]
$view = array(xxxxxx);
...
$view->addChild(xxxx);

Aux dernières nouvelles un tableau n'a pas de méthode addChild en PHP c'est une méthode disponible dans un objet de type ViewModel. Même chose pour $bilanView tu le définis comme un array et ensuite tu lui affectes un template. C'est toujours pas un ViewModel ...

Dans le cas où on retourne un array dans une action du contrôleur c'est après qu'il est transformé en ViewModel en faisant un truc du genre :

Code:

[lang=php]
$result = array('param1' => 'value1', 'param2' => 'value2'); // Résultat du retour de l'action du contrôleur
if (is_array($result)) { // ou if (!$result instanceof ViewModel) {
    return new ViewModel($result);
}
return $result;

Ceci fonctionne dans les cas simple, dans ton cas c'est un peu plus complexe et c'est à toi d'instancier le ViewModel pour faire les traitements dont tu as besoin. Ensuite tu retournes ton ViewModel.

Même chose pour ton redirect dans ton catch. Le paramètre action n'a rien à faire là ... Normalement il est directement défini dans le router avec une route spécifique dans ce cas si tu changes l'action pour une raison x ou y tu n'as besoin de la modifier qu'à un seul endroit : le router et non pas dans toutes tes vues, contrôleurs etc ... qui appellent cette route "globale"

Hors ligne

 

#7 19-03-2014 17:10:01

Bouks
Membre
Lieu: Paris
Date d'inscription: 31-08-2012
Messages: 241

Re: Nesting view

Bien vu Orkin.

De plus :

arnica33 a écrit:

Code:

[lang=php]
    public function selectoperationparmoisAction() //selectionne les operations du mois 
    {
        $view = new ViewModel();
        $bilanView = new ViewModel();
        
        ...
        
        try {
            
            ...
}
        catch (\Exception $ex) {
                                return $this->redirect()->toRoute('operation', array(
                    'action' => 'selectoperationparmois',
                    'id' => '1',
            ));
        }
      }

Ca sent la boucle infinie à plein nez...

Et si on apprenait à programmer avant de faire du framework ?


22914720

Hors ligne

 

#8 19-03-2014 17:13:31

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: Nesting view

Bouks a écrit:

Et si on apprenait à programmer avant de faire du framework ?

Ça arrive de faire des fautes d'inattention mmhh?? smile

Dernière modification par flobrflo (19-03-2014 17:14:30)

Hors ligne

 

#9 19-03-2014 17:20:27

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Nesting view

Même la doc dit de pas le faire ça. Pourtant j'ai vu des gens faire ça : passer l'action en paramètre. Ca fonctionne mais nulle part dans la doc il est question de ça. Je sais pas sur quel site/blog ca a été pompé mais comme c'est pas le seul à faire cette erreur je suppose que c'est sur un site quelque part. Et c'est une connerie sans nom, pour ça la doc officielle est vraiment bien foutu et c'est dommage d'aller voir un blog/tuto alors que la doc en parle. Dans le cas contraire je dis pas mais là ... Même quand j'ai commencé le ZF2 (c'était l'alpha à l'époque) j'ai jamais vu dans la doc qu'il fallait faire ça. Je serais curieux de voir qui a publié cet article.

Ca vaut pour tout le monde en premier lieu consultez la doc officielle, ensuite les blogs des contributeurs (il y a quand même peu de chance d'y voir des conneries ^^) et ensuite les tutos de développeurs lambda qui dans certains cas traitent des sujets super intéressant et aident à avancer et dans d'autre font prendre de mauvaises habitudes. Ce pourquoi il faut aussi savoir recouper les informations.

Au final quand on voit les problèmes d'Arnica33 c'est beaucoup de fautes d'inattention et simplement lire le message d'erreur donne la solution au problème.

Concernant la boucle infinie effectivement c'est un autre sujet wink.

Hors ligne

 

#10 19-03-2014 17:27:41

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: Nesting view

hem...

Pour sa défense : http://framework.zend.com/manual/2.0/en … llers.html
(On est pas des chiens non plus hein ^^)
Si on le lit en vitesse on peu vite dérapper.
Bon ok, c'est au développeur de bien faire attention, mais ça peu arriver... smile

Hors ligne

 

#11 19-03-2014 17:38:11

Bouks
Membre
Lieu: Paris
Date d'inscription: 31-08-2012
Messages: 241

Re: Nesting view

flobrflo a écrit:

Bouks a écrit:

Et si on apprenait à programmer avant de faire du framework ?

Ça arrive de faire des fautes d'inattention mmhh?? smile

Entre la réaffectation de $view de viewModel en array, l'appel de addchild sur un array et la boucle infinie, ça fait un peu beaucoup.

Au passage le if(!$id) ne sert à rien.


22914720

Hors ligne

 

#12 19-03-2014 18:02:27

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Nesting view

A aucun moment tu as un redirect avec l'action directement dedans le param action est bien dans le router.

Là pour le coup je suis d'accord avec Bouks ça fait beaucoup big_smile. Sachant qu'effectivement vérifier si $id est défini n'est pas nécessaire puisque normalement tu le met en contraintes dans le router encore une fois wink.

Hors ligne

 

#13 19-03-2014 18:26:48

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: Nesting view

Wé ok ça fais un paquet...

Mais si l'id 1 est "sur" il fait un genre de 404 un peu bizarre? ^^

Hors ligne

 

#14 19-03-2014 18:59:03

Bouks
Membre
Lieu: Paris
Date d'inscription: 31-08-2012
Messages: 241

Re: Nesting view

Sachant qu'il est défini en contrainte (et j'imagine obligatoire) dans le router, avec la simple contrainte :

Code:

[lang=php]
'constraints' => ['id' => '[1-9][0-9]*']

tu n'as même pas besoin de tester le inférieur à 1.

Maintenant si tu veux une redirection plutôt qu'une erreur de routage, il faut faire le test dans le controller (inférieur à 1 et supérieur à 12) et laisser par exemple :

Code:

[lang=php]
'constraints' => ['id' => '[0-9]*']

et tester :

if($id == 0 || $id > 12)

Puisque $id ne sera jamais inférieur à 0. Le "===" est aussi optionnel puisque à cette étape on est déjà certain que $id est un entier (par le routeur). Cependant si l'id est optionnel dans la table de routage, le transtypage préalable devient nécessaire pour traiter le null (sinon tester avec empty()).


22914720

Hors ligne

 

#15 19-03-2014 19:11:16

Bouks
Membre
Lieu: Paris
Date d'inscription: 31-08-2012
Messages: 241

Re: Nesting view

Je mets des * pour simplifier mais normalement tu dois mettre un {m,n} en fonction de la taille d'entier de ton id dans ta table pour éviter au maximum des problèmes (même si c'est impossible de l'éviter complètement par le routeur qui ne peut limiter par ordre de grandeur numérique).

Dans ton cas, et suivant ta limitation de 12 :

[0-9]{1,2}

ou

[1-9][0-9]?


22914720

Hors ligne

 

#16 21-03-2014 20:45:45

arnica33
Membre
Date d'inscription: 23-11-2013
Messages: 25

Re: Nesting view

merci pour toutes vos remarques.
En réponse collective, effectivement, j'apprends à coder avec le framework, il y a beaucoup de notions qui ne sont pas claires, j'apprends par la pratique. Je me suis défini un objectif, je sais ce qui je veux obtenir mais, je ne sais pas comment. Alors je me renseigne, je fais des essais, il y a des trucs que je mets de coté pour plus tard.
Je n'ai pas beaucoup de temps à consacrer à ce loisir, alors je priorise, je pratique après mon boulot d'ingé info indus, après mes activités de papa, si je fais trois quarts d'heures dans la soirée, je suis content, je me suis bien trituré les méninges.
merci encore pour toutes vos remarques constructives, je les prendrai en compte plus tard. Pour le moment, je me concentre sur le fait d'ajouter une vue fille à une vue mère. Il s'agit de ne pas se disperser.
j'ai noté la remarque d'Orkin sur le fait de passer un array par addchild().
amicalement
Arnica

Hors ligne

 

#17 21-03-2014 21:09:56

arnica33
Membre
Date d'inscription: 23-11-2013
Messages: 25

Re: Nesting view

avec ce code-ci, ça fonctionne

Code:

[lang=php]
            $selectOp = array(
                    'NumMois'=> $id,
                'creditparmois' => $this->getOperationTable()->CreditParMois($id),
                'debitparmois' => $this->getOperationTable()->DebitParMois($id),
                    );
            
            $bilan = array('bilan' => $this->getServiceTraitement()->getBilanparmois($id));
            $bilanView = new ViewModel($bilan);
            $bilanView->setTemplate('operation/bilandumois');
             $view = new ViewModel($selectOp);
            $view->addChild($bilanView,'bilanparmois');
            return $view;

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