Jump to content

Module: trier les caractéristiques?


HARVIE

Recommended Posts

Bonjour,

- Il existe un module pour trier les catégories (en drag'n'drop)
- Il existe un module pour trier les attributs et declinaisons (en drag'n'drop)

Mais existe-il un module pour trier les caractéristiques?

Merci,

Cordialement,

Hervé

Link to comment
Share on other sites

Bonjour,

Trier les caractéristiques reviendrait à court-circuiter l'utilisation des classes de Prestashop, je me suis donc plutôt penché sur la modification du Core de Prestashop et c'est faisable mais nécessite néanmoins des modifications importantes et à de multiples endroits, et aussi la modification d'une table (Feature).

Link to comment
Share on other sites

Bonjour,

Dans ce topic:
http://www.prestashop.com/forums/viewthread/36968/P0/discussion_generale/gestion_de_lordre_daffichage_des_caracteristiques

Codigo proposait une solution:

- avec même un groupe de caractéristiques(réponse #4)
- et les caractéristiques triées sur le Front mais aussi sur le Back (réponse #8)

J'ai testé cette solution pour le Front et ça fonctionne en faisant des modifs sur Product.php comme indiqué dans le topic. Maintenant je ne sais pas comment il a fait pour affiché les caractéristiques dans le BO comme sur les photos de la réponse #8

Tu en penses quoi?

Link to comment
Share on other sites

Je ne voyais pas ça comme ça, en effet dans cette solution, nous sommes devant ce que j'appelle "une rustine", cela fait ce qu'on lui demande mais bon... La solution que j'ai codé ce matin permet d'organiser les caractéristiques en Drag'n'Drop directement dans la liste des catégories, je trouve ça beaucoup plus propre. En attendant cette solution nécessite des modifications importantes...

Link to comment
Share on other sites

Détail des modifications à effectuer :

1 - Ajouter un champ dans la table Feature :

     
nom : featureOrder
type : INT
taille : 10
valeur par défaut : 99



2 - Modification du fichier "Feature.php" dans le dossier "Classes" :

Fonction getFields :
AVANT :

   
public function getFields()
{
   return array('id_feature' => NULL);
}



APRES :

public function getFields()
{
   //MODIFIY BY BVINCE
   return array('id_feature' => NULL, 'featureOrder' => intval($this->featureOrder));
}



Fonction getFeatures :

AVANT :

static public function getFeatures($id_lang)
{
   return Db::getInstance()->ExecuteS('
   SELECT *
   FROM `'._DB_PREFIX_.'feature` f
   LEFT JOIN `'._DB_PREFIX_.'feature_lang` fl ON (f.`id_feature` = fl.`id_feature` AND fl.`id_lang` = '.intval($id_lang).')
   ORDER BY fl.`name` ASC');
}



APRES :

static public function getFeatures($id_lang)
{
   //MODIFIY BY BVINCE
   return Db::getInstance()->ExecuteS('
   SELECT *
   FROM `'._DB_PREFIX_.'feature` f
   LEFT JOIN `'._DB_PREFIX_.'feature_lang` fl ON (f.`id_feature` = fl.`id_feature` AND fl.`id_lang` = '.intval($id_lang).')
   ORDER BY f.`featureOrder`, fl.`name` ASC');
}




3 - Modification du fichier "AdminFeatures.php" dans le dossier "admin/tabs/" :

Fonction __construct :

AVANT :

public function __construct()
{
   $this->adminFeaturesValues = new AdminFeaturesValues();
   $this->table = 'feature';
   $this->className = 'Feature';
   $this->lang = true;
   $this->edit = true;
   $this->delete = true;

   $this->fieldsDisplay = array(
       'name' => array('title' => $this->l('Name'), 'width' => 128),
       'value' => array('title' => $this->l('Values'), 'width' => 255, 'orderby' => false, 'search' => false));

   parent::__construct();
}



APRES :

public function __construct()
{
   $this->adminFeaturesValues = new AdminFeaturesValues();
   $this->table = 'feature';
   $this->className = 'Feature';
   $this->lang = true;
   $this->edit = true;
   $this->delete = true;
   $this->_defaultOrderBy = false;
   $this->_orderBy = "featureOrder";

   $this->fieldsDisplay = array(
       'featureOrder' => array('order' => $this->l('Order'), 'width' => 20, 'orderby' => false),
       'name' => array('title' => $this->l('Name'), 'width' => 128, 'orderby' => false),
       'value' => array('title' => $this->l('Values'), 'width' => 255, 'orderby' => false, 'search' => false));

   parent::__construct();
}



Fonction displayList:

Après

global $currentIndex;



Ajouter

//ADD BY BVINCE
if(isset($_POST['updateOrganization'])) {
   $tabOrganization = explode(",", $_POST['updateOrganization']);
   $i=1;
   foreach($tabOrganization as $k=>$organization) {
       $tabIdFeature = explode("_", $organization);
       $orderFeature = $tabIdFeature[1];
       Db::getInstance()->Execute('UPDATE '._DB_PREFIX_.'feature SET featureOrder='.$i.' WHERE id_feature='.$orderFeature);
       $i++;
   }
}
echo '';
echo '';
echo '
       function SortableElements() {
           $("#sortable").sortable({ opacity: 0.6, cursor: "move"});
           $("#sortable").disableSelection();                
       }
       $(function() {
           $("#sortable").sortable({ opacity: 0.6, cursor: "move", update: function() {
               $.ajax({
                   type: "POST",
                   async: true,
                   cache: false,
                   data: "updateOrganization="+$(this).sortable("toArray")
               });

           [spam-filter]);
           $("#sortable").disableSelection();
       });
';
//***************


Pensez à remettre le mot SCRIPT dans le bon sens, je l'ai écris à l'envers pour pas qu'il soit shooté par le forum
A suivre...

Link to comment
Share on other sites

Repérer le code

foreach ($this->_list AS $tr)
{
   $id = intval($tr['id_'.$this->table]);
    echo '

<input type="checkbox" name="'.$this->table.'Box[]" value="'.$id.'" class="noborder" />
'.$tr['name'].'


<input type="checkbox" name="checkme" class="noborder"></th>
'.$this->l('Value').''.$this->l('Actions').'<input type="checkbox" name="feature_value'.$id.'Box[]" value="'.$feature['id_feature_value'].'" class="noborder" /></td>
'.$feature['value'].'
token.'">
l('Edit').'" title="'.$this->l('Edit').'" /> 
token.'"
                       onclick="return confirm(\''.$this->l('Delete value', __CLASS__, true, false).' #'.$feature['id_feature_value'].'?\');">
l('Delete').'" title="'.$this->l('Delete').'" />
'.$this->l('No values defined').'

<input type="Submit" class="button" name="submitDelfeature_value" value="'.$this->l('Delete selection').'"
           onclick="changeFormParam(this.form, \'?tab=AdminFeatures\', '.$id.'); return confirm(\''.$this->l('Delete selected items?', __CLASS__, true, false).'\');" />

';

   echo '

table.'='.$id.'&update;'.$this->table.'&token;='.$this->token.'">
l('Edit').'" title="'.$this->l('Edit').'" /> 
table.'='.$id.'&delete;'.$this->table.'&token;='.$this->token.'" onclick="return confirm(\''.$this->l('Delete item', __CLASS__, true, false).' #'.$id.'?\');">
l('Delete').'" title="'.$this->l('Delete').'" />

';
}



A suivre...

Link to comment
Share on other sites

et le remplacer par ceci :

>
//MODIFIY BY BVINCE
echo '';
echo '</pre>
<ul>';
foreach ($this->_list AS $tr)
{
   $id = intval($tr['id_'.$this->table]);
   $order = intval($tr['featureOrder']);
    echo '

<input type="checkbox" name="'.$this->table.'Box[]" value="'.$id.'" class="noborder" />'.$tr['name'].'

<input type="checkbox" name="checkme" class="noborder"></th>
'.$this->l('Value').''.$this->l('Actions').'<input type="checkbox" name="feature_value'.$id.'Box[]" value="'.$feature['id_feature_value'].'" class="noborder" /></td>
'.$feature['value'].'
token.'">
l('Edit').'" title="'.$this->l('Edit').'" /> 
token.'"
                       onclick="return confirm(\''.$this->l('Delete value', __CLASS__, true, false).' #'.$feature['id_feature_value'].'?\');">
l('Delete').'" title="'.$this->l('Delete').'" />
'.$this->l('No values defined').'

<input type="Submit" class="button" name="submitDelfeature_value" value="'.$this->l('Delete selection').'"
           onclick="changeFormParam(this.form, \'?tab=AdminFeatures\', '.$id.'); return confirm(\''.$this->l('Delete selected items?', __CLASS__, true, false).'\');" />


table.'='.$id.'&update;'.$this->table.'&token;='.$this->token.'">
l('Edit').'" title="'.$this->l('Edit').'" /> 
table.'='.$id.'&delete;'.$this->table.'&token;='.$this->token.'" onclick="return confirm(\''.$this->l('Delete item', __CLASS__, true, false).' #'.$id.'?\');">
l('Delete').'" title="'.$this->l('Delete').'" />

';
}
echo '</ul>';<br>echo '';<br>//******************************



A suivre...

Link to comment
Share on other sites

3 - Modification du fichier "Product.php" dans le dossier "Classes" :

Fonction getFrontFeaturesStatic:

AVANT :

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



APRES :

static public function getFrontFeaturesStatic($id_lang, $id_product)
{
   //MODIFIY BY BVINCE
   return Db::getInstance()->ExecuteS('
   SELECT name, value, pf.id_feature
   FROM '._DB_PREFIX_.'feature_product pf
   LEFT JOIN '._DB_PREFIX_.'feature f ON (f.id_feature = pf.id_feature) 
   INNER 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 f.`featureOrder` ASC');

}



4 - Modification du fichier "AdminTab.php" dans le dossier "Classes" :

Fonction getList:

Trouver la ligne :

$this->_orderBy = $orderBy;



la remplacer par :

if($this->_orderBy)
   $orderBy = $this->_orderBy;
else
   $this->_orderBy = $orderBy;



Il faut aussi ajouter les 2 fichier js ci-joint et les mettre dans votre dossier js/ puis transférer l'image move.png dans le dossier img/admin/ de votre site.
Et voilà, je crois que j'ai tout mis, je pense néanmoins que ce n'est pas à faire directement sur le serveur en production.

!!!!! THE END !!!!!

js.zip

32239_KO2Tb9jQm9eQKIBmTeMJ_t

Link to comment
Share on other sites

Bonsoir,

Cette modification de code est-elle compatible avec PS 1.3.1.1?

J'ai adapté tout le code, mais la page caractéristique est complètement vide. Pas de message d'erreur.

Aurais-je oublié qqch?

Merci pour votre retour.

Sho


... C'est dommage de Prestashop n'a pas intégré cela de base, car il y a des centaines d'utilisateurs comme moi qui utilisent énormément de caractéristiques (shop computer et Télécoms)

Link to comment
Share on other sites

  • 2 months later...

Bonjour,

je viens de faire les manips, j'ai une page vide dans l'onglet "Caractéristiques" du Catalogue... Les caractéristiques des fiches techniques sont encore plus désordonnées qu'avant.

J'ai vérifié mes manips, mais je ne vois pas. Je suis en 1.3.3.0.

Je vais prendre l'air...

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...