Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] Jelix 1.1 : Template Boucle imbriquer

Posted by Yann.L on 01/08/2009 18:16

Bonjour,

Dans un template je suis obliger d'imbriquer deux boucles pour permettre l'affichage d'une liste déroulante dans chaque ligne de mon tableau. Or la boucle semble fonctionner que pour la première ligne de mon tableau.

Voici le code de mon template.

 <table summary="Ce tableau présente les présences d'un collaborateur.">
	<caption>{$collabNom} {$collabPrenom} - Periode du {$dateDeb} au {$dateFin}</caption>
	<thead>
		<tr>
			<th scope="col">Jour</th>
			<th scope="col">Date</th>
			<th scope="col">Status</th>
			<th scope="col">Validation</th>
			<th scope="col">Observations</th>
		</tr>
	</thead>
	<tbody>
		{foreach $affectation_prevu as $presence} 
		<tr>
			<td>{$presence->jourEnLettrePresence}</td>
			<td>{$presence->dateDuJourPresence}</td>
			<td>
				<select name="TypePresence" >
					{foreach $type_presences as $type_presence}
						{if $type_presence->type_presenceId == $presence->idTypePresence}
							<option selected="selected" value="{$type_presence->type_presenceId}">{$type_presence->type_presenceLib}</option>
						{else}
							<option value="{$type_presence->type_presenceId}">{$type_presence->type_presenceLib}</option>
						{/if}
					{/foreach}
				</select>
			</td>
			<td>{$presence->validationPresence}</td>
			<td>{$presence->observationPresence}</td>
		</tr>
		{/foreach}
	</tbody>
 </table>

Il semblerait que pour la première ligne, la boucle fonctionne, mais pour les ligne suivante le foreach n'effectue pas de boucle, il est déjà à la fin.

Une idée pour m'aider svp ?

  [Opened] Re: Jelix 1.1 : Template Boucle imbriquer

Reply #1 Posted by manooweb on 01/08/2009 19:29

oui curieux, je ne pense pas que ce soit lié à l'imbrication. Je fais çà (boucles imbriquées) à plusieurs endroits et çà fonctionne parfaitement.


Manu

  [Opened] Re: Jelix 1.1 : Template Boucle imbriquer

Reply #2 Posted by laurentj on 01/08/2009 19:55

Salut

regarde le code source de la page web. Tu devrais avoir des erreurs je pense dans l'element select (et ces erreurs ne sont pas dans une option, donc on ne les vois pas).

Je pense donc que ce n'est pas lié à jelix ou jtpl, et tu dois avoir une erreur php classique...

  [Opened] Re: Jelix 1.1 : Template Boucle imbriquer

Reply #3 Posted by manooweb on 01/08/2009 20:02

tu es sûr que ton tableau $type_presences n'est pas vide pour les autres enregistrements ?

j'ai fait un exemple çà marche farpaitement

http://www.treize-septiers.fr/?module=tr(..)

La première boucle sur un tableau contenant une liste de classe, la seconde imbriquée boucle sur un tableau dont chaque élément contient un tableau avec la valeur et le libellé de l'option.

 <table>
 {foreach $testClasse as $record}
    <tr>
    <td>
    {$record->maPropriete}
    </td>
    <td>
        <select>
        {foreach $options as $option}
            <option value="{$option[0]}">{$option[1]}</option>
        {/foreach}
        </select>
    </td>
    </tr>
 {/foreach}

Manu

  [Opened] Re: Jelix 1.1 : Template Boucle imbriquer

Reply #4 Posted by Yann.L on 01/09/2009 10:11

$type_presences contient une liste complète de records de type type_presence(DAO type_presences)

Voila comment je récupéré ma liste de records

 // recuperation des types de présences
 $factTypePresence = jDao::get('cout_dir~type_presence');
 $liste_type_presences = $factTypePresence->findAll();

