THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline


Bonjour,

j'ai une fiche produit pour vendre une chaussure.
J'ai donc une déclinaison Pointure.

Sur la fiche produit, j'aimerai afficher le stock qu'il y a pour chaque pointure.
Je n'y arrive pas.

Sur la fiche produit, le client choisit sa taille par ce code :


<select name="declinaison#ID" >
          <THELIA_DECLIDISP type="DECLIDISP" declinaison="#ID" produit="#PRODUIT" stockmini="1">
            <option value="#ID">#TITRE</option>
          </THELIA_DECLIDISP>

j'ai essayé en ajoutant #VALEUR mais ca ne m'affiche pas le stock mais re écrit "#VALEUR".

Un petit coup de pouce svp.


EDITION: !! je viens d'avoir un déclic .... J'utilise #VALEUR alors que je ne le met pas dans la boucle "STOCK"...alors que c'est sur le wiki que j'ai lu ca...
J'essaye de me corriger...

Last edited by jeep05 (23-04-2009 18:32:20)

Offline


Salut,

La boucle stock ne fonctionne qu'avec le paramètre d'entrée article => il faut que le produit soit dans le panier car la boucle va chercher les informations dans la variable de session et non dans la base de données....

La seule façon que je vois de le faire c'est de créer un nouveau paramètre de sortie pour la boucle declidisp : #STOCK (ça se passe dans le fichier fonctions/boucle.php aux alentours de la ligne 2626 que j'organiserais un petit bout de code type :

$stock = new Stock();
$stock=charger($produit, $tdeclidisp->id);
$stock2 = stock->valeur;

Puis ligne 2635 :

$temp = str_replace("#STOCK", "$stock2", $temp);

(non testé)


jb

Last edited by ottoroots (23-04-2009 18:43:47)

Offline


merci de t'intéresser au problème, mais ta modfication ne semble pas OK :


Parse error: syntax error, unexpected T_OBJECT_OPERATOR in ..../fonctions/boucles.php on line 2629""


Ne serait-il pas possible, à la maniere de ce code qui affiche le STOCK total :

<h4>En stock : {<?php
                 $query = mysql_query("SELECT stock FROM produit WHERE ref='#REF'");
                 $stock = mysql_fetch_array($query);
                 $stock = $stock[stock];

                 if ($stock>0) echo "$stock";
                 else { echo "EPUISE"; }
                 ?>}</h4>

d'afficher le stock de chaque déclinaison issu de la BDD ?

Last edited by jeep05 (23-04-2009 18:58:34)

Offline


Copié/collé ça ne m'étonne pas qu'il ne fonctionne pas je l'ai écris à la volée sans rien testé : j'ai oublié un $ à la ligne 2629 smile ($stock->valeur;)
Y a peut-être d'autres coquilles tongue.

Mais je maintiens que ça doit marcher.

