sum41147 Posted March 28, 2012 Share Posted March 28, 2012 Bonjour, Ayant des tarifs assez particuliers à mettre en place, qui devront s'afficher en fonction du client, j'ai suivi ce tutoriel mais qui est pour la version 1.3 de Prestashop (je suis sur la 1.4.6). J'ai créé un nouveau champ prix_b dans la table product identique au champ prix, inséré un champ modifiable dans l'admin, les modifications fonctionnent, les prix sont bien intégrés dans la base de données, ensuite ça se complique pour affecter le prix en fonction de tel ou tel groupe. Dans le fichier classes/product.php, J'ai déclaré le nouveau prix, ajouté le nom du champ dans la requête SQL : // fetch price & attribute price $cacheId2 = $id_product.'-'.$id_product_attribute; if (!isset(self::$_pricesLevel2[$cacheId2])) self::$_pricesLevel2[$cacheId2] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' SELECT p.`price`, p.`pricet_b`, [...] Puis j'essaie d'affecter le type de prix en fonction du groupe : $GroupCli = $cookie->$id_group; if ($GroupCli==2) { $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['pricet_b'] : $specific_price['price']; } else { $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['price'] : $specific_price['price']; } Et ça ne fonctionne pas. En faisant un echo de $GroupCli, le numéro du groupe apparaît bien en fonction du client mais le prix ne change pas, il y en a seulement un des deux qui s'affiche en fonction des diverses modifications du code ou je ne sait quoi ? Est-ce que j'aurais oublié quelque chose ? Y-a-t-il autre chose à modifier ? Link to comment Share on other sites More sharing options...
misterpink Posted April 3, 2012 Share Posted April 3, 2012 Bonjour, as tu trouvé la solution car moi aussi je suis bloqué sur cette fonction... Link to comment Share on other sites More sharing options...
olea Posted April 3, 2012 Share Posted April 3, 2012 Un module qui vous permet de gérer les prix par clients sur la 1.4 : Super Prices Editor Extended Sinon de base, prestashop 1.4 gère les prix par groupe de client : dans les fiche produit, il faut aller dans l'onglet Prix. La version de base de Super Prices Editor vous permet d'accéder plus rapidement aux prix Link to comment Share on other sites More sharing options...
sum41147 Posted April 5, 2012 Author Share Posted April 5, 2012 Non je n'ai toujours pas trouvé la solution j'ai refait des tests en faisant un if autour de la requête (si groupe client = 2 utiliser la requête avec pricet_b, sinon utiliser la requête avec p.price mais ça ne fonctionne pas non plus ... Quelqu'un pourrait nous aider ? Je voudrais vraiment trouver la solution Link to comment Share on other sites More sharing options...
sum41147 Posted April 6, 2012 Author Share Posted April 6, 2012 Je m'en veut de ne pas avoir trouvé la solution plus tôt il suffit de ne pas rajouter la partie suivante car la variable $id_group est déjà déclarée plus haut : $GroupCli = $cookie->$id_group; Ce qui donne : // fetch price & attribute price $cacheId2 = $id_product.'-'.$id_product_attribute; if (!isset(self::$_pricesLevel2[$cacheId2])) self::$_pricesLevel2[$cacheId2] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' SELECT p.`price`, p.`pricet_b`, '.($id_product_attribute ? 'pa.`price`' : 'IFNULL((SELECT pa.price FROM `'._DB_PREFIX_.'product_attribute` pa WHERE id_product = '.(int)($id_product).' AND default_on = 1), 0)').' AS attribute_price, p.`ecotax` '.($id_product_attribute ? ', pa.`ecotax` AS attribute_ecotax' : '').' FROM `'._DB_PREFIX_.'product` p '.($id_product_attribute ? 'LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON pa.`id_product_attribute` = '.(int)($id_product_attribute) : '').' WHERE p.`id_product` = '.(int)($id_product)); $result = self::$_pricesLevel2[$cacheId2]; if ($id_group==2) { $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['pricet_b'] : $specific_price['price']; } else if ($id_group==1) { $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['price'] : $specific_price['price']; } Pour l'instant je n'ai pas rencontré de problème ça semble bien fonctionner =) Link to comment Share on other sites More sharing options...
misterpink Posted April 6, 2012 Share Posted April 6, 2012 Salut sum41147 Cool que tu y soit arrivé!! je vais essayé, mais par contre j’hésite encore car mes produits ont des déclinaisons qui font varier le prix et je ne sais pas comment cela se gère avec cette modification, peux tu me dire ce qu'il se passe si il y a des déclinaisons? merci d'avance Link to comment Share on other sites More sharing options...
misterpink Posted April 6, 2012 Share Posted April 6, 2012 Bon définitivement je n'y arrive pas, pourrais tu me passer les fichiers que tu as modifié car la je rame trop comme ça je pourrai regarder les modifs que tu as faites... tu arrives a avoir les prix différents dans product.tpl selon le groupe de client? et il s'affichent dans la fiche produits dans le front office? merci d'avance Link to comment Share on other sites More sharing options...
sum41147 Posted April 6, 2012 Author Share Posted April 6, 2012 Je t'avoue que je n'ai pas encore testé les déclinaisons mais en théorie le prix que tu donne doit écraser le prix de base ? Désolée j'ai voulu faire le test mais mon PC a fait une surchauffe donc je vais le laisser se reposer un peu. Je transmettrai le code un peu plus tard Link to comment Share on other sites More sharing options...
Lyn&Or Bijoux Posted April 10, 2012 Share Posted April 10, 2012 Bonjour, bon, vouas avez l'air callés en codes, alors comme je recherche une solution sur le module gestion de groupe, peut-être allez-vous pouvoir m'aider... En fait, je crée un groupe Comité d'entreprise, et je leur attribue une réduction, jusque là, tout va bien, c'est prévu. par contre, je voudrai paramétrer un minimum de commande pour pouvoir passer commande. savez-vous comment faire? Merci d'avance;) Link to comment Share on other sites More sharing options...
sum41147 Posted April 11, 2012 Author Share Posted April 11, 2012 Bonjour, bon, vouas avez l'air callés en codes, alors comme je recherche une solution sur le module gestion de groupe, peut-être allez-vous pouvoir m'aider... En fait, je crée un groupe Comité d'entreprise, et je leur attribue une réduction, jusque là, tout va bien, c'est prévu. par contre, je voudrai paramétrer un minimum de commande pour pouvoir passer commande. savez-vous comment faire? Merci d'avance;) Pour ma part, je peut remercier les personnes qui prennent du temps pour nous présenter des tutoriels et nous apporter leur aide Concernant ton problème, s'il s'agit d'un même minimum de commande pour tout le monde, tu peut le paramétrer depuis le BO de prestashop dans l'onglet Préférences / Produits puis "Montant total minimum requis pour valider une commande :" Si les groupes doivent avoir un minimum de commande différent ça va être plus compliqué, après je n'ai pas regardé, mais je pourrais toujours essayer de t'aider à l'occasion Link to comment Share on other sites More sharing options...
Lyn&Or Bijoux Posted April 11, 2012 Share Posted April 11, 2012 Bonsoir, Merci pour ta réponse, mais malheureusement, je souhaitais bien que le minimum de commande ne soit recquis que pour un groupe spécifique (CE et collectivités). mais du coup, j'ai fait autrement et je n'en ai plus besoin Bonne soirée Link to comment Share on other sites More sharing options...
sum41147 Posted April 11, 2012 Author Share Posted April 11, 2012 Bonsoir, Désolée d'avoir mis du temps à répondre, voici la méthode qui fonctionne chez moi (avec la version de prestashop 1.4.6.2) : Pour le début, tu peut reprendre le tuto de matgrafiks : 1 : Créer un nouveau champ dans la base de données par exemple priceb 2 : Aller dans le fichier Admin/tabs/AdminProducts.php et ajouter le code suivant après "Pre-tax retail price:" vers la ligne 2540 : <br /> <input size="11" maxlength="14" name="priceb" type="text" value="'.$this->getFieldValue($obj, 'priceb').'"/>'.($currency->format == 2 ? ' '.$currency->sign : '').'<span style="margin-left:13px">Tarif professionnel</span> 3 : Dans le fichier classes/Product.php, modifier les lignes suivantes : - En début de fichier : /** @var float Price in euros */ public $priceb = 0; - Ajouter le champ dans la fonction getFields() : $fields['priceb'] = (float)($this->priceb); - Ajouter le champ dans la requête SQL, juste après le commentaire "// fetch price & attribute price" : self::$_pricesLevel2[$cacheId2] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' SELECT p.`price`, p.`priceb`, '.($id_product_attribute ? 'pa.`price`' : 'IFNULL((SELECT pa.price FROM `'._DB_PREFIX_.'product_attribute` pa WHERE id_product = '.(int)($id_product).' AND default_on = 1), 0)').' AS attribute_price, p.`ecotax` '.($id_product_attribute ? ', pa.`ecotax` AS attribute_ecotax' : '').' FROM `'._DB_PREFIX_.'product` p '.($id_product_attribute ? 'LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON pa.`id_product_attribute` = '.(int)($id_product_attribute) : '').' WHERE p.`id_product` = '.(int)($id_product)); - Et enfin tu met le prix en fonction du groupe : if ($id_group==2) { $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['priceb'] : $specific_price['price']; } else if ($id_group==1) { $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['price'] : $specific_price['price']; } Et teste bien avec deux comptes clients : un premier avec un premier groupe par défaut, et un deuxième avec un deuxième groupe par défaut. J'ai pas encore fait un test complet mais pourtant ça semble fonctionner. Link to comment Share on other sites More sharing options...
misterpink Posted April 12, 2012 Share Posted April 12, 2012 merci beaucoup je vais tester ça... Link to comment Share on other sites More sharing options...
sum41147 Posted April 12, 2012 Author Share Posted April 12, 2012 Quelqu'un pourrait m'aider ? Comme le système des groupes ne me convenait pas (car il faudrait que j'inscrive à la main chaque foi qu'il y a un client le compte client par défaut ça risque de faire lourd à force), j'ai voulu créer un nouveau champ "Code tarif" dans la table Customer, afin de le récupérer dans le fichier Product.php pour pouvoir faire "si codetarif= .. afficher tel prix sinon afficher tel prix". Jusque là, pas de problème, ensuite je me suis bien amusée à tenter de récupérer la valeur dans mon fichier classes/Product.php, j'ai donc déclaré la nouvelle variable public $codetarif; en début de document, Puis ce qui suit : // fetch price & attribute price $cacheId2 = $id_product.'-'.$id_product_attribute; if (!isset(self::$_pricesLevel2[$cacheId2])) self::$_pricesLevel2[$cacheId2] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' SELECT p.`price`, p.`pricet14`, '.($id_product_attribute ? 'pa.`price`' : 'IFNULL((SELECT pa.price FROM `'._DB_PREFIX_.'product_attribute` pa WHERE id_product = '.(int)($id_product).' AND default_on = 1), 0)').' AS attribute_price, p.`ecotax` '.($id_product_attribute ? ', pa.`ecotax` AS attribute_ecotax' : '').' FROM `'._DB_PREFIX_.'product` p '.($id_product_attribute ? 'LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON pa.`id_product_attribute` = '.(int)($id_product_attribute) : '').' WHERE p.`id_product` = '.(int)($id_product)); $result = self::$_pricesLevel2[$cacheId2]; // ici pour récupérer le code tarif $id_customer = ((Validate::isCookie($cookie) AND isset($cookie->id_customer) AND $cookie->id_customer) ? (int)($cookie->id_customer) : NULL); $codetarif = Db::getInstance()->getRow(' SELECT `codetarif`, `id_customer` FROM `'._DB_PREFIX_.'customer` WHERE `id_customer` = '.(int)($cookie->id_customer)); echo 'Result for id : '.$codetarif['codetarif']; // Afficher le prix en fonction du code tarif if ($codetarif==14) { $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['pricet14'] : $specific_price['price']; } else if ($codetarif==10) { $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['price'] : $specific_price['price']; } La valeur code tarif est bien récupérée, par contre j'ai ce message d'erreur : "Notice: Undefined variable: price in C:\wamp\www\alaone\prestashop\classes\Product.php on line 1974" Qui correspond à la dernière ligne du code ci-dessous, situé juste en dessous de ce que j'ai modifié : // convert only if the specific price is in the default currency (id_currency = 0) if (!$specific_price OR !($specific_price['price'] > 0 AND $specific_price['id_currency'])) $price= Tools::convertPrice($price, $id_currency); Quelqu'un pourrait m'expliquer pourquoi elle n'est plus reconnue ? Link to comment Share on other sites More sharing options...
sum41147 Posted April 12, 2012 Author Share Posted April 12, 2012 Je crois que c'est bon en fait ça ne récupérait pas le résultat de la requête donc pour info voici mon code : // fetch price & attribute price $cacheId2 = $id_product.'-'.$id_product_attribute; if (!isset(self::$_pricesLevel2[$cacheId2])) self::$_pricesLevel2[$cacheId2] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' SELECT p.`price`, p.`pricet14`, '.($id_product_attribute ? 'pa.`price`' : 'IFNULL((SELECT pa.price FROM `'._DB_PREFIX_.'product_attribute` pa WHERE id_product = '.(int)($id_product).' AND default_on = 1), 0)').' AS attribute_price, p.`ecotax` '.($id_product_attribute ? ', pa.`ecotax` AS attribute_ecotax' : '').' FROM `'._DB_PREFIX_.'product` p '.($id_product_attribute ? 'LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON pa.`id_product_attribute` = '.(int)($id_product_attribute) : '').' WHERE p.`id_product` = '.(int)($id_product)); $result = self::$_pricesLevel2[$cacheId2]; $id_customer = ((Validate::isCookie($cookie) AND isset($cookie->id_customer) AND $cookie->id_customer) ? (int)($cookie->id_customer) : NULL); $codetarif = Db::getInstance()->getRow(' SELECT `codetarif`, `id_customer` FROM `'._DB_PREFIX_.'customer` WHERE `id_customer` = '.(int)($cookie->id_customer)); if ($codetarif['codetarif']==14) { $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['pricet14'] : $specific_price['price']; } else if ($codetarif['codetarif']==10) { $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['price'] : $specific_price['price']; } else { $price = (float)(!$specific_price OR $specific_price['price'] == 0) ? $result['price'] : $specific_price['price']; } hiiiii c'est génial quand ça fonctionne Link to comment Share on other sites More sharing options...
misterpink Posted April 13, 2012 Share Posted April 13, 2012 salut, pour moi la modif pour le tarif particulier et tarif pro ne fonctionne pas, si je suis logger en tant que client par défaut ou que je suis logger en client pro le prix ne change pas dans le template product.tpl... snifff Link to comment Share on other sites More sharing options...
misterpink Posted April 13, 2012 Share Posted April 13, 2012 j'ai vérifié dans la base de donnée et price_pro reste a 0.... Link to comment Share on other sites More sharing options...
sum41147 Posted April 16, 2012 Author Share Posted April 16, 2012 j'ai vérifié dans la base de donnée et price_pro reste a 0.... As-tu bien vérifié que les noms utilisés dans le code et dans la base de données sont bien identiques ? Link to comment Share on other sites More sharing options...
misterpink Posted April 17, 2012 Share Posted April 17, 2012 Oui ils sont bien identiques, peux tu m'envoyer carrément les fichiers que tu as modifié comme ça je regarde de plus prêt envoi les moi en message privé si tu préfères et bien sur si cela ne te dérange pas... Merci en tout cas de prendre le temps de me répondre c'est cool Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now