代码之家  ›  专栏  ›  技术社区  ›  Fluffy

如何在教义中创造鬼域?

  •  0
  • Fluffy  · 技术社区  · 14 年前

    设计师: tableName:设计师 行动: 字段:[名称] 柱: 身份证件: 无符号:真 主要:真 自动递增:真 类型:字符串(30)

    默认时 I18n

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

    比如说,我可以更方便地为当前语言设置一些常量 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 方法来显示转换字段(如果请求)。

    我不敢去想insert/update/delete部分,但是如果我处理了上面的问题,我就能够为dql添加钩子并完成任务。

    你认为这样的想法在一般情况下是可能的,而不与核心理论库发生冲突吗?必须以默认方式使用它将是一个巨大的痛苦在*。。。

    1 回复  |  直到 14 年前
        1
  •  0
  •   Benjamin Cremer    14 年前

    我没有一个好的,非黑客解决你的实际问题,但有一个替代品来尝试。


    所以你仍然要做翻译关节,但你所有的查询都在一个地方,很容易维护。

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