cette liste est ensuite envoyer a ma zone :

 $rep->body->assignZone('content', 'affectation_prevu', array('type_presences'=>$liste_type_presences);

et ma zone l'assigne au template :

 $this->_tpl->assign('type_presences', $this->param('type_presences'));

Et voila le code de source de ma page :

 
 <table summary="Ce tableau présente les présences d'un collaborateur.">
 <caption>USER 1 - Periode du 01-01-2009 au 31-01-2009</caption>
 <thead>
   <tr>
     <th scope="col">Jour</th>
     <th scope="col">Date</th>
     <th scope="col">Status</th>
     <th scope="col">Validation</th>
     <th scope="col">Observations</th>
   </tr>
 </thead>
 <tbody>
	<tr>
	  <td>Thu</td>
	  <td>01-01-2009</td>
	  <td>
	    <select name="TypePresence0" >
		<option selected="selected" value="1">Presence</option>
		<option value="2">Repos</option>
		<option value="3">RTT</option>
		<option value="4">CP</option>
		<option value="5">Recup</option>
		<option value="6">JF</option>
		<option value="7">Maladie</option>
		<option value="8">Maternite</option>
		<option value="9">CE</option>
		<option value="10">AANR</option>
	    </select>
	  </td>
	  <td>Non</td>
  	  <td></td>
	</tr>
	<tr>
	  <td>Fri</td>
	  <td>02-01-2009</td>
	  <td>
	    <select name="TypePresence1" >
	    </select>
 	  </td>
	  <td>Non</td>
	  <td></td>
	</tr>
 </tbody>

Et le code généré dans le temp par Jelix :

 <table summary="Ce tableau présente les présences d'un collaborateur.">
	<caption><?php echo $t->_vars['collabNom']; ?> <?php echo $t->_vars['collabPrenom']; ?> - Periode du <?php echo $t->_vars['dateDeb']; ?> au <?php echo $t->_vars['dateFin']; ?></caption>
	<thead>
		<tr>
			<th scope="col">Jour</th>
			<th scope="col">Date</th>
			<th scope="col">Status</th>
			<th scope="col">Validation</th>
			<th scope="col">Observations</th>
		</tr>
	</thead>
	<tbody>
		<?php $t->_vars['i'] = 0;?>
		<?php foreach($t->_vars['affectation_prevu'] as $t->_vars['presence']):?> 
		<tr>
			<td><?php echo $t->_vars['presence']->jourEnLettrePresence; ?></td>
			<td><?php echo $t->_vars['presence']->dateDuJourPresence; ?></td>
			<td>
				<select name="TypePresence<?php echo $t->_vars['i']; ?>" >
					<?php foreach($t->_vars['type_presences'] as $t->_vars['type_presence']):?>
						<?php if($t->_vars['type_presence']->type_presenceId == $t->_vars['presence']->idTypePresence):?>
							<option selected="selected" value="<?php echo $t->_vars['type_presence']->type_presenceId; ?>"><?php echo $t->_vars['type_presence']->type_presenceLib; ?></option>
						<?php else:?>
							<option value="<?php echo $t->_vars['type_presence']->type_presenceId; ?>"><?php echo $t->_vars['type_presence']->type_presenceLib; ?></option>
						<?php endif;?>					
					<?php endforeach;?>
				</select>
			</td>
			<td><?php echo $t->_vars['presence']->validationPresence; ?></td>
			<td><?php echo $t->_vars['presence']->observationPresence; ?></td>
		</tr>
		<?php $t->_vars['i'] = $t->_vars['i'] + 1;?>
		<?php endforeach;?>
	</tbody>
 </table>

Pour que ça marche je dois utiliser un tableau plutôt qu'une liste de records ?

EDIT : Apparemment ça marche avec un tableau ! c'est bizarre je trouve de ne pas pouvoir utiliser une liste de record pour cela ? c'est un bug ou quelque chose que j'ai oublié ?

  [Opened] Re: Jelix 1.1 : Template Boucle imbriquer

Reply #5 Posted by Yann.L on 01/09/2009 15:02

je ne pense pas avoir redéfini le findAll, j'ai seulement créer ma DAO avec jelix-script. Et j'ai écrit ceci dans mon contrôleur :

 // recuperation des types de présences
 $factTypePresence = jDao::get('cout_dir~type_presence');
 $liste_type_presences = $factTypePresence->findAll();

Par contre j'utilise mon driver jDb pour mssql qui n'est pas encore totalement au point, c'est pour ça d'ailleurs que je n'ai tjrs pas soumis le patch pour l'intégrer a Jelix. Il y a peut être un problème dans mssql.daobuilder.php

  [Opened] Re: Jelix 1.1 : Template Boucle imbriquer

Reply #6 Posted by laurentj on 01/09/2009 16:02

Je pense que tu as peut être mal implémenté la méthode _rewind(), qui doit normalement remettre le "curseur" au début de la liste des enregistrements. (faire un mssql_data_seek(.., 0) je pense)

  [Opened] Re: Jelix 1.1 : Template Boucle imbriquer

Reply #7 Posted by laurentj on 01/09/2009 16:04

au fait, à ce stade de développement de ton driver, c'est quand même utile de le proposer dans un ticket et demander une review, tu auras certainement plus vite des retours sur les choses qui sont mal faites ;-) (plutôt que d'attendre que le bug arrive ;-)

  [Opened] Re: Jelix 1.1 : Template Boucle imbriquer

Reply #8 Posted by manooweb on 01/10/2009 17:30

Salut,

bon j'ai refait un exemple sur mon site en dev en ce moment.

Voici la méthode action du controlleur

 function testClasse() {
        $rep = $this->getResponse('html');
        $rep->title = "Page de test";
        jClasses::inc('plan~categorie');
        $params = array('tpl'=>'treizeseptiers~testClasse',
                        'annuaire'=>$this->factoryAnnuaire->findAllByCategorie(3)->fetchAll(),
                        'categories'=>categorie::getCategories(),
                        );
        $rep->body->assignZone('contenu','treizeseptiers~contenu',$params);
        return $rep;
 }

Dans annuaire je passe le resultat total d'une méthode de Dao Dans categorie appel d'une méthode statique de classe qui est le résultat d'une méthode findAll d'un dao.

 public static function getCategories() {
     $factory = jDao::get('plan~categorie');
     return $factory->findAll()->fetchAll();
 }

Dans la classe de la zone contenu je ne fais strictement rien (aucune assignation) je change juste le nom du template par défaut par celui passé en paramètre.

Les deux boucles imbriquées dans le template

 <h1>Test d'affichage d'une classe</h1>
 <table>
 {foreach $annuaire as $record}
     <tr>
     <td>
     {$record->nom}
     </td>
     <td>
         <select>
         {foreach $categories as $categorie}
             <option value="{$categorie->idCategorie}">{$categorie->libelle} </option>
         {/foreach}
         </select>
     </td>
     </tr>
 {/foreach}
 </table>

et voilà çà donne çà. c'est assez proche de ce que tu veux faire, c'est avec jelix 1.1rc1

http://www.treize-septiers.fr/?module=tr(..)


Manu

  [Opened] Re: Jelix 1.1 : Template Boucle imbriquer

Reply #9 Posted by Yann.L on 01/12/2009 18:02

Je viens de lire ceci :

 Si le driver PDO ne supporte pas cette fonctionnalité, PDO::lastInsertId() lancera un SQLSTATE IM001. 

 

Source

Donc apparemment PDO ne supporte pas lastInsertId() pour MSSQL, mais sa ne m'explique pas pourquoi ça marche avec jDb :x

 
Page
  1. Jelix 1.1 : Template Boucle imbriquer