Bonjour,
Dans mon model Post j'utilise une fonction afterFind comme ceci:

public function afterFind($data,$primary = false){
        foreach($data as $k=>$d){
            if(isset($d'Post']'slug']) && isset($d'Post']'id']) && isset($d'Post']'type'])){
                if($d'Post']'type']=='post'){
                    $cmpt=0;
                    foreach ($d'Comment'] as $key => $value) {
                        $cmpt++;
                    }
                    $timestamp = strtotime($d'Post']'created']);
                    $d'Post']'link']=array(
                        'controller'    => Inflector::pluralize($d'Post']'type']),
                        'action' => 'show',
                        'category' => $d'Category']'name'],
                        'created' => strftime("%Y%m%d", $timestamp),
                        'id' => $d'Post']'id'],
                        'slug' => $d'Post']'slug']
                    );
                    $d'Post']'month']=strftime('%b', $timestamp);
                    $d'Post']'day']=strftime('%d', $timestamp);
                    $d'Post']'dateArchive']=strftime('%B %Y', $timestamp);
                    $d'Post']'nbComment']= $cmpt;
                }
                else{
                    $d'Post']'link']=array(
                        'controller'    => Inflector::pluralize($d'Post']'type']),
                        'action' => 'show',
                        'id' => $d'Post']'id'],
                        'slug' => $d'Post']'slug']
                    );
                }
            }
            $data$k] = $d;
        }
        return $data;
    }

Le soucis est que cette fonction se lance aussi pour ma fonction tag présente dans mon controller PostsController:

function tag($name){
        $this->loadModel('PostTag');
        $this->PostTag->recursive = 0;
        $posts = $this->Paginate('PostTag',array(
            'Tag.name'=>$name,
            'Post.type' => 'post',
            'Post.online' => 1,
            'Post.created <= NOW()'
        ));
        $post_ids = Set::Combine($posts,'{n}.PostTag.post_id','{n}.PostTag.post_id');
        $d'posts'] = $this->Post->find('all',array(
            'conditions' => array('Post.id'=>$post_ids)
        ));
        $this->set($d);
        $this->render('index');
    }

Pour le paginate PostTag... j'obtient donc des erreurs... car il ne me met pas les categories ni les comments. Logique.

Comment dire je ne veux pas faire de afterFind?

4 réponses


duffJohn
Auteur
Réponse acceptée

Enfait il suffit faire une condition sur $primary dans le afterFind.
Car le lorsque l'on appelle afterFind via une relation $primary est a false. Du coup on peut empecher l'action du afterFind.
;)

Dans ton find, tu peux desactiver l'appel du callback en faisant sa :

$this->Post->find('all', array(
    // conditions et autres
    'callbacks' => false
));

Essaye ca deja et dis moi. a+

duffJohn
Auteur

Enfait c'est lors du paginate qu'il y a un soucis de callbacks, et on ne peut pas ajouter ta ligne a un paginate...
J'ai recherché sur le net pour annuler les callback d'un paginate sans succes.

Dans ce cas, ben tu fais ta pagination manuellement sans utiliser le paginate. Enfin c'est comme sa que je ferai. Si tu trouves une autre solution, je serai intéresser aussi de l'avoir, sa peut toujours servir ce genre de chose.