2010-07-28 113 views
0

设计师: TABLENAME:设计师 ACTAS: 的I18n: 字段:[名称] 列: ID: 类型:整数(2) 无符号:真 初级:真 自动增量:真 名: 类型:字符串(30) NOTNULL:真如何在教义中制作鬼域?

虽然默认I18n行为,必须使用这样

$d = Doctrine_Query::create() 
       ->select('id, t.name') 
       ->from('Designer d') 
       ->leftJoin('d.Translation t') 
       ->where("t.lang = 'en'") 
       ->execute(); 

我将一些常数设置为当前语言faaar更方便,说en,和具有每i18nable字段对应于它的,因此具有这样的查询

$d = Doctrine_Query::create() 
      ->select('id, name') 
      ->from('Designer d') 
      ->execute(); 

相当于上面之一。

我试图做一个新的行为,扩展默认的,可以提供这样的事情,但我需要你的帮助。

获取所需的语言非常简单,所以我们假设有define('LANGUAGE', 'en')。基本行为类是

class TransparentI18N extends Doctrine_Template 
{ 
    private $_translation = NULL; 

    public function setUp() 
    { 
     $this->addListener(new TransparentI18NListener()); 

     $this->actAs(new Doctrine_Template_I18n($this->_options)); 
    } 
} 

这样的想法是添加一个监听器,每当这些领域存在的SELECT子句中,将修改查询,设置连接并选择所需的字段。 TransparentI18NListener包含preDqlSelect,它接收Doctrine_Event对象。我可以得到相关的Doctrine_Query甚至getDqlPart('select')的作品,但后者返回原始选择字符串,如id, t.name,我怎样才能得到,每个子句对应哪个表

然后,我必须设置Doctrine_Record实例的字段。 是否有可能没有让模型扩展一些自定义的类,会给这样的功能?我真的不愿意添加这样的类,但万一其他失败,我应该能够保存这些字段并覆盖__get方法来显示翻译字段,如果他们被请求。

我太害怕想到插入/更新/删除部分,但希望如果我处理上述问题,我可以添加挂钩到dql并完成工作。

你是否认为这样的想法一般来说是可能的,而不会干扰核心原则库?在默认情况下使用它将是一个巨大的痛苦* ...

+0

您是否设法完成此模板?我正在寻找完全一样的东西 – ZolaKt 2011-05-01 14:56:51

回答

0

我没有一个好的,你的实际问题不hacky解决方案,但有一个替代尝试。

您可以将所有查找/查询查询放入模型对应的表类中。
所以你仍然需要做Translation-Joints,但是你所有的查询都在一个地方,而且易于维护。

class DesignerTable extends Doctrine_Table 
{ 
    protected $_lang = LANGUAGE; 

    public function findAll() 
    { 
     return Doctrine_Query::create() 
       ->select('id, t.name') 
       ->from('Designer d') 
       ->leftJoin('d.Translation t') 
       ->where("t.lang = ?", $this->_lang) 
       ->execute(); 
    } 

    public function findOneById($id) 
    { 
     return Doctrine_Query::create() 
       ->select('id, t.name') 
       ->from('Designer d') 
       ->leftJoin('d.Translation t') 
       ->where('.lang = ?', $this->_lang) 
       ->andWhere('id = ?', $id) 
       ->execute(); 
    } 
    ... 
} 

// In your controllers: 

// Find all designers 
$designers = Doctrine_Core::getTable('Designer')->findAll(); 

// Find one designer by id 
$designers = Doctrine_Core::getTable('Designer')->findOneById(13); 
+0

我想这不会用于创建自定义的'Doctrine_Queries' :( – Fluffy 2010-07-29 07:27:43

+0

@roddik为什么不能?您可以根据需要定义多种方法,您不必使用该规则inbuild find * -querynames – 2010-07-29 07:39:53

+0

是的,但问题是,如果其他开发人员想使用'Doctrine_Query :: create() - > ...',他将无法使用简单的访问器a-la'$ designer-> name',对吗? – Fluffy 2010-07-29 08:03:58