Bonjour,
Je suis un peut bloquer j'ai une table f_topic_tags qui sert de carrefour a mes tags, j'y ai un id, topic_id, user_id, tag_id.
j'utilise Choices qui permet de choisir mes tags la valeur est un int on peut choisir min 1 et max 4 tags.
ce name="tags[]" je dois le foreach avant l'envoie en bdd parce que c'est un tableau, jusqu'ici ça va, si c'est juste pour un insert pour un nouveau topic.
Là où ça se corse c'est que je voudrais bien édité les tags d'un topic et c'est un peut plus compliquer car je voudrais mêttre a jour seulement les tags qui on été modifié et si l'utilisateur avait choisis 1 tags et que maintenant il en met 2 de plus, il faudrais faire la mise a jour sauf pour le tag qui existe déjà ; Et aussi si il a choisis d'en supprimé et bien supprimé les tags qui on été retiré, sinon mon forum continuera de les listé.
Pour faire ça j'ai créer une class
https://github.com/neecride/Forum-Project/blob/main/src/Action/TagsAction.php
mais je ne suis pas du tout sur de moi j'ai pas envie de faire n'importe quoi, cette class dois servir a la fois pour un nouveau topic mais aussi pour un edite, tout ce joue sur la méthode fromTopicTags qui dois géré les autres méthodes private... il existe forcément des fonctions PHP que je ne connais pas.
/**
* UPDATE|INSERT les tags d'un topic donné dans la table topic_tags.
* @param int $topic_id ID du topic à mettre à jour.
* @param int $user_id ID de l'auteur | ajout plus tard l'id du modo ou admin qui éditera.
* @param array $tags Tableau contenant les nouveaux tags à associer au topic.
* @param bool $update si null on fais un insert si true on fais un update
* @return array Tableau contenant les ID des tags mis à jour.
*/
public function fromTopicTags(int $topic_id,int $user_id, array $tags,bool $update = NULL): array
{
$existing_topic_tags = $this->getExistingTopicTags($topic_id);
$updated_tags = array();
foreach ($tags as $tag) {
// Vérifier que le tag est un entier
if (is_int($tag) && count($updated_tags) <= 4)
{
if (!in_array($tag, $existing_topic_tags))
{
if (count($existing_topic_tags) <= 4) {
$this->deleteTopicTag($topic_id, $existing_topic_tags[0]);
array_shift($existing_topic_tags);
}
$this->saveTopicTag($topic_id, $user_id, $tag, $update);
$updated_tags[] = $tag;
}
}
}
return $updated_tags;
}
C'est le même système que sur Grafikart sauf que je n'ai pas de tags parent, c'est plus simple a maintenir.
Bonne journée.
EDIT
J'ai finalement réussit non sans mal, je viens de découvrir not in et les implode dans des req ce que je n'avais jamais fais.
Si toutefois vous avez un amélioration je prend.
La class fais sont taf elle supprime les tags que je retire du topic, ne change pas ceux qui reste, si je met a jour les tags elle supprime les anciens tags pour mettre les nouveaux.
https://github.com/neecride/Forum-Project/blob/main/src/Action/TagsAction.php
Cela dit j'espère qu'un bigint suffira