THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline


Salut,

Le problème récurent : quand une déclinaison est active dans une rubrique mais qu'au niveau du produit on désactive dans le BO toutes ses valeurs (declidisp),  alors dans la fiche produit sur le site, la déclinaison apparaît toujours mais vide....

La solution : la boucle DECLIX qui corrige le problème. DECLIX ne prend en compte que les déclinaisons qui 1°) sont actives dans la rubrique et 2°) ont au moins 1 declidisp active au niveau du produit.

Les avantages :
- Plus besoin de boucle conditionnelle pour un affichage cohérent des déclinaisons
- la boucle permet une gestion dynamique des déclinaisons (avec une boucle déclinaison classique la seule solution est de coder en dur les déclinaisons)
- La gestion des déclinaisons au niveau de la rubrique est conservée.
- c'est un plugin : pas de modification du moteur.

Inconvénient :
- Plus gourmande en requêtes sql que la boucle déclinaison classique.

Sur le squelette produit.html, le formulaire pour afficher les déclinaisons se présente simplement comme ceci :

<form action="panier.php" method="post">
<input type="hidden" name="action" value="ajouter" />
<input type="hidden" name="ref" value="#REF" />

<THELIA_DECLI type="DECLIX" rubrique="#RUBRIQUE_ID" produit="#ID">
		                    
#TITRE :
<select name="declinaison#ID" >
<THELIA_DECLIDISP type="DECLIDISP" declinaison="#ID" produit="#PRODUIT" stockmini="1">
<option value="#ID">#TITRE</option>
</THELIA_DECLIDISP>
</select>
</THELIA_DECLI>
<input type="submit" />
</form>

Le plugin s'appelle donc declix. Le code est le suivant :

<?php

include_once(realpath(dirname(__FILE__)) . "/../../../classes/PluginsClassiques.class.php");
include_once(realpath(dirname(__FILE__)) . "/../../../classes/Rubdeclinaison.class.php");
include_once(realpath(dirname(__FILE__)) . "/../../../classes/Declidisp.class.php");
include_once(realpath(dirname(__FILE__)) . "/../../../classes/Exdecprod.class.php");
include_once(realpath(dirname(__FILE__)) . "/../../../classes/Declinaisondesc.class.php");

class Declix extends PluginsClassiques {


	function boucle($texte, $args){
	
	$search ="";
	$res="";
	
	$rubrique = lireTag($args, "rubrique");
	$produit = lireTag($args, "produit");
			
	if($rubrique =="") return;
	if($produit=="") return;
		
	$rubdeclinaisonx = new Rubdeclinaison();
	$declidispx = new Declidisp();
	$exdecprodx = new Exdecprod();
	$declinaisondescx = new Declinaisondesc();
	
	$query = "select declinaison from $rubdeclinaisonx->table where rubrique='$rubrique'";	
	$resul = mysql_query($query, $rubdeclinaisonx->link);
	$nbres = mysql_num_rows($resul);
	if(!$nbres) return "";
	$i=0;
		
		while( $row = mysql_fetch_object($resul)){
		$tabdeclidisp="";
		$search = $row->declinaison;		
		$query2 = "select*from $declidispx->table where declinaison='$search'";	
		$resul2 = mysql_query($query2, $declidispx->link);	
		$nbres2 = mysql_num_rows($resul2);
		if(!$nbres2) return "";
		$i=0;
						
			while( $row2 = mysql_fetch_object($resul2)){
				if (!$exdecprodx->charger($produit, $row2->id)){			
				$tabdeclidisp[$i++] = $row2->id; 
				}
			}

			if ($tabdeclidisp !=="") {	
				$declinaisondescx->charger($row->declinaison);
				
				$temp = str_replace("#TITRE", "$declinaisondescx->titre", $texte);	
				$temp = str_replace("#CHAPO", "$declinaisondescx->chapo", $temp);	
				$temp = str_replace("#ID", "$row->declinaison", $temp);		
				$temp = str_replace("#PRODUIT", "$produit", $temp);		
					
					if(trim($temp) !="") $res .= $temp;	
			}
		}	
				return $res;		
	}
	
}

?>

A copier/coller sur un fichier Declix.class.php dans un répertoire "declix" de client/plugin et à activer dans le BO.

Elle nécessite que les paramètres d'entrée "produit" et "rubrique" soient renseignés.

testé sur 1.4.0b

