Jump to content

Gestion de l'ordre d'affichage des caractéristiques


samsab

Recommended Posts

Bonjour à tous
bon beh, c'est un peu le [auto censure;-)] binzz ces caractéristiques techniques dés que l'on a des produits.....techniques.

l'ordre d'affichage est alphanumérique; c'est bien mais à quoi cela sert? à rien.
comment peut on modifier l'ordre d'affichage pour donner un peu de cohérence à tout ça?

merci pour vos conseils.
A+

Link to comment
Share on other sites

Bonjour,

ayant été confronté au même problème je propose ici une solution.


* Pour modifier l'ordre d'affichage des produits sur le front

il faut modifier la classe Product (classes/Product.php) au niveau de la fonction getFrontFeaturesStatic
C'est au niveau de cette fonction qu'est lancée la requête SQL pour la récupération des caractéristiques

Il est donc possible de trier :

- en modifiant la requête SQL pour pouvoir y ajouter une clause ORDER BY

- en récupérant le résultat de la requête SQL pour le manipuler dans la fonction

exemple :

static public function getFrontFeaturesStatic($id_lang, $id_product)
{
// 1. Spécifier un ordre de tri (ici, tri par nom de la caractéristique)
// 2. Récupérer le résultat de la requête dans le tableau $results

  $results = 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 ASC');

// 3. Manipuler le tableau $results

    // pour chaque caractéristique produit...
    foreach ($results as $result_line){
     // ... effectuer le tri ICI
     // ...
     }

// 4. Retourner le tableau trié
     return $results;

}





* Pour modifier l'ordre d'affichage des produits sur l'admin

même principe, il faut modifier la classe Product (classes/Product.php) au niveau de la fonction getFeaturesStatic

Remarque : ici, la requête ne récupère pas le nom et la valeur des caractéristiques, donc pour un tri via SQL il faudra modifier la requête en entier (et pas seulement ajouter un ORDER BY).

Link to comment
Share on other sites

ce qu'il faudrait (le rêve quoi), ce serait cette possibilité: pour chaque catégorie de produits (pour chaque famille de produits), on pourrait définir un certain nombre de caractéristiques à remplir de façon facultative en BO; le top serait de définir à ce moment l'ordre avec lequel ces caract. doivent s'afficher .



exemple
produit pomme -> catégorie Fruit ->; caractéristiques: appellation, origine, insecticide soit 3 caractéristiques

produit renault clio -> catégorie automobile -> caractéristiques: puissance fiscale, nombre de portes, cylindrées, accessoires, soit 4 caractéristiques toutes disjointes (ou non d'ailleurs) par rapport à mon premier produit

ce serait bien de pouvoir n 'avoir accès qu'à ces 4 là qd je rentre un nouveau véhicule en BO.

qui a une idée

Link to comment
Share on other sites

Effectivement, ce serait une fonctionnalité très intéressante : pouvoir créer des "groupes de caractéristiques".
Une bonne idée de module !!!
:-)

J'ai contourné le problème en nommant les caractéristiques avec un préfixe contenant le nom du groupe et l'ordre (un peu à la manière du nommage des catégories pour le tri des catégories)

exemple : si je veux 2 groupes de caractéristiques, 1 pour les fruits, 1 pour les automobiles, je crée les caractéristiques
FRUIT.01.Appellation
FRUIT.02.Origine
FRUIT.03....
AUTO.01.Puissance fiscale
AUTO.02.Nombre de portes
AUTO.03....

ensuite, je trie les caractéristiques par ordre alphabétique (et donc par groupe), et je supprime le préfixe pour qu'il n'apparaisse pas dans l'affichage de la fiche produit (ni dans le front ni dans le back-office).
Au niveau du back-office, toutes les caractéristiques apparaissent mais elles sont triées donc c'est un peu moins gênant pour la saisie.

Link to comment
Share on other sites

