Load full product

  • Posts: 333
  • Thank you received: 22
  • Hikamarket Multivendor Hikaserial Subscription Hikashop Business
2 months 1 week ago #346802

Bonjour,

j'arrête de chercher, je pose la question :silly:

Je cherche à charge un produit complet tel qu'il est dans la vue product dans la variable this->element, mais lorsque j'utiliser getProduct, je n'ai pas tout, il manque les variantes, les prices, etc, il n'y a que les infos de ligne de la table product et les images.

Un peu comme la fonction loadFullCart qui donne toutes les données liées.

De manière général, cette fonction me manque souvent, donc on peut mettre le contexte à part mais je le donne quand même au cas ou

Le contexte :
Je suis dans une vue produit, avec les options de variantes en listes déroulantes, mon client souhaite que le tarif "à partir de" s'affiche avant d'avoir sélectionné les options.
Le tarif qui était de base caché n'était pas celui de la variante la moins chère.
J'avais modifié la vue listing_price pour que le prix le plus bas soit afficher, mais forcément, ma modif bloque l'affichage dynamique du nouveau prix une fois les options sélectionnées.
Donc je me suis dit que j'allais faire la modif en amont, à la ligne $this->row = &$this->element; juste avant le loadTemplate du listing_price dans la vue produit.

mais là je coince car lorsque je remplace this->row par la variante la moins chère, tout ce dont la vue listing_price à besoin n'est pas chargé

j'aurais aimé faire quelque chose du type :