jb

Last edited by ottoroots (30-05-2009 23:24:09)

Offline


Tiens, une suggestion pour le plug-in. Je suis en train de désactiver les déclinaisons sur les produits et j'en ai des centaines, c'est l'horreur.

Ce qui serait pas mal, ce serait des cases à cocher et un bouton désactiver / Activer, ça permettrait de gagner un temps phénoménal ...

Ceci dit, si tu peux aller voir à cette page :

http://195.200.217.59/~effixepern/produ … rubrique=4

Au lieu de m'afficher les deux tailles dispo, il ne m'affiche que le nom de la déclinaison

Offline


Bon j'ai l'impression que c'est un bug du plugin je pense.

En effet, les listes déroulantes n'affichent pas le contenu des déclinaisons mais répètent le titre de la déclinaison à chaque fois ...

Offline


Salut,


La boucle assure l"affichage ou non d'une déclinaison. Elle n'entre pas en jeu dans l'affichage des valeurs de la déclinaison (declidisp). Si ta déclinaison apparait sur une fiche produit parce qu'au moins une declidisp est active pour cette déclinaison pour ce produit et si la même déclinaison, pour le même produit, n'apparaît plus parce que tu as désactivé toutes les declidisp, alors la boucle declix fait le boulot qu'on lui demande.

c'est la boucle declidisp qui normalement assure l'affichage des valeurs.
Peux-tu afficher les paramètres #ID des boucles declix et  declidisp (en plus des #TITRE) et me dire ce qui sort ?

Offline


Salut, ça m'affiche 12, qui est l'ID de la déclinaison, et non pas son / ses contenu(s)

Offline


test :

Si tu remplaces juste type="DECLIX" par type="DECLINAISON", sans toucher la boucle declidisp que se passe-t-il ?

Offline


Si je mets ça, dans ma liste déroulante, j'ai toujours les mêmes valeurs, par contre, il me ressort toutes les déclinaisons désactivées ...

Offline


OK donc on est d'accord que si le phénomène est identique avec une boucle DECLINAISON traditionnelle ce n'est pas un problème de boucle DECLIX. Je pencherais plutôt pour un problème sur le squelette.

On recommence tout : peux-tu me donner ton squelette produit ?

Offline


Bien sur, et merci pour ton implication, vraiment !

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
#INCLURE "thelia0002/inc/get_copyleft.html"

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title><THELIA_PROD type="PRODUIT" ref="#PRODUIT_REF">#TITRE</THELIA_PROD> > #RUBRIQUE_NOM > ::catalogue:: > #VARIABLE(nomsite)</title>


#INCLURE "thelia0002/inc/get_thelia0001meta.html"
#INCLURE "thelia0002/inc/get_thelia0001css.html"
#INCLURE "thelia0002/inc/get_thelia0001javascript.html"

</head>