@samsab : oui, dans le front-office, le préfixe FRUIT.01. disparait.

Au niveau du back-office, je laisse le préfixe dans l'onglet Catalogue >> Caractéristiques,
par contre, dans l'onglet Caractéristiques de la fiche produit dans le back-office, je le supprime,
mais je trie les caractéristiques pour avoir un tableau du type :

FRUIT
Origine
Appellation
[...]

AUTO
Puissance fiscale
Nb de portes
[...]

Link to comment
Share on other sites

merci pour ta réponse
pas ceratin de comprendre.
aurais tu 2 ou 3 screen à mettre ici pour bien piger.
comment peux tu "dans l’onglet Caractéristiques de la fiche produit dans le back-office, je le supprime,
mais je trie les caractéristiques pour avoir un tableau du type :"

A te lire
A+

Link to comment
Share on other sites

ça m'intéresse également car je suis en train de chercher comment faire... mais je n'ai pas complétement résolu le pb.
J'ai réussi à modifier sur le front office mais pas sur le back office...
Quel est la modif exacte à faire sur pour changer l'apparition sur le BO et trier par ordre alphabétique et non par id

Link to comment
Share on other sites

  • 1 month later...
  • 2 months later...
  • 2 months later...
  • 1 month later...

Vous pouvez poster les deux fichiers. Je ne suis pas. êtes un débutant et d'essayer de reproduire ce que vous avez écrit ne résulte pas rien. désolé pour mon français, mais en utilisant Google Translate. crois tu possible de nous communiquer le détail des modif?Merci d'avance

28022_67deNl8EAt7S8uSKFNBx_t

Link to comment
Share on other sites

Pour info (je part dans une direction différente), sur les catégories, pour les mettre dans l'ordre on utilise la méthode NUMERO.Nom de produit, ainsi la liste :

5.Patate
2.Huitre
9.Banane

se remet dans l'ordre. Il y a une fonction qui existe (je ne sais plus laquelle) pour afficher une chaine de caractère sans le "NUMERO." devant dont les catégories se servent.

Il suffit donc d'afficher les caractéristiques par ordre alphabétique et d'appliquer cette fameuse fonction quand on affiche ces caractéristiques.

Link to comment
Share on other sites

Your proposal does not work in features. want to get something similar in characteristics
FRUIT
Origin
Appellation
[...]
AUTO
Puissance tax
Nb of Portes
[...]

see previous posts. Codigo's Posted: 15 December 2009 11:47 PM. is that possible? he said yes, but never answered. please if you can help. or would no longer be a possibility. extratabs module can use but I want to be different for each product. Thanks in advance. I do not know if I was very explicit. sorry for English. Google Translate. as for French

Link to comment
Share on other sites

Voici le code à utiliser, il fonctionne parfaitement pour moi sur la version 1.3.1.1:

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);
   }



Le mieux est de faire 1 fonction distincte, il ne faut pas oublier de mettre le "$result=" à la première ligne. Ensuite,

.intval($id_product).' order by name');


Je n'ai pas mis ASC car c'est mis par défaut. Le mieux est de copier ce code et remplacer par l'ancien pour éviter les erreurs.

Link to comment
Share on other sites

Sorry, but the same result. I copied your text into Product.php but the result is the same. necessary to change and other file? I attach my file Product.php and you can check it. using 1.3.1. Thanks in advance.

exactly what i need is to put in his answer Codigo. category features which contain more properties. I want the same in BO. possible?

Product.php

Link to comment
Share on other sites

