THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bonjour,

Il y a déjà plusieurs discussions avec ce type de question mais aucune ne réponds vraiment à mon problème (en fait j'ai un bon résultat mais avec un pbm):

Je veux afficher des produits qui ont une certaine valeur pour une certaine caractéristique. Pour imager, ce sont des cosmétiques, j'ai une caractéristique (id=1) qui est la forme galénique (creme, lait, cachet, etc...). Je veux afficher "creme", la liste des produits qui ont cette valeur, puis "lait", la liste des produits qui ont cette valeur, etc ... Evidemment, si je n'ai aucun produit sous forme de cachet, je ne veux pas afficher "cachet".

<THELIA_formegal type="CARACDISP" caracteristique="1-">
  #TITRE   (--> affiche "creme", "lait" , ...)
    <THELIA_prod type="PRODUIT" rubrique="#RUBRIQUE_ID" caracteristique="1-" caracdisp="#ID">
      <a href="#URL">#TITRE</a>
      #PRIX €
      <a href="panier.php?action=ajouter&ref=#REF" title="Ajouter au panier">Ajout</a>
    </THELIA_prod>		
</THELIA_formegal>

Dans le code ci-dessus j'ai supprimé la mise en forme, j'ai bien mis les sauts de lignes nécessaires quand j'ai fait des essais avec des boucles conditionnelles.

Mon premier pbm est que la boucle ci-dessus marche quand j'ai au moins un produit pour une forme galénique donnée. Si j'en ai 0, et ben ça m'affiche tous les produits de la rubrique pour chaque valeur de la forme galénique (dans mon test j'ai 4 cremes, 1 lait, 0 cachet, et ben ça marche bien pour creme et lait, mais je me retrouve avec 5 cachets, produits qui sont en fait des cremes et laits). Déjà à ce niveau, je pige pas pourquoi la boucle prod me liste des produits qui ne repondent pas au conditions posées ( caracteristique="1-" caracdisp="#ID")

Ensuite j'ai fait des tas d'essais de boucles conditionnelles pour qu'une forme galénique qui n'a aucun produit ne s'affiche pas, impossible de trouver une solution (ce qui ne m'étonne guère étant donné le résultat ci-dessus, puisque une forme galénique vide retourne tous les produits, je vois pas comment la boucle conditionnelle pourrait fonctionner ...).

Si quelqu'un a eu le courage de lire jusqu'au bout ...
Mci d'avance. Pierre.

Offline


Salut Pierre,
J'ai repéré un petit bug qui fait que dans une rubrique , pour une caractéristique donnée, il faut au moins qu'un des articles soit inscrit pour chaque valeur de la caractéristique, sous peine de voir la recherche un peu boiteuse qui ne prend pas en compte toutes les valeurs...
 
En attendant , pour cette méthode , essaie de rajouter un tiret çàd : caracdisp="#ID-", ca marchera peut-être bien...

Offline


Bonjour,

Mci, mais j'avais déjà essayé ça, ici en tout cas, ça donne le même résultat erroné ... Quand tu dis que tu as repéré le bug, tu as trouvé l'erreur ou tu as juste vu (comme moi) qu'il y avait un bug ?

J'ai mis des echo un peu partout dans boucles.php dans la fonction boucleProduit, mais je vois pas le pbm. Je me demande comment je vais me sortir de ce soucis. Je peux expliquer au client qu'il ne peut pas créer de formes galéniques s'il n'a pas au moins un produit  .... ça va faire classe ! De toute façon ça me parait impossible à combiner en plus avec les rubriques, puisqu'il y aura forcément des rubriques pour lesquelles une forme galénique n'a aucun produit ... et ça me paraissait un truc super simple (enfin pas dans la réalisation, mais dans le type de fonctionnalité quand on fait ce genre de site).

Bon la nuit porte conseil.

Pierre.

Last edited by pierrot (06-06-2007 21:41:13)

Offline


J'ai constaté le bug, mais je ne me suis pas encore penché sur le problème.

Offline


Essaye de remplacer ça:

  dans la boucle produit de boucle.php , après la remarque
/* Demande de caracteristiques */
qui doit se trouver du côté de la ligne 750

remplace :   if(!mysql_numrows($resul)) break;
par: if(!mysql_numrows($resul)) return("");

Plus de produit fantôme nécessaire dans ma base.:D
 
..Tu peux tester et me dire si ça marche chez toi?

Offline


Slt

Oui, ça marche nickel, maintenant j'ai bien 0 produits dans mes cachets.

Par contre (rien à voir avec le bug je pense) j'essaye de faire en sorte de ne pas afficher "cachet" maintenant que j'ai bien 0 produit avec cette caractéristique, ça marche pas. J'essaye en mettant le titre de ma boucle CARACDISP dans la 1ère partie conditionnelle de ma boucle PRODUIT, plus rien ne s'affiche. Pourtant quand j'ai 1 produit, je devrai bien avoir la partie conditionnelle qui fonctionne.

J'ai l'impression de toute façon que l'imbrication de boucle n'est pas très bonne. Le #TITRE de la boucle CARACDISP qui est maintenant dans la partie conditionnelle de la boucle PRODUIT qui elle même produit un #TITRE, je pense que ça le fait pas. SPIP a résolu ce problème avec une syntaxe spéciale des balises (#_nomboucle:TITRE,  de mémoire), je sais pas si Thélia a ce genre de mécanisme.

