CakePHP изменяет виртуальные поля во время выполнения - PullRequest
1 голос
/ 23 февраля 2011

У меня есть модель продукта для многосайтового приложения.

В зависимости от домена (сайта) я хочу загрузить разные данные.

Например, вместо полей name и description в моей базе данных у меня есть posh_name, cheap_name, posh_description и cheap_description.

если я настрою что-то вроде этого:

class Product extends AppModel 
{
    var $virtualFields = array(
        'name' => 'posh_name',
        'description' => 'posh_description'
    );
}

Тогда это всегда работает, независимо от того, доступен ли он непосредственно из модели или через ассоциацию.

Но мне нужно, чтобы виртуальные поля были разными в зависимости от домена. Итак, сначала я создал 2 набора:

var $poshVirtualFields = array(
    'name' => 'posh_name',
    'description' => 'posh_description'
);

var $cheapVirtualFields = array(
    'name' => 'cheap_name',
    'description' => 'cheap_description'
);

Итак, это мои 2 набора, но как мне назначить правильный набор на основе домена? У меня есть глобальная функция с именем isCheap(), которая позволяет мне узнать, нахожусь ли я в нижнем домене или нет.

поэтому я попробовал это:

var $virtualFields = isCheap() ? $this->cheapVirtualFields : $this->poshVirtualFields;

Это дает мне ошибку. По-видимому, вы не можете назначать переменные в определении класса, как это.

Таким образом, вместо этого я поместил это в мою модель продукта:

function beforeFind($queryData)
{
    $this->virtualFields = isCheap() ? $this->cheapVirtualFields : $this->poshVirtualFields;

    return $queryData;
}

Это работает ТОЛЬКО при доступе к данным непосредственно из модели, НЕ работает при обращении к данным через сопоставление модели.

Должен быть способ заставить это работать правильно. Как?

Ответы [ 2 ]

1 голос
/ 23 февраля 2011

Ну, если я положу это в конструктор вместо beforeFind обратного вызова, это, кажется, будет работать:

class Product extends AppModel 
{
    var $poshVirtualFields = array(
        'name' => 'posh_name',
        'description' => 'posh_description'
    );

    var $cheapVirtualFields = array(
        'name' => 'cheap_name',
        'description' => 'cheap_description'
    );

    function  __construct($id = false, $table = null, $ds = null) {
        parent::__construct($id, $table, $ds);
        $this->virtualFields = isCheap() ? $this->cheapVirtualFields : $this->poshVirtualFields;
    }
}

Однако я не уверен, если это CakePHP нет нет что может вернуться, чтобы укусить меня?

0 голосов
/ 23 февраля 2011

похоже, проблема может заключаться в том, что ассоциация моделей - это модель, созданная на лету.например, AppModel

попробуйте сделать pr (get_class ($ this-> Relation));в коде и посмотрите, что вывод, это должно быть название вашей модели, а не AppModel.

также попробуйте и используйте:

var $poshVirtualFields = array(
    'name' => 'Model.posh_name',
    'description' => 'Model.posh_description'
);

var $cheapVirtualFields = array(
    'name' => 'Model.cheap_name',
    'description' => 'Model.cheap_description'
);
...