2011-03-25 65 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