2017-03-13 39 views
0

我對CakePHP 3.3有一個非標準問題。讓我們想象一下,在我的數據庫中,我有兩個表:AB(兩者是相同的,第一個專用於第一語言的數據,第二個專用於第二語言的數據)。CakePHP 3.3表專用於基於所選語言的不同數據

我正確編碼整個網站的表A(表B尚未使用)。另外,我實現了.po文件mechanizm來切換界面的語言。界面語言正確切換。

如何輕鬆插入表B - 我不想在所有情況下都生成IF-ELSE語句,因爲網站變大了,並且表A中已包含許多操作。有沒有可能以某種方式做一個簡單的映射,表A等於表B如果語言pl_PL被選爲en_US(通過.po文件)?

+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

我想到的最簡單的選擇是將當前語言環境注入到現有表類中,並相應地設置數據庫表名。

假設您現有的表類將被稱爲SomeSharedTable,這可以看的線沿線的東西:

// ... 

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

     // ... 
    } 

    // ... 
} 

而在此之前你參加辦法代碼涉及到模型層,並將其設置課程的語言環境後(這可能是例如在引導文件),配置您正在使用在整個應用程序的別名(在這個例子中,我們假設別名表名相匹配):

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

由於它有可能是祿因爲任何原因,阿爾特可能不會進入班級,你應該實施一些安全措施,我剛剛添加了基本的isset()檢查爲例。鑑於錯誤配置的表類可能會導致相當多的問題,您可能需要添加一些稍微複雜的檢查。

+0

謝謝,這簡直太完美了!你爲我節省了很多時間。 – Annabelle