Jump to content

Shonen

Members
  • Posts

    267
  • Joined

  • Last visited

Everything posted by Shonen

  1. Outch, ça me rappel trop de souvenirs ce simple topo. Tout d'abord, je pars du principe que c'est un Prestashop 1.6 et donc stable. C'est natif, pas besoin de module, juste activer les stocks avancés. Ensuite créer 1 ou plusieurs entrepôts physiques, puis assigner les produits aux entrepôts. Mais lors de la commande, je ne sais pas quel entrepôt sera soustrait de son produit, ou si c'est une activation manuelle etc. Si tu ne fais que de la livraison, c'est jouable, il faudra juste en interne que vous fassiez votre tambouille pour savoir quel magasin a vendu ci ou quel magasin à vendu ça etc. Prestashop ne le gérera pas. Si tu fais du retrait boutique + livraison par magasin avec gestion de stock et promesse de stock, cas auquel je me suis déjà frotté, je suis curieux si quelqu'un a une solution car je n'ai toujours pas trouvé quelque chose d'abordable.
  2. Salut, Si j'ai bien compris, un petit CSS peut t'aider à faire ça : #top-menu > li > .sub-menu > ul.top-menu > li > div > ul { display: none; }
  3. Salut, Je débarde bien plus tard, mais comme j'avais le même soucis, je préfère afficher ma solution. Mon Prestashop est version 1.6.1.19, me demandez pas pour 1.7 cette version n'existe pas pour moi. J'ai modifié l'affichage dans le BO, pour ne plus afficher les paniers qui ne comportent pas de produits, je suis passé de 8000 paniers à 3300 paniers sur mon site client. Pour cela, j'ai créé le fichier AdminCartsController.php dans le dossier override/controllers/admin <?php class AdminCartsController extends AdminCartsControllerCore { public function __construct() { parent::__construct(); $this->_select = 'CONCAT(LEFT(c.`firstname`, 1), \'. \', c.`lastname`) `customer`, a.id_cart total, ca.name carrier, IF (IFNULL(o.id_order, \''.$this->l('Non ordered').'\') = \''.$this->l('Non ordered').'\', IF(TIME_TO_SEC(TIMEDIFF(\''.pSQL(date('Y-m-d H:i:00', time())).'\', a.`date_add`)) > 86400, \''.$this->l('Abandoned cart').'\', \''.$this->l('Non ordered').'\'), o.id_order) AS status, IF(o.id_order, 1, 0) badge_success, IF(o.id_order, 0, 1) badge_danger, IF(co.id_guest, 1, 0) id_guest'; $this->_join = 'LEFT JOIN '._DB_PREFIX_.'customer c ON (c.id_customer = a.id_customer) LEFT JOIN '._DB_PREFIX_.'currency cu ON (cu.id_currency = a.id_currency) LEFT JOIN '._DB_PREFIX_.'carrier ca ON (ca.id_carrier = a.id_carrier) LEFT JOIN '._DB_PREFIX_.'orders o ON (o.id_cart = a.id_cart) INNER JOIN '._DB_PREFIX_.'cart_product cp ON (cp.id_cart = a.id_cart) LEFT JOIN `'._DB_PREFIX_.'connections` co ON (a.id_guest = co.id_guest AND TIME_TO_SEC(TIMEDIFF(\''.pSQL(date('Y-m-d H:i:00', time())).'\', co.`date_add`)) < 1800)'; } } La ligne qui change est tout simplement INNER JOIN '._DB_PREFIX_.'cart_product cp ON (cp.id_cart = a.id_cart) Vous pouvez tout aussi bien changer le fichier source dans controllers/admin/AdminCartsController.php, pour moi c'est ligne 50. Mais un override c'est toujours mieux. Pensez à vider le cache, et à supprimer le fichier class_index.php dans le dossier cache pour voir les modifications. Have fun.
  4. Presque un an après et ce problème est toujours d'actualité ! Un report a été fait sur le seul endroit où la team Prestashop répond : https://github.com/PrestaShop/PrestaShop/issues/16990 La réponse : "prestashop 1.6 n'est plus maintenu, faites appel à la communauté pour résoudre votre problème". Mais malgré tout, même si le problème était corrigé par la communauté, ils ne pousseraient pas les modifs en production, donc on doit faire au cas par cas. Encore une fois un petit passage sur la partie anglophone et un résultat satisfaisant : Installez ensuite depuis la page Modules le zip téléchargé depuis ce post, et c'est bon !
  5. Hello, I'm using your module PAGE CACHE ULTIMATE V5.1.12 on my website Prestashop 1.6.1.19 Just one thing not working, the cache for connected users. When using test mode, I have always the text "Connection" even if I'm connected, and when I go to "My account" it shows my informations and your module text panel is not showing. I have my own module blockuserinfo, but when I use the default module blockuserinfo, it's still not working. The value $is_logged in nav.tpl or $logged in blockuserinfo.tpl is always to false. For the moment I use your module with cache disabled for connected users, but I would like to use it fully. FYI I have dynamic hook check in front of the module blockuserinfo, but it's my own position, does it have an influence ? If you have any idea, it would be great !
  6. Merci @Sebastien MAS, j'ai dû faire la même sur tous mes serveurs OVH qui avaient Paypal d'installé, sauf que Paypal prévient lui @LittleSoap, Tout d'abord, si tu es chez OVH, vérifie le commentaire de Sebastien au dessus qui décrit très bien le problème. Si ta configuration est bien sur PHP >= 5.6 avec un serveur Stable, penche toi sur la génération d'un certificat SSL, et passe ton site en https. C'est aussi une des nouvelles règle avec le TLS 1.1 & 1.2
  7. Je n'ai rien pour les développeurs, mais voici pour les webmasters (un de mes client l'utilise) : https://fr.tuto.com/droit-numerique/le-rgpd-pour-les-webmasters-droit-numerique,101141.html Prestashop est à jour dans le sens où la version 1.7 est conforme comme tu dis. Ils ne nous obligent pas à utiliser la 1.6 qui n'est pas conforme, et d'ailleurs ils n'étaient pas obligés de créer un module, ils auraient tout simplement pu nous forcer la main à passer sur la 1.7 Ils ont plus à y gagner en conservant leurs clientèle Prestashop 1.6, et doivent savoir que leur version 1.7 ne plaît pas aux développeurs.
  8. Salut, C'est au début du post que se trouve cette information, sous le titre "General messages". Même si en effet je n'ai pas non plus compris "pour PS 1.6 et 1.7" sachant qu'ils préviennent bien de la portabilité de 1.5 à 1.7
  9. Bonjour, Sujet déjà évoqué sur Presta 1.5, et trop daté pour le remonter donc je créé mon topic. https://www.prestashop.com/forums/topic/247849-résolu-navigation-à-facettes-déclinaison-et-prix-annonce-multiversion/ Je suis sur Prestashop 1.6.1.13, boutique unique, avec des produits ayant des déclinaisons qui impactent le prix. Par exemple, un pot de peinture bleu 5L,15L coûtant respectivement 50€,140€ La déclinaison par défaut est celle de 5L, on affiche donc 50€ à l'internaute. Si je filtre avec le module Navigation à facette et que je trie par pots de 15L, je tombe sur mon produit avec un prix affiché de 50€, et non pas ma déclinaison de 15L à 140€, c'est donc faussé et mensongé. Est-ce le fonctionnement voulu du module ? Y a t-il un correctif connu à appliquer sur une version 1.6 ? Un module sinon ? Ce module natif (et gratuit) et déjà très puissant, ce qui le rend complexe à paramétrer et à modifier en code, j'aimerais donc si possible éviter de passer par un autre module. J'ai par contre quelques connaissances en override, mais sûrement pas suffisamment pour corriger ce genre de bug assez costaud j'imagine. Merci.
  10. Salut, Je laisse juste un "dot" pour être mis au jus. Sujet intéressant et incontournable bien sûr. Après quelques recherches on tombe sur pas mal d'attrape nigauds (https://rgpd-prestashop.com). Pour le moment je vais juste rester conforme à la CNIL avec les cookies et le consentement valide, mais je vais pas encore m'amuser à crypter les infos des clients sur Presta. Déjà je suis persuadé que je le ferais mal et que je ne serais toujours pas dans la conformité,et car je n'ai aucun client qui serait prêt à payer pour un service qui lui parait évident. En tout cas merci à ceux qui se sont renseigné vers les dev de Presta, si vous avez d'autres infos n'hésitez pas !
  11. Salut, Même soucis ici Prestashop 1.6.1.17 J'ai installé 2 Presta à la suite sans soucis. Le 3ème installé, je n'ai plus l'affichage HT/TTC et en effet le code du fichier shopping-cart.tpl est différent. Pour corriger le problème il m'a suffit de mettre le code d'un fichier de la même version mais d'un autre de mes site, c'est un peu n'importe quoi. Ce hook "displayCartTotalPriceLabel" est invisible sur la recherche Google, la seule mention visible serait un "advancedeucompliance" sauf que je n'ai pas installé de module, et même en désactivant les modules non-Prestashop dans les performances ça n'y change rien. Module qui serait apparemment "natif" et pourtant je n'ai aucune mention de ce module dans ma liste, rien à "compliance". Franchement sur ce coup je suis perdu, je sais que Presta fait un peu n'importe quoi depuis peu mais là...
  12. Salut, Même problème de mon côté Prestashop 1.6.1.17, PHP 7, MySQL 5.7.11. Après quelques recherche, j'ai plutôt l'impression que c'est le create temporary table qui fonctionne différemment sur phpmyadmin. Les tables sont détruites plus vite que sur un serveur, et donc l'affichage ne se fait pas. https://stackoverflow.com/questions/14426401/temporary-tables-not-working-in-phpmyadmin Pour le fichier, il est bien pointé par l'OP sur ce post. Product.php fonction getRandomSpecial. Pour contrer le problème (à ne faire qu'en local hein...), mettre en commentaire la ligne 2436 Db::getInstance()->execute('DROP TEMPORARY TABLE `'._DB_PREFIX_.'product_reductions`', false); De cette manière au moins tu peux afficher tes logs et gérer les load time...
  13. Hello, November 2017 here, and your answer is still relevant. This hack works perfectly for me, with this exact lines, thank you for sharing. Bless you.
  14. Je me répond à moi même. Encore. Décidément. La variable $groups se situe dans le Controller, et non pas dans la Class. De ce fait, une simple surchage m'a permis de gérer mes dates : <?php /* * 2007-2016 PrestaShop * * NOTICE OF LICENSE * * This source file is subject to the Open Software License (OSL 3.0) * that is bundled with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://opensource.org/licenses/osl-3.0.php * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to [email protected] so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade PrestaShop to newer * versions in the future. If you wish to customize PrestaShop for your * needs please refer to http://www.prestashop.com for more information. * * @author PrestaShop SA <[email protected]> * @copyright 2007-2016 PrestaShop SA * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * International Registered Trademark & Property of PrestaShop SA */ class ProductController extends ProductControllerCore{ /** * Assign template vars related to attribute groups and colors */ protected function assignAttributesGroups() { $colors = array(); $groups = array(); // @todo (RM) should only get groups and not all declination ? $attributes_groups = $this->product->getAttributesGroups($this->context->language->id); if (is_array($attributes_groups) && $attributes_groups) { $combination_images = $this->product->getCombinationImages($this->context->language->id); $combination_prices_set = array(); foreach ($attributes_groups as $k => $row) { // Color management if (isset($row['is_color_group']) && $row['is_color_group'] && (isset($row['attribute_color']) && $row['attribute_color']) || (file_exists(_PS_COL_IMG_DIR_.$row['id_attribute'].'.jpg'))) { $colors[$row['id_attribute']]['value'] = $row['attribute_color']; $colors[$row['id_attribute']]['name'] = $row['attribute_name']; if (!isset($colors[$row['id_attribute']]['attributes_quantity'])) { $colors[$row['id_attribute']]['attributes_quantity'] = 0; } $colors[$row['id_attribute']]['attributes_quantity'] += (int)$row['quantity']; } if (!isset($groups[$row['id_attribute_group']])) { $groups[$row['id_attribute_group']] = array( 'group_name' => $row['group_name'], 'name' => $row['public_group_name'], 'group_type' => $row['group_type'], 'default' => -1, ); } /* edit date */ $date = new DateTime(); if($date->format('Y-m-d') < $row['date']) $groups[$row['id_attribute_group']]['attributes'][$row['id_attribute']] = $row['attribute_name']; $groups[$row['id_attribute_group']]['date'][$row['id_attribute']] = $row['date']; /* fin edit date */ if ($row['default_on'] && $groups[$row['id_attribute_group']]['default'] == -1) { $groups[$row['id_attribute_group']]['default'] = (int)$row['id_attribute']; } if (!isset($groups[$row['id_attribute_group']]['attributes_quantity'][$row['id_attribute']])) { $groups[$row['id_attribute_group']]['attributes_quantity'][$row['id_attribute']] = 0; } $groups[$row['id_attribute_group']]['attributes_quantity'][$row['id_attribute']] += (int)$row['quantity']; $combinations[$row['id_product_attribute']]['attributes_values'][$row['id_attribute_group']] = $row['attribute_name']; $combinations[$row['id_product_attribute']]['attributes'][] = (int)$row['id_attribute']; $combinations[$row['id_product_attribute']]['price'] = (float)Tools::convertPriceFull($row['price'], null, Context::getContext()->currency, false); // Call getPriceStatic in order to set $combination_specific_price if (!isset($combination_prices_set[(int)$row['id_product_attribute']])) { Product::getPriceStatic((int)$this->product->id, false, $row['id_product_attribute'], 6, null, false, true, 1, false, null, null, null, $combination_specific_price); $combination_prices_set[(int)$row['id_product_attribute']] = true; $combinations[$row['id_product_attribute']]['specific_price'] = $combination_specific_price; } $combinations[$row['id_product_attribute']]['ecotax'] = (float)$row['ecotax']; $combinations[$row['id_product_attribute']]['weight'] = (float)$row['weight']; $combinations[$row['id_product_attribute']]['quantity'] = (int)$row['quantity']; $combinations[$row['id_product_attribute']]['reference'] = $row['reference']; $combinations[$row['id_product_attribute']]['unit_impact'] = Tools::convertPriceFull($row['unit_price_impact'], null, Context::getContext()->currency, false); $combinations[$row['id_product_attribute']]['minimal_quantity'] = $row['minimal_quantity']; if ($row['available_date'] != '0000-00-00' && Validate::isDate($row['available_date'])) { $combinations[$row['id_product_attribute']]['available_date'] = $row['available_date']; $combinations[$row['id_product_attribute']]['date_formatted'] = Tools::displayDate($row['available_date']); } else { $combinations[$row['id_product_attribute']]['available_date'] = $combinations[$row['id_product_attribute']]['date_formatted'] = ''; } if (!isset($combination_images[$row['id_product_attribute']][0]['id_image'])) { $combinations[$row['id_product_attribute']]['id_image'] = -1; } else { $combinations[$row['id_product_attribute']]['id_image'] = $id_image = (int)$combination_images[$row['id_product_attribute']][0]['id_image']; if ($row['default_on']) { if (isset($this->context->smarty->tpl_vars['cover']->value)) { $current_cover = $this->context->smarty->tpl_vars['cover']->value; } if (is_array($combination_images[$row['id_product_attribute']])) { foreach ($combination_images[$row['id_product_attribute']] as $tmp) { if ($tmp['id_image'] == $current_cover['id_image']) { $combinations[$row['id_product_attribute']]['id_image'] = $id_image = (int)$tmp['id_image']; break; } } } if ($id_image > 0) { if (isset($this->context->smarty->tpl_vars['images']->value)) { $product_images = $this->context->smarty->tpl_vars['images']->value; } if (isset($product_images) && is_array($product_images) && isset($product_images[$id_image])) { $product_images[$id_image]['cover'] = 1; $this->context->smarty->assign('mainImage', $product_images[$id_image]); if (count($product_images)) { $this->context->smarty->assign('images', $product_images); } } if (isset($this->context->smarty->tpl_vars['cover']->value)) { $cover = $this->context->smarty->tpl_vars['cover']->value; } if (isset($cover) && is_array($cover) && isset($product_images) && is_array($product_images)) { $product_images[$cover['id_image']]['cover'] = 0; if (isset($product_images[$id_image])) { $cover = $product_images[$id_image]; } $cover['id_image'] = (Configuration::get('PS_LEGACY_IMAGES') ? ($this->product->id.'-'.$id_image) : (int)$id_image); $cover['id_image_only'] = (int)$id_image; $this->context->smarty->assign('cover', $cover); } } } } } // wash attributes list (if some attributes are unavailables and if allowed to wash it) if (!Product::isAvailableWhenOutOfStock($this->product->out_of_stock) && Configuration::get('PS_DISP_UNAVAILABLE_ATTR') == 0) { foreach ($groups as &$group) { foreach ($group['attributes_quantity'] as $key => &$quantity) { if ($quantity <= 0) { unset($group['attributes'][$key]); } } } foreach ($colors as $key => $color) { if ($color['attributes_quantity'] <= 0) { unset($colors[$key]); } } } foreach ($combinations as $id_product_attribute => $comb) { $attribute_list = ''; foreach ($comb['attributes'] as $id_attribute) { $attribute_list .= '\''.(int)$id_attribute.'\','; } $attribute_list = rtrim($attribute_list, ','); $combinations[$id_product_attribute]['list'] = $attribute_list; } $this->context->smarty->assign(array( 'groups' => $groups, 'colors' => (count($colors)) ? $colors : false, 'combinations' => $combinations, 'combinationImages' => $combination_images )); } } }
  15. Bonjour, Question très simple pour les développeurs aguerris Prestashop (que je ne suis pas) : comment modifier le contenu de la variable $groups dans product.tpl ! Je n'arrive pas à trouver dans Product.php une requête ou une variable similaire. Le contexte : j'ai modifié la classe Attributes & la BDD (et bien d'autres choses) pour ajouter une constante "date" dans la table "ps_attributes" ex : 2017-10-18. Le soucis c'est que la variable $groups me sort le contenu de la table "ps_attribute_lang" ex : Mercredi 18 Octobre 2017 à 10h. Hors, j'ai besoin d'avoir la date pour effectuer des requêtes dessus (cacher les dates antérieures dans le cas présent). <div class="product_attributes clearfix"> <pre>{$groups|var_dump}</pre> {if isset($groups)} <!-- attributes --> <div id="attributes"> [...] Par exemple le var_dump me sort ceci : array(1) { [1]=> array(6) { ["group_name"]=> string(4) "Date" ["name"]=> string(4) "Date" ["group_type"]=> string(4) "date" ["default"]=> int(44) ["attributes"]=> array(6) { [44]=> string(28) "Jeudi 19 octobre 2017 à 10h" [70]=> string(29) "Jeudi 02 novembre 2017 à 10h" [88]=> string(29) "Lundi 13 novembre 2017 à 15h" [130]=> string(33) "Vendredi 08 décembre 2017 à 15h" [163]=> string(30) "Jeudi 28 décembre 2017 à 15h" [194]=> string(21) "Lundi 09 Octobre 2017" } ["attributes_quantity"]=> array(6) { [44]=> int(4) [70]=> int(4) [88]=> int(4) [130]=> int(4) [163]=> int(4) [194]=> int(0) } } } Hors, je voudrais comme je l'ai souligné plus haut, le contenu "date" de ma table "ps_attributes". Help !
  16. Comme je m'en doutais, j'étais juste mauvais en SQL. Un simple ajout de MIN(a.date) a suffit ! $this->products = Db::getInstance()->executeS(' SELECT p.*, '.($alias_where == 'p' ? '' : 'product_shop.*,' ).' '.$alias_where.'.id_category_default, pl.*, image_shop.`id_image` id_image, il.legend, MIN(a.date) as date, m.name manufacturer_name, '.(Combination::isFeatureActive() ? 'product_attribute_shop.id_product_attribute id_product_attribute,' : '').' DATEDIFF('.$alias_where.'.`date_add`, DATE_SUB("'.date('Y-m-d').' 00:00:00", INTERVAL '.(int)$nb_day_new_product.' DAY)) > 0 AS new, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity'.(Combination::isFeatureActive() ? ', product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity' : '').' FROM '._DB_PREFIX_.'cat_filter_restriction cp LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product` '.Shop::addSqlAssociation('product', 'p'). (Combination::isFeatureActive() ? ' LEFT JOIN `'._DB_PREFIX_.'product_attribute_shop` product_attribute_shop ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop='.(int)$context->shop->id.')':'').' LEFT JOIN '._DB_PREFIX_.'product_attribute pa ON (pa.id_product = p.id_product) LEFT JOIN '._DB_PREFIX_.'product_attribute_combination pac ON (pac.id_product_attribute = pa.id_product_attribute) LEFT JOIN '._DB_PREFIX_.'attribute a ON (pac.id_attribute = a.id_attribute) LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = p.id_product'.Shop::addSqlRestrictionOnLang('pl').' AND pl.id_lang = '.(int)$cookie->id_lang.') LEFT JOIN `'._DB_PREFIX_.'image_shop` image_shop ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop='.(int)$context->shop->id.') LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$cookie->id_lang.') LEFT JOIN '._DB_PREFIX_.'manufacturer m ON (m.id_manufacturer = p.id_manufacturer) '.Product::sqlStock('p', 0).' WHERE '.$alias_where.'.`active` = 1 AND '.$alias_where.'.`visibility` IN ("both", "catalog") AND date >= "'.$date_chosen.'" GROUP BY p.id_product ORDER BY date, '.Tools::getProductsOrder('by', Tools::getValue('orderby'), true).' '.Tools::getProductsOrder('way', Tools::getValue('orderway')).' , cp.id_product'. ' LIMIT '.(((int)$this->page - 1) * $n.','.$n), true, false); Comment passer des h² sur un problème Have fun !
  17. Bonjour, J'ai manuellement créé un système de datepicker comme attribut pour le module blocklayered. Ainsi l'internaute peut choisir une date, et trier ses produits par date. Maintenant j'aimerais récupérer les attributs du produits (ici la date) pour l'afficher dans la liste des produits, et que cet affichage se mette à jour lorsqu'on clique sur le calendrier que j'ai mis en place. Hors j'ai un affichage différent sur mon site en production et mon site en développement (strictement même base de donnée). Voici le code qui m'importe, et je ne dois pas être assez calé en SQL je pense. override/modules/blocklayered/blocklayered.php function getProductByFilters $date_chosen = new DateTime(); $date_chosen = $date_chosen->format("Y-m-d"); switch ($key) { case 'id_attribute_date' : foreach ($filter_values as $filter_value){ $query_filters_where .= ' AND p.id_product IN (SELECT pa.`id_product` FROM `'._DB_PREFIX_.'product_attribute_combination` pac LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (pa.`id_product_attribute` = pac.`id_product_attribute`)'. Shop::addSqlAssociation('product_attribute', 'pa').' LEFT JOIN `'._DB_PREFIX_.'attribute` a ON (a.`id_attribute` = pac.`id_attribute`)'. Shop::addSqlAssociation('attribute', 'a').' WHERE a.date >= "'.$filter_value.'") '; $date_chosen = $filter_value; } break; } $this->products = Db::getInstance()->executeS(' SELECT p.*, '.($alias_where == 'p' ? '' : 'product_shop.*,' ).' '.$alias_where.'.id_category_default, pl.*, image_shop.`id_image` id_image, il.legend, a.date, m.name manufacturer_name, '.(Combination::isFeatureActive() ? 'product_attribute_shop.id_product_attribute id_product_attribute,' : '').' DATEDIFF('.$alias_where.'.`date_add`, DATE_SUB("'.date('Y-m-d').' 00:00:00", INTERVAL '.(int)$nb_day_new_product.' DAY)) > 0 AS new, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity'.(Combination::isFeatureActive() ? ', product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity' : '').' FROM '._DB_PREFIX_.'cat_filter_restriction cp LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product` '.Shop::addSqlAssociation('product', 'p'). (Combination::isFeatureActive() ? ' LEFT JOIN `'._DB_PREFIX_.'product_attribute_shop` product_attribute_shop ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop='.(int)$context->shop->id.')':'').' LEFT JOIN '._DB_PREFIX_.'product_attribute pa ON (pa.id_product = p.id_product) LEFT JOIN '._DB_PREFIX_.'product_attribute_combination pac ON (pac.id_product_attribute = pa.id_product_attribute) LEFT JOIN '._DB_PREFIX_.'attribute a ON (pac.id_attribute = a.id_attribute) LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = p.id_product'.Shop::addSqlRestrictionOnLang('pl').' AND pl.id_lang = '.(int)$cookie->id_lang.') LEFT JOIN `'._DB_PREFIX_.'image_shop` image_shop ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop='.(int)$context->shop->id.') LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$cookie->id_lang.') LEFT JOIN '._DB_PREFIX_.'manufacturer m ON (m.id_manufacturer = p.id_manufacturer) '.Product::sqlStock('p', 0).' WHERE '.$alias_where.'.`active` = 1 AND '.$alias_where.'.`visibility` IN ("both", "catalog") AND a.date >= "'.$date_chosen.'" GROUP BY p.id_product ORDER BY a.date, '.Tools::getProductsOrder('by', Tools::getValue('orderby'), true).' '.Tools::getProductsOrder('way', Tools::getValue('orderway')).' , cp.id_product'. ' LIMIT '.(((int)$this->page - 1) * $n.','.$n), true, false); Voici à quoi ressemblait le code avant que je n'intervienne : $this->products = Db::getInstance()->executeS(' SELECT p.*, '.($alias_where == 'p' ? '' : 'product_shop.*,' ).' '.$alias_where.'.id_category_default, pl.*, image_shop.`id_image` id_image, il.legend, m.name manufacturer_name, '.(Combination::isFeatureActive() ? 'product_attribute_shop.id_product_attribute id_product_attribute,' : '').' DATEDIFF('.$alias_where.'.`date_add`, DATE_SUB("'.date('Y-m-d').' 00:00:00", INTERVAL '.(int)$nb_day_new_product.' DAY)) > 0 AS new, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity'.(Combination::isFeatureActive() ? ', product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity' : '').' FROM '._DB_PREFIX_.'cat_filter_restriction cp LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product` '.Shop::addSqlAssociation('product', 'p'). (Combination::isFeatureActive() ? ' LEFT JOIN `'._DB_PREFIX_.'product_attribute_shop` product_attribute_shop ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop='.(int)$context->shop->id.')':'').' LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = p.id_product'.Shop::addSqlRestrictionOnLang('pl').' AND pl.id_lang = '.(int)$cookie->id_lang.') LEFT JOIN `'._DB_PREFIX_.'image_shop` image_shop ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop='.(int)$context->shop->id.') LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$cookie->id_lang.') LEFT JOIN '._DB_PREFIX_.'manufacturer m ON (m.id_manufacturer = p.id_manufacturer) '.Product::sqlStock('p', 0).' WHERE '.$alias_where.'.`active` = 1 AND '.$alias_where.'.`visibility` IN ("both", "catalog") ORDER BY '.Tools::getProductsOrder('by', Tools::getValue('orderby'), true).' '.Tools::getProductsOrder('way', Tools::getValue('orderway')).' , cp.id_product'. ' LIMIT '.(((int)$this->page - 1) * $n.','.$n), true, false); Je ne sais pas si je suis assez clair, mais en gros au résultat je perd certaines dates, par exemple un produit est proposé à la date du 21 Octobre et du 2 Novembre, et avec ce code il ne me propose que le 2 Novembre (sur le product-list.tpl). J'affiche ensuite simplement sur mon product-list. <p>{$product.date|date_format:"%A %e %B %Y"}</p>
  18. Fantastique ! Merci encore, je suis toujours surpris par le niveau des dév Presta, j'aurais pu y passer des semaines. Je marque en résolu, merci beaucoup.
  19. J'ai envoyé un MP avec un lien ainsi qu'un identifiant de connexion sur le frontoffice en tant que client "Pro" et donc avec les réductions. Merci pour ton aide !
  20. Merci pour ta réponse et pour ton lien ! J'ai appliqué les changements, maintenant au lieu d'avoir 9.42€/L j'ai -253.16€/L sur mon produit 15L (déclinaison qui subit un -0.57€/L) J'ai l'impression que le -0.57 n'est pas calculé, mais qu'il prend une sorte de "différence" entre le prix final et le prix au litre par défaut, la variable productUnitPriceRatio. Du coup ce ratio est toujours à 5 chez moi peut importe le prix final et le prix au litre du produit, cette variable ne change jamais, et donc le résultat final ne change pas. Je pense que c'est cette variable qui est mauvaise, sauf qu'elle n'est pas instanciée dans le JS, elle doit être dans le controlleur.
  21. Bonjour, Version Prestashop : 1.6.1.13 Thème enfant du thème default J'ai un problème sur mes déclinaisons produit, qui est sûrement un bug de presta. J'ai 2 groupes de clients, "clients" et "pros". Les pros ont des avantages personnalisés par produit (prix modifié dans le produit, onglet "prix spécifique") et un affichage HT. Hors les prix spécifiques fonctionnent bien sur un client, c'est à dire j'ai mon prix au litre qui change selon la déclinaison. Mais dès que je passe en pro, le prix de la déclinaison s'aligne sur celui des particulier, ça ne prend pas en compte ma réduction. Exemple de produit : Pot de peinture Prix HT : 42.08€ Prix TTC : 50.50€ Prix unitaire : 8.419999€ /L Déclinaison : 5L Impact prix : 0 Impact poids : +5kg Impact sur le prix unitaire : 0 Pro : -32.04% 15L Impact prix : +75.67€ HT Impact poids : +15kg Impact sur le prix unitaire : -0.57€ /L Pro : -33.25% Résultat : Hors je devrais avoir 5.24€ /L. Le problème se situe sûrement dans le fichier theme/mon_theme/js/product.js vers ligne 780 var unit_impact = +combination.unit_impact; if (productUnitPriceRatio > 0 || unit_impact) { if (unit_impact) { console.log('unit_impact:'+unit_impact); baseUnitPrice = productBasePriceTaxExcl / productUnitPriceRatio; console.log('productBasePriceTaxExcl:'+productBasePriceTaxExcl); console.log('productUnitPriceRatio:'+productUnitPriceRatio); console.log('baseUnitPrice (productBasePriceTaxExcl/productUnitPriceRatio):'+baseUnitPrice); unit_price = baseUnitPrice + unit_impact; console.log('unit_price(impact):'+unit_price); if (!noTaxForThisProduct || !customerGroupWithoutTax){ unit_price = unit_price * (taxRate/100 + 1); console.log('unit_price(impact+tax):'+unit_price); } } else{ unit_price = priceWithDiscountsDisplay / productUnitPriceRatio; console.log('unit_price(no_impact):'+unit_price); } } Malgré mes console.log je ne vois vraiment pas. Le soucis vient sûrement du fait que j'utilise les prix particulier, et le prix au L ne change dont pas ? Pourtant le résultat est plutôt incohérent, un prix au L plus élevé mais un prix final plus faible.. Merci de votre aide !
  22. Salut, Merci de ta réponse. Merveilleux haha, je modifiais donc en effet le mauvais fichier ! Le chemin que tu me montre m'envoie en effet sur le bon override (il existait déjà sur le thème par défaut...). Je ne ferme pas le sujet car j'aurais sûrement encore des questions sur comment faire mes développement, c'est assez corsé ^^ Concrètement pour la suite, je vais devoir rediriger l'Ajax sur une action d'un controller, pour faire la recherche sur la case "date" de ma base de donnée, et demander les produits dont la date est >= à celle entrée par l'internaute. Enfin bref, je me lance déjà dans mes développements et je reviens dès que j'ai besoin, merci !
  23. Hello, For a development, I need to be able to sort my products by date. I created a "Date" attribute, as well as a new type of overload attribute, which is "calendar date". Thus, if you add a value to the date attribute, a datepicker field appears and saves a date to the database. So far everything worked, I had to overload the Attribute class, the AdminAttributesGroupsController controller and the template form in that same controller (I could share the code if you need to realize the same development one day). Now I wish I could sort it out. I overload the module blocklayered. In front of "Attribute group: Date", I authorize the "Datepicker" filter style. /theme/my_theme/modules/blocklayered/views/templates/admin/add_1.6.tpl <div class="col-lg-6"> <select name="layered_selection_ag_{(int)$attribute_group['id_attribute_group']}_filter_type"> <option value="0">{l s='Checkbox' mod='blocklayered'}</option> <option value="1">{l s='Radio button' mod='blocklayered'}</option> <option value="2">{l s='Drop-down list' mod='blocklayered'}</option> {if $attribute_group['name'] == 'Date'} <option value="3">{l s='Datepicker' mod='blocklayered'}</option> {/if} </select> </div> /override/modules/blocklayered/blocklayered.php if (!defined('_PS_VERSION_')) exit; class BlockLayeredOverride extends BlockLayered { public function hookHeader($params) { $this->context->controller->addJQueryUI('ui.datepicker'); return parent::hookHeader($params); } } /theme/my_theme/modules/blocklayered/blocklayered.tpl {elseif $filter.filter_type == 3} <input type="text" class="form-control datepicker" name="layered_{$filter.type_lite}_{$id_value}" id="layered_{$filter.type_lite}{if $id_value || $filter.type == 'quantity'}_{$id_value}{/if}"/> <script> $('.datepicker').datepicker(); </script> {else} So much for the preliminaries. I now have an input field that opens a click calendar. Problem: I do not know what to override to have a function of type: according to the date chosen, in Ajax, load me all my products whose date is> = the date selected. For info my date in BDD is in the format DATE (0000-00-00) Time is a characteristic and does not count in my search. I have already tried to override the JS blocklayered_admin.js, blocklayered.js and blocklayered-footer.js, but it does not change anything. Someone would have any idea ? I did not find anything about the Ajax overload of this module, just a track could be of help to me. Thank you !
  24. Bonjour, Dans le cadre d'un développement, je dois pouvoir trier mes produits par date. J'ai créé un attribut "Date", ainsi qu'un nouveau type d'attribut par surcharge, qui est "date calendaire". Ainsi, si on ajoute une valeur à l'attribut date, un champs datepicker apparaît et enregistre une date en base de donnée. Jusqu'ici tout fonctionne, j'ai dû surcharger la classe Attribute, le controlleur AdminAttributesGroupsController et le template form dans ce même controlleur (je pourrais partager le code si vous avez besoin de réaliser le même développement un jour). Maintenant je souhaite pouvoir le trier. Je surcharge donc le module bloc navigation à facette. En face de "Attribute group: Date", j'autorise le style de filtre "Datepicker". /theme/mon_theme/modules/blocklayered/views/templates/admin/add_1.6.tpl Ajoute l'option Date avec un datepicker pour les attributs en backoffice <div class="col-lg-6"> <select name="layered_selection_ag_{(int)$attribute_group['id_attribute_group']}_filter_type"> <option value="0">{l s='Checkbox' mod='blocklayered'}</option> <option value="1">{l s='Radio button' mod='blocklayered'}</option> <option value="2">{l s='Drop-down list' mod='blocklayered'}</option> {if $attribute_group['name'] == 'Date'} <option value="3">{l s='Datepicker' mod='blocklayered'}</option> {/if} </select> </div> /override/modules/blocklayered/blocklayered.php Ajoute le script datepicker à ma vue. if (!defined('_PS_VERSION_')) exit; class BlockLayeredOverride extends BlockLayered { public function hookHeader($params) { $this->context->controller->addJQueryUI('ui.datepicker'); return parent::hookHeader($params); } } /theme/mon_theme/modules/blocklayered/blocklayered.tpl Ajoute le datepicker à la vue {elseif $filter.filter_type == 3} <input type="text" class="form-control datepicker" name="layered_{$filter.type_lite}_{$id_value}" id="layered_{$filter.type_lite}{if $id_value || $filter.type == 'quantity'}_{$id_value}{/if}"/> <script> $('.datepicker').datepicker(); </script> {else} Voilà pour les préliminaires. J'ai maintenant un champs input qui ouvre un calendrier au clic. Problème : je ne sais pas quoi surcharger pour avoir une fonction du type : selon la date choisie, en Ajax, me charger tous mes produits dont la date est >= à la date sélectionnée. Pour info ma date en BDD est au format DATE (0000-00-00) L'heure est une caractéristique et n'entre pas en compte dans ma recherche. j'ai déjà essayé de surcharger le JS blocklayered_admin.js, blocklayered.js et blocklayered-footer.js, mais ça ne modifie rien. Quelqu'un aurait une idée ? Je n'ai rien trouvé sur la surcharge Ajax de ce module, rien qu'une piste pourrait m'être d'une aide précieuse. Merci !
×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More