Search the Community
Showing results for tags 'plusieurs valeurs'.
-
Same topic in English Bon, je sais que le forum n'encourage pas les modifs du coeur de PrestaShop mais je crois que cette fonctionnalité manque vraiment à beaucoup de monde. Voici donc les modifications que j'ai effectué sur PS 1.4.8.2 pour pouvoir utiliser des caractéristiques à multiples valeurs : Pour PS v1.5.x voir ce post : http://www.prestasho...post__p__967310 Maintenant il existe également un module pour PS1.5.x http://www.prestasho...s-par-produits/ Merci à Flo_180 Tout d'abord il faut modifier la structure de la table ps_feature_product pour autoriser l’insertion de plusieurs lignes avec les mêmes id_feature et id_product. (je suppose ici que le préfixe de vos tables est "ps", sinon il suffit de remplacer ps par votre préfixe) - Accédez à votre base de donnée via phpmyadmin, et affichez la structure de la table ps_feature_product - Dans la zone Index, supprimez la caractéristique PRIMERY des champs id_feature et id_product. - Si la zone index n'apparait pas, cliquez sur l'onglet SQL et exécutez la commande : ALTER TABLE ps_feature_product DROP PRIMARY KEY Maintenant votre base de données est prête à recevoir plusieurs valeurs pour une même caractéristique. Ensuite il faut modifier le fichier AdminProducts.php qui se trouve dans le sous dossier tabs de votre répertoire admin. Éditez le fichier AdminProducts.php pour faire les modifications suivantes : Dans la fonction postProcess, ligne 668 (pour PS 1.4.8.2, peut-être une autre ligne pour une autre version...) Remplacez : if ($val) $product->addFeaturesToDB($match[1], $val); Par : if ($val && $val[0] != 0) foreach ($val AS $feature_val) $product->addFeaturesToDB($match[1], $feature_val); La variable $val sera devenu un tableau contenant les différentes valeurs de la caractéristique. On va donc ajouter une ligne pour chacune de ces valeurs dans la table ps_feature_product. Dans la fonction displayFormFeatures (ligne 3578 - PS 1.4.8.2) Remplacez : foreach ($feature AS $tab_features) { $current_item = false; $custom = true; foreach ($obj->getFeatures() as $tab_products) if ($tab_products['id_feature'] == $tab_features['id_feature']) $current_item = $tab_products['id_feature_value']; $featureValues = FeatureValue::getFeatureValuesWithLang((int)$cookie->id_lang, (int)$tab_features['id_feature']); echo ' <tr> <td>'.$tab_features['name'].'</td> <td style="width: 30%">'; if (sizeof($featureValues)) { echo ' <select id="feature_'.$tab_features['id_feature'].'_value" name="feature_'.$tab_features['id_feature'].'_value" onchange="$(\'.custom_'.$tab_features['id_feature'].'_\').val(\'\');"> <option value="0">--- </option>'; foreach ($featureValues AS $value) { if ($current_item == $value['id_feature_value']) $custom = false; echo '<option value="'.$value['id_feature_value'].'"'.(($current_item == $value['id_feature_value']) ? ' selected="selected"' : '').'>'.substr($value['value'], 0, 40).(Tools::strlen($value['value']) > 40 ? '...' : '').' </option>'; } echo '</select>'; } else echo '<input type="hidden" name="feature_'.$tab_features['id_feature'].'_value" value="0" /><span style="font-size: 10px; color: #666;">'.$this->l('N/A').' - <a href="index.php?tab=AdminFeatures&addfeature_value&id_feature='.(int)$tab_features['id_feature'].'&token='.Tools::getAdminToken('AdminFeatures'.(int)(Tab::getIdFromClassName('AdminFeatures')).(int)($cookie->id_employee)).'" style="color: #666; text-decoration: underline;">'.$this->l('Add pre-defined values first').'</a></span>'; echo ' </td> <td style="width:40%" class="translatable">'; $tab_customs = ($custom ? FeatureValue::getFeatureValueLang($current_item) : array()); foreach ($this->_languages as $language) echo ' <div class="lang_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $this->_defaultFormLanguage ? 'block' : 'none').'; float: left;"> <textarea class="custom_'.$tab_features['id_feature'].'_" name="custom_'.$tab_features['id_feature'].'_'.$language['id_lang'].'" cols="40" rows="1" onkeyup="if (isArrowKey(event)) return ;$(\'#feature_'.$tab_features['id_feature'].'_value\').val(0);" >'.htmlentities(Tools::getValue('custom_'.$tab_features['id_feature'].'_'.$language['id_lang'], FeatureValue::selectLang($tab_customs, $language['id_lang'])), ENT_COMPAT, 'UTF-8').'</textarea> </div>'; echo ' </td> </tr>'; } Par : foreach ($feature AS $tab_features) { $current_item = false; $custom = true; foreach ($obj->getFeatures() as $tab_products) if ($tab_products['id_feature'] == $tab_features['id_feature']) $current_item[] = $tab_products['id_feature_value']; $featureValues = FeatureValue::getFeatureValuesWithLang((int)$cookie->id_lang, (int)$tab_features['id_feature']); echo ' <tr> <td>'.$tab_features['name'].'</td> <td style="width: 30%">'; if (sizeof($featureValues)) { echo '<div style="width:200px;max-height:200px;margin:4px 0px;padding:2px;border:1px solid #e0d0b1;overflow: auto;text-align:left;">'; if (!$current_item) $current_item[0] = null; foreach ($featureValues AS $value) if (in_array($value['id_feature_value'], $current_item)) $custom = false; echo '<input type="checkbox" style="display:none;" name="feature_'.$tab_features['id_feature'].'_value[]" id="feature_'.$tab_features['id_feature'].'_value" value="" '.($custom ? 'checked="checked"' : '').'/>'; foreach ($featureValues AS $value) { echo '<label style="padding:2px;text-align:left;cursor:pointer;width:98%;'.((in_array($value['id_feature_value'], $current_item)) ? 'background-color:#acd8fe;' : '').'"> <input type="checkbox" name="feature_'.$tab_features['id_feature'].'_value[]" class="feature_'.$tab_features['id_feature'].'_value" value="'.$value['id_feature_value'].'"'.((in_array($value['id_feature_value'], $current_item)) ? ' checked="checked"' : '') .'onchange="$(\'.custom_'.$tab_features['id_feature'].'_\').val(\'\'); $(\'#feature_'.$tab_features['id_feature'].'_value\').attr(\'checked\', false); if ($(this).attr(\'checked\')) $(this).closest(\'label\').css(\'background-color\', \'#acd8fe\'); else $(this).closest(\'label\').css(\'background-color\', \'#ffffff\');"> ' .substr($value['value'], 0, 40).(Tools::strlen($value['value']) > 40 ? '...' : '').' </label><br />'; } echo '</div>'; } else echo '<input type="hidden" name="feature_'.$tab_features['id_feature'].'_value" value="0" /><span style="font-size: 10px; color: #666;">'.$this->l('N/A').' - <a href="index.php?tab=AdminFeatures&addfeature_value&id_feature='.(int)$tab_features['id_feature'].'&token='.Tools::getAdminToken('AdminFeatures'.(int)(Tab::getIdFromClassName('AdminFeatures')).(int)($cookie->id_employee)).'" style="color: #666; text-decoration: underline;">'.$this->l('Add pre-defined values first').'</a></span>'; echo ' </td> <td style="width:40%" class="translatable">'; $tab_customs = ($custom ? FeatureValue::getFeatureValueLang($current_item[0]) : array()); foreach ($this->_languages as $language) echo ' <div class="lang_'.$language['id_lang'].'" style="display: '.($language['id_lang'] == $this->_defaultFormLanguage ? 'block' : 'none').'; float: left;"> <textarea class="custom_'.$tab_features['id_feature'].'_" name="custom_'.$tab_features['id_feature'].'_'.$language['id_lang'].'" cols="40" rows="1" onkeyup="if (isArrowKey(event)) return; $(\'#feature_'.$tab_features['id_feature'].'_value\').attr(\'checked\', true); $(\'.feature_'.$tab_features['id_feature'].'_value\').attr(\'checked\', false); $(\'.feature_'.$tab_features['id_feature'].'_value\').closest(\'label\').css(\'background-color\', \'#ffffff\');" >' .htmlentities(Tools::getValue('custom_'.$tab_features['id_feature'].'_'.$language['id_lang'], FeatureValue::selectLang($tab_customs, $language['id_lang'])), ENT_COMPAT, 'UTF-8').'</textarea> </div>'; echo ' </td> </tr>'; } La variable $current_item est transformée en tableau et récupère les différentes valeurs enregistrées de la caractéristique. La zone de sélection est remplacée par une liste avec des cases à cocher dont les valeurs seront récupérées par la fonction postProcess modifiée précédemment. Maintenant vous pouvez sélectionner plusieurs valeurs pour vos caractéristiques en cliquant sur les valeurs désirées. Pour ceux qui sont sous PS 1.4.8.2, voici mon fichier AdminProducts.php modifié : AdminProducts.php Toujours pour PS 1.4.8.2, voici les fichiers ProductController.php et CompareController.php, à AJOUTER dans /override/controllers/ pour corriger l'affichage des caractéristiques à valeurs multiples dans la fiche produit et dans la comparaison de produits (voir captures d'écrans) ProductController.php CompareController.php Si vous êtes sur une autre version de prestashop ou si vous avez déjà ces fichiers dans votre dossier override, ouvrez les fichiers et repérez le code à changer pour effectuer vous-même les modifs sur vos fichiers (les modifs sont commentés) J'ai fais beaucoup d'essais sur un site que je développe en local, et tout semble fonctionner sans problème. - La navigation à facettes prend bien en compte ces valeurs de caractéristiques multiples, sans aucune modif suplémentaire - On peut toujours entrer des caractéristiques personnalisées (non gérées par la navigation à facettes) - Avec les deux fichiers override joints, les caractéristiques à plusieurs valeurs s'affichent correctement dans la fiche technique produit et dans la comparaison de produits. Voila, je pense que cette modif pourra intéresser pas mal de monde... Mais, malgré tous mes essais, il est toujours possible que cette modification interfère avec d'autres parties du code, alors si vous rencontrez des problèmes faites le savoir ici.
- 106 replies
-
- caracteristique
- plusieurs valeurs
- (and 4 more)