Bonsoir à tous, j'ai un petit soucis au niveau de la suppression des tags. Je liste mes tags dans un input puis après la sauvegarde je les efface tous pour sauvegarder que les nouveaux avec la fonction afterSave().

Posts/edit.ctp

<h2>Editer un article</h2>
<?php echo $this->Form->create('Post', array('action' => 'edit')); ?>
<?php echo $this->Form->input('title', array('label' => 'Titre')); ?>
<?php echo $this->Form->input('body', array('label' => 'Contenu', 'rows' => '3')); ?>
<?php echo $this->Form->input('tags', array('label' => 'Tags', 'value' => $tags)); ?>
<?php echo $this->Form->input('id', array('type' => 'hidden')); ?>
<?php echo $this->Form->end('Sauvegarder le post'); ?>

Controller/PostsController.php :

public function edit($id = null) {
        $this->Post->id = $id;
        if ($this->request->is('get')) {
            $this->request->data = $this->Post->read();
        } else {
            if ($this->Post->save($this->request->data)) {
                $this->Session->setFlash('Votre article a été mis à jour.', 'default', array('class' => 'success'));
                $this->redirect(array('action' => 'listing'));
            } else {
                $this->Session->setFlash('Impossible de mettre à jour votre article.', 'default', array('class' => 'error'));
            }
        }
        $this->Post->PostsTag->contain('Tag');
        $tags = $this->Post->PostsTag->find('all', array(
            'conditions' => array('PostsTag.post_id' => $id) 
        ));
        foreach($tags as $k=>$v){
            $t] = $v'Tag']'name'];
        }
        if(!empty($t)){
            $data = implode(', ',$t);
        }else{
            $data = '';
        }

        $this->set('tags',$data);
    }

Model/Post.php :

public function afterSave($created){
        if(!empty($this->data'Post']'tags'])){
            $tags = explode(',',$this->data'Post']'tags']);
            $this->PostsTag->deleteAll(array(
                'post_id' => $this->id
            ));
            foreach($tags as $tag){
                $tag = trim($tag);
                if(!empty($tag)){
                    $res = $this->Tag->findByName($tag);
                    if(!empty($res)){
                        $this->Tag->id = $res'Tag']'id'];
                    }else{
                        $this->Tag->create();
                        $this->Tag->save(array(
                            'name' => $tag
                        ));
                    }
                    $this->PostsTag->create();
                    $this->PostsTag->save(array(
                        'post_id' => $this->id,
                        'tag_id' => $this->Tag->id
                    ));
                }
            }
        }
        return true;
    }

Je me suis beaucoup inspiré du tutoriel de Grafikart et j'ai un soucis lorsque je supprime mes tags, les relations PostsTag se suppriment à merveille. Dans la table des tags ceux inutilisés ne se supprime car le champ count ne passe jamais à 0.

A votre avis pourquoi ?

6 réponses


Digikube
Auteur
Réponse acceptée

Je suis reparti sur le système de Tag que propose Grafikart en faisant attention de bien passer l'id de la liaison et non l'id du tag en paramètre et ça fonctionne beaucoup mieux. Encore désolé du dérangement.

Digikube
Auteur

Je me permet de relancer le sujet auriez-vous une solution ?

Hi,
Si ton champ 'count' ne passe pas a zéro, c'est un problème avec countercache.

Et s'il y passe, bien faut pas oublié au moment du deleteAll d'ajouter la condition que 'count' == 0.

@+

Digikube
Auteur

Pour le countercache j'ai ça :
Model/PostsTag.php :

<?php
class PostsTag extends AppModel {
    public $actsAs = array('Containable');
    public $belongsTo = array(
        'Post',
        'Tag' => array(
            'counterCache' => true
        )
    );
}

Dans ma table poststags j'ai le champ poststags_count j'ai bien suivi la convention CakePHP non ?
Car lors d'ajout de tag le count fonctionne a merveille enfin c'est un grand mot il réagit comme je veux c'est a dire qu'il incrémente bien le champ quand il y en a plusieurs.

D'après la convention c'est le nom du model au singulier. (http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html)

Au pire essai ca:

public $belongsTo = array(
        'Post',
        'Tag' => array(
            'counterCache' => 'poststags_count'
        )
    );

@+

Digikube
Auteur

Ça change rien ... tu penses pas qu'on puisse les supprimer autrement ?