En utilisant la documentation Joomla, on peut trouver comment insérer, mettre à jour ou supprimer des données à l'aide de JDatabase avec du code php.
Il est donc possible de 'jouer' avec les tables de la base de données Joomla de manière totalement personnalisée pour ajouter des fonctionnalités. J'utilise cela assez souvent et je peux donner des exemples si cela est nécessaire pour mieux comprendre ma question.
Pour permettre l'exécution du code, j'utilise LM-Custom, mais d'autres solutions existent.
Néanmoins, je bute sur un problème : Certaines tables sont organisées selon un 'Nested Set Model' (je ne sais pas comment il faut traduire en français).
On trouve plusieurs pages qui expliquent cela très bien, dont celle-ci.
Cette organisation est pertinente pour les catégories d'articles, les groupes d'utilisateurs, etc. En pratique, dans les tables correspondantes, on trouve en plus des champs 'id', 'title', 'alias' habituels deux champs 'lft' et 'rgt' (pour 'left' et 'right', évidemment). Cette hierarchisation est très pratique pour permettre de retrouver tous les enfants d'une catégorie mère par exemple.
MAIS : Lorsque l'on veut rajouter ou supprimer une catégorie (ou un groupe d'utilisateurs, c'est ce cas qui m'intéresse), cela oblige à décaler ces valeurs pour la quasi-totalité des entrées de la table.
Je donne un exemple quand même, pour être compréhensible : Imaginons que deux sous-groupes du groupe Registered ont été créés. On a alors la table 'usergroups' suivante :
Cette hiérarchisation indique que tous les groupes enfants de Registered ont une valeur lft>8 et une valeur rgt<19
Quand on va rajouter un Sous-groupe3, cet ajout va "pousser" chacun des groupes parents (public, registered) et on va obtenir :
Les autres groupes (Super Users, Public,...) seront décalés aussi. C'est compréhensible, donc c'est codable, mais fastidieux. Et une erreur peut mettre par terre toute l'architecture de la table, rendant le site inutilisable.
Il semble y avoir une méthode pour réaliser cet ajout proprement (décrite ici), mais je ne parviens pas à la mettre en oeuvre.
Pour juste tenter de rajouter un groupe enfant de Registered, en m'inspirant de la partie 'Adding a new node', je tente :
<?php
$data_array = array(
$title->quote('GroupeEnfant')
);
$table = JTable::getInstance('#__usergroups');
$table->setLocation(2, 'last-child');
$table->bind($data_array);
$table->id = 0;
$table->check();
$table->store();
?>
J'obtiens une belle erreur 0 : Call to a member function setLocation() on bool
Qu'est-ce que je rate?
Note : Version de Joomla 5.1.0 ; php 8.2.20
Il est donc possible de 'jouer' avec les tables de la base de données Joomla de manière totalement personnalisée pour ajouter des fonctionnalités. J'utilise cela assez souvent et je peux donner des exemples si cela est nécessaire pour mieux comprendre ma question.
Pour permettre l'exécution du code, j'utilise LM-Custom, mais d'autres solutions existent.
Néanmoins, je bute sur un problème : Certaines tables sont organisées selon un 'Nested Set Model' (je ne sais pas comment il faut traduire en français).
On trouve plusieurs pages qui expliquent cela très bien, dont celle-ci.
Cette organisation est pertinente pour les catégories d'articles, les groupes d'utilisateurs, etc. En pratique, dans les tables correspondantes, on trouve en plus des champs 'id', 'title', 'alias' habituels deux champs 'lft' et 'rgt' (pour 'left' et 'right', évidemment). Cette hierarchisation est très pratique pour permettre de retrouver tous les enfants d'une catégorie mère par exemple.
MAIS : Lorsque l'on veut rajouter ou supprimer une catégorie (ou un groupe d'utilisateurs, c'est ce cas qui m'intéresse), cela oblige à décaler ces valeurs pour la quasi-totalité des entrées de la table.
Je donne un exemple quand même, pour être compréhensible : Imaginons que deux sous-groupes du groupe Registered ont été créés. On a alors la table 'usergroups' suivante :
title | id | lft | rgt |
Registered | 2 | 8 | 19 |
Sous-Groupe1 | 10 | 15 | 16 |
Sous-Groupe2 | 11 | 17 | 18 |
Quand on va rajouter un Sous-groupe3, cet ajout va "pousser" chacun des groupes parents (public, registered) et on va obtenir :
title | id | lft | rgt |
Registered | 2 | 8 | 21 |
Sous-Groupe1 | 10 | 15 | 16 |
Sous-Groupe2 | 11 | 17 | 18 |
Sous-Groupe3 | 12 | 19 | 20 |
Il semble y avoir une méthode pour réaliser cet ajout proprement (décrite ici), mais je ne parviens pas à la mettre en oeuvre.
Pour juste tenter de rajouter un groupe enfant de Registered, en m'inspirant de la partie 'Adding a new node', je tente :
<?php
$data_array = array(
$title->quote('GroupeEnfant')
);
$table = JTable::getInstance('#__usergroups');
$table->setLocation(2, 'last-child');
$table->bind($data_array);
$table->id = 0;
$table->check();
$table->store();
?>
J'obtiens une belle erreur 0 : Call to a member function setLocation() on bool
Qu'est-ce que je rate?
Note : Version de Joomla 5.1.0 ; php 8.2.20
Commentaire