Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je rencontre un problème avec l'utilisation de plusieurs partialLoop imbriqués.
En effet, lorsque j'appelle seulement le premier "niveau", tout se passe bien, mon partialLoop appelle correctement le fichier .phtml et lui passe bien le tableau de valeurs à afficher.
Mais si, dans ce .phtml, je fais appel à un nouveau partialLoop, il semblerait que celui entre en conflit avec celui du niveau supérieur.
Ci-dessous, le code en question :
index.phtml
<?php echo $this->partialLoop() ->setObjectKey( 'release' ) ->partialLoop( 'release/partials/partial-release.phtml', $this->releases ); ?>
release/partial-relase.phtml
<div class="divRelease"> <div class="header"> <a href="<?php echo $this->baseUrl();?>/release/edit/id/<?php echo $this->escape( $this->release->getId() ); ?>"> <img class="edit" src="<?php echo $this->baseUrl();?>/images/edit.png" alt="edit release" title="edit release" /> </a> <h4> <a href="<?php echo $this->baseUrl();?>/release/display/id/<?php echo $this->release->getId(); ?>"><?php echo $this->release->getName();?></a> </h4> <div class="description"> <?php echo $this->escape( $this->release->getDescription() ); ?> </div> <div class="status <?php echo $this->escape( $this->release->getStatus()->getName() ); ?>" title="<?php echo $this->escape( $this->release->getStatus()->getName() ); ?>"> <span class="startDate"> <img src="<?php echo $this->baseUrl();?>/images/flag-start.png" /> <?php echo $this->escape( $this->release->getStartDate() ); ?> </span> <span class="endDate"> <img src="<?php echo $this->baseUrl();?>/images/flag-end.png" /> <?php echo $this->escape( $this->release->getEndDate() ); ?> </span> </div> </div> <div class="content"> <div class="sprints"> <a href="<?php echo $this->baseUrl();?>/sprint/edit/"> <img class="edit" src="<?php echo $this->baseUrl();?>/images/add.png" alt="add sprint" title="add sprint" /> </a> <h4>Sprints</h4> <?php echo $this->partialLoop() ->setObjectKey( 'sprint' ) ->partialLoop( 'sprint/partials/partial-sprint-with-stories.phtml', $this->release->getSprints() ); ?> </div> </div> </div>
L'erreur se situe à la ligne 3 de "release/partial-release.phtml", lors du 1° appel à la variable $this->release :
PHP a écrit:
Notice: Key "release" does not exist.
Fatal error: Call to a member function getId() on a non-object in C:\www\Escarmouche\application\views\scripts\release\partials\partial-release.phtml on line 3
Mais, et c'est là que ça devient 'achement bizarre, si je supprime le bloc PHP en fin de ce fichier (la 2° boucle partialLoop), tout refonctionne à nouveau...
(je précise que ce partialLoop aussi fonctionne correctement, si pris séparément).
Y aurait-il donc un conflit lorsque plusieurs partialLoop tournent, ou doit-on faire quelque chose de particulier pour les "isoler" l'un de l'autre ? Google n'a pas été mon ami, sur ce coup-là !
Hors ligne
J'avance dans ma recherche d'explications : il semblerait que ce soit l'appel à "setObjectKey" qui fout la grouille...
Après étude du code-source des classes PartialLoop et Partial, je dirais que cette méthode écrase la clé précédente (celle du niveau supérieur, donc), d'où gros problème.
Hors ligne
Je continue à me répondre à moi-même.
J'ai trouvé une "solution" de secours : elle consiste à sauvegarder dans une variable la valeur renvoyée par getObjectKey() et à la remettre après le partialLoop du niveau inférieur.
$objectKey = $this->partialLoop()->getObjectKey(); echo $this->partialLoop() ->setObjectKey( 'sprint' ) ->partialLoop( 'sprint/partials/partial-sprint-with-stories.phtml', $this->release->getSprints() ); $this->partialLoop() ->setObjectKey( $objectKey );
Cette solution fonctionne mais ne me semble pas très propre. Je laisse donc le sujet ouvert, en espérant avoir une proposition plus propre.
Hors ligne