iann_ash Posted October 13, 2012 Share Posted October 13, 2012 (edited) Bonjour à tous, Un peu néophyte en php et sql, et tout nouveau dans le monde PS, j'aurais aimé un petit coup de main sur l'action suivante. Dans la classes manufacturer, on trouve la fonction getManufacturers($getNbProducts = false, $id_lang = 0, $active = true, $p = false, $n = false, $all_group = false) Dans les paramètre, il y a la possibilité de mettre à TRUE l'affichage de la quantité de produits. Ce qui m'intéresse n'est pas de l'afficher mais de me baser sur cette valeur pour TRIER mes fabricants. Mon problème est le suivant : 1. La fonction qui va chercher le nombre de produits se trouve après l'extractions des fabricants (par ordre alphabétique) de la base de donnée. Voici le code (non modifié donc) : if ($getNbProducts) { $sqlGroups = ''; if (!$all_group) { $groups = FrontController::getCurrentCustomerGroups(); $sqlGroups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1'); } foreach ($manufacturers as $key => $manufacturer) { $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT p.`id_product` FROM `'._DB_PREFIX_.'product` p LEFT JOIN `'._DB_PREFIX_.'manufacturer` as m ON (m.`id_manufacturer`= p.`id_manufacturer`) WHERE m.`id_manufacturer` = '.(int)($manufacturer['id_manufacturer']). ($active ? ' AND p.`active` = 1 ' : ''). ($all_group ? '' : ' AND p.`id_product` IN ( SELECT cp.`id_product` FROM `'._DB_PREFIX_.'category_group` cg LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) WHERE cg.`id_group` '.$sqlGroups.')')); $manufacturers[$key]['nb_products'] = sizeof($result); } } Personnellement, j'ai le sentiment (mais est-ce là que je me trompe) qu'à présent, la variable $manufacturers est un tableau multidimensionnel. J'ai donc pensé que je pourrais faire un tri sur le tableau directement avant que la variable ne soit envoyé en retour. Cependant, la page bloque complètement... J'imagine que j'utilise mal la fonction array_multisort(). Voici donc ma tentative de code : if ($getNbProducts) { $sqlGroups = ''; if (!$all_group) { $groups = FrontController::getCurrentCustomerGroups(); $sqlGroups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1'); } foreach ($manufacturers as $key => $manufacturer) { $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT p.`id_product` FROM `'._DB_PREFIX_.'product` p LEFT JOIN `'._DB_PREFIX_.'manufacturer` as m ON (m.`id_manufacturer`= p.`id_manufacturer`) WHERE m.`id_manufacturer` = '.(int)($manufacturer['id_manufacturer']). ($active ? ' AND p.`active` = 1 ' : ''). ($all_group ? '' : ' AND p.`id_product` IN ( SELECT cp.`id_product` FROM `'._DB_PREFIX_.'category_group` cg LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) WHERE cg.`id_group` '.$sqlGroups.')')); $manufacturers[$key]['nb_products'] = sizeof($result); /* Fonction de tri ajoutée par Iann Ash le 13/10/2012 Permettant un tri sur la colonne nb_products. Permet de classer les fabricants suivant le nombre de produits associés. */ array_multisort($manufacturers['nb_products'],SORT_ASC); /* Fin de la fonction de tri ajouté par Iann Ash */ } } Je vous remercie déjà super fort pour l'attention que vous porterez à mon problème. Par ailleurs, désolé si je suis complètement à côté de la plaque. Dans ce cas, n'hésitez pas à m'indiquer la meilleure piste à suivre... Cordialement, PS : Si vous connaissez un moyen pour garder l'indentation du code lors des copiers/coller, je suis preneur :-) Je trouve que sans indentation, c'est hard à lire Edited October 15, 2012 by iann_ash (see edit history) Link to comment Share on other sites More sharing options...
iann_ash Posted October 14, 2012 Author Share Posted October 14, 2012 Bonjour à tous, Déjà une petite correction : ne pas mettre la fonction de tri DANS la boucle "foreach". Je ne pense pas que cela fasse planter mais ça rame pour rien de retrier le tableau à chaque fois. Par contre, j'ai fait un test avec la fonction "asort()" et là, ça fonctionne bien... Mais forcément le tri se fait sur la clé et donc l'ID du fabricant. En lisant bien la documentation de la fonction array_multisort(), je constate qu'il modifie la clé lorsque le tri n'est pas fait sur cette dernière et il choisi une clé numérique auto-incrémentée... enfin, si j'ai bien compris... Donc, j'imagine que forcément, les ID dans le tableau sont modifié, ça bug et c'est pourquoi ma page reste bloquée (page blanche). Je pense que je vais devoir créer ma propre petit fonction de tri en passant par une variable tampon... J'essaierai ça demain... En attendant, si quelqu'un a une meilleur idée, votre participation est la bienvenue Bien à vous, Iann, en plein monologue. Link to comment Share on other sites More sharing options...
iann_ash Posted October 15, 2012 Author Share Posted October 15, 2012 Bonsoir à tous, Bon, ce sont mes débuts dans ce forum mais je dois dire que j'ai déjà lâché 7 post dont 3 topics et pas une seule réponse... J'ai envie de dire : "CAST AWAY". Soit, je pose mal mes questions, soit, c'est trop complexe, soit, la fonctionnalité n'emballe personne, soit j'ai mal cherché et le sujet est déjà traité 1000 fois... Bref, c'est pas trop grave, je m'en suis sorti... à force d'essai/erreurs (ben voui, développeur du dimanche que voulez-vous). En gros, il semblerait que j'utilisais pas comme il fallait la fonction array_multisort. Mais j'avoue que je n'y vois pas clair pour autant ! Voici donc le code modifié et qui fonctionne. Le fichier à modifier est /classes/Manufacturer.php Cordialement, static public function getManufacturers($getNbProducts = true, $id_lang = 0, $active = true, $p = false, $n = false, $all_group = false)//modifié par Iann Ash le 13/10/2012 --> $getNbProducts mis à true { if (!$id_lang) $id_lang = (int)Configuration::get('PS_LANG_DEFAULT'); $sql = 'SELECT m.*, ml.`description`'; $sql.= ' FROM `'._DB_PREFIX_.'manufacturer` m LEFT JOIN `'._DB_PREFIX_.'manufacturer_lang` ml ON (m.`id_manufacturer` = ml.`id_manufacturer` AND ml.`id_lang` = '.(int)($id_lang).') '.($active ? ' WHERE m.`active` = 1' : ''); $sql.= ' ORDER BY m.`name` ASC'.($p ? ' LIMIT '.(((int)($p) - 1) * (int)($n)).','.(int)($n) : ''); $manufacturers = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql); if ($manufacturers === false) return false; if ($getNbProducts) { $sqlGroups = ''; if (!$all_group) { $groups = FrontController::getCurrentCustomerGroups(); $sqlGroups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1'); } foreach ($manufacturers as $key => $manufacturer) { $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT p.`id_product` FROM `'._DB_PREFIX_.'product` p LEFT JOIN `'._DB_PREFIX_.'manufacturer` as m ON (m.`id_manufacturer`= p.`id_manufacturer`) WHERE m.`id_manufacturer` = '.(int)($manufacturer['id_manufacturer']). ($active ? ' AND p.`active` = 1 ' : ''). ($all_group ? '' : ' AND p.`id_product` IN ( SELECT cp.`id_product` FROM `'._DB_PREFIX_.'category_group` cg LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) WHERE cg.`id_group` '.$sqlGroups.')')); $manufacturers[$key]['nb_products'] = sizeof($result); } } /* Fonction de tri ajoutée par Iann Ash le 13/10/2012 Permettant un tri sur le nombre de produits en boutiques pour le fabricants sélectionné */ //var_dump($manufacturers); foreach ($manufacturers as $key => $row) { $nb_prod[$key] = $row['nb_products']; } array_multisort($nb_prod, SORT_DESC,$manufacturers); //var_dump($manufacturers); /* Fin de la fonction de tri ajouté par Iann Ash */ for ($i = 0; $i < sizeof($manufacturers); $i++) if ((int)(Configuration::get('PS_REWRITING_SETTINGS'))) $manufacturers[$i]['link_rewrite'] = Tools::link_rewrite($manufacturers[$i]['name'], false); else $manufacturers[$i]['link_rewrite'] = 0; return $manufacturers; } 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