[bogue][nextIdCategory()] L'ajout catégorie dans édition article, peut en écraser une autre.

18 avril modifié dans Bogues

Bonjour,

je viens de remarqué un bogue lorsque l'on ajoute une catégorie a partir de la page d'édition d'un article, celle-ci peut remplacer une catégorie existante.

Pour reproduire ce bug.

  • réorganiser le sens d'affichage des catégories sans mettre la dernière catégorie en dernier (a partir de la page catégorie.php).
  • édité ou crée un article sans l'enregistrer,mais ajouter une nouvelle catégorie (à partir de la page article.php).

Cette nouvelle catégorie prendra invariablement le N° + 1 de la dernière catégorie affiché dans le tableau catégorie , si cette dernière de votre liste est la numéro 3 et que vous avez 5 catégories, vous aurez toujours 5 catégorie et la numéro quatre aura été simplement éditer.

si ce bug est déjà connu et documenter, merci de me rediriger vers le(s) sujet(s) le mentionnant.

Pour Infos, défaut logique provenant de

    /**
     *  Méthode qui retourne le prochain id d'une catégorie
     *
     * @return  string  id d'un nouvel article sous la forme 001
     * @author  Stephane F.
     **/
    public function nextIdCategory() {
        if(is_array($this->aCats)) {
            $idx = key(array_slice($this->aCats, -1, 1, true));
            return str_pad($idx+1,3, '0', STR_PAD_LEFT);
        } else {
            return '001';
        }
    }

dans class.plx.admin.php , sans hook, impossible d'effectuer une correction au bon endroit sans toucher aux entrailles de PluXml.

Le premier hook dispo plxAdminEditCategoriesNew est déjà trop loin dans le deroulé du script où un

$cat_id = str_pad(count(array_column($this->aCats, null))+1,3, '0', STR_PAD_LEFT);

aurait pu être efficace à la place du

$cat_id = $this->nextIdCategory();

Cdt

Edit: Je me demande si finalement cette fonction est utile car utilisée uniquement dans ce cas .

covid-19 ... ça laisse des traces

Réponses

  • bazooka07bazooka07 Member
    17 avril modifié

    Bonjour,

    Effectivement il y a un petit souci et il passe sous les radars depuis des lustres ou versions de PluXml.
    Pas de panique, rien de bien grave. Voici la solution à intégrer dans la prochaine mise à jour de PluXml :

        public function nextIdCategory() {
            if(is_array($this->aCats) and count($this->aCats) > 0) {
                $catIds = array_keys($this->aCats);
                rsort($catIds);
                return str_pad(intval($catIds[0]) + 1, 3, '0', STR_PAD_LEFT);
            } else {
                return '001';
            }
        }
    

    Merci pour le retour.

    Note qu'il n'y a pas ce souci. Juste à incrémenter une valeur numérique pour être rigoureux :

        public function nextIdArticle() {
    
            if($aKeys = array_keys($this->plxGlob_arts->aFiles)) {
                rsort($aKeys);
                return str_pad(intval($aKeys['0']) + 1, 4, '0', STR_PAD_LEFT);
            } else {
                return '0001';
            }
        }
    

    Et en croisant les doigts pour que $this->plxGlob_arts->aFiles soit toujours un tableau

    Pull-Request #534

  • Merci,
    Cela règle bien le soucis au premier abord, mais c'est peut-être encore boiteux, car si entre-temps on retire(delete) une catégorie, celle-ci laisse un trou dans les numéros de catégories et le dernier numéro de catégorie peut être supérieur au nombre de catégories elle-même :(

    Peut-être que finalement, rechercher le dernier numéro de catégorie serait plus judicieux. Remplir les trous n'est probablement pas une bonne idée :).

    Merci pour nous en tous cas.

    Cdt,
    GC

    covid-19 ... ça laisse des traces

  • bazooka07bazooka07 Member
    18 avril modifié

    Bonjour,
    Les catégories peuvent se numéroter jusqu'à 999. Cela laisse le temps de voir venir.

    Par contre, supprimer une catégorie peut, peut-être, poser un problème côté site quand on affiche les catégories d'un article. A vérifier.

    La fonction plxShow::artCat() pose un petit souci.
    En supposant qu'un article soit classé dans plusieurs catégories, disons 3 par exemple, et qu'on supprime 2 de ces catégories. Alors on affiche 2 fois "non classé" et la catégorie encore existante.
    Cela fait un peu bizarre.

  • Oui effectivement,
    le plus simple serait d’empêcher d'effacer une catégorie tant que des articles lui sont rattachés.

    covid-19 ... ça laisse des traces

  • C'est un peu contraignant. A la limite, on affiche un avertissement si une catégorie à supprimer contient au moins un article.

    Il suffit de corriger plxShow::artCat() :

        public function artCat($separator = ', ')
        {
    
            $cats = array();
            foreach ($this->artActiveCatIds() as $idx => $catId) {
                # On valide si la categorie est "home"
                if ($catId == 'home') {
                    $href = '';
                    $name = L_HOMEPAGE;
                    $className = 'active';
                    $cats[] = '<a class="active" href="' . $this->plxMotor->urlRewrite() . '" title="' . L_HOMEPAGE . '">' . L_HOMEPAGE . '</a>';
                } elseif(isset($this->plxMotor->aCats[$catId])) {
                    # La catégorie existe. On en récupère les infos
                    $name = plxUtils::strCheck($this->plxMotor->aCats[$catId]['name']);
                    $url = $this->plxMotor->aCats[$catId]['url'];
                    $href = '?categorie' . intval($catId) . '/' . $url;
                    $active = (
                        $this->plxMotor->mode == 'categorie' and
                        isset($this->plxMotor->aCats[$this->plxMotor->cible]['url']) and
                        $url == $this->plxMotor->aCats[$this->plxMotor->cible]['url']
                    );
                    $className = $active ? 'active' : 'noactive';
                } else {
                    # Rien à faire
                    continue;
                }
    
                # On mémorise pour afficher
                $cats[] = '<a class="' . $className . '" href="' . $this->plxMotor->urlRewrite($href) . '" title="' . $name . '">' . $name . '</a>';
            }
    
            # si $cats est vide, on n'a trouvé aucune catégorie valide
            echo !empty($cats) ? implode($separator, $cats) : L_UNCLASSIFIED;
        }
    

    Mais il y a encore un autre souci :
    Si un article appartient uniquement à une catégorie et qu'on supprime celle-ci l'article devient invisible sur le site alors qu'il devrait être considéré comme non classé (id categorie: "000").
    Au final, c'est plxMotor::artInfoFromFilename() qui fait mal le job. Il ne vérifie pas si les catégories de l'article sont valides.
    Je vais voir cela.

  • Oui, et on a déjà la possibilité de rendre inactive ou de masquer une catégorie avec un résultat assez similaire. peut-être faudrait-il plutôt proposer de désactiver la catégorie qui contient encore des articles dans ce cas ?

    D'un truc simple, ça se complique à trop s'y pencher :) Désolé.
    Cdt,
    GC

    covid-19 ... ça laisse des traces

  • Une autre personne aurait soulever le problème dans l'avenir si tu n'avais pas fait la remarque.
    Autant traiter le problème plutôt que de lui tourner le dos.
    Cela augmentera la résilience de PluXml.

Connectez-vous ou Inscrivez-vous pour répondre.