BeforeFind geri arama gerekli Containable alanları değiştirme?

2 Cevap php

Benim CakePHP 1.2.5 app, ben bir User modelini belongsTo bir Profile modeli var. Kullanıcı modeli username alanı vardır ve Profil model üzerinde bir find() yaparken, ben her zaman otomatik olarak çok User.username değerini almak istiyorum. Ben otomatik olarak istenilen alanı içeren benim Profili modelin beforeFind() yöntemini değiştirmek mantıklı olur rakam.

Burada yapmak için teşebbüs ne:

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;
}

Ben değeri $queryData['contain'] düzgün güncellenmekte olduğunu görebilirsiniz, ancak adı veri alındığını değildir. Ben find() yöntemi için CakePHP çekirdek koduna baktı, ve ben Containable zaten yapması gereken şeyi yaptım, yani beforeFind() geri çağırma tüm Davranışlarını 'geriçağırımlarının sonra çağrıldığını bulundu değeri ile $queryData['contain'] Bunu değiştirmek mümkün oldu önce.

Nasıl çekirdeğini hack olmadan bu çalışabilirsiniz?

2 Cevap

Ben bunu çözmüş, yani burada herkes aynı sorunu var durumda benim cevap. Tüm Davranışlar 'beforeFind() yöntemleri modelin beforeFind() yöntemine prior denir beri Containable alanlar beforeFind belirtilen olamaz.

Benim özel containable alanı eklemek için Profili modeli doğrudan find() yöntemini değiştirmek için gibi, gerekli oldu.

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);
}

Matt, ben güzel bir çözüm olduğuna inanıyoruz. Ben CakePHP'ye 2.0.4 kullanıyorum ve ben sadece kullanıcı modeli veri getirmek niyetinde.

Sadece kayıt için, kullanıcı modeli için actsAs ayarı

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

Sonra bulmak yöntemini bu şekilde geçersiz:

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

Ya da, örneğin, profil verilerini almak isteyen varsa:

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