1

マルチサイト アプリケーションの製品モデルがあります。

ドメイン(サイト)に応じて、異なるデータをロードしたい。

たとえば、データベースにnameanddescriptionフィールドを持つ代わりに、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;

これは私にエラーを与えます。どうやら、このようなクラス定義で変数を割り当てることはできません。

したがって、代わりにこれを Product モデルに入れます。

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

    return $queryData;
}

これは、データがモデルから直接アクセスされる場合にのみ機能し、モデルの関連付けを介してデータにアクセスされる場合は機能しません。

これを正しく機能させる方法が必要です。どのように?

4

2 に答える 2

1

コールバックの代わりにコンストラクターに入れると、うまく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 ませんか?

于 2011-02-23T17:05:29.853 に答える
0

問題は、モデルの関連付けがその場で構築されるモデルである可能性があるようです。例: 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'
);
于 2011-02-23T16:55:48.760 に答える