2011-03-25 79 views
7


我想擴展i18n的行爲,以便它自動加入翻譯表,在任何類型的查詢(DQL,關係,getTable)上自動加入。
此外,它需要定義默認的語言參數,所以當我做一個沒有語言設置的查詢時,它會回到默認語言。
注意:我正在尋找一個通用行爲,因此適用於所有i18n模型對象,而不是爲每個類編寫和覆蓋。學說1.2自動加入i18n?

下面是一個例子:
product - > ID,CATEGORY_ID,價格...
product_translation - > ID,郎,名稱,描述...

隨着當我當前的解決方案像這樣:Doctrine_Core::getTable('Product')->findAll(),它會獲得所有產品而不加入翻譯。
所以在控制器我有循環槽的所有記錄並重新轉換值,與$product->name = $product->Translation['en']->name

我想是這樣的:

  • Doctrine_Core::getTable('Product')->findAll()它應該得到的加盟值LANG =「EN 「
  • Doctrine_Core::getTable('Product)->findAll('en')同上
  • 還應該與工作的關係,因此,例如,如果我有有許多產品$user->Products它應該返回集合與翻譯包括一類用戶。
  • 也像$user->Products('en')應返回其他(非默認)語言的集合
  • 神奇的功能也將是不錯(如果可能的話)......像Doctrine_Core::getTable('Product')->getByCategoryAndLang(1,'en')

誰能幫助?我期待在模板和行爲,我認爲這是要走的路,但不知道如何實現這一

編輯:我看沒有這個太大的興趣,所以讓我嘗試用更簡單的問題。你通常如何通過關係獲得國際領域?例如,我怎樣才能撥打$user->Products並獲得加載翻譯的產品?

回答

1

我認爲你不需要擴展標準的原則行爲,除非你想這是完全自動的。但你仍然可以嘗試像我們一樣做到這一點 - 我們用一個DAO(數據訪問對象),返回美國混凝土主義實體(教義表表示):其中由PHP類模型描述Classname代表表

\DAO::get('Some\Namespace\Classname') 

。我們的DAO類創建Classname的實例,封裝爲proxy(請參閱設計模式)。

除了表類模型之外,我們還爲此表創建另一個類,它位於表模型上方並使用此模型進行操作。在這堂課裏,我們寫的方法如getProducts($args),getProduct($id),getProductsByCategory($catId)

我認爲這就是你要找的...

在方法getProducts($args)然後,您可以DQL將被給予$lang識別器在$args參數加入翻譯表內實施->leftJoin()。簡單的例子(未測試):

class Products extends \DAO { 
    public function save($item) { 
     $item->save(); 
    } 

    public function getProducts($args = array()) { 
     $order = array('p.id'); 

     $result = \Doctrine_Query::create() 
      ->from('Some\Namespace\Product p') 
      ->where('1 = 1'); 

     if(!empty($args['lang'])) { 
      $result = $result->leftJoin('Some\Namespace\ProductTranslation pt ON pt.product_id = p.id AND pt.language = ?', $args['lang']); 
     } 

     $result = $result->orderBy($order); 

     $result = $result->execute(); 

     return $result; 
    } 
} 

然後通過調用

$products = DAO::get('Some\Namespace\Product')->getProducts(array('lang' => 1)); 

你獲得所有加載英文翻譯產品...

這與其說automaticated,你必須爲每個模型編寫您自己的DAO類,但這是一種好方法,因爲您具有MVC/MVP面向對象應用程序體系結構所需的不同數據定義類(模型)和數據操作類(控制器)...

+0

謝謝,但是你的建議可以在沒有DAO的情況下完成。只需聲明ProductTable類,並添加與Translation進行連接的getXy方法。無論如何,它不能解決問題,因爲我仍然無法訪問這些字段與$ product-> name,但$ product-> Translation ['en'] - >名稱 – ZolaKt 2011-05-04 12:59:25

+0

您不能通過'產品「模型,因爲它不在此模型中描述(並且不存在於數據庫表中)。使用我的方法您可以在一個對象(Doctrine_Collection中)中獲得所有列 - 並且可以爲一個具體的翻譯。因此循環遍歷'$ products = DAO :: get('Some \ Namespace \ Product') - > getProducts(array('lang'=> 1));'用這種方式'foreach($ products as $ product){。 ..您可** **恕我直言訪問'產品 - >名稱'。你不能嗎? – shadyyx 2011-05-04 13:44:15

+0

嗯...我不認爲你仍然可以訪問它,就像你說的那樣,它沒有在模態中描述。我能做的就是將它水合爲數組,並重新排列結果(移除翻譯,並將名稱向上傳播一層)。這是我現在使用的。但是,仍然看不到您的方法與Table類中的正常定義方法相比有什麼不同 – ZolaKt 2011-05-04 14:21:15