Comment associer automatiquement toutes les catégories à un nouveau groupe client sur PrestaShop 1.7
Vous ne le savez peut-être pas, mais lorsque vous créez un nouveau groupe client sur Prestashop, celui-ci n'aura accès à aucune catégorie, il faudra vous rendre dans chaque catégorie pour lui associer ce nouveau groupe.
Pour être franc, cela semble être une aberration, mais cela existe depuis toujours.
Je crois qu'une prochaine version de Prestashop 1.7 intégrera cette fonctionnalité mais à la date du jour, rien n'est fait.
Voici donc une interprétation de la solution proposée par Eolia à l'époque de Prestashop 1.6 pour la version 1.7 de PrestaShop.
Le résultat attendu
Ce que l'on souhaite faire à l'aide de ce tutoriel, c'est de simplement ajouter un switch sur la page de création d'un groupe client pour qu'à l'enregistrement ce nouveau groupe soit associé à toutes les catégories présentes dans le catalogue.
Voici visuellement ce que vous allez obtenir
La méthode pour l'obtenir
Nous allons intervenir que sur un seul fichier : controllers/admin/AdminGroupsController.php
Je n'ai pas pris le parti de faire un override du controller car il faut intégrer tout le code des fonctions appelées ce qui, même si cela est plus propre à l'avenir, n'apporte pas grand-chose ici.
La création du switch
Nous allons dans un premier temps intégrer le code pour créer ce nouveau switch de choix.
Vous devez intégrer ce code dans l'appel fait des input dans la fonction renderForm()
.
Personnellement, je l'ai ajouté après le switch d'affichage des prix donc après l'input portant le nom show_price.
[
'type' => 'switch',
'label' => $this->trans('Assign to all catégories', [], 'Admin.Shopparameters.Feature'),
'name' => 'all_cat',
'required' => false,
'class' => 't',
'is_bool' => true,
'values' => [
[
'id' => 'all_cat_on',
'value' => 1,
'label' => $this->trans('Yes', [], 'Admin.Global'),
],
[
'id' => 'all_cat_off',
'value' => 0,
'label' => $this->trans('No', [], 'Admin.Global'),
],
],
'desc' => $this->trans('Members of this group will have access to all categories.', [], 'Admin.Shopparameters.Help'),
],
L'enregistrement
La seconde partie sera d'enregistrer l'information du choix de l'association à toutes les catégories de ce groupe puis de sélectionner toutes les catégories et de réellement les associer au groupe.
Dit rapidement c'est compliqué, mais à faire si on part comme l'a intelligemment fait Eolia on retombe vite sur nos pâtes.
Lors de la fonction déjà présente dans le code source processSave(), on ajoute l'appel à une nouvelle fonction access_all() à laquelle on associe l'object définissant le nouveau groupe.
$this->access_all_cat($object);
De là on crée une requête SQL permettant d'associer en une ligne toutes les catégories à un groupe ou plus précisément, un groupe à toutes les catégories.
public function access_all_cat($group)
{
$id_group = (int)$group->id;
$assign_to_all = (bool)Tools::getValue('all_cat');
if ($assign_to_all && $id_group) {
Db::getInstance()->execute(
'INSERT IGNORE INTO `'._DB_PREFIX_.'category_group` (id_category, id_group)
SELECT DISTINCT id_category, '.$id_group.'
FROM `'._DB_PREFIX_.'category`
WHERE id_parent != 0'
);
}
}
Conclusion
L'intérêt primaire de cette solution, outre sa simplicité, c'est qu'elle permet d'améliorer PrestaShop sans empêcher de conserver le fonctionnement de base de la solution, elle laisse le choix et c'est la meilleure des solutions à mon avis.
Discussions