<body>
<!-- Page -->
<div id="Page">

	<!-- Entete -->
	<!-- Entete -->
    #INCLURE "thelia0002/inc/get_entete_catalogue.html"
	<!-- /Entete -->
    
	<!-- Sous Menu - Hierarchie -->
	#INCLURE "thelia0002/inc/get_hierarchie.html"
	<!-- /Sous Menu - Hierarchie -->
    
    <!-- Contenant -->
    <div id="ContenantCentraleProduit">
    
    <!-- Cartouche rub en cours gauche -->
    <div class="RubriqueEnCoursGauche">
    
    <div class="RubriqueEnCoursGaucheTitre"><strong>
	  <T_niv1>
	  <THELIA_niv1 type="CHEMIN" rubrique="#RUBRIQUE_ID" niveau="1">
		#TITRE
	  </THELIA_niv1>
	  </T_niv1>
	  	#RUBRIQUE_NOM
	  <//T_niv1>
	</strong>
    
    <THELIA_rub type="RUBRIQUE" id="#RUBRIQUE_ID">
    <div class="RubriqueEnCoursGaucheLogoRub" <THELIA_IMAGE type="IMAGE" num="1" rubrique="#ID">style="background: url(#GRANDE) no-repeat right top;"</THELIA_IMAGE>>    </div>
    </THELIA_rub>
    
    <THELIA_rub type="CHEMIN" rubrique="#RUBRIQUE_ID" niveau="1">
    <div class="RubriqueEnCoursGaucheLogoRub" <THELIA_IMAGE type="IMAGE" num="1" rubrique="#ID">style="background: url(#GRANDE) no-repeat right top;"</THELIA_IMAGE>>   </div>  
    </THELIA_rub>
    
    </div>
    
    <div class="RubriqueEnCoursGaucheListeSousRub">
    <strong class="normal">::les_rubriques::</strong>
      <ul>
	  
	      <T_rub0>
		  
            <THELIA_rub0 type="CHEMIN" rubrique="#RUBRIQUE_ID" niveau="1">
					
        	    <THELIA_rub1 type="RUBRIQUE" parent="#ID">
				   <THELIA_rubsel type="RUBRIQUE" id="#ID" courante="1">
            	    <li><a href="#URL" class="selected">#TITRE</a></li>
				   </THELIA_rubsel>
				   <THELIA_rubpassel type="RUBRIQUE" id="#ID" courante="0">
            	    <li><a href="#URL">#TITRE</a></li>
				   </THELIA_rubpassel>
				   	
       			</THELIA_rub1>
           
			</THELIA_rub0>
        
		</T_rub0>
		
       	    <THELIA_rub2 type="RUBRIQUE" parent="#RUBRIQUE_ID">
           	    <li><a href="#URL">#TITRE</a></li>
     		</THELIA_rub2>
            
		<//T_rub0>
		
		
		</ul>
    </div>
        
        
    </div>
    <!-- /Cartouche rub en cours gauche -->
    
    <!-- Cartouche rub en cours droite -->
    <div class="ProduitDroite">
    
	
	
    <THELIA_PROD type="PRODUIT" ref="#PRODUIT_REF">	
	
    <div class="ProduitsDetail">
    	<ul>
        	<li class="TitreProduit">#TITRE</li>
            <li class="DescriptifProduit"><strong>::produit_reference::</strong> #REF</li>
            <li class="DescriptifProduit"><strong>::produit_descriptif::</strong> #DESCRIPTION</li>
            <THELIA_CARACTITRES type="CARACTERISTIQUE" produit="#ID" affiche="1">
            <li class="DescriptifProduit"><strong>#TITRE :</strong><br />
            <THELIA_CARACVALEURS type="CARACVAL" caracteristique="#ID" produit="#PRODUIT">
            #VALEUR,
            </THELIA_CARACVALEURS>
            </li>
            </THELIA_CARACTITRES>
            <T_PROMO>
            <THELIA_PROMO type="PRODUIT" ref="#PRODUIT_REF" promo="1">
            <li class="PrixProduit">::produit_prix_promo::<strong> #PRIX2 €</strong></li>
            </THELIA_PROMO>
            </T_PROMO>
            <li class="PrixProduit">::produit_prix::<strong> #PRIX €</strong></li>
            <//T_PROMO>
            <li class="Livraison"></li>
            
		</ul>











<form action="panier.php" method="post">
<input type="hidden" name="action" value="ajouter" />
<input type="hidden" name="ref" value="#REF" />
<ul>
<THELIA_DECLI type="DECLIX" rubrique="#RUBRIQUE_ID" produit="#ID">
                            
<li class="DescriptifProduit">#TITRE :
<select name="declinaison#ID" >
<THELIA_DECLIDISP type="DECLIDISP" declinaison="#ID" produit="#PRODUIT" stockmini="1">
<option value="#ID">#TITRE

#ID</option>
</THELIA_DECLIDISP>
</select>
      </li>
<li></THELIA_DECLI></li>
<input type="submit" /></ul>
</form>



	
	
	
	
	
	
		
		
		
		
		

    </div>
            
    <div id="ProduitsImg">
        
        <div id="large">
        <div id="Filigranne"></div>
    <THELIA_img type="IMAGE" num="1" produit="#ID" largeur="400">
         	<img src="#GRANDE" alt="#PRODTITRE" title="#TITRE" border="0" />
        </THELIA_img>
        </div>

        <ul id="thumbnail">
        <THELIA_img type="IMAGE" num="15" produit="#ID">
        	<li><a href="#GRANDE" title="#TITRE">#COMPT</a></li>         
        </THELIA_img>
        </ul>
    </div>

    </div>
    
    </THELIA_PROD>
    <!-- /Cartouche rub en cours droite -->
    
    <div class="EffaceurGaucheDroite"></div>
    
    </div>
    <!-- /Contenant -->
    
    <!-- Pied -->
    #INCLURE "thelia0002/inc/get_pied_catalogue.html"
    <!-- /Pied -->
    
