2012-09-27 2 views
1

내가 내 모델 중 하나에 행동을 번역 부착하고 나는이에 대한 몇 가지 단점이 있습니다

1) 내가 전달되는 모든 분야에서 데이터를 저장하지 않는 경우 모델에 비헤이비어를 첨부 할 때 params로 $ Model :: find() 메서드는 삽입 된 행을 가져 오지 않습니다.

public $actsAs = array(
    'Translate' => array(
     'title' => 'title_Translation', 
     'description' => 'description_Translation', 
     'description_long' => 'description_long_Translation' 
    ) 
); 

예 : 내가 $Model::save() 방법 'title'에만 값으로 전달하는 경우, 데이터가도 국제화 테이블에 저장되어 있지만 $Model::find() 아무것도하지 않습니다. 모든 분야의 데이터를 전달해야합니다.

강제로 해당 레코드를 검색 할 수 있습니까?

2) 응용 프로그램의 관리자 측에서 레코드를 저장하는 언어에 관계없이 모든 레코드를 가져와 사용자가 변경할 수 있도록 나열하려면 어떻게합니까 (데이터 편집, 데이터 저장 여러 언어)? 현재, 현재 언어에 해당하는 레코드 만 가져올 수 있습니다 (구성 또는 명시 적으로 읽음).

고마워요!

+0

여기에서 같은 문제가 발생합니다. 생성 된 쿼리는 변환 된 각 필드에 대해 변환 테이블을 사용하여 내부 조인을 수행하므로, 적어도 하나가 변환 테이블에 없으면 원래 레코드조차 검색되지 않습니다. 기존 번역 된 필드를 기존 모델에 추가해야하는 경우 완료되었습니다. – eleonzx

+0

나는 동일한 문제를 가지고 그것을 고치기 위해 코드를 작성했다. 기본적으로 새로운 번역 가능 필드를 추가 한 후에는이 코드를 실행하여 기존의 모든 행에 대해 DB에 새 번역 레코드를 추가한다. 참조 : http://stackoverflow.com/questions/13243785/add-a-new-translatable-field-to-an-existing-translatable-table-in-cakephp-2-2/13249219#13249219 –

답변

2

OK, 나는

1) 케이크 행을 가져올 때 내부 조인 사용하고 그렇게 기본적으로이 주위에 쉬운 방법이 없다, 번역 연관된 ... 조금 늦었지만 어쨌든 수 있습니다. 빈칸으로 저장하는 경우에도 항상 모든 번역 가능한 필드를 저장해야합니다. 유일한 대안은 코어를 해킹하여 내부 조인이 아닌 왼쪽 조인을 사용하는 것입니다.하지만 그렇게하지는 마십시오. 요리 책은 여기에 모든 레코드를 가져 오는 방법에 대해 설명합니다

2) : 이제 http://book.cakephp.org/2.0/en/core-libraries/behaviors/translate.html#retrieve-all-translation-records-for-a-field

, 당신은 당신의 $의 actsAs의 정의를 수정하지 않도록, 하나의 번역을 얻기 위해 원하는 시간의 아마 대부분의 [ 'Translate'] 배열을 모델에 추가하십시오. 이 관리자 방법의 경우,

/* 
* See http://book.cakephp.org/2.0/en/core-libraries/behaviors/translate.html#using-the-bindtranslation-method 
* This is for making it so we fetch all translations, as opposed to just that of the current locale. 
* Used for eg. editing (multiple translations) via the admin interface. 
*/ 
public function bindAllTranslations(){ 
    $translatableFields = $this->actsAs['Translate']; 

    $keyValueFields = array(); 
    foreach($translatableFields as $field){ 
     $keyValueFields[$field] = $field.'Translation'; 
    } 

    $this->bindTranslation($keyValueFields,false); // false means it will be changed for all future DB transactions in this page request - and won't be reset after the next transaction. 
} 

그래서 (또는 원하는 다른 상황 : 그래서 내가 무슨 짓을했는지는 $ actsAs [ '번역'] 즉시 배열을 수정 AppModel.php의 방법을 설정 모든 번역) 찾기 전에 코드를 호출하십시오 :

$this->MyModel->bindAllTranslations(); 
$this->MyModel->find('all'); 

희망이 있습니다!

4

나는 그것을 해결했습니다. 나는 TranslateBehavior를 app/Model/Behavior에 복사했습니다. (다만 향후 업그레이드시 문제를 피하고 원래의 경우를 유지하기 위해) 다음에 _addJoin (...) 메소드를 변경했습니다. 비헤이비어에서 255 번째 줄에서 조인 유형을 INNER에서 LEFT로 변경했습니다 (저는 케이크 2.2.3을 사용합니다).

이제 레코드가 존재하면 변환 된 필드가없는 경우에도 항상 검색됩니다.

번역 필드가 비어 있는지 확인해야하는 외에 단점이 보이지 않습니다. 그것은 당신의 경우에 도움이 될 것입니다,하지만 당신은 또한 당신이 호출하기 전에 발견()

$this->YourModel->locale = array("ENG", "GER", "JAP"); 

당신은 항상 모든 레코드 경우에도 얻을 것이다이 방법을 로케일을 설정할 수 배열을 사용할 수 있는지

+1

너, 엘레 렉스! +1 – Michael

+0

당신을 환영합니다. – eleonzx

+0

+1 동작을 복사하고 코어를 망칠 필요가 없습니다. – timstermatic

0

정확하게 확실하지 않음 그들은 가능한 모든 번역을 가지고 있지 않습니다.

0

감사합니다. eleonzx에게 감사드립니다. 저는 10 년 이래로이 문제를 겪고 있으며 간단한 대답으로 앞으로 나아갈 수 있습니다! 다시 한 번 감사드립니다.

그리고 어쩌면이 코드는 사람들의 많은 도움이 될 수 있습니다 : 나는 원본을 얻기 위해 즉석에서 번역 행동을하지 않도록 나는 다른 조건으로 _setLanguage

private function _setLanguage() { 
    if($this->Session->read('Config.language')){ 
     $locale = $this->Session->read('Config.language'); 
     $this->{$this->modelClass}->setLocale($locale); 
    }else{ 
     $this->{$this->modelClass}->Behaviors->disable('Translate'); 
    } 
} 

전화 내의 AppController으로, beforeFilter 방법에

을 세션에 로케일이 설정되지 않은 경우 내용 (기본 링크를 사용하여 언어 간을 전환 함).