tu peux aussi effectivement coder ta requête php dans ton squelette. Faut effectivement coder la totalité de la requête sql (moi je passe par la méthode prédéfinie charger() dans le moteur c'est plus rigolo smile)

Last edited by ottoroots (23-04-2009 19:03:37)

Offline


j'ai ceci maintenant wink

Fatal error: Call to undefined function charger() in www/fonctions/boucles.php on line 2627


2627 = $stock=charger($produit, $tdeclidisp->id);

Offline


lol....

Oui bien sûr comme ça

$stock->charger($produit, $tdeclidisp->id);

c'est mieux

smile

Offline


OK.
Donc pour résumer.
Dans ma page produit.html j'ai ca :

<THELIA_DECLIDISP type="DECLIDISP" declinaison="#ID" produit="#PRODUIT" stockmini="1">
                <option value="#ID">#TITRE #STOCK</option>
              </THELIA_DECLIDISP>

et dans boucles.php j'ai ajouté tes lignes

$stock = new Stock();
$stock->charger($produit, $tdeclidisp->id);
$stock2 = $stock->valeur;

$temp = str_replace("#STOCK", "$stock2", $temp);


Malgré ca, la page affiche "#STOCK", sans remplacer par la valeur.

Offline


bien bien bien....

donc me voilà obligé d'aller regarder d'un peu plus près cette classe stock et oh encore une coquille la méthode charger() chez stock c'est plutôt :

$stock->charger($tdeclidisp->id, $produit);

bon désolé de ne pas avoir testé avant la solution et te la fournir clé en main. Si c'est toujours pas bon promis je m'y mets

Par ailleurs me vient l'idée qu'il faudra améliorer un tout petit peu ce script (quand il marchera) parce qu'en l'état si mon calcul est bon ce tag devrait afficher les valeurs que tu aurais désactivé dans le BO....

Bon faisons marcher ce bout-là d'abords.

jb

Last edited by ottoroots (23-04-2009 20:58:19)

Offline


ne soit pas désolé, je te remercie déjà de m'avoir répondu et de bosser sur ca.

Je regrette mais ta modif ne change pas la donne.
Comme précédemment, seul #STOCK apparait.

Offline


Grogn... Ca m'énnerve.
Bien donc voilà j'ai simplifié, ce que je code après

            $tdeclidisp = new Declidisp();
            $tdeclidisp->charger($tabliste[$i]);
de la boucle declidisp (environ ligne 2626 je teste sur la 1.4) :

$tstock = new Stock();
$tstock->charger($tdeclidisp->id, $produit);

et à la suite des $temp = str_replace.....  je rajoute çà :

$temp = str_replace("#STOCK", "$tstock->valeur", $temp);

Dans mon squelette j'ai rajouté comme toi #STOCK au même endroit et ça marche très bien.

Tu peux copier-coller.

Offline


bravo ! ca fonctionne !!
je te remercie grandement ottoroots.

Offline


ottoroots

sur le meme modele, est ce que je peux affecter #STOCKDECLI par exemple à la boucle QUANTITE pour pouvoir afficher le stock par déclinaison sur la page panier ?

ou bien en ré utilisant le code ci dessus,

si j'utilise ce code sur la page PANIER :

<THELIA_DECLI type="DECLINAISON" rubrique="#RUBRIQUE_ID" produit="#ID"> 
                            <THELIA_DECLIDISP type="DECLIDISP" declinaison="#ID" produit="#PRODUIT" stockmini="1">
                            <option value="#STOCK">#STOCK en stock</option>
                            </THELIA_DECLIDISP>
                        </THELIA_DECLI>


Ca affiche donc toutes les valeurs du stock pour chaque valeur de déclinaison (chq pointure).

Est-il possible de limiter l'affichage du stock de la pointure qui a été sélectionné par le client ?

Last edited by jeep05 (24-04-2009 10:28:21)

Offline


Salut,

Pour que, dans le panier la quantité disponible pour commander dépende du stock d'une déclinaison : tu remplaces la boucle quantité par la boucle stock smile elle a été prévue pour ça normalement.

jb

Offline


grace a la recherche sur le forum je suis tombé sur un sujet similaire.

J'ai testé ce code qui fonctionne pour la déclinaison n°1

<THELIA_stockprod type="STOCK" produit="#ID" declinaison="1" article="#ARTICLE">
<THELIA_quantite type="QUANTITE" article="#ARTICLE" max="#VALEUR">
<option value="#NUM" #SELECTED style="width:20px;">#NUM</option>
</THELIA_quantite>
</THELIA_stockprod>

c'est cool smile merci


mais comment faire si un article à plusieurs déclinaisons ?

Last edited by jeep05 (24-04-2009 12:49:42)

Offline


tu soulèves un "point faible" de Thélia : pour une seule déclinaison tout va bien ; pour plusieurs, ça se gate et il faut intervenir un peu au niveau du code.

Concrètement, voilà ce qui se passe :

les valeurs d'une ou + déclinaisons pour un produit sont stockées dans la table 'stock' : une ligne de cette table correspond donc à un couple produit/declidisp auquel on attribue une valeur de stock (et de surplus tarifaire).

Si un produit (ex : des t-shirts) a plusieurs déclinaisons (exemple taille et couleur) comment est constitué le stock réel pour ces tshirts ? si vous avez trois couleurs et trois tailles et que votre stock de chaque déclinaison est de 100, combien de t-shirts avez-vous dans votre entrepôt ?

bleu : 100
rouge : 100
vert : 100

S:100
M:100
L:100

Vous n'avez pas 600 tshirts. Vous en avez 300 : les déclinaisons se combinent mais ne s'additionnent pas pour avoir le stock général de produit.

Donc en parlant le langage thélia : dans votre entrepôt vous avez un total de tshirt = nombre de declidip pour UNE SEULE déclinaison. Or Thélia considèrera que vous avez 600 Tshirts.

ainsi la valeur du champ stock de produit (le stock général) additionne les valeurs de toutes les declidisp pour ce produit et donne donc un total de 600 sad.

Pour la boucle stock on retrouve le même problème : elle calcule le stock total pour toutes les declidisp d'un produit et non pour toutes les declidisp d'une seule déclinaison pour un produit.

Dans le même ordre d'idée, il y a une aberration dans la gestion des stock des declidisp quand un produit a plusieurs déclinaisons : aucun contrôle n'impose de cohérence entre le stock de plusieurs déclinaisons : on peut enregistrer n'importe quoi par exemple :

bleu : 100
rouge : 100
jaune : 100

S:22
M:40
L:61

C'est impossible dans la vie d'avoir de tels stocks de déclinaisons pur un même produit : il faut imposer dans Thélia que le stock total de déclidisp pour un produit soit identique pour toutes les déclinaisons (qu'il y en ait 2 ou 50 c'est pareil).

Ces quelques petites optimisations du script ne sont pas très compliquées mais les expliquer sur un forum l'est beaucoup plus.

J'y travaille....

Encore quelques semaines de patience....


Jb

Last edited by ottoroots (24-04-2009 13:43:53)

Offline


merci pour l'explication
Pour le moment je peux me limliter à une déclinaison par produit.

Est ce qu'il est possible d'ajouter par contre le meme code pour la déclinaison 2, la déclinaison 3 ?

Car quand il y a des produits différents dans le panier.....


Par exemple j'ai 3 produits dans le panier.
Chaque produit dépend d'une déclinaison différente.

Pour le 1er produit qui est attaché à la déclinaison 1, c'est bon ca ne me met que le stock de la déclinaison associé au produit.
Mais pour les 2 autres produits, ca met le stock total. Normal puisque rien n'est codé pour faire le contraire.

Mais si je fais copier/coller de la boucle et que je change declinaison par 2 et 3, bien sur la boucle tourne et du coup j'ai 3 fois les stocks dans la liste déroulante.

Est ce qu'il est possible sans gros changement de rectifier ?
Jesp que j'ai bien expliqué....

Last edited by jeep05 (24-04-2009 14:00:22)

Offline


La boucle stock est assez délicate à appréhender et en allant regarder de plus près je me suis rendu compte d'une chose : ce que nous avons codé au-dessus n'était pas nécessaire smile

en effet la boucle stock va boucler sur les articles dans le panier si et seulement si on utilise son paramètre d'entrée déclinaison.

Si on n'utilise pas déclinaison mais declidisp un 2ième paramètre d'entrée de la boucle, on obtient la valeur du stock de la declidisp pour le produit, sans qu'il soit dans le panier ! smile donc pas la peine de créer un paramètre de sortie #STOCK à declidisp mais utiliser plutôt le code natif de la manière suivante (pour ton exemple depuis le début smile

<THELIA_DECLI type="DECLINAISON" rubrique="#RUBRIQUE_ID" produit="#ID">
		                    
<p> #TITRE : 
<select name="declinaison#ID" >
<THELIA_DECLIDISP type="DECLIDISP" declinaison="#ID" produit="#PRODUIT" stockmini="1">
<option value="#ID">#TITRE <THELIA_STOCDEC type="STOCK" produit="#PRODUIT" declidisp="#ID">
#VALEUR
</THELIA_STOCDEC></option>
</THELIA_DECLIDISP>
		                        
</select>
</THELIA_DECLI>

C'est testé, ça marche aussi bien et tu touches pas au code source.

2°) Pour ta question je reviens

