Précédent   Forum du club des développeurs et IT Pro > PHP > Bibliothèques et frameworks > CakePHP
CakePHP Forum d'entraide sur le framework PHP CakePHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 19/04/2012, 12h42   #1
kiradeus
Candidat au titre de Membre du Club
 
Inscription : janvier 2010
Messages : 43
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 43
Points : 11
Points : 11
Par défaut Probleme récupération données avec foreach

Bonjour à tous,

Voila j'ai décidé de faire un filtre sur mon site de cocktails.

Pour ce faire, à chaque clic d'une catégorie dans mon filtre, ça exécute un code javascript qui fait appel à chaque fois à la fonction filter() qui se trouve dans mon CocktailsController.php. Voici son contenu :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function filter(){
		if(isset($_POST['categories'])){
			$term_id = $_POST['categories'];
			foreach($term_id as $k => $v){
				$termR = $this->Cocktail->TermR->find('list', array(
					'fields' => array('ref_id'),
					'conditions' => array('TermR.term_id' => $v)
				));
				foreach($termR as $w => $x){
					$d['cocktails'] = $this->Cocktail->find('all', array('conditions' => array('Cocktail.id' => $x)));
					$this->set($d);
				}
			}
		}
		else{
			$this->paginate = array('Cocktail' => array('limit' => 10));
			$cocktails = $this->Paginate('Cocktail', array('Cocktail.online' => 1, 'Cocktail.created <= NOW()'));
			$this->set($d);
		}
	}
Et mon filter.ctp correspondant :
Code :
1
2
3
4
5
6
<?php if(!empty($cocktails)): ?>
	<?php foreach($cocktails as $k => $v): $v = current($v); ?>
		<?php echo $v['name']; ?>
		<a href="<?php echo $this->Html->url($v['link']); ?>" class="btn primary">Consulter</a><br>
	<?php endforeach; ?>
<?php endif; ?>
Le problème c'est que dès qu'il y a plusieurs cocktails à retourner, et bien seul le dernier résultat est pris en compte. En fait en faisant des debug je me suis vite aperçu qu'à chaque appelle de la fonction filter(), le foreach écrasait mes anciennes données à chaque fois. Seul le dernier résultat est pris en compte donc.

Je comprend très bien le problème donc mais je ne vois pas du tout comment faire pour y remédier.
Je m'en remet donc à vous car je sèche depuis déjà plusieurs jours sans trouver la solution.
J'espère que j'ai donner tout les éléments nécessaires pour que vous puissiez bien comprendre mon problème.

Merci en tous les cas de votre aide.
kiradeus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2012, 13h32   #2
rawsrc
Modérateur
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 2 593
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 2 593
Points : 6 074
Points : 6 074
Envoyer un message via Skype™ à rawsrc
Bonjour,

Est-ce que tu pourrais essayer avec ceci :
Code php :
$d['cocktails'][] = $this->Cocktail->find('all', array('conditions' => array('Cocktail.id' => $x)));
Et tu n'as pas besoin de ça :
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2012, 23h19   #3
kiradeus
Candidat au titre de Membre du Club
 
Inscription : janvier 2010
Messages : 43
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 43
Points : 11
Points : 11
Bonjour rawsrc, merci de ta réponse !

J'ai fait comme tu dis et ça marche niquel sauf qu'il y a deux soucis maintenant :

1 - Il y a des doublons. Je m'explique, si un cocktail appartient à la catégorie 'Rhum' et 'Vodka', et que l'on sélectionne ces deux catégories dans le filtre, et bien le cocktail en question va s'afficher deux fois.

2 - Ensuite si j'utilise le $d['cocktails'][] dans le premier cas, et bien il faut que je change également le passage suivant :
Code :
1
2
3
4
5
else{
		$this->paginate = array('Cocktail' => array('limit' => 10));
		$cocktails = $this->Paginate('Cocktail', array('Cocktail.online' => 1, 'Cocktail.created <= NOW()'));
		$this->set($d);
		}
J'ai essayé d'utiliser également le $d['cocktails'][] ici mais seul le dernier cocktail de ma base de données s'affiche. Comprend pas trop...

Voici mon nouveau code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function filter(){
		if(isset($_POST['categories'])){
			$term_id = $_POST['categories'];
			foreach($term_id as $k => $v){
				$termR = $this->Cocktail->TermR->find('list', array(
					'fields' => array('ref_id'),
					'conditions' => array('TermR.term_id' => $v)
				));
				foreach($termR as $w => $x){
					$d['cocktails'][] = $this->Cocktail->find('all', array(
						'conditions' => array('Cocktail.id' => $x)
					));
					$this->set($d);
				}
			}
		}
		else{
			$d['cocktails'][] = $this->Cocktail->find('all', array(
				'conditions' => array('Cocktail.online' => 1, 'Cocktail.created <= NOW()')
			));
			$this->set($d);
		}
	}
Et :
Code :
1
2
3
4
5
6
<?php if(!empty($cocktails)): ?>
	<?php foreach($cocktails as $k => $v): $v = current($v); ?>
		<?php echo $v['Cocktail']['name']; ?>
		<a href="<?php echo $this->Html->url($v['Cocktail']['link']); ?>" class="btn primary">Consulter</a><br>
	<?php endforeach; ?>
<?php endif; ?>
Je sais j'utilise encore le current mais si je l'enlève ça ne marche pas.
Et encore merci à toi car tu m'as déjà beaucoup fait avancé !
kiradeus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2012, 10h39   #4
rawsrc
Modérateur
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 2 593
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 2 593
Points : 6 074
Points : 6 074
Envoyer un message via Skype™ à rawsrc
Citation:
Envoyé par kiradeus Voir le message
1 - Il y a des doublons. Je m'explique, si un cocktail appartient à la catégorie 'Rhum' et 'Vodka', et que l'on sélectionne ces deux catégories dans le filtre, et bien le cocktail en question va s'afficher deux fois.
Ça relève du SQL et pas du PHP.

Ensuite j'ai du mal à comprendre pourquoi tu ne récupères pas en une seule passe tes données ? Tu fais des foreach en pagaille.
Au vu de ton code, je pense que tu fais de l'héritage fonctionnel -> pas bien.
Regardes ici

Enfin, ta pagination semble exotique, je ne te cache pas que je ne comprend pas tout...
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h09.


 
 
 
 
Partenaires

Hébergement Web