2010-07-28 6 views
0

디자이너 : TABLENAME : 디자이너 actAs : 국제화 : 필드 : [이름] 열 : ID : 유형 : 정수 (2) 부호 : 사실 주 : 사실 자동 증가 : 사실 이름 : 유형 : 문자열 (30) NOTNULL : 사실Doctrine에서 고스트 필드를 만드는 방법은 무엇입니까?

기본 I18n 동작이

$d = Doctrine_Query::create() 
       ->select('id, t.name') 
       ->from('Designer d') 
       ->leftJoin('d.Translation t') 
       ->where("t.lang = 'en'") 
       ->execute(); 
01,235처럼 사용할 수 있어야하지만 16,

나는 현재 언어에 약간의 일정을 설정하는 faaar 더 편리 할 것, 따라서 위의 하나에 해당

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

같은 쿼리를 가지고, en 말을하고에 해당하는 모든 i18nable 필드가 있습니다.

저는 새로운 동작을 시도하고 있습니다. 기본 동작을 확장하여 이러한 동작을 제공 할 수 있지만 귀하의 도움이 필요합니다.

필요한 언어를 얻는 것이 쉽기 때문에 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

답변

0

나는 실제 문제에 대해 해롭지는 않지만 좋은 해결책이 없지만 시도해 볼 수있는 대안이 있습니다.

해당 테이블 클래스 모델에서 찾기/가져 오기 쿼리를 모두 입력 할 수 있습니다.
번역 조인트를 사용해야하지만 쿼리는 모두 한 곳에서 유지 관리가 쉽습니다.

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

+0

@roddik 왜 필요하지 않은가? 당신은 doctrine inbuild를 사용할 필요가 없다. find * -querynames –

+0

네,하지만 다른 개발자가'Doctrine_Query :: create() -> ...'를 사용하고 싶다면 쉽게 접근 할 수있는 a-la'$ 디자이너 -> 이름'맞지? – Fluffy

관련 문제