re corant1, (je vais parler français comme c'est un topic français, mais dis-moi si tu es anglais)
J'avais pas bien observer la forme de tes caractéristiques. En fait le code que tu a collé est bon, mais ce code va simplement enlever ce qui est avant une caractéristique seulement s'il commence par un nombre (nombre.texte). Or, tes caractéristiques sont de la forme texte.nombre.texte. C'est juste l'expression Regex à changer. En fait tu dois juste changer cette ligne:

return preg_replace('/^[0-9]+\./', '', $name);



Par:

return preg_replace('/^[a-zA-Z0-9\.]+\./', '', $name);



En fait le deuxième code est un peu mieux car il va virer tous ce qui se trouve avant le dernier "point" qu'il y ait des chiffres ou des lettres avant.

Cette fois ça devrait être bon.

Link to comment
Share on other sites

  • 2 weeks later...

Désolé de revenir, mais ne peut pas obtenir ce que fait Codigo (si vous voulez vérifier les photos de son message). Je ne veux pas être trop insistant, mais déclare que le changement et fichier admin / tabs / AdminProducts.php, displayFormFeatures Fonction () ... s'il vous plaît aider si vous pouvez obtenir la même chose que lui, pour les catégories caractéristiques ... Merci d'avance ... désolé pour le français (Google Translate)... Peut-être vous pouvez joindre votre fichier Product.php ...

Link to comment
Share on other sites

  • 1 month later...

Bonjour,

Voici un extrait de mon fichier juste en pratiquant la modification indiquée par deniss #25. Marche très bien pour moi sous 1.3.2 avec des catégories écrites comme ceci en BO:

01.cat1
02.cat2
03.cat3
etc.

A partir de la ligne 2274 fonction getProductsProperties

    static public function getProductsProperties($id_lang, $query_result)
   {
       $resultsArray = array();
       foreach ($query_result AS $row)
           if ($row2 = Product::getProductProperties($id_lang, $row))
               $resultsArray[] = $row2;
       return $resultsArray;
   }

   /*
   * Select all features for a given language
   *
   * @param $id_lang Language id
   * @return array Array with feature's data
   */
/*     MODIF DE STRATIC PUBLIC FUNCTION
   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));
   }
   */
/* MODIF ON TRIE LES CARACTERISTISQUES PERSO via 01; 02; 03, etc. */
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);
   }
/* FIN MODIF */
   public function getFrontFeatures($id_lang)
   {
       return self::getFrontFeaturesStatic($id_lang, $this->id);
   }

   static public function getAttachmentsStatic($id_lang, $id_product)
   {
       return Db::getInstance()->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 = '.intval($id_lang).')
       WHERE pa.id_product = '.intval($id_product));
   }

   public function getAttachments($id_lang)
   {
       return self::getAttachmentsStatic($id_lang, $this->id);
   }

   /*
   ** Customization management
   */



Bonne chance ;-)

Link to comment
Share on other sites

  • 4 months later...
  • 2 months later...
  • 4 weeks later...
  • 1 year later...

Pour ceux qui n'ont pas peur de mettre leur nez dans le code et dans la base, mais en mode facile, j'ai usé d'une autre procédure en deux étapes, sans trop de bricolage.

 

Etape 1 : modification dans la base de données (via PHPMyAdmin)

 

Pour définir la position de chaque caractéristique, il faut créer un nouvel enregistrement dans la table "features_position"

id_feature_pos => champ auto-incrémenté

id_feature : saisir l'id du champ éponyme de la table "feature_product" correspondant à la caractéristique

position_feature : saisir le numéro de la position souhaitée pour la caractéristique

 

Etape 2 : modification dans la page PHP située dans "classes/Product.php"

 

1 ligne à ajouter et 1 ligne à modifier dans le code :

 

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_.'features_position fp ON fp.id_feature = pf.id_feature

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 fp.position_feature ASC

');

Edited by misterphil (see edit history)
Link to comment
Share on other sites

  • 1 year later...

pour le BO, j'ai modifié la classe AdminProducts

(fichier admin/tabs/AdminProducts.php, fonction displayFormFeatures() )

 

pouru le FO, j'ai modifié la classe Product

(fichier classes/Product.php, fonction getFrontFeaturesStatic() )

svp donne mois le code de modification

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...