Pierre

Offline


Essaie ce code, il t'éclairera un peu sur l'emploi des boucles conditionnelles de THELIA wink

<THELIA_formegal type="CARACDISP" caracteristique="1-">
 
    <T_titre>test
    
	<THELIA_titre type="PRODUIT" rubrique="#RUBRIQUE_ID" caracteristique="1-" caracdisp="#ID-">
     
    </THELIA_titre>        
 #TITRE   (--> affiche "creme", "lait" , ...)
	
	
	<THELIA_prod type="PRODUIT" rubrique="#RUBRIQUE_ID" caracteristique="1-" caracdisp="#ID->
      <a href="#URL">#TITRE</a>
      #PRIX €
      <a href="panier.php?action=ajouter&ref=#REF" title="Ajouter au panier">Ajout</a>
    </THELIA_prod>
	
	</T_titre>
	
	<//T_titre>
		
	</THELIA_formegal>

Un conseil, veille bien à laisser au moins une ligne entre les balises des boucles conditionnelles, si tu veux que tes boucles fonctionnent .

Offline


Plutôt comme ci-dessous, la seconde boucle produit "prod" doit être en dehors de la "titre" mais dans "formegal". Une boucle PRODUIT dans le code optionnel d'une boucle PRODUIT ne marche pas apparemment (avec la même sélection, mais j'ai essayé plein de variantes), ça ne me retourne rien (j'ai bien les titres des formes galéniques, mais plus de produits).

Ta version m'aurait parue plus logique (la boucle "prod" ne s'exécute que si on a au moins un produit détecté par la boucle "titre") alors que dans mon cas elle s'exécute à chaque fois et ne trouve éventuellement rien.

Ce qui m'épate dans ce code, c'est que #TITRE affiche le titre qui vient de la boucle "formegal" et non pas le titre qui vient de la boucle "titre", mais ça explique tout à fait pourquoi ma version à 2 boucles ne marchait pas. Il semble donc que la règle soit que les balises utilisées dans la partie conditionnelle soient issues de la boucle de contexte (englobante)... cela ouvre de nouvelles perspectives pour moi.

<THELIA_formegal type="CARACDISP" caracteristique="1-">
 
    <T_titre>
    
    <THELIA_titre type="PRODUIT" rubrique="#RUBRIQUE_ID" caracteristique="1-" caracdisp="#ID-">
     
    </THELIA_titre>        
 
      #TITRE   (--> affiche "creme", "lait" , ... vient de formegal et pas de titre)
        
    </T_titre>
    
    <//T_titre>
        
    <THELIA_prod type="PRODUIT" rubrique="#RUBRIQUE_ID" caracteristique="1-" caracdisp="#ID->
      <a href="#URL">#TITRE</a>
      #PRIX €
      <a href="panier.php?action=ajouter&ref=#REF" title="Ajouter au panier">Ajout</a>
    </THELIA_prod>

    </THELIA_formegal>

Pierre.

Offline


Tu as  compris les boucles conditionnelles, ce script fonctionne, aussi...mais, tu peux mettre une boucle dans un sortie de boucle conditionnelle , ce qu'il vaut mieux éviter ce sont les chevauchement.

Ce qui ne marche pas c'est #RUBRIQUE_ID dans une boucle CARACDISP...Autant pour moi, j'étais en fin de journée.

Last edited by david49 (09-06-2007 01:53:37)

Offline


Bon en fait j'ai retourné le problème dans tous les sens, j'ai enfin ta solution.
Tu peux te faire une petite modif dans la boucle #CARACDISP pour récupérer #RUBRIQUE_ID

Dans boucles.php , dans la fonction boucleCaracdisp, juste après
 
       global $caracdisp;

tu rajoutes une ligne:

$rubrique= lireTag($args, "rubrique");

puis à la fin de la fonction, avant:

    $res .= $temp;

Tu rajoutes:

$temp = str_replace("#RUBRIQUE", "$rubrique", $temp);

Enfin pour le

 <THELIA_formegal type="CARACDISP" caracteristique="1-" rubrique="#RUBRIQUE_ID">
 
    <T_titre>
    
    <THELIA_titre type="PRODUIT" rubrique="#RUBRIQUE" caracteristique="1-" caracdisp="#ID">
    
	</THELIA_titre>        
 
    #TITRE
	
   
     <THELIA_prod type="PRODUIT" rubrique="#RUBRIQUE" caracteristique="1-" caracdisp="#ID">
      <a href="#URL">#TITRE</a>
      #PRIX €
      <a href="panier.php?action=ajouter&ref=#REF" title="Ajouter au panier">Ajout</a>
    </THELIA_prod>  
	
    </T_titre>
    
    <//T_titre>
        
  
	
    </THELIA_formegal>    <THELIA_prod type="PRODUIT" rubrique="#RUBRIQUE" caracteristique="1-" caracdisp="#ID">
      <a href="#URL">#TITRE</a>
      #PRIX €
      <a href="panier.php?action=ajouter&ref=#REF" title="Ajouter au panier">Ajout</a>
    </THELIA_prod>

ou si tu préfères, tu sors ta boucle produit comme tu l'as fait précédemment,ça ne change rien.

Désolé pour le 'Gag' d'hier...:lol:

Last edited by david49 (09-06-2007 03:45:42)