Jump to content

requête sql pour récupérer la quantité des déclinaisons


Recommended Posts

Bonjour
Je suis un débutant en php et PS aussi et je rencontre des problèmes lors dés récupération des variables ou des données de ma BD pour l'utiliser ailleurs dans d'autres fichier .tpl c pourquoi je demande un coup de main de la part des développeurs et le pro en programmation prestashop pour me donner quelques astuces ou des tutos afin que je ma lance dans la programmation sur PS puisqu'il est assez flexible.
par exemple j'ai besoin de récupérer les quantités de déclinaisons pour chaque produit pour l'utiliser dans un autre module mais j y'arrive pas adapter ma requête sql dans le fichier php pour qu'elle soit récupérable dans le fichier tpl associés.
Cordialement

Link to comment
Share on other sites

Salut Overdoze,

Aller, ça c'est cadeau ;)

   /**
    * @return array of Groups/Attribute available for a designed product
    * param integer $id_product
    * param integer $id_lang
    */
   private function GetAvailableAttributes($id_product, $id_lang)
   {         
       return Db::getInstance()->ExecuteS('
       SELECT * 
       FROM `'._DB_PREFIX_.'product_attribute` 
       LEFT JOIN `'._DB_PREFIX_.'product_lang` ON '._DB_PREFIX_.'product_attribute.id_product = '._DB_PREFIX_.'product_lang.id_product 
       WHERE '._DB_PREFIX_.'product_attribute.id_product = '.intval($id_product).' 
       AND `id_lang` = '.intval($id_lang).' 
       AND `quantity` >= 1');
   }

Link to comment
Share on other sites

Bonjour space
et un grand merci pour le cadeau ;)
pour ce bout de code il faut le mettre dans le fichier php non?
mais comment je peut récupérer le résultat de cette requête dans le fichier Template où je veux faire le traitement des donnés?

Link to comment
Share on other sites

j'ai mis votre bout de code dans le fichier php puis dans mon fichier tpl j'ai fait une boucle foreach pour teste est afficher l'id_product mais il m'affiche rien
voici la boucle
{foreach from=$tabResult item=declin name=qtedeclin}
{$declin.id_product}{/foreach}

je crois que j'ai oublié qqe chose :)

Link to comment
Share on other sites

non ça pas marché
mais en fouillant dans le fichier php du module j'ai trouvé ce code

public static function getDetailledDeclinaison($id_lang,$ean13,$reference=NULL,$id_product_attribut=NULL){
       $row=array();
       $id_product_attribut=$id_product_attribut?$id_product_attribut:($ean13?self::getIdProductAttributFromEan13($ean13)$reference?self::getIdProductAttributFromReference($reference):false));
       if(!$id_product_attribut)
           return false;
       $row['id_product_attribute']=$id_product_attribut;
       $result2 = Db::getInstance()->ExecuteS('
               SELECT agl.`public_name` AS public_group_name, al.`name` AS attribute_name
               FROM `'._DB_PREFIX_.'product_attribute_combination` pac
               LEFT JOIN `'._DB_PREFIX_.'attribute` a ON a.`id_attribute` = pac.`id_attribute`
               LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON ag.`id_attribute_group` = a.`id_attribute_group`
               LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = '.$id_lang.')
               LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = '.$id_lang.')
               WHERE pac.`id_product_attribute` = '.intval($id_product_attribut));

       $attributesList = '';
       $attributesListSmall = '';
       if ($result2)
       foreach ($result2 AS $k2 => $row2)
       {
           $attributesList .= $row2['public_group_name'].' : '.$row2['attribute_name'].', ';
           $attributesListSmall .= $row2['attribute_name'].', ';
       }
       $attributesList = rtrim($attributesList, ', ');
       $attributesListSmall = rtrim($attributesListSmall, ', ');
       $row['attributes'] = $attributesList;
       $row['attributes_small'] = $attributesListSmall;
       $row['stock_quantity'] = $row['quantity_attribute'];
       return $row;
   }



je croit qu'il sélectionne les les détails des déclinaisons des produit mais comment l'utiliser dans le fichier tpl

Link to comment
Share on other sites

Dans ta classe Attribute, tu as la fonction recherchée.
Côté PHP, mets :

$attr = new Attribute();
$quantity = $attr->getAttributeQty($id_product);

Puis :
$smarty->assign(array(
'quantity' => $quantity
));