Offline


vu pour la modif, ca fonctionne en effet.

J'espere que tu trouveras pour avoir dans le panier les stocks sur les déclinaisons pour les différents articles wink

Car en fait, le client choisira la quantité sur la page panier.

Last edited by jeep05 (24-04-2009 21:37:52)

Offline


Bonsoir,

Il aura fallu se battre et c pas la première fois dans ce forum que les déclinaisons donnent de l'urticaire... bref....

voilà ma conclusion concernant je le rappelle, la gestion de la quantité "commandable" dans le panier en fonction du stock de la declidisp sélectionnée par le client sur la fiche produit :

En l'état la seule possibilité sans modifier le code source est d'entrer en dur l'ID de la déclinaison sue le squelette panier, comme tu le constates dans ton avant-dernier post et comme de nombreux autres posts le suggèrent. C'est très limité car cela impose de gérer une seule et unique déclinaison pour tous les articles du site.

Pourquoi ? Parce que la boucle stock attend, pour afficher la valeur que l'on cherche à afficher, les paramètres d'entrée suivants :

- Article (OK)
- ID declinaison (OK on va récupérer cette donnée en encapsulant la boucle stock dans une boucle decval qui a comme paramètre de sortie : #DECLINAISON).
- ID produit (KO : la boucle decval n'a pas ce paramètre de sortie)

Pour récupérer l'ID du produit j'ai d'abords essayé d'intercaler une boucle produit entre ma boucle decval et ma boucle stock (pour avoir l'ID à partir de la REF) mais ça ne marche pas car du coup je perds le paramètre de sortie #DECLINAISON.


J'ai donc décidé de créer un nouveau paramètre de sortie pour la boucle DECVAL  : #ID codé comme ça sur le fichier boucle :

ligne 2728 :

			$tprod= new Produit();
			$tprod->charger($ref);

puis ligne 2738 :

			$temp = str_replace("#ID", "$tprod->id", $temp);

Au final mon panier se présente ainsi pour la gestion de la quantité  :

<THELIA_DECVAL2 type="DECVAL" article="#ARTICLE" declinaison="#DECLINAISON_ID" ref="#REF">#
<THELIA_stockprod type="STOCK"  article="#ARTICLE" produit="#ID" declinaison="#DECLINAISON">

<select>
<THELIA_quantite type="QUANTITE" article="#ARTICLE" max="#VALEUR"><option value="#NUM" #SELECTED style="width:20px;">#NUM</option>
</THELIA_quantite>
</select>
</THELIA_stockprod>
</THELIA_DECVAL2>

Tout cela m'a l'air de fonctionner : dans ton panier tes quantités commandables dépenderont du stock du declidisp sélectionné et ce, même si tes produits sont déclinables selon des déclinaisons différentes.

La seule limite reste celle que je décris plus haut : 1 seule déclinaison par produit.
Mais désormais un produit1 peut avoir une déclinaison "A" et un autre produit2 peut avoir une déclinaison "B" : le panier restituera bien pour chacun la quantité de la declidisp sélectionnée pour le déclinaison "A" pour le premier et la quantité de la declidisp sélectionnée pour le déclinaison "B" pour l'autre....

J'aimerais bien savoir s'il existe une solution sans modif du code...


Jb

Last edited by ottoroots (25-04-2009 02:17:22)

Offline


Bonjour,

Après une nuit de repos je reviens à la charge car la solution proposée n'est pas totalement fonctionnelle : elle impose que les produits commandés aient tous une déclinaison : autrement dit si le client commande un produit sans déclinaison, en l'état le panier ne proposera pas de quantité à commander (embêtant)...

Donc, pour la solution finale, je préconise donc d'enrober le code donné ci-dessus dans une boucle conditionnelle....

Si le produit possède une déclinaison : ce code

Sinon : le code initial...


A tester

Jme demande quand même si mon esprit tordu n'est pas allé chercher une réponse un peu tarabiscotée.... tongue

Last edited by ottoroots (25-04-2009 14:04:00)

Offline


Merci pour ta contribution.
Ca n'a pas l'air suffisant j'ai des droles des résultats.

Déjà vérifions que j'ai bien modifié boucles.php
J'ai ca :

// recup valeur declidisp ou string
			if($tdeclinaison->isDeclidisp($tperso->declinaison)){
				$tdeclidisp->charger($tperso->valeur);
				$tdeclidispdesc->charger_declidisp($tdeclidisp->id, $_SESSION['navig']->lang);
				$valeur = $tdeclidispdesc->titre;
				
				$tprod= new Produit();
            	$tprod->charger($ref);
			}
				
			else $valeur = $tperso->valeur;

			$temp = str_replace("#DECLITITRE", "$tdeclinaisondesc->titre", $texte);
			$temp = str_replace("#DECLINAISON", "$tdeclinaisondesc->declinaison", $temp);
			$temp = str_replace("#REF", "$ref", $temp);	
			$temp = str_replace("#ARTICLE", "$article", $temp);	
			$temp = str_replace("#VALEUR", "$valeur", $temp);	
			$temp = str_replace("#DECLIDISP", "$tdeclidispdesc->declidisp", $temp);
			
			$temp = str_replace("#ID", "$tprod->id", $temp);
			
			$res .= $temp;				
		}		
	


		return $res;

Concernant ta modif :
si je teste ton code, on est OK les produits sans déclinaison, pas de quantité. La n'est pas le probleme, à tester avec boucle condi.

Par contre, pour ceux qui possedent 1 déclinaison :
Lorsque je fais l'ajout au panier, la quantité n'est pas affichée. J'ai le menu déroulant vierge.
Si j'ajoute un 2eme produit, là c'est OK pour ce 2eme produit.
Si j'ajoute un 3eme produit, c'est OK pour lui, mais ca affiche rien pour les autres.

Comme si ca ne mettait la quantité que du dernier produit ajouté au panier, sans compter le 1er...


Ton code entre les balises form ca donne ca :
J'ai gardé l'ancien 'select' que j'avais qui permet de rafraichir la panier et recalculer qd on selectionne une autre quantité.

<form action="#URLPANIER" method="post" name="formpanier#ARTICLE" id="formpanier#ARTICLE">
                	<input type="hidden" name="article" value="#ARTICLE" />
                	<input type="hidden" name="action" value="modifier" />
<THELIA_DECVAL2 type="DECVAL" article="#ARTICLE" declinaison="#DECLINAISON_ID" ref="#REF">#
<THELIA_stockprod type="STOCK"  article="#ARTICLE" produit="#ID" declinaison="#DECLINAISON">
<select name="quantite" size="1" class="zoneDeSaisie" onchange="document.formpanier#ARTICLE.submit()">
<THELIA_quantite type="QUANTITE" article="#ARTICLE" max="#VALEUR"><option value="#NUM" #SELECTED style="width:20px;">#NUM</option>
</THELIA_quantite>
</select>
</THELIA_stockprod>
</THELIA_DECVAL2>
                    </form>

Last edited by jeep05 (25-04-2009 16:16:14)

Offline


Hello,

Tu as mal placé  la modification : tu as instancié ton objet $tprod à l'intérieur de la structure conditionnelle "if" au-dessus.

Copie colle les 2 Lignes

$tprod= new Produit();
$tprod->charger($ref);


après la ligne

else $valeur = $tperso->valeur;

Et tu ne devrais plus avoir ce comportement.

jb

Offline


J'ai fait la modif comme ceci :

else $valeur = $tperso->valeur;
			
			$tprod= new Produit();
            $tprod->charger($ref);
				
			$temp = str_replace("#DECLITITRE", "$tdeclinaisondesc->titre", $texte);
			$temp = str_replace("#DECLINAISON", "$tdeclinaisondesc->declinaison", $temp);
			$temp = str_replace("#REF", "$ref", $temp);	
			$temp = str_replace("#ARTICLE", "$article", $temp);	
			$temp = str_replace("#VALEUR", "$valeur", $temp);	
			$temp = str_replace("#DECLIDISP", "$tdeclidispdesc->declidisp", $temp);
			
			$temp = str_replace("#ID", "$tprod->id", $temp);
			
			$res .= $temp;

Malheureusement, ca ne change rien.
Seul l'ajout du 2eme produit affiche le stock...mais le 3eme produit dans le panier efface le stock du 2eme, etc..

Offline


Salut

Ce n'est pas normal.

Ce petit rajout sur decval doit fonctionner, en tout cas avec 1.4. Ton formulaire pour la quantité m'a l'air correct.

Ta version de Thélia ?

Et aussi montre moi le formulaire de la fiche produit

jb

Offline


version Thelia 1.3.9

Formulaire fiche produit :

<form action="panier.php" method="post">
                <input type="hidden" name="action" value="ajouter" />
                <input type="hidden" name="ref" value="#REF" />
                <T_DECLI>
                <THELIA_DECLI type="DECLINAISON" rubrique="#RUBRIQUE_ID" produit="#ID">        
                <p> #TITRE #CHAPO :
                <select name="declinaison#ID" >
                <THELIA_DECLIDISP type="DECLIDISP" declinaison="#ID" produit="#PRODUIT" stockmini="1">
                <option value="#ID">#TITRE</option>
                </THELIA_DECLIDISP>        
                </select>
                </THELIA_DECLI></p>
                </T_DECLI>
                <!--aucune déclinaison ecrire ici      --> 
                <//T_DECLI>
                
                <T_sistock>
                <THELIA_sistock type="PRODUIT" ref="#REF" stockmini="1">
                <!-- Bouton panier si stock > 1 -->
                <input type="image" src="admin/gfx/bt_ajout_panier.png" border="0" /></a>	
                </form>
                </THELIA_sistock>
                </T_sistock>
                <!-- Bouton epuise si stock < 1 -->
                <img src="admin/gfx/bt_stock_epuise.png"  alt="epuise" title="stock epuise" border="0" />
                <//T_sistock>