Bonjour à tous,

J'ai un code qui m'affoiche les Tags qui se trouvent dans la table Tgas

class TagsController extends AppController{

    // Dans le tuto, il utilise sidebar au lieux de categoriesList
    function tagsList(){
        //$this->loadModel('PageTag');
        return $this->Tag->find('all',array('order'=>'name ASC','conditions'=>array('Tag.count >= 0')));
    }
}

Le problème qui se pose, c'est que lorsqu'une page est offline, le Tag associé à cette page s'affiche et je ne le veux pas.

Ma table Tags à trois champs : id, name, count

J'ai une table de laisons

PahesTags qui a 3 champs : id, page_id, tag_id

Et j'ai une table pour mes pages, ou j'ai un champs "online"

J'aimerais, dans le premier code, ajouter une conditions, qui va regarder dans la table page, si le champs "offiline* est à 1, comme ceci

class TagsController extends AppController{

    // Dans le tuto, il utilise sidebar au lieux de categoriesList
    function tagsList(){
        //$this->loadModel('PageTag');
        return $this->Tag->find('all',array('order'=>'name ASC','conditions'=>array('Tag.count >= 0','Page.online' => 1)));
    }
}

Mais évidement ca ne marche pas et j'aimerais savoir comment, je peux modifier mes modeles Tag, PageTag et page.

Pour le moement, j'ai ceci dans le modele Tag:

<?php
class Tag extends AppModel{
    public $hasOne = 'PageTag';

}

Dans mon modele PageTag, j'ai ceci:

<?php
class PageTag extends AppModel{
    var $useTable = "pages_tags";
    public $actsAs = array('containable');
    public $belongsTo = array(
        'Page',
        'Tag' => array(
            'counterCache' => 'count'
            )
        );
    public function afterDelete(){
        // Efface tous les tag qui ne sont plus associé
        $this->Tag->deleteAll(array(
            'count' => 0
            ));
    }
}

et mon modele Page.php, j'ai ceci:

public $actsAs = array('containable','Tree');
    // Création d'un liasons
    // DECI EFFACERA LE CAMPS DU TABLEAU MEDIAS ASSOCIE AU POST_ID
    // Nous sommes dans les post. Si dessous, il va associé l'id du post, automatiquement avec le champs post_id du tableau medias.

    public $hasMany =array(
        #Commenté le 13.12.2013 car Media plus utilisé
        #'Media' => array(
        #   'dependent' => true
        #),
        'PageTag'
        );

    /*
    // Permet d'enregistrer dans la table Tag et Categorie, le nombre de Post qui sont enregistré avec la categorie ou un tag
    public $belongsTo = array(
            'Category' => array(
                'counterCache' => array(
                    'page_count' => array(
                        'Page.online' => 1,
                        'Page.created <= NOW()'
                        )
                )
            )
    );
    */
    public $hasAndBelongsToMany = array('Tag');
    // Added for the search module
    //public $belongsTo = array('Search');

    //MyQL Arrete de faire des requetes recursive
    public $recursive = -1;

Pouvez-vous m'aider a me dire comment je peux fair een sorte que le champs Page.offilne est vérifier?
Je vous remercie

2 réponses


Bonsoir.
Déjà pour commencer, c'est normal que ta vérification pour l'état de la page ne fonctionne pas, vu que dans ta requête tu lui désigne un champ "online" alors que tu dis que dans ta table il se nomme "offline".
Ensuite, normalement ceci est déprécié et ce n'est pas utile de le préciser :

var $useTable

Etant donné que tu es dans le modèle PageTag et que ta table se nomme bien pages_tags , il est totalement inutile de le préciser.
Pour le counterCache, ce n'est pas comme ça qu'il faut faire, la désignation correcte est :

public $belongsTo = array('Page', 'Tag' => array('counterCache' => true));

Mais bon, au lieu de tout te dire, je te conseille fortement de regarder le tutoriel suivant :
Tutoriel vidéo CakePHP : Système de Tags, HasAndBelongsToMany.
Comme tout tutoriel de Grafikart, c'est très bien expliqué et tu verras où tu as pu faire des erreurs.

Salut Merci pour ta réponse.

Déjà le champs s'appelle bien online et pas offline, je me suis trompé. Désolé.

J'ai suivi ce tuto, mais je le regarde encore une fois car en effet, il est riche en information.

C'est en suivant ce tuto que j'ai mis

'counterCache' => 'count'

Parce que c'est le champs 'count', qui doit être changé. (je peux me tromper)
Ca fonction quand j'ajoute un tag, mais quand je le supprime, le nombre descent pas.

Tu m'a écris qu'il fallait changé comme ceci

public $belongsTo = array('Page', 'Tag' => array('counterCache' => true));

Mais dans ton exemple, comment il fait pour savoir le changer a changer?

Il faut justement que je résouds ce problème et peux etre que la source du problème peut venir de la

'counterCache' => 'count'

J'ai réussi a faire ce que je voulais mais j'ai recodé mon TagController ainsi: C'est plus lourd, mais bon

class TagsController extends AppController{
    // Dans le tuto, il utilise sidebar au lieux de categoriesList
    function tagsList(){
        $conditions = array();

        $this->loadModel('Page');
        $this->Page->contain('PageTag');
        $pages = $this->Page->find('all',array(
            'conditions'=>array(
                'online' => 1,
                'Page.created <= NOW()'
            ),
            'fields'=>'Page.online,Page.id'
            ));
        foreach($pages as $k => $v){
            foreach($v'PageTag'] as $kk => $vv){

                //$r'page']]=$vv'tag_id'];
                $conditions] = array('Tag.id Like' => $vv'tag_id']);
            }

        }
        $this->loadModel('Post');
        $this->Post->contain('PostTag');
        $posts = $this->Post->find('all',array(
            'conditions'=>array(
                'online' => 1,
                'Post.created <= NOW()'
            ),
            'fields'=>'Post.online,Post.id'
            ));
        foreach($posts as $k => $v){
            foreach($v'PostTag'] as $kk => $vv){

                $conditions] = array('Tag.id Like' => $vv'tag_id']);
            }

        }
        $tags = $this->Tag->find('all',array(
            'order'=>'name ASC',
            'conditions'=>array(
                'Tag.count >= 0',
                'OR' => $conditions
                )
            ));
        //debug($tags);
        return $tags;
    }