Laurine_srd Posted April 19, 2017 Share Posted April 19, 2017 (edited) Bonjour, Nous possédons une boutique en ligne de vente de modélisme. Nous souhaitons réduire la visibilité d'anciennes commandes, au niveau back office dans un premier temps. Côté back office, cela ralenti quelque peu le chargement de la page d'un client, lorsque toutes ses commandes sont chargées et affichées, et n'a pas de réel intérêt pour nous. Nous souhaitons afficher uniquement les dernières commandes les plus récentes. J'ai fait quelques recherches, sans succès jusqu'à présent, même si je me doute qu'il faudra très certainement utiliser une requête SQL. Mais si quelqu'un a des pistes, je suis preneuse. Merci. Edited April 19, 2017 by Laurine_srd (see edit history) Link to comment Share on other sites More sharing options...
Alexandre Carette Posted April 19, 2017 Share Posted April 19, 2017 bonjour, tu sauvegarde ta bdd et tu effaces les lignes souhaitées dans ps_orders cdt Link to comment Share on other sites More sharing options...
Laurine_srd Posted April 19, 2017 Author Share Posted April 19, 2017 Bonjour, merci de ta réponse! Il faut forcément effacer les lignes? N'y a-t-il pas un moyen de les garder et juste de ne pas les afficher/charger sur la page? N'es-ce pas un peu risqué, malgré la sauvegarde, d'effacer des données comme ceci? Merci Link to comment Share on other sites More sharing options...
Alexandre Carette Posted April 19, 2017 Share Posted April 19, 2017 1) Dans ps_orders on ajoute une colonne nommée "active" de type INT avec pour valeur par defaut 1 2) on crée un override de AdminOrdersController.php 3) on modifie la function construct public function __construct() { $this->bootstrap = true; $this->table = 'order'; $this->className = 'Order'; $this->lang = false; $this->addRowAction('view'); $this->explicitSelect = true; $this->allow_export = true; $this->deleted = false; $this->context = Context::getContext(); $this->_select = ' a.id_currency, a.id_order AS id_pdf, CONCAT(LEFT(c.`firstname`, 1), \'. \', c.`lastname`) AS `customer`, osl.`name` AS `osname`, os.`color`, a.`active`, IF((SELECT so.id_order FROM `'._DB_PREFIX_.'orders` so WHERE so.id_customer = a.id_customer AND so.id_order < a.id_order LIMIT 1) > 0, 0, 1) as new, country_lang.name as cname, IF(a.valid, 1, 0) badge_success'; $this->_join = ' LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = a.`id_customer`) LEFT JOIN `'._DB_PREFIX_.'address` address ON address.id_address = a.id_address_delivery LEFT JOIN `'._DB_PREFIX_.'country` country ON address.id_country = country.id_country LEFT JOIN `'._DB_PREFIX_.'country_lang` country_lang ON (country.`id_country` = country_lang.`id_country` AND country_lang.`id_lang` = '.(int)$this->context->language->id.') LEFT JOIN `'._DB_PREFIX_.'order_state` os ON (os.`id_order_state` = a.`current_state`) LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = '.(int)$this->context->language->id.')'; $this->_where = 'AND a.`active` = 1'; $this->_orderBy = 'id_order'; $this->_orderWay = 'DESC'; $this->_use_found_rows = true; $statuses = OrderState::getOrderStates((int)$this->context->language->id); foreach ($statuses as $status) { $this->statuses_array[$status['id_order_state']] = $status['name']; } $this->fields_list = array( 'id_order' => array( 'title' => $this->l('ID'), 'align' => 'text-center', 'class' => 'fixed-width-xs' ), 'active' => array( 'title' => $this->l('Active') ), 'reference' => array( 'title' => $this->l('Reference') ), 'new' => array( 'title' => $this->l('New client'), 'align' => 'text-center', 'type' => 'bool', 'tmpTableFilter' => true, 'orderby' => false, 'callback' => 'printNewCustomer' ), 'customer' => array( 'title' => $this->l('Customer'), 'havingFilter' => true, ), ); if (Configuration::get('PS_B2B_ENABLE')) { $this->fields_list = array_merge($this->fields_list, array( 'company' => array( 'title' => $this->l('Company'), 'filter_key' => 'c!company' ), )); } $this->fields_list = array_merge($this->fields_list, array( 'total_paid_tax_incl' => array( 'title' => $this->l('Total'), 'align' => 'text-right', 'type' => 'price', 'currency' => true, 'callback' => 'setOrderCurrency', 'badge_success' => true ), 'payment' => array( 'title' => $this->l('Payment') ), 'osname' => array( 'title' => $this->l('Status'), 'type' => 'select', 'color' => 'color', 'list' => $this->statuses_array, 'filter_key' => 'os!id_order_state', 'filter_type' => 'int', 'order_key' => 'osname' ), 'date_add' => array( 'title' => $this->l('Date'), 'align' => 'text-right', 'type' => 'datetime', 'filter_key' => 'a!date_add' ), 'id_pdf' => array( 'title' => $this->l('PDF'), 'align' => 'text-center', 'callback' => 'printPDFIcons', 'orderby' => false, 'search' => false, 'remove_onclick' => true ) )); if (Country::isCurrentlyUsed('country', true)) { $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT DISTINCT c.id_country, cl.`name` FROM `'._DB_PREFIX_.'orders` o '.Shop::addSqlAssociation('orders', 'o').' INNER JOIN `'._DB_PREFIX_.'address` a ON a.id_address = o.id_address_delivery INNER JOIN `'._DB_PREFIX_.'country` c ON a.id_country = c.id_country INNER JOIN `'._DB_PREFIX_.'country_lang` cl ON (c.`id_country` = cl.`id_country` AND cl.`id_lang` = '.(int)$this->context->language->id.') ORDER BY cl.name ASC'); $country_array = array(); foreach ($result as $row) { $country_array[$row['id_country']] = $row['name']; } $part1 = array_slice($this->fields_list, 0, 3); $part2 = array_slice($this->fields_list, 3); $part1['cname'] = array( 'title' => $this->l('Delivery'), 'type' => 'select', 'list' => $country_array, 'filter_key' => 'country!id_country', 'filter_type' => 'int', 'order_key' => 'cname' ); $this->fields_list = array_merge($part1, $part2); } $this->shopLinkType = 'shop'; $this->shopShareDatas = Shop::SHARE_ORDER; if (Tools::isSubmit('id_order')) { // Save context (in order to apply cart rule) $order = new Order((int)Tools::getValue('id_order')); $this->context->cart = new Cart($order->id_cart); $this->context->customer = new Customer($order->id_customer); } $this->bulk_actions = array( 'updateOrderStatus' => array('text' => $this->l('Change Order Status'), 'icon' => 'icon-refresh') ); parent::__construct(); } Link to comment Share on other sites More sharing options...
Alexandre Carette Posted April 19, 2017 Share Posted April 19, 2017 (edited) de la on peut mettre active a 0 dans les commandes qu'on ne veux pas afficher seules les commandes actives égales a 1 seront prisent dans la requete avec le $this->_where = 'AND a.`active` = 1'; PS 1.6.11 cdt Edited April 19, 2017 by Alexandre Carette (see edit history) Link to comment Share on other sites More sharing options...
PatJ Posted April 25, 2017 Share Posted April 25, 2017 Bonsoir Alexandre Je bosse avec Laurine sur ce sujet. Et merci pour ton aide J'ai mis en place la modification, mais elle intervient au niveau de la liste de commandes du backoffice. Notre souhait est de limiter la liste des commandes (et la liste des produits achetés) dans la page "client" du backoffice (la page d'informations liées au client) Je pense que la modification que tu as suggéré pourrait aussi être utilisée pour cela, mais je ne sais pas trop où faire cette modification. Est-ce dans le fichier AdminCustomersController.php ? Merci Patrice Link to comment Share on other sites More sharing options...
Eolia Posted April 25, 2017 Share Posted April 25, 2017 et LIMIT en sql, vous ne connaissez pas ? Parce que là ca sent l'usine à gaz votre truc^^ Link to comment Share on other sites More sharing options...
PatJ Posted April 26, 2017 Share Posted April 26, 2017 Salut Merci pour vos réponses. okom3pom >> On a des clients avec effectivement plusieurs centaines de commandes réparties sur plusieurs années, Chaque commande ayant souvent plusieurs articles. Je ne vois guère l’intérêt de charger une page qui me rappelle ce que la personne a commandé il y a 7 ans... D'où mon souhait d'alléger cette page comme la charge serveur pour ne plus avoir ces infos (les 2 dernières années me suffisent amplement). Eolia >> Donc non, je ne connais pas LIMIT, mes compétences en SQL sont assez limitées (justement... ) Je vais chercher de ce côté, (mais je suis preneur si vous avez quelques suggestions quand à son emploi dans le cas qui nous occupe ?) Merci de vos réponses Link to comment Share on other sites More sharing options...
Eolia Posted April 26, 2017 Share Posted April 26, 2017 (edited) LIMIT permet de limiter le nombre de résultats récupérés en bdd Par exemple pour la fonction public function getBoughtProducts() { return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT * FROM `'._DB_PREFIX_.'orders` o LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.id_order = od.id_order WHERE o.valid = 1 AND o.`id_customer` = '.(int)$this->id); } Vous pouvez la remplacer par public function getBoughtProducts() { return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT * FROM `'._DB_PREFIX_.'orders` o LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.id_order = od.id_order WHERE o.valid = 1 AND o.`id_customer` = '.(int)$this->id.' ORDER BY o.date_add DESC LIMIT 50'); } Qui vous renverra les 50 derniers produits achetés par ce client L'idéal étant de faire un override de ces 2 fonctions, de remplacer 50 par un paramètre configurable dans Préférences -> Clients^^ Edited October 10, 2019 by Eolia (see edit history) Link to comment Share on other sites More sharing options...
PatJ Posted April 26, 2017 Share Posted April 26, 2017 Salut Eolia, Merci pour ces informations. Je vais regarder cela le plus vite possible. Faire un override, je crois que j'ai déjà fait ça (et avec cette réponse vous voyez mon niveau... ) Mais par contre, le paramètre configurable alors là... Bon j'avance sur ça et je vous dis comment je m'en suis sorti ... ou pas Merci ! Link to comment Share on other sites More sharing options...
Laurine_srd Posted May 3, 2017 Author Share Posted May 3, 2017 Bonjour, On planche toujours sur le sujet. J'ai juste un petit soucis: quand je suis sur la page d'un client, dans le back office, il y a plusieurs blocs : par exemple, les commandes, les paniers, les produits achetés etc. J'ai trouvé le fichier AdminCustomerController.php pour modifier et faire l'override de la requête des produits achetés, en revanche, pas moyen de mettre la main sur celui des paniers... Comment se nomme-t-il? Quant à la solution d'Eolia, le LIMIT fonctionne bien, Il affiche bien que les derniers produits, en revanche il ne réduit pas le temps d'affichage. Merci Link to comment Share on other sites More sharing options...
Eolia Posted May 3, 2017 Share Posted May 3, 2017 okom vous a donné les 2 fonctions plus haut^^ 1 Link to comment Share on other sites More sharing options...
Eolia Posted June 15, 2018 Share Posted June 15, 2018 En poussant un peu le truc on arrive à quelque chose de pas mal^^ Avec rechargement en ajax uniquement si nécessaire Link to comment Share on other sites More sharing options...
ChristopheB89 Posted October 10, 2019 Share Posted October 10, 2019 On 4/26/2017 at 11:53 AM, Eolia said: LIMIT permet de limiter le nombre de résultats récupérés en bdd Par exemple pour la fonction public function getBoughtProducts() { return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT * FROM `'._DB_PREFIX_.'orders` o LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.id_order = od.id_order WHERE o.valid = 1 AND o.`id_customer` = '.(int)$this->id); } Vous pouvez la remplacer par public function getBoughtProducts() { return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT * FROM `'._DB_PREFIX_.'orders` o LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.id_order = od.id_order WHERE o.valid = 1 AND o.`id_customer` = '.(int)$this->id.' ORDER BY o.date_add DESC LIMIT 50); } Qui vous renverra les 50 derniers produits achetés par ce client L'idéal étant de faire un override de ces 2 fonctions, de remplacer 50 par un paramètre configurable dans Préférences -> Clients^^ Bonjour, Je reviens sur ce sujet, ma question est peut-être idiote, mais ces modifications doivent bien être faites dans customer.php ? Chaque fois que j'apporte cette modification, directement dans le customer.php ou en override, j'obtiens directement une erreur 500 en front et en back. Merci pour votre aide. Link to comment Share on other sites More sharing options...
Eolia Posted October 10, 2019 Share Posted October 10, 2019 vous devez avoir une erreur de syntaxe. Affichez les erreurs et donnez-nous l'erreur 1 Link to comment Share on other sites More sharing options...
ChristopheB89 Posted October 10, 2019 Share Posted October 10, 2019 Voici l'erreur annoncée : Parse error: syntax error, unexpected 'BY' (T_STRING) in "..."/classes/Customer.php on line 702 Et une capture du code renseigné. Link to comment Share on other sites More sharing options...
Eolia Posted October 10, 2019 Share Posted October 10, 2019 Vous avez remplacé le bloc comme je l'ai dit ou vous avez uniquement ajouté la ligne en oubliant d'enlever le ); à la ligne précédente ? Link to comment Share on other sites More sharing options...
ChristopheB89 Posted October 10, 2019 Share Posted October 10, 2019 J'ai recommencé en faisant bien un copié collé du bloc indiqué et j'obtiens cette fois le message Parse error: syntax error, unexpected 'PS_CUSTOMER_GROUP' (T_STRING) in "..."/classes/Customer.php on line 710 Si on regarde le code dans l'éditeur, on se rend compte que la fonction ajoutée ne semble pas se fermer. Voir la capture. Link to comment Share on other sites More sharing options...
Eolia Posted October 10, 2019 Share Posted October 10, 2019 effectivement l'éditeur Presta a bouffé une apostrophe. Le bon code est : public function getBoughtProducts() { return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT * FROM `'._DB_PREFIX_.'orders` o LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.id_order = od.id_order WHERE o.valid = 1 AND o.`id_customer` = '.(int)$this->id.' ORDER BY o.date_add DESC LIMIT 50'); } 1 Link to comment Share on other sites More sharing options...
Eolia Posted October 10, 2019 Share Posted October 10, 2019 Il faut savoir que c'est surtout la fonction Cart::getCustomerCarts($customer->id) qui consome le plus de ressources et celle qui suit dans le code et essaye de trouver les produits souvent ajoutés aux paniers et jamais commandés. Pour celle-ci un return array(); suffit. 1 Link to comment Share on other sites More sharing options...
ChristopheB89 Posted October 10, 2019 Share Posted October 10, 2019 59 minutes ago, Eolia said: effectivement l'éditeur Presta a bouffé une apostrophe. Le bon code est : public function getBoughtProducts() { return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT * FROM `'._DB_PREFIX_.'orders` o LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.id_order = od.id_order WHERE o.valid = 1 AND o.`id_customer` = '.(int)$this->id.' ORDER BY o.date_add DESC LIMIT 50'); } Super, merci beaucoup. Avec cette correction je n'ai plus d'erreur. Par contre, comme vous le prédisiez dans votre message suivant il ne semble pas y avoir d'impact sur la vitesse de chargement de la page. 55 minutes ago, Eolia said: Il faut savoir que c'est surtout la fonction Cart::getCustomerCarts($customer->id) qui consome le plus de ressources et celle qui suit dans le code et essaye de trouver les produits souvent ajoutés aux paniers et jamais commandés. Pour celle-ci un return array(); suffit. Si je saisi bien, il s'agit des deux fonctions suivantes à modifier ? public function getLastCart($with_order = true) { $carts = Cart::getCustomerCarts((int)$this->id, $with_order); if (!count($carts)) { return false; } $cart = array_shift($carts); $cart = new Cart((int)$cart['id_cart']); return ($cart->nbProducts() === 0 ? (int)$cart->id : false); } public function getOutstanding() { $query = new DbQuery(); $query->select('SUM(oi.total_paid_tax_incl)'); $query->from('order_invoice', 'oi'); $query->leftJoin('orders', 'o', 'oi.id_order = o.id_order'); $query->groupBy('o.id_customer'); $query->where('o.id_customer = '.(int)$this->id); $total_paid = (float)Db::getInstance()->getValue($query->build()); $query = new DbQuery(); $query->select('SUM(op.amount)'); $query->from('order_payment', 'op'); $query->leftJoin('order_invoice_payment', 'oip', 'op.id_order_payment = oip.id_order_payment'); $query->leftJoin('orders', 'o', 'oip.id_order = o.id_order'); $query->groupBy('o.id_customer'); $query->where('o.id_customer = '.(int)$this->id); $total_rest = (float)Db::getInstance()->getValue($query->build()); return $total_paid - $total_rest; } Est-ce bien ceci et que modifier exactement ? Merci beaucoup pour votre aide. Link to comment Share on other sites More sharing options...
Eolia Posted October 10, 2019 Share Posted October 10, 2019 Ben non, c'est dans la classe Cart.php, fonction getCustomerCarts(); à remplacer par: public static function getCustomerCarts($id_customer, $with_order = true) { return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT * FROM '._DB_PREFIX_.'cart c WHERE c.`id_customer` = '.(int)$id_customer.' '.(!$with_order ? 'AND NOT EXISTS (SELECT 1 FROM '._DB_PREFIX_.'orders o WHERE o.`id_cart` = c.`id_cart`)' : '').' ORDER BY c.`date_add` DESC LIMIT 10'); } Et dans /controllers/admin/AdminCustomersController.php, remplacer $interested = Db::getInstance()->executeS($sql); $total_interested = count($interested); for ($i = 0; $i < $total_interested; $i++) { $product = new Product($interested[$i]['id_product'], false, $this->default_form_language, $interested[$i]['id_shop']); if (!Validate::isLoadedObject($product)) { continue; } $interested[$i]['url'] = $this->context->link->getProductLink( $product->id, $product->link_rewrite, Category::getLinkRewrite($product->id_category_default, $this->default_form_language), null, null, $interested[$i]['cp_id_shop'] ); $interested[$i]['id'] = (int)$product->id; $interested[$i]['name'] = Tools::htmlentitiesUTF8($product->name); } Par $interested = array(); 1 Link to comment Share on other sites More sharing options...
ChristopheB89 Posted October 10, 2019 Share Posted October 10, 2019 Merci beaucoup, je vais tester ces modifications. Link to comment Share on other sites More sharing options...
ChristopheB89 Posted October 10, 2019 Share Posted October 10, 2019 Après application de ces modifications, c'est déjà bien mieux. Lorsque je saisi une commande manuelle sur un client ayant des centaines de commandes à son actif, le nombre de commandes à charger ralentissent encore pas mal le chargement. Comment faire en sorte de limiter aussi le nombre de commandes à charger dans ce cas de figure ? Link to comment Share on other sites More sharing options...
Crabix Posted October 27, 2022 Share Posted October 27, 2022 Bonjour, je me permet de déterrer ce post car il m'intéresse fortement ! Nous avons le même problème sur notre site, certaines fiches clients du backoffice mettent plus de 60 secondes avant de charger c'est un vrai calvaire !! Le problème c'est que je ne peux pas effectuer les mêmes modifications, le fichier /controllers/admin/AdminCustomersController.php n'existe pas chez moi (je suis sur PS 1.7.8.X) Quelqu'un pourrait me donner un coup de main ? J'aurais donc besoin de virer ou limiter le nombres de paniers et de produits achetés dans les fiches client du backoffice ce serait super Merci d'avance Link to comment Share on other sites More sharing options...
Phanie Posted February 8, 2023 Share Posted February 8, 2023 Le fichier existe bien en version 1.7.8.5 Link to comment Share on other sites More sharing options...
Blawdi Posted February 10, 2023 Share Posted February 10, 2023 Pas en 1.7.8.2 en tout cas ? Link to comment Share on other sites More sharing options...
Phanie Posted February 10, 2023 Share Posted February 10, 2023 17 minutes ago, Blawdi said: Pas en 1.7.8.2 en tout cas ? Bizarre ça quand même. Il est juste après le fichier AdminCustomerThreadsController.php car CustomerS est au pluriel. Vous êtes sûr ? Mais ça ne résoud pas le soucis, car la fonction est appelée $products = $customer->getBoughtProducts(); mais elle est créée ailleurs. Je poursuis mes recherches. Si vous trouvez avant moi, je suis intéressée. Link to comment Share on other sites More sharing options...
Blawdi Posted February 10, 2023 Share Posted February 10, 2023 Oui je suis certain, j'ai vérifié dans plusieurs versions de PrestaShop je ne la voie nulle part en 1.7.8.x, 1.7.7.7 non plus, Link to comment Share on other sites More sharing options...
Blawdi Posted February 10, 2023 Share Posted February 10, 2023 On 10/27/2022 at 12:06 PM, Crabix said: Bonjour, je me permet de déterrer ce post car il m'intéresse fortement ! Nous avons le même problème sur notre site, certaines fiches clients du backoffice mettent plus de 60 secondes avant de charger c'est un vrai calvaire !! Le problème c'est que je ne peux pas effectuer les mêmes modifications, le fichier /controllers/admin/AdminCustomersController.php n'existe pas chez moi (je suis sur PS 1.7.8.X) Quelqu'un pourrait me donner un coup de main ? J'aurais donc besoin de virer ou limiter le nombres de paniers et de produits achetés dans les fiches client du backoffice ce serait super Merci d'avance Ce n'est pas dingo, mais vu qu'on a quasiment plus d'entre aide... voici ce que j'ai fait dans /src/Adapter/Customer/QueryHandler/GetCustomerForViewingHandler.php a la ligne 805 j'ai commenté //$carts = Cart::getCustomerCarts($customer->id); et ajouté $carts = array(); ça permet de ne plus afficher les paniers et donc un affichage quasi instantané. Link to comment Share on other sites More sharing options...
Crabix Posted February 13, 2023 Share Posted February 13, 2023 On 2/10/2023 at 3:56 PM, Blawdi said: Ce n'est pas dingo, mais vu qu'on a quasiment plus d'entre aide... voici ce que j'ai fait dans /src/Adapter/Customer/QueryHandler/GetCustomerForViewingHandler.php a la ligne 805 j'ai commenté //$carts = Cart::getCustomerCarts($customer->id); et ajouté $carts = array(); ça permet de ne plus afficher les paniers et donc un affichage quasi instantané. Merci Blawdi c'est vrai que poster une question sur ce forum équivaut à envoyer une bouteille à la mer, Merci beaucoup, personnellement j'ai fini par prendre un module hors de prix qui permet d'optimiser notre site web (il contient une option permettant de supprimer tous les paniers abandonnés) Link to comment Share on other sites More sharing options...
Asu34 Posted May 21 Share Posted May 21 On 6/15/2018 at 7:27 AM, Eolia said: En poussant un peu le truc on arrive à quelque chose de pas mal^^ Avec rechargement en ajax uniquement si nécessaire Bonjour, je me permets de relancer ce topic avec cette solution qui me serait vraiment idéale :). Pour l'instant je me contente du LIMIT SQL. Sauf erreur de ma part, je n'ai pas trouvé comment mettre ceci ci-dessus en place :(. Merci par avance pour votre retour. Link to comment Share on other sites More sharing options...
Asu34 Posted May 23 Share Posted May 23 Je me permets revenir ici. @Eolia va trouver ça en quelques secondes j'en suis persuadé ^^... ça fait 3 heures que moi suis dessuis. En BO je souhaite limiter l'affichage des paniers du client. ça marchait jusqu'en 1.7 avec Cette fonction est la même en PS 8.1.x mais elle ne limite pas son affichage. J'ai cherché d'autre occurrence de getCustomerCarts qui permettraient cela mais en vain... Je ne comprends pas Merci par avance à tous si vous avez une idée Link to comment Share on other sites More sharing options...
Eolia Posted May 23 Share Posted May 23 Allez, je vous laisse chercher un peu^^ Ce sont ces lignes qui ramènent les contenus: // Discount listing $customerDiscountGridFactory = $this->get('prestashop.core.grid.factory.customer.discount'); $customerDiscountFilters->addFilter(['id_customer' => $customerId]); $customerDiscountGrid = $customerDiscountGridFactory->getGrid($customerDiscountFilters); // Addresses listing $customerAddressGridFactory = $this->get('prestashop.core.grid.factory.customer.address'); $customerAddressFilters->addFilter(['id_customer' => $customerId]); $customerAddressGrid = $customerAddressGridFactory->getGrid($customerAddressFilters); // Order listing $customerOrderGridFactory = $this->get('prestashop.core.grid.factory.customer.order'); $customerOrderFilters->addFilter(['id_customer' => $customerId]); $customerOrderGrid = $customerOrderGridFactory->getGrid($customerOrderFilters); // Cart listing $customerCartGridFactory = $this->get('prestashop.core.grid.factory.customer.cart'); $customerCartFilters->addFilter(['id_customer' => $customerId]); $customerCartGrid = $customerCartGridFactory->getGrid($customerCartFilters); // Bought products listing $customerBoughtProductGridFactory = $this->get('prestashop.core.grid.factory.customer.bought_product'); $customerBoughtProductFilters->addFilter(['id_customer' => $customerId]); $customerBoughtProductGrid = $customerBoughtProductGridFactory->getGrid($customerBoughtProductFilters); // Viewed products listing $customerViewedProductGridFactory = $this->get('prestashop.core.grid.factory.customer.viewed_product'); $customerViewedProductFilters->addFilter(['id_customer' => $customerId]); $customerViewedProductGrid = $customerViewedProductGridFactory->getGrid($customerViewedProductFilters); Link to comment Share on other sites More sharing options...
Asu34 Posted May 23 Share Posted May 23 MDR ! Bon 45 min de plus 🤣. Je ne trouve pas le customerCartGridFactory... Arrff je dois faire fausse route ^^ Link to comment Share on other sites More sharing options...
Asu34 Posted May 23 Share Posted May 23 Arrff, j'ai perdu mon cerveau en cette fin de journée... Arrff, tu crois que je peux donner ma langue au fameux chat ? 😅 Link to comment Share on other sites More sharing options...
Eolia Posted May 23 Share Posted May 23 use PrestaShop\PrestaShop\Core\Domain\Customer\Query\GetCustomerCarts; private function getQueryBuilder(array $filters): QueryBuilder { $qb = $this->connection ->createQueryBuilder() ->from($this->dbPrefix . 'cart', 'c') ->where('c.`id_customer` != 0'); $qb->leftJoin( 'c', $this->dbPrefix . 'carrier', 'ca', 'c.`id_carrier` = ca.`id_carrier`' ); $this->applyFilters($qb, $filters); return $qb; } Link to comment Share on other sites More sharing options...
Asu34 Posted May 28 Share Posted May 28 Bonjour @Eolia, je n'avais pas vu ta réponse. Merci. Sauf erreur de ma part ça se passerait donc ici : \src\Core\Grid\Query\CartRuleQueryBuilder.php ? J'y ai tenté de modifié la getQueryBuilder avec l'ajoût de la ligne >where('c.`id_customer` != 0'); Mais ça ne me limit pas cet affichage... Link to comment Share on other sites More sharing options...
Eolia Posted May 28 Share Posted May 28 C'est plutôt un limit qu'il faut ajouter... La ligne ->where('c.`id_customer` != 0'); est déjà présente. Donc un truc du genre ->setMaxResults(10); private function getQueryBuilder(array $filters): QueryBuilder { $qb = $this->connection ->createQueryBuilder() ->from($this->dbPrefix . 'cart', 'c') ->where('c.`id_customer` != 0') ->setMaxResults(10); $qb->leftJoin( 'c', $this->dbPrefix . 'carrier', 'ca', 'c.`id_carrier` = ca.`id_carrier`' ); $this->applyFilters($qb, $filters); return $qb; } Link to comment Share on other sites More sharing options...
Eolia Posted May 28 Share Posted May 28 https://www.editions-eni.fr/livre/apprendre-a-developper-des-applications-web-avec-php-et-symfony-2e-edition-9782409041488/la-couche-modele-avec-doctrine Link to comment Share on other sites More sharing options...
Eolia Posted May 28 Share Posted May 28 https://www.doctrine-project.org/projects/doctrine-orm/en/3.2/reference/query-builder.html#limiting-the-result Link to comment Share on other sites More sharing options...
Eolia Posted May 28 Share Posted May 28 Comprenez bien qu'à partir de la 1.7 il faut raisonner Symfony et oublier les classes du Prestashop legacy. Link to comment Share on other sites More sharing options...
Asu34 Posted May 28 Share Posted May 28 Merci pour ces réponses encore. Oui c'est une logique que je n'ai pas encore assimilé effectivement... J'ai tenté le ->setMaxResults(10); en vain. J'ai fait un test en commentant la function complètement il ne se passe rien... Je ne suis pas sûr être au bon endroit... Link to comment Share on other sites More sharing options...
Asu34 Posted May 29 Share Posted May 29 Bon ben je n'ai toujours pas réussi... Dans mon fichier \src\Core\Grid\Query\CartRuleQueryBuilder.php ... je n'ai pas cette ligne : On 5/28/2024 at 5:38 PM, Eolia said: C'est plutôt un limit qu'il faut ajouter... La ligne ->where('c.`id_customer` != 0'); est déjà présente. Donc un truc du genre ->setMaxResults(10); private function getQueryBuilder(array $filters): QueryBuilder { $qb = $this->connection ->createQueryBuilder() ->from($this->dbPrefix . 'cart', 'c') ->where('c.`id_customer` != 0') ->setMaxResults(10); $qb->leftJoin( 'c', $this->dbPrefix . 'carrier', 'ca', 'c.`id_carrier` = ca.`id_carrier`' ); $this->applyFilters($qb, $filters); return $qb; } private function getQueryBuilder(array $filters): QueryBuilder { $qb = $this->connection ->createQueryBuilder() ->from($this->dbPrefix . 'cart_rule', 'cr') ; $qb->leftJoin( 'cr', $this->dbPrefix . 'cart_rule_lang', 'crl', 'cr.id_cart_rule = crl.id_cart_rule AND crl.id_lang = :contextLangId' ); $this->applyFilters($qb, $filters); $qb->setParameter('contextLangId', $this->contextIdLang); return $qb; } et j'ai cette ligne ->from($this->dbPrefix . 'cart_rule', 'cr'). Je n'ai aucun fichier qui contient celle mentionnée avec >from($this->dbPrefix . 'cart', 'c') ->where('c.`id_customer` != 0') Link to comment Share on other sites More sharing options...
Eolia Posted May 29 Share Posted May 29 Ben vous n'êtes pas du tout au bon endroit. PrestaShop/src/Core/Grid/Query/CustomerCartQueryBuilder.php https://github.com/PrestaShop/PrestaShop/blob/444feff15d6d84bd5281b23d7b9e76c6fb5a38f4/src/Core/Grid/Query/CustomerCartQueryBuilder.php#L98 Link to comment Share on other sites More sharing options...
Eolia Posted May 29 Share Posted May 29 Quand je vous dis qu'on perd du temps avec leur Symfony^^ Link to comment Share on other sites More sharing options...
Asu34 Posted May 30 Share Posted May 30 15 hours ago, Eolia said: Ben vous n'êtes pas du tout au bon endroit. PrestaShop/src/Core/Grid/Query/CustomerCartQueryBuilder.php https://github.com/PrestaShop/PrestaShop/blob/444feff15d6d84bd5281b23d7b9e76c6fb5a38f4/src/Core/Grid/Query/CustomerCartQueryBuilder.php#L98 Salut Eolia, c'est dingue ça c'est quelle version ça ? Car je n'ai pas ce fichier sur la dernière 8.1.5 : Idem sur la dernière 8.1.6 : Link to comment Share on other sites More sharing options...
Eolia Posted May 30 Share Posted May 30 Ah ben c'est la version Github (la 9 ?) perso je n'en sais rien je ne travaille pas avec les versions 1.7 et supérieures. Link to comment Share on other sites More sharing options...
Asu34 Posted May 30 Share Posted May 30 (edited) Oui c'est ce que je viens de voir c'est la 9. Elle n'est pas encore proposée sur le site prestashop. Quant on va sur la branche 8.1.x effectivement ce fichier n'yest pas. Arrfff, ça m'énerve ne pas arriver à limiter ce panier. Tous les anciens overrides ont marché avec le LIMIT sur les classes : Customer avec public function getBoughtProducts() (pour limiter le nombre de produits CustomerThread avec public static function getCustomerMessages($id_customer, $read = null, $id_order = null) Etc. pour les commandes. Mais pas les paniers. Cart.php n'est pas pris en compte... Edited May 30 by Asu34 (see edit history) 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