if ($this->params->get('show_price') && (empty($this->displayVariants['prices']) || $this->params->get('characteristic_display') != 'list')) {				
				$productClass = hikashop_get('class.product');
				if($this->row->product_type == 'main'){
					$db->setQuery('SELECT * FROM #__hikashop_product WHERE product_published = 1 AND product_parent_id = '.$this->row->product_id.' ORDER BY product_sort_price LIMIT 1');
					$this->row = $db->loadObject();
					$this->row = $productClass->getProduct($this->row->product_id);
				}
				elseif($this->row->product_type == 'variant'){
					$db->setQuery('SELECT * FROM #__hikashop_product WHERE product_published = 1 AND product_parent_id = '.$this->row->product_parent_id.' ORDER BY product_sort_price LIMIT 1');
					$this->row = $db->loadObject();
					$this->row = $productClass->getProduct($this->row->product_id);
				}
				$this->setLayout('listing_price');
				echo $this->loadTemplate();

Mais voilà, il manque plein d'infos dans this->row par rapport à this->element

je sais que c'est un peu tordu, j'espère avoir été le plus clair possible

Merci d'avance

Last edit: 2 months 1 week ago by Minie.

Please Log in or Create an account to join the conversation.

  • Posts: 77783
  • Thank you received: 12273
  • MODERATOR
2 months 1 week ago #346815

Bonjour,

C'est surtout les prix qu'il manque dans $this->row pour que cela fonctionne.
Il faudrait rajouter cela:

$ids = array($this->row->product_id);
$this->currencyClass->getPrices($this->row, $ids, null, null, null, null);
Cela va chager les discounts et les prix du produit. Et si c'est pour le produit principal et qu'il faut pouvoir utiliser le prix d'une variante, alors il faut également spécifier l'id de la variante dans $ids.

Faire un getFullProduct pour avoir toutes les informations d'un produit est une bonne idée.

Please Log in or Create an account to join the conversation.

  • Posts: 333
  • Thank you received: 22
  • Hikamarket Multivendor Hikaserial Subscription Hikashop Business
2 months 1 week ago #346850

Bonjour,

merci pour votre réponse.

Malheureusement c'est ce que j'avais essayé, le "à partir de" que je génère dans le listing_price avec le code suivant ne s'affiche plus

if(!empty($this->row->variant_ids) OR !empty($this->row->variants)){
	echo '<span class="price_intro">A partir de</span>';
}
Pour le "à partir de", mon code me dit qu'il manque $this->row->variants vu que je n'ais pas tout le produit dans this->row
J'ai donc essayé de charger les variants $this->row->variants = $productClass->loadProductVariants($this->row); le résultat est NULL :S

Le plus embêtant, les listes déroulantes de caractéristiques disparaissent aussi car, d'apèrs mon var_dump, le this->element n'a plus les caractéristiques, pourtant je ne modifie jamais le this->element, juste le this->row que je remets en place après ma manip en plus, voici le code actuel ainsi que le lien vers la vue avec ce code :
if ($this->params->get('show_price') && (empty($this->displayVariants['prices']) || $this->params->get('characteristic_display') != 'list')) {
				
				$productClass = hikashop_get('class.product');
				$currencyClass = hikashop_get('class.currency');
				if($this->row->product_type == 'main'){
					$db->setQuery('SELECT * FROM #__hikashop_product WHERE product_published = 1 AND product_parent_id = '.$this->row->product_id.' ORDER BY product_sort_price LIMIT 1');
					$this->row = $db->loadObject();
					$this->row = $productClass->getProduct($this->row->product_id);
					$ids = array($this->row->product_id);
					$currencyClass->getPrices($this->row, $ids, null, null, null, null);
					$this->row->variants = $productClass->loadProductVariants($this->row);
				}
				elseif($this->row->product_type == 'variant'){
					$db->setQuery('SELECT * FROM #__hikashop_product WHERE product_published = 1 AND product_parent_id = '.$this->row->product_parent_id.' ORDER BY product_sort_price LIMIT 1');
					$this->row = $db->loadObject();
					$this->row = $productClass->getProduct($this->row->product_id);
					$ids = array($this->row->product_id);
					$currencyClass->getPrices($this->row, $ids, null, null, null, null);
					$this->row->variants = $productClass->loadProductVariants($this->row);
				}
				// $this->row = $this->element;
				// echo'<pre>';var_dump($this->row);echo'</pre>';
				$this->setLayout('listing_price');
				echo $this->loadTemplate();
				$this->row = $this->element;

cebonat.gixia.fr/fr/tous-les-produits/pr...l-inox-acmatpoussinv

Please Log in or Create an account to join the conversation.

  • Posts: 77783
  • Thank you received: 12273
  • MODERATOR
2 months 1 week ago #346852

Ce n'est pas comme ça qu'il faut "remettre en place".
Il faut faire une copie de $this->row avant votre code dans une variable temporaire.
Comme ceci:

$tmp = hikashop_copy($this->row);

// ... votre code ...

$this->row = $tmp;

Et pour loadProductVariants il ne faut pas écrire
$this->row->variants = $productClass->loadProductVariants($this->row);
mais:
$productClass->loadProductVariants($this->row);


Enfin, pour
if(!empty($this->row->variant_ids) OR !empty($this->row->variants)){
	echo '<span class="price_intro">A partir de</span>';
}
, dans les listings, vous avez $this->row->has_options qui contient l'information de savoir si le produit a des variantes/options ou non. Cela permet de savoir s'il faut afficher le bouton "add to cart" ou le bouton "choose options". Peut être que vous pourriez utiliser cela plutôt que d'essayer de recharger les variantes ? Par exemple:
if(!empty($this->row->has_options) OR !empty($this->row->variant_ids) OR !empty($this->row->variants)){
	echo '<span class="price_intro">A partir de</span>';
}

Please Log in or Create an account to join the conversation.

  • Posts: 333
  • Thank you received: 22
  • Hikamarket Multivendor Hikaserial Subscription Hikashop Business
2 months 1 week ago #346926

Bonjour,

merci pour votre réponse.

pour la "remise en place", ca fonctionne nickel merci beaucoup !

Pour les variantes, la formulation $productClass->loadProductVariants($this->row); etait la première que j'ia testée, mais this->row n'a pas de this->row->variants alors j'ai testé comme ca, là je viens de tester à nouveau avec la bonne façon mais sans succès, mais la remise en place de this->row à résolu le problème de la disparition des listes déroulantes :silly:

pour le has_options, il fait partie des présents dans this->element et absents dans this->row au même titre que les variantes mais ce n'est pas grave, je peux tout aussi bien faire une requête sql sale de recherche de variantes à partir du product_id à cet endroit, je ne sus plus à ca près du moment que ca fonctionne, et ca fonctionne, youpi !

Merci beaucoup, Nicolas toujours au top :)

Please Log in or Create an account to join the conversation.

Time to create page: 0.063 seconds
Powered by Kunena Forum