Jump to content

[Résolu] Récupérer le prix produit dans la BDD


Recommended Posts

Bonjour :)

 

J'ai créé un module qui permet en BO de remplir quelques champs (pour louer un article) et donc l'admin peut saisir un champ "tarif" qui modifie le prix de l'article pour le remplacer par celui saisi.

 

J'arrive bien à modifier la table ps_product (donc la colonne price) ainsi que la table ps_product_attribute (colonne price) et la table ps_layered_price_index mais à moitié (uniquement la colonne price_min qui est le prix HT, pas price_max qui est le prix TTC)

 

Quand je vais dans l'onglet prix de la page de modification d'un produit (en BO) je ne retrouve pas le prix que j'ai saisi via mon module qui a son onglet aussi dans la page de modification d'un produit (vous savez les onglets prix, informations, déclinaisons, quantités etc)...

 

... Incompréhension totale. Comment faire pour modifier correctement le prix HT, pour ensuite calculer automatiquement le prix TTC ?

 

Je désespère, je vous remercie de votre patience ;)

Edited by genius_ (see edit history)
Link to comment
Share on other sites

Bonjour,

 

je suis sur un Presta 1.5.3.1 et la table ps_layered_price_index n'existe pas. Je peux néanmoins vous indiquer des pistes, il semblerait que seul l'attribut price de la table ps_product soit utilisé pour l'affichage dans l'onglet Prix lors de la création/modification d'un produit. Le prix de vente HT correspond ainsi à l'attribut price puis le prix de vente TTC est ensuite calculé avant affichage sur la base du prix HT.

 

Cordialement

Link to comment
Share on other sites

Merci pour les informations, c'est donc bien ce que je pensais, seule la table ps_product est utilisée pour l'affichage (et les getters de la classe Product). Vraiment bizarre que le .tpl qui affiche les prix n'aille pas "récupérer" les valeurs qui sont pourtant correctes dans ma table ps_product

 

D'ailleurs je ne l'ai pas précisé, mais l'affichage du prix pose problème dans le FO : lors du listing des produits, et dans la fiche produit. j'ai donc écris un getter qui fonctionne, mais celà n'est pas très pro et je dois donc appeler ce getter dans tout les .tpl qui affichent le prix ... pas pratique du tout.

 

EDIT : La variable qui affiche le prix dans les .tpl, notamment product_list.tpl est : $product.show_price.

Je suis perdu, je pensais qu'on accéder aux attributs d'une classe via nomClasse->attribut, il ne s'agit donc pas de l'affichage de l'attribut d'un objet produit ? :huh:

 

SVP :)

Edited by genius_ (see edit history)
Link to comment
Share on other sites

Pour vérifier ce point, êtes vous sur que les modifications sont bien prises en compte et enregistrer dans la Bdd ?

Il est possible qu'aucune modification ne soit faite et que vous récupérer finalement les valeurs de base des prix pour chaque produit.

Link to comment
Share on other sites

Oui, lorsque je saisi mon tarif dans mon champs et que j'enregistre. je vais voir ma table ps_product : elle contient bien la valeur saisie (dans la colonne price).

 

Voici le code qui s'exécute lorsque j'enregistres mes modifications en BO :

public function hookActionProductUpdate($params)
{
	$id_product = Tools::getValue('id_product');

	$sampleObj = BlockLocationClasse::loadByIdProduct($id_product);

	$sampleObj->dispo = (boolean)Tools::getValue('dispo');
	$sampleObj->texte = Tools::getValue('texte');
	$sampleObj->tarif = (float)Tools::getValue('tarif');
	$sampleObj->nb_jour_max = Tools::getValue('nb_jour_max');
	$sampleObj->id_product = $id_product;

	//Test l'objet et son attribut "tarif" pour voir si on peut modifier le tarif dans la BDD
	if( !empty($sampleObj) && isset($sampleObj->tarif) )
	{
	 $this->setProductPrice($id_product, $sampleObj->tarif); /*<-------------------- ICI QUE J'APPELLE MA METHODE*/
	}

	//Test l'objet afin de voir s'il faut le modifier ou le crééer  
	if( !empty($sampleObj) && isset($sampleObj->id) )
	{
	 $sampleObj->update();
	}
	else
	{
		$sampleObj->add();
	}
}

 

 

