Question

Dans mon application CakePHP 1.2.5, j'ai un modèle Profile qui Appartient un modèle User. Le modèle de l'utilisateur dispose d'un champ de username, et lors de l'exécution d'un find() sur le modèle de profil, je veux toujours récupérer automatiquement trop la valeur de User.username. Je figure, il serait logique de modifier ma méthode beforeFind() de modèle de profil pour contenir automatiquement le champ désiré.

Voici ce que je tentais de le faire:

public function beforeFind($queryData) {
    // determine if the username data was already requested to be included in the return data via 'User.username' or 'User' => array('username').
    $hasUserData  = isset($queryData['contain']) && in_array("User.{$this->User->displayField}", $queryData['contain']);
    $hasUserData |= isset($queryData['contain']['User']) && in_array($this->User->displayField, $queryData['contain']['User']);

    // request the the username data be included if it hasn't already been requested by the calling method
    if (!$hasUserData) {
        $queryData['contain']['User'][] = $this->User->displayField;
    }

    return $queryData;
}

Je peux voir que la valeur de $queryData['contain'] est correctement mis à jour, mais les données de nom d'utilisateur ne sont pas en cours de récupération. Je regardais dans le code de base CakePHP pour la méthode find(), et je trouve que le rappel beforeFind() est appelé après les callbacks de tous les comportements, ce qui signifie que Containable déjà fait ce qu'il devait faire avec la valeur de $queryData['contain'] avant que je puisse le modifier .

Comment puis-je contourner ce sans le piratage du noyau?

Était-ce utile?

La solution

Je l'ai résolu, voici donc ma réponse au cas où quelqu'un a la même complication. champs maîtrisables ne peuvent pas être spécifiés dans beforeFind puisque toutes les méthodes de beforeFind() Behaviors sont appelés avant à la méthode beforeFind() du modèle.

En tant que tel, il était nécessaire pour moi de modifier la méthode de find() directement sur le modèle de profil afin d'ajouter mon champ personnalisé maîtrisable.

public function find($conditions = null, $fields = array(), $order = null, $recursive = null) {
    $this->contain("{$this->User->alias}.{$this->User->displayField}");
    return parent::find($conditions, $fields, $order, $recursive);
}

Autres conseils

Matt, je crois que c'est une belle solution. J'utilise CakePHP 2.0.4 et j'avais l'intention de chercher uniquement les données du modèle User.

Pour le compte rendu, réglage actsAs pour le modèle utilisateur

class User extends AppModel {
    public $name = 'User';
    public $belongsTo = array('Role');
    public $actsAs = array('Containable');
    ...

Puis-je remplacer la méthode find cette façon:

public function find($conditions = null, $fields = array(), $order = null, $recursive = null) {
    $this->contain();
    return parent::find($conditions, $fields, $order, $recursive);
}

Ou, si l'intention de récupérer les données profil, par exemple:

public function find($conditions = null, $fields = array(), $order = null, $recursive = null) {
    $this->contain(array('Profile'));
    return parent::find($conditions, $fields, $order, $recursive);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top