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)