Pour ensuite vérifier ton résultat, dans ton fichier .tpl, mets :
{$quantity}, ceci t'affichera le nombre.

Tu as bien compris le principe PHP / Tpl ? Chaque fichier PHP est relié au TPL, il faut bien mettre ton PHP dans le TPL concerné tout ça ?

Link to comment
Share on other sites

bonjour Vincent et merci de m'avoir répondu
en faite la notion Tpl/PHP m'est encore un peu flou
si j'ai bien compris ce que tu vient me dire c'est que j'ajoute ton bout de code après ma classe Attribute et pour vérifier je tape {$quantity} dans mon fichier .tpl, mais je la trouve pas la classe Attribute!!

Link to comment
Share on other sites

En fait, à la racine du serveur, tu peux voir plein de fichier .php, chaque fichier correspond à un fichier template de ton thème.

Si tu veux utiliser la quantity des déclinaisons sur la fiche produit, il faudra mettre le code PHP dans product.php, et le {$quantity} dans product.tpl.
Tu veux t'en servir pour quoi faire de cette quantité ?

EDIT : la fonction getAttributeQty($id) retourne uniquement un entier en fait, qui représente la somme des quantités des déclinaisons. Du coup, utiliser la fonction de space qui est bien mieux.
Mais le principe PHP / Tpl reste le même.

Link to comment
Share on other sites

dans ma boutique chaque produit a 3 déclinaisons, je veux faire du vente flash mais selon la quantité de la 2ème déclinaison.
c pour cela je veux récupérer les quantité des déclinaisons afin de tester si la quantité de la 2éme est NULL un message "Terminée" s'affiche dans le module.

Link to comment
Share on other sites

j'ai essayé avec le code de space mais je croit que je n y'arrive pas seule a le déployé correctement