</div>
<!-- /Page -->
</body>
</html>

Offline


Un doute m'assaille même si je vois mal pourquoi ça mettrait ce bazar  :

Enlèves les balises <li> et </li> qui encadrent la balise </THELIA_DECLI> et mets la balise </ul> avant le submit.

Offline


J'ai déjà essayé, ça n'a rien changé ...

Je refais un test, si je ne reposte pas tout de suite derrière c'est que ça n'aura rien changé ...

Offline


Je confirme, ça ne change rien ...

Offline


Qu'est-ce que je peux faire pour te faciliter la vie ?

Offline


Je cherche mais franchement je comprends pas comment le paramètre #TITRE de ta boucle DECLIDISP qui est prévu pour remonter le titre de tes declidisp arrive à remonter le titre de ta déclinaison.

Ça veut dire que le moteur interprète  ton #TITRE comme le paramètre #TITRE de la boucle DECLINAISON, donc il ne prend pas en compte ta boucle DECLIDISP.....

Mais pourquoi ? je ne vois pas.... sad  je cherche

Offline


Est-ce que tu veux voir la structure du site ?

Ce qui m'étonne, c'est que ça fonctionnait avant. Je ne vois pas ce qui a pu engendrer ce problème ...

Offline


Je ne pense pas que la structure du site joue à ce niveau-là.
Est-ce que tu connais les modifications effectuées sur ton site ou ta base entre le moment tout fonctionnait et maintenant ?

Offline


A vrai dire non ...

En effet, ayant d'autres travaux à effectuer, j'ai laisser tomber le site pendant un moment. De mémoire, ça fonctionnait à ce moment là.

Depuis, il n'y a eu que des modifs de la cliente qui a entré des articles dans sa boutique, c'est tout. Je ne vois pas ce qu'elle aurait pu faire comme erreur à ce niveau.

Ceci dit, il est vrai qu'à un moment, elle a créé un article avec une référence erroné (il y avait un caractère spécial dedans), ce qui bloquait la fiche. Mais bon, ça ne doit pas avoir d'influence là-dessus.

Offline


Est-ce que un nombre trop important de déclinaisons peut avoir une influence ?

Je suis vraiment ennuyé là, car le site devrait ouvrir ses portes prochainement ... :-/

Merci vraiment de ton aide !

Offline


J'ai mis à jour Thelia, avec l'espoir que ça résoudrait le soucis ... Peine perdue, j'ai toujours mon problème ...

Offline


Je fais un petit up, désolé, mais même en passant du temps dessus, je ne vois pas ce qui cloche. Une bonne âme pourrait-elle m'éclairer ?

Offline


Que veux-tu dire par là :

"Elle nécessite que les paramètres d'entrée "produit" et "rubrique" soient renseignés."

Offline


Bonjour,

je pense qu'il veut dire que dans ta boucle, tu dois avoir produit="l'id du produit" et rubrique="l'id de la rubrique".

Alfouine,


Au royaume des aveugles, les borgnes sont mal vus.

Offline


Ok, donc c'est bien le cas. Tout a l'air Ok dans cette page. J'ai fouillé dans l'administration du site, mais je n'ai vu aucun paramètre qui puisse gêner les déclinaisons.

Je ne vois plus où continuer mes recherches ...

Offline


Salut Steph,

Alfouine a répondu à ta dernière question.

Je suis vraiment embêté par ton problème et je n'ai pas la possibilité actuellement d'y consacrer plus de temps, je suis moi-même complètement sous l'eau sur mes propres projets et en déplacement professionnel en plus jusqu'à la fin de la semaine.

A l'aiiiiide : si quelques personnes pouvaient tester la boucle sur leur propre environnement et me dire si oui ou non ils rencontrent ce problème ça me serait bien utile car chez moi ça fonctionne sans problème, quoique je fasse.

Manu ou Yoan sivoupléééé, juste un coup d'oeil sur ces quelques lignes de code pourrait aussi faire avancer la question et vous vaudrait ma reconnaissance éternelle (ah vous l'avez déjà ?...... zut alors....)

Offline


Salut ottoroots,

Je comprends bien le manque de temps, pas de soucis.

Ceci dit, si quelqu'un peut effectivement me filer un coup de main. Je peux donner accès temporairement à la base de données, etc.