La méthode en question :

/*
Méthode pour modifier uniquement le prix d'un produit en fonction de son ID
Arguments :
- id_produit pour le WHERE
- price qui est le tarif à modifier
*/
public function setProductPrice($id_product, $price)
{
 $result = Db::getInstance()->update('product', array('price' => $price), 'id_product = '.(int)$id_product);
}

 

EDIT : qui plus est, lorsque j'accède au listing des produits en BO (donc Catalogue -> produits) j'ai bien le tarif saisi qui s'affiche correctement dans la colonne prix de base donc je soupçonne les fichiers .tpl de ne pas aller récupérer la bonne valeur dans la BDD ... vraiment étrange.

Edited by genius_ (see edit history)
Link to comment
Share on other sites

EDIT : La variable qui affiche le prix dans les .tpl, notamment product_list.tpl est : $product.show_price.

Je suis perdu, je pensais qu'on accéder aux attributs d'une classe via nomClasse->attribut, il ne s'agit donc pas de l'affichage de l'attribut d'un objet produit ? :huh:

 

SVP :)

 

Vous n'êtes pas au bon emplacement concernant le fichier template, comme on est dans la partie back office, le véritable fichier template qui plus relatif à l'onglet Prix est accessible par ce chemin : /admin/themes/default/template/controllers/products/prices.tpl

 

Le champ Prix de vente HT récupére la valeur issu de la Bdd (prix de base indiqué dans le tableau des produits). Ensuite selon la taxe sélectionnée le prix de vente TTC final est calculé conditionnant également le Prix final.

Edited by Pepitoww (see edit history)
Link to comment
Share on other sites

Oui je suis conscient qu'il s'agit de prices.tpl que j'ai d'ailleurs exploré pour voir comment le prix était affiché. Il semblerait que l'affichage se fasse avec l'attribut $price de l'objet $product. L'accès se fait donc via : $product->price.

 

Voici le paramètre du champs INPUT du prix HT :

value="[spam-filter]toolsConvertPrice price=$product->price}|string_format:'%.2f'}"

 

Le code complet :

 <td style="padding-bottom:5px;">
  <input type="hidden"  id="priceTEReal" name="price" value="{toolsConvertPrice price=$product->price}" />
  {$currency->prefix}<input size="11" maxlength="14" id="priceTE" name="price_displayed" type="text" value="[spam-filter]toolsConvertPrice price=$product->price}|string_format:'%.2f'}" onchange="noComma('priceTE'); $('#priceTEReal').val(this.value);" onkeyup="$('#priceType').val('TE'); $('#priceTEReal').val(this.value.replace(/,/g, '.')); if (isArrowKey(event)) return; calcPriceTI();" />{$currency->suffix}
  <p class="preference_description">{l s='The pre-tax retail price to sell this product'}</p>
 </td>

 

Je te remercie encore pour ton soutien, je bloque toujours autant. Il s'agit de POO alors j'imagine que l'attribut $price de la classe Product (objet $product dans le code) doit être initialisé à partir de sa valeur dans la BDD (donc de la valeur que j'ai saisi et qui est dans cette BDD ... incompréhension totale)

 

:huh:

Link to comment
Share on other sites

Je viens de découvrir qu'en fait il s'agit de la colonne price de la table ps_product_shop qui est utilisée (que ce soit pour l'affichage ou le calcul du prix TTC) ... si seulement la BDD était plus claire :rolleyes:

 

Et bien merci pour ton aide à toi Pepitoww. je peux maintenant me consacrer à la gestion du tarif journalier pour la location produit.

 

Encore merci ! :D

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...