Rosiel Posted May 5, 2010 Share Posted May 5, 2010 Bonjour,Quelqu'un peut-il me dire comment classer les valeurs des caractéristiques dans le back office par ordre croissant ? En effet j'ai une caractéristique Nombre de pages = et j'ai la liste des valeurs qui s'affichent dans l'ordre de création alors que ce sont des chiffres ?Merci par avance.Prestashop 1.2.5 Link to comment Share on other sites More sharing options...
jeckyl Posted May 5, 2010 Share Posted May 5, 2010 Salut,on doit pouvoir retrouver la requête SQL qui affiche ces caractéristiques pour la modifier.Mais tu peux aussi chercher un module qui fait cela, car je crois que cela existe. Link to comment Share on other sites More sharing options...
Divine Posted May 5, 2010 Share Posted May 5, 2010 Hello,Tu peux trier tes caractéristiques dans l'ordre que tu souhaites en utilisant la même astuce que pour les catégories.Pour cela ouvres Classes>>product.php et remplaces ces lignes: static public function getFrontFeaturesStatic($id_lang, $id_product) { return Db::getInstance()->ExecuteS(' SELECT name, value, pf.id_feature FROM '._DB_PREFIX_.'feature_product pf LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.intval($id_lang).') LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.intval($id_lang).') WHERE pf.id_product = '.intval($id_product)); } Par celles-ci: static public function getFrontFeaturesStatic($id_lang, $id_product) { $result=Db::getInstance()->ExecuteS(' SELECT name, value, pf.id_feature FROM '._DB_PREFIX_.'feature_product pf LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.intval($id_lang).') LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.intval($id_lang).') WHERE pf.id_product = '.intval($id_product).' order by name'); $resultsArray = array(); foreach ($result AS $row) { $row['name'] = product::hideFeaturePosition($row['name']); $resultsArray[] = $row; } return $resultsArray; } static public function hideFeaturePosition($name) { return preg_replace('/^[0-9]+\./', '', $name); } Ensuite tu n'as plus qu'à ajouter 1., 2., 3.,... devant le nom de tes caractéristiques pour qu'elles apparaissent dans l'ordre que tu souhaites (comme pour les catégories). Chez moi ça fonctionne impecc Link to comment Share on other sites More sharing options...
Rosiel Posted May 6, 2010 Author Share Posted May 6, 2010 Bonjour,J'avais déjà fait cette modification et effectivement cela marche pour l'ordre des caractéristiques. Mais ce n'est pas ce que je cherchais. Je cherche à obtenir LES VALEURS des caractéristiques par ordre croissant. Exemple : lorsque je vais dans la fiche produit>caractéristiques>Nombre de pages : j'ai les nombres complètement dans le désordre (affichage par ordre de création) : c'est compliqué pour rien de rechercher dans la liste en désordre.Merci quand-même pour la réponse. Link to comment Share on other sites More sharing options...
cocoges Posted May 11, 2010 Share Posted May 11, 2010 Bonjour par ici Je viens d'utiliser votre code de modification pour le tri.J'utilise un moteur de recherche en module qui affiche des tri par caractéristiques.Celui-ci affiche le nom des caractéristiques avec le préfixe 01.nom_de_la_caractéristiqueVoici l'extrait de code : function getAllCategory() { global $cookie; $result = Db::getInstance()->ExecuteS(' SELECT c.`id_category`, cl.`name`, cl.`link_rewrite` FROM `' . _DB_PREFIX_ . 'category` c LEFT JOIN `' . _DB_PREFIX_ . 'category_lang` cl ON c.`id_category` = cl.`id_category` WHERE `id_lang` = ' . intval($cookie->id_lang) . ' AND c.`id_category` != 1 AND `active` = 1 ORDER BY `name` ASC'); /* Modify SQL result */ $resultsArray = array (); foreach ( $result as $row ) { $row ['name'] = Category::hideCategoryPosition($row ['name']); $resultsArray [] = $row; } return $resultsArray; } Comment pallier à l'affichage du préfixe de tri ?Merci de votre aide ! Link to comment Share on other sites More sharing options...
cocoges Posted May 14, 2010 Share Posted May 14, 2010 toujours pas d'idée ? Link to comment Share on other sites More sharing options...
Thurdan Posted June 13, 2011 Share Posted June 13, 2011 Bonjour,Je suis également intéressé par une réponse de Divine...Merci Link to comment Share on other sites More sharing options...
Utile PC Posted June 23, 2011 Share Posted June 23, 2011 BonjourMoi aussiMerciv 1.4.0.17 Link to comment Share on other sites More sharing options...
amerigeau Posted August 10, 2011 Share Posted August 10, 2011 Bonjour, J'ai lu tout le post mais dans classes / product.php je n'ai pas les mêmes lignes exactement (prestashop v1.4.3) : public static function getFrontFeaturesStatic($id_lang, $id_product) { if (!array_key_exists($id_product.'-'.$id_lang, self::$_frontFeaturesCache)) { self::$_frontFeaturesCache[$id_product.'-'.$id_lang] = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT name, value, pf.id_feature FROM '._DB_PREFIX_.'feature_product pf LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.') LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.(int)$id_lang.') WHERE pf.id_product = '.(int)$id_product); } return self::$_frontFeaturesCache[$id_product.'-'.$id_lang]; } public function getFrontFeatures($id_lang) { return self::getFrontFeaturesStatic($id_lang, $this->id); } public static function getAttachmentsStatic($id_lang, $id_product) { return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT * FROM '._DB_PREFIX_.'product_attachment pa LEFT JOIN '._DB_PREFIX_.'attachment a ON a.id_attachment = pa.id_attachment LEFT JOIN '._DB_PREFIX_.'attachment_lang al ON (a.id_attachment = al.id_attachment AND al.id_lang = '.(int)($id_lang).') WHERE pa.id_product = '.(int)($id_product)); } public function getAttachments($id_lang) { return self::getAttachmentsStatic($id_lang, $this->id); } Si je remplace cette section par le code donné plus haut par Divine, la page produit ne s'affiche pas (page blanche), comment faire ? Merci d'avance Link to comment Share on other sites More sharing options...
toto37 Posted September 1, 2011 Share Posted September 1, 2011 J'ai fait ça sur la 1.4, ça fonctionne pour le tri par numérotation (sans affichage de la numérotation) remplacer : public static function getFrontFeaturesStatic($id_lang, $id_product) { if (!array_key_exists($id_product.'-'.$id_lang, self::$_frontFeaturesCache)) { self::$_frontFeaturesCache[$id_product.'-'.$id_lang] = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT name, value, pf.id_feature FROM '._DB_PREFIX_.'feature_product pf LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.') LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.(int)$id_lang.') WHERE pf.id_product = '.(int)$id_product); } return self::$_frontFeaturesCache[$id_product.'-'.$id_lang]; } par : public static function getFrontFeaturesStatic($id_lang, $id_product) { if (!array_key_exists($id_product.'-'.$id_lang, self::$_frontFeaturesCache)) { self::$_frontFeaturesCache[$id_product.'-'.$id_lang] = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT name, value, pf.id_feature FROM '._DB_PREFIX_.'feature_product pf LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.') LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.(int)$id_lang.') WHERE pf.id_product = '.(int)$id_product.' ORDER BY `name`'); $resultsArray = array(); foreach (self::$_frontFeaturesCache[$id_product.'-'.$id_lang] AS $row) { $row['name'] = product::hideFeaturePosition($row['name']); $resultsArray[] = $row; } return $resultsArray; } //return self::$_frontFeaturesCache[$id_product.'-'.$id_lang]; } public static function hideFeaturePosition($name) { return preg_replace('/^[0-9]+./', '', $name); } je vais maintenant essayer de faire marcher l'ajout d'une rubrique (voiture.01.hauteur, voiture.11.largeur, velo.01.selle,...) n'hésitez pas si mon code n'est pas optimisé à apportez vos améliorations ! Link to comment Share on other sites More sharing options...
toto37 Posted September 1, 2011 Share Posted September 1, 2011 Donc après quelques heures avec les expressions régulières, les forums et un peu d'optimisations : 1 - Remettre la classe Product.php comme à l'original 2 - Dans "override/classes/", créer un fichier "Product.php", nous pourrons y placer ici les modifications de la classe sans toucher a l'originale (quand même plus propre ^^) 3 - coller ça dans le document VIERGE : <?php class Product extends ProductCore { public function getFrontFeatures($id_lang) { return self::getFrontFeaturesStatic($id_lang, $this->id); } public static function getFrontFeaturesStatic($id_lang, $id_product) { if (!array_key_exists($id_product.'-'.$id_lang, self::$_frontFeaturesCache)) { self::$_frontFeaturesCache[$id_product.'-'.$id_lang] = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT name, value, pf.id_feature FROM '._DB_PREFIX_.'feature_product pf LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.') LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.(int)$id_lang.') WHERE pf.id_product = '.(int)$id_product.' ORDER BY `name`'); $resultsArray = array(); foreach (self::$_frontFeaturesCache[$id_product.'-'.$id_lang] AS $row) { $row['name'] = product::hideFeaturePosition($row['name']); $resultsArray[] = $row; } return $resultsArray; } } static public function hideFeaturePosition($name) { return preg_replace('/[a-zA-Z0-9_]+_+[0-9]+./', '', $name); } } ?> 4 - Attention vous "DEVEZ" maintenant écrire les caractéristique comme ça : voiture_01.Type de Pneu, voiture_10.Taille des jantes, velo_01.garantie,... Ça va être assez long et galère au début, mais ça vous permet après d'être à l'aise dans vos caractéristique si vous en avez beaucoup. Si vous avez peu de caractéristique vous pouvez remplacer le code(a la fin de la classe) par : return preg_replace('/^[0-9]+./', '', $name); Celui-la vous permet de classer uniquement par 01.type de pneu, 10.Taille des jantes, 20.garantie. Après vous avez aussi la possibilité de faire vos propre règle à l'aide des expressions régulières ^^ Link to comment Share on other sites More sharing options...
amerigeau Posted September 2, 2011 Share Posted September 2, 2011 Bonjour à tous, Webbax a posté un article sur le tri des caractéristiques sur son site, très bien expliqué en plus Par ici : http://www.webbax.ch/2011/08/17/trier-les-caracteristiques-sous-prestashop/ ++ Arnaud Link to comment Share on other sites More sharing options...
lordbdp Posted February 21, 2014 Share Posted February 21, 2014 Donc après quelques heures avec les expressions régulières, les forums et un peu d'optimisations : 1 - Remettre la classe Product.php comme à l'original 2 - Dans "override/classes/", créer un fichier "Product.php", nous pourrons y placer ici les modifications de la classe sans toucher a l'originale (quand même plus propre ^^) 3 - coller ça dans le document VIERGE : <?php class Product extends ProductCore { public function getFrontFeatures($id_lang) { return self::getFrontFeaturesStatic($id_lang, $this->id); } public static function getFrontFeaturesStatic($id_lang, $id_product) { if (!array_key_exists($id_product.'-'.$id_lang, self::$_frontFeaturesCache)) { self::$_frontFeaturesCache[$id_product.'-'.$id_lang] = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT name, value, pf.id_feature FROM '._DB_PREFIX_.'feature_product pf LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.') LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.(int)$id_lang.') WHERE pf.id_product = '.(int)$id_product.' ORDER BY `name`'); $resultsArray = array(); foreach (self::$_frontFeaturesCache[$id_product.'-'.$id_lang] AS $row) { $row['name'] = product::hideFeaturePosition($row['name']); $resultsArray[] = $row; } return $resultsArray; } } static public function hideFeaturePosition($name) { return preg_replace('/[a-zA-Z0-9_]+_+[0-9]+./', '', $name); } } ?>4 - Attention vous "DEVEZ" maintenant écrire les caractéristique comme ça :voiture_01.Type de Pneu, voiture_10.Taille des jantes, velo_01.garantie,... Ça va être assez long et galère au début, mais ça vous permet après d'être à l'aise dans vos caractéristique si vous en avez beaucoup. Si vous avez peu de caractéristique vous pouvez remplacer le code(a la fin de la classe) par : return preg_replace('/^[0-9]+./', '', $name);Celui-la vous permet de classer uniquement par 01.type de pneu, 10.Taille des jantes, 20.garantie. Après vous avez aussi la possibilité de faire vos propre règle à l'aide des expressions régulières ^^ Merci pour cet overide mais pour faire une classification des valeurs et non des attributs (ce script est bien pour les attributs ???), comment faire afin d'avoir un buton de choix de tri ? Merci d'avance. 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