2017-03-13 4 views
0

私はCakePHP 3.3に非標準的な質問があります。私のデータベースには、ABの2つのテーブルがあります(どちらも同じです。最初は第1言語のデータ用、第2は第2言語のデータ専用)。CakePHP 3.3選択された言語に基づいて異なるデータ専用のテーブル

テーブルAのウェブサイト全体を正しくコーディングしました(テーブルBはまだ使用されていません)。さらに、私は.poファイルメカニッ​​クを実装して、インターフェイスの言語を切り替えました。インタフェースの言語が正しく切り替わります。

テーブルを簡単に差し込むにはB - ウェブサイトが大きくなり、すでに含まれているテーブルAに多くの操作があるため、IF-ELSEステートメントをすべてのケースで作成したくありません。テーブルApl_PLen_US.poまでのファイル)に選択されている場合、テーブルBと同じテーブルを何らかの形で作る可能性はありますか?

+0

私の心に来る最初の質問は "_why_"ですか?なぜ、[**翻訳動作**](https://book.cakephp.org/3.0/en/orm/behaviors/translate.html)を使用するのではなく、そのようなことをするのでしょうか? – ndm

+0

ご回答いただきありがとうございますが、テーブルが外部プログラムによって記入されているため、このソリューションを使用することはできません。たとえば、AとBはそれぞれ英語とポーランド語のデータで埋められています。ユーザーがウェブサイト – Annabelle

+0

で操作を行う場合はC(en)とD(pl)でデータを追加する必要があります。レガシーデータベース。 – ndm

答えて

1

私の頭に浮かぶ最も簡単なオプションは、現在のロケールを既存のテーブルクラスに挿入し、それに応じてデータベーステーブル名を設定することです。 (

// ... 

class SomeSharedTable extends Table 
{ 
    public function initialize(array $config) 
    { 
     if (!isset($config['locale'])) { 
      throw new \InvalidArgumentException('The `locale` config key is missing'); 
     } 

     $table = 'en_table'; 
     if ($config['locale'] === 'pl_PL') { 
      $table = 'pl_table'; 
     } 
     $this->table($table); 

     // ... 
    } 

    // ... 
} 

そして、あなたのappplicationコードの前に

は、モデル層を含み、それは当然のロケールを設定した後:

これはの線に沿って何かを見ることができる、のは、既存のテーブルクラスがSomeSharedTableと呼ばれることになると仮定しましょう例えばそれかもしれないが、あなたのブートストラップであること)、(この例では、我々は、エイリアステーブル名と一致していることを前提とし)、あなたのアプリケーション全体で使用しているエイリアスを設定します。LOCことが可能だということを考えると

\Cake\ORM\TableRegistry::config('SomeShared', [ 
    'locale' => \Cake\I18n\I18n::locale() 
]); 

エールは何らかの理由でクラスに入れないかもしれませんが、いくつかの安全対策を実装する必要があります。私はその基本的な例をisset()のように追加しました。誤って構成されたテーブルクラスがかなりの問題を引き起こす可能性があることを考えると、おそらくもっと洗練されたいくつかのチェックを追加することをお勧めします。

+0

ありがとう、これは単に完璧です!あなたは私に多くの時間を救った。 – Annabelle

関連する問題