On construit, vous explorez : une nouvelle expérience de support est en route…
Plongez dès maintenant dans notre nouvelle base de connaissances en avant-première !
Nous souhaitons ajouter une colonne qui reprend les valeurs personnalisées d'une caractéristique pour les produits affichés dans la grille des produits.
Nous pourrons ainsi afficher et modifier le texte de la valeur personnalisée des produits.
Pour ajouter le champ à la liste des champs disponibles pour vos grilles produit, cliquez sur le bouton
de l'interface "Ajout de champ", puis saisissez les informations suivantes :
Quel est l'ID du champ ? : myfeature
SC crée le champ, il faut maintenant renseigner dans la grille :
Nom du champ : Auteur
Table : Another table
Type : Modifiable
Rafraîchir les déclinaisons : Non
Dans le panneau des Propriétés Avancées à droite :
- sélectionner le menu SQL Select et renseignez :
return ' , (SELECT fvl_cus.value
FROM `' . _DB_PREFIX_ . 'feature_product` fp1_cus
INNER JOIN `' . _DB_PREFIX_ . 'feature_value_lang` fvl_cus ON (fp1_cus.id_feature_value = fvl_cus.id_feature_value)
WHERE fp1_cus.id_feature = "36"
AND fp1_cus.id_product = p.id_product
AND fvl_cus.id_lang = pl.id_lang
LIMIT 1) as myfeature';
- sélectionner le menu PHP onAfterUpdateSQL et renseignez :
if (isset($_POST['myfeature'])) {
$feature_value = Tools::getValue('myfeature');
$sql = 'SELECT * FROM ' . _DB_PREFIX_ . 'feature_product WHERE id_product=' . (int)$idproduct . ' AND id_feature=36';
$res = Db::getInstance()->executeS($sql);
if ($res) {
// Le produit a déjà une valeur pour cette caractéristique
if ($feature_value) {
// ====== MODIFICATION : on supprime l'ancienne et on crée une nouvelle ======
// Vérifier si la valeur actuelle est custom
$sql = 'SELECT custom FROM ' . _DB_PREFIX_ . 'feature_value WHERE id_feature_value=' . (int)$res[0]['id_feature_value'];
$isCustom = Db::getInstance()->getValue($sql);
// Supprimer l'association produit <-> valeur
$sql = 'DELETE FROM ' . _DB_PREFIX_ . 'feature_product WHERE id_product=' . (int)$idproduct . ' AND id_feature=36';
Db::getInstance()->execute($sql);
// Si c'était une valeur custom, vérifier si elle est encore utilisée ailleurs
if ($isCustom) {
$sql = 'SELECT COUNT(*) FROM ' . _DB_PREFIX_ . 'feature_product WHERE id_feature_value=' . (int)$res[0]['id_feature_value'];
$usageCount = Db::getInstance()->getValue($sql);
// Si elle n'est plus utilisée, la supprimer
if ($usageCount == 0) {
$sql = 'DELETE FROM ' . _DB_PREFIX_ . 'feature_value WHERE id_feature_value=' . (int)$res[0]['id_feature_value'];
Db::getInstance()->execute($sql);
$sql = 'DELETE FROM ' . _DB_PREFIX_ . 'feature_value_lang WHERE id_feature_value=' . (int)$res[0]['id_feature_value'];
Db::getInstance()->execute($sql);
}
}
// Créer une NOUVELLE valeur custom
$sql = 'INSERT INTO ' . _DB_PREFIX_ . 'feature_value (id_feature,custom) VALUES (36,1)';
if (Db::getInstance()->execute($sql)) {
$id_value = Db::getInstance()->Insert_ID();
// Insérer pour toutes les langues actives
$languages = Language::getLanguages(false);
foreach ($languages as $lang) {
$sql = 'INSERT INTO ' . _DB_PREFIX_ . 'feature_value_lang (id_feature_value,id_lang,value)
VALUES (' . (int)$id_value . ',' . (int)$lang['id_lang'] . ',"' . pSQL($feature_value) . '")';
Db::getInstance()->execute($sql);
}
// Associer au produit
$sql = 'INSERT INTO ' . _DB_PREFIX_ . 'feature_product (id_feature,id_product,id_feature_value)
VALUES (36,' . (int)$idproduct . ',' . (int)$id_value . ')';
Db::getInstance()->execute($sql);
}
} else {
// ====== SUPPRESSION : vérifier si la valeur custom est encore utilisée ======
$sql = 'SELECT custom FROM ' . _DB_PREFIX_ . 'feature_value WHERE id_feature_value=' . (int)$res[0]['id_feature_value'];
$isCustom = Db::getInstance()->getValue($sql);
$sql = 'DELETE FROM ' . _DB_PREFIX_ . 'feature_product WHERE id_product=' . (int)$idproduct . ' AND id_feature=36';
if (Db::getInstance()->execute($sql) && $isCustom) {
// Vérifier si la valeur custom est encore utilisée ailleurs
$sql = 'SELECT COUNT(*) FROM ' . _DB_PREFIX_ . 'feature_product WHERE id_feature_value=' . (int)$res[0]['id_feature_value'];
$usageCount = Db::getInstance()->getValue($sql);
if ($usageCount == 0) {
$sql = 'DELETE FROM ' . _DB_PREFIX_ . 'feature_value WHERE id_feature_value=' . (int)$res[0]['id_feature_value'];
if (Db::getInstance()->execute($sql)) {
$sql = 'DELETE FROM ' . _DB_PREFIX_ . 'feature_value_lang WHERE id_feature_value=' . (int)$res[0]['id_feature_value'];
Db::getInstance()->execute($sql);
}
}
}
}
} elseif ($feature_value) {
// ====== CRÉATION : créer une nouvelle valeur custom ======
$sql = 'INSERT INTO ' . _DB_PREFIX_ . 'feature_value (id_feature,custom) VALUES (36,1)';
if (Db::getInstance()->execute($sql)) {
$id_value = Db::getInstance()->Insert_ID();
// Insérer pour toutes les langues actives
$languages = Language::getLanguages(false);
foreach ($languages as $lang) {
$sql = 'INSERT INTO ' . _DB_PREFIX_ . 'feature_value_lang (id_feature_value,id_lang,value)
VALUES (' . (int)$id_value . ',' . (int)$lang['id_lang'] . ',"' . pSQL($feature_value) . '")';
Db::getInstance()->execute($sql);
}
$sql = 'INSERT INTO ' . _DB_PREFIX_ . 'feature_product (id_feature,id_product,id_feature_value)
VALUES (36,' . (int)$idproduct . ',' . (int)$id_value . ')';
Db::getInstance()->execute($sql);
}
}
}
On prend ici la caractéristique ID 36. Vous pouvez changer de caractéristique en allant chercher l'ID voulu dans la fenêtre des caractéristiques (menu Catalogue > Caractéristiques de SC).
Fermez la fenêtre d'édition des champs personnalisés.
Le nouveau champ est présent dans la liste des champs disponibles, et vous pouvez l'ajouter à vos grilles produits.