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

3 réponses


Puisque tu fais déjà deux requêtes actuellement tu pourrais simplifier un peu et :

  1. supprimer tous les tags du topic
  2. ajouter ceux envoyés par le formulaire

Ensuite, RAV mais dans cette boucle tu fais une requête par tag quand tu fais $this->tagExists($tag) :

        foreach ($tags as $tag) 
        {
            //on insert que les nouveau tags
            if (!in_array($tag,$existingTags)) 
            {
                if($this->tagExists($tag)){
                    $this->cnx->Request("INSERT INTO f_topic_tags (topic_id, tag_id, user_id) VALUES (?, ?, ?)",[$topicId, $tag, $userID]);
                }
            }
        }

Tu pourrais plutôt récupérer les tags envoyés et qui sont existants :

$newAndValidTagIds = $this->cnx->Request("SELECT tag_id FROM f_topic_tags WHERE FIND_IN_SET(id, ?)", [implode(',', $tags)]);
foreach ($newAndValidTagIds as $tagId) {
    $this->cnx->Request("INSERT INTO f_topic_tags (topic_id, tag_id, user_id) VALUES (?, ?, ?)",[$topicId, $tagId, $userID]);
}

Tu pourrais même construire UNE requête mais tu n'as ptt pas beaucoup de tags pour que ça vaille le coup :

INSERT INTO f_topic_tags (topic_id, tag_id, user_id) VALUES
(1, 2, 3), (11, 21, 31), (31, 32, 33);
neecride
Auteur

Bonjour,

Désolé j'ai mis un peut de temps a répondre je suis en pleine compréhention du MVC du coup ça m'ouvre des portes, que j'ouvre avec plaisir, et je l'ai compris tout seul donc c'est que je commence a avoir une certaine logique.

Pour en revenir au sujet, je ne comprend pas ton abréviation RAV.

Je prend note de tes sugestions, pour l'instant je ne prend que 4 tags car c'est compliquer a maintenir puis en plus si je créer un tags PHP par exemple que les gens vont choisir pour leurs topic et si un jour je choisis de le supprimer il faudrai delete ou migré tout les sujets ouvert sur se tags précis, je m'aperçois que ça pourrais me rendre fou lol

RAV = rien à voir. :)

Dans le cas d'une suppression tu peux faire

DELETE FROM f_topic_tags where tag_id=:id

et zou :)

Ton sujet n'aura plus le tag et picétou.