/**
    * @return array of Groups/Attribute available for a designed product
    * param integer $id_product
    * param integer $id_lang
    */
   private function GetAvailableAttributes($id_product, $id_lang)
   {         
       return Db::getInstance()->ExecuteS('
       SELECT * 
       FROM `'._DB_PREFIX_.'product_attribute` 
       LEFT JOIN `'._DB_PREFIX_.'product_lang` ON '._DB_PREFIX_.'product_attribute.id_product = '._DB_PREFIX_.'product_lang.id_product 
       WHERE '._DB_PREFIX_.'product_attribute.id_product = '.intval($id_product).' 
       AND `id_lang` = '.intval($id_lang).' 
       AND `quantity` >= 1');
       $result = self::GetAvailableAttributes($id_product, $id_lang);
       $smarty->assign(array('tabResult' => $result));
   }



j'ai mis le code dans mon fichier php mais comment faire dans le fichier tpl?

Link to comment
Share on other sites

  • 2 weeks later...

un ptit up svp
j'arrive toujours pas a récupérer les quantité des déclinaisons pour chaque produit
Voici le code php appelé par mon fich.tpl, comment intégrer le requête de récupération dedans pour avoir la quantité des déclinaisons dans le bloc du module.
Merci d'avance

Link to comment
Share on other sites

Bonjour, si rien ne s'affiche le plus simple c'est de mettre {debug} dans le fichier tpl, la tu verra si ta variable est vide, null(problème lors de la requete sql) ou si il y a quelque chose (sous la forma array).

A mon avis il manque des ` et des ', voici ce que je mettrais comme code :


/**
    * @return array of Groups/Attribute available for a designed product
    * param integer $id_product
    * param integer $id_lang
    */
   private function GetAvailableAttributes($id_product, $id_lang)
   {         
       return Db::getInstance()->ExecuteS('
       SELECT * 
       FROM `'._DB_PREFIX_.'product_attribute` p_a
       LEFT JOIN `'._DB_PREFIX_.'product_lang` p_l ON(p_a.`id_product` = p_l.`id_product`)
       WHERE p_a.`id_product` = '.intval($id_product).' 
       AND p_l.`id_lang` = '.intval($id_lang).' 
       AND p_a.`quantity` >= 1');
   }




Je pense qu'il est préférable de mettre le code ci dessus dans le fichier classes/Product.php (Product et non pas product)

Pour utiliser la fonction (dans un fichier php) et pour l'envoi des résultats :

$result = Product::GetAvailableAttributes($id_product, $id_lang);
$smarty->assign('tabResult',$result); 



pour l'envoi, j'ai enlevé array, ca change rien c'est plus court c'est tout.

Pour récupérer les valeurs dans le fichier tpl:

{foreach from=$tabResult item='declinaison'}
{$declinaison.id_product_attribute}{$declinaison.quantity}
{/foreach}



Si rien ne s'affiche, essaye avec {debug}

Link to comment
Share on other sites

Bonjour
merci ceoes.pro pour le coup de main
j'ai fait comme tu m'a dit :
-j'ai mis le bout de code de la fonction GetAvailableAttributes dans les 2 fichiers php associés au module comme suit

function GetAvailableAttributes($id_product, $id_lang)
   {         
       return Db::getInstance()->ExecuteS('
       SELECT * 
       FROM `'._DB_PREFIX_.'product_attribute` 
       LEFT JOIN `'._DB_PREFIX_.'product_lang` ON '._DB_PREFIX_.'product_attribute.id_product = '._DB_PREFIX_.'product_lang.id_product 
       WHERE '._DB_PREFIX_.'product_attribute.id_product = '.intval($id_product).' 
       AND `id_lang` = '.intval($id_lang).' 
       AND `quantity` >= 1');
       $result = self::GetAvailableAttributes($id_product, $id_lang);
       $smarty->assign(array('tabResult' => $result));
   }


-mis la boucle foreach dans le fichier tpl associés + {debug}
===>et j'ai comme résultat un messgae d'erreur : $tabResult est inconnu
je suis complètement déraillé :(

Link to comment
Share on other sites

Bonjour, j'ai mis 3 codes dans le message précédent:

- le premier code est à placer dans /classes/Product.php (attention mon code n'est pas le même que le votre, je n'ai pas les 2 dernières lignes qui commencent par $result et $smarty)

- le deuxième est à placer dans le php qui a besoin de cette fonction

- le troisième dans le fichier tpl


EDIT : dans la console de débogage smarty il faut chercher dans la colonne de gauche : {$tabResult}

Link to comment
Share on other sites

Si vous voulez afficher les quantité dans la page product alors allez à la racine du site dans le fichier product.php et rajoutez le code (le 2) et dans la page /themes/votretheme/product.tpl vous rajoutez le code (3) là où voulez afficher la quantité de déclianison.

Link to comment
Share on other sites

non je veux utiliser les quantités des déclinaisons pour faire des testes dans le module vente flash.
ce module a 2 fichiers php : le 1er vente-flash.php et l'autre ventesflash.php qui contient la mise en page du backoffice du module.
ces quantités je vais les utiliser dans le module, si c possible dans la totalité des fichier tpl du module et product.tpl, mais j'arrive pas a le faire.
mon problème c comment utiliser le 2 ème code dans mon fichier php c a d le syntaxe du code 2
je le met comme il est dans le fichier php

$result = Product::GetAvailableAttributes($id_product, $id_lang);
$smarty->assign('tabResult',$result);


ou je l'affecte a une fonction?
une piste svp

Link to comment
Share on other sites

bonjour
enfin j'ai réussi a récupérer les déclinaisons existante dans ma base de donnée (environ 1830) par cette requête

public function GetquantityAttributes()
   {         
       return Db::getInstance()->ExecuteS('
       SELECT * 
       FROM `'._DB_PREFIX_.'product_attribute` p_a');
   }


et l'afficher avec cette boucle

{foreach from=$quantite_comb item=combina }
       {$combina.quantity}
       {/foreach}


mais mois je veux juste sélectionné les déclinaisons des produits existants dans les vents flash, donc il faut récupérer les déclinaisons a travers l' $id_product.Si je met

public function GetquantityAttributes($id_product)

l'erreur suivante est affichée Notice: Undefined variable: id_product
un coup de main svp

Link to comment
Share on other sites

Vous mettez bien public function GetquantityAttributes($id_product) pour la fonction qui fait la recherche de déclinaison, mais dans le fichier qui appelle cette fonction, vous mettez quoi ?...GetquantityAttributes($id_product) et dans ce fichier $id_product existe ?

Link to comment
Share on other sites

la fonction est public function GetquantityAttributes($id_produit).
l'appel du fonction

$smarty->assign(array(
               .................etc...................,
               '............etc...........................,
               'quantite_comb' => self::GetquantityAttributes($id_produit),


et $id_produit existe dans mon fichier php plus qu'une fois et utilisé dans d'autre fonctions

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...