2017-03-13 19 views
0

CakePHP 3.3에 대한 비표준 질문이 있습니다. 데이터베이스에 두 개의 테이블이 있다고 상상해 봅시다 : AB (둘 다 동일하고, 첫 번째는 첫 번째 언어의 데이터 용이고 두 번째는 두 번째 언어의 데이터 전용입니다).CakePHP 3.3 선택된 언어에 기초한 다른 데이터 전용 테이블들

테이블 A에 대한 전체 웹 사이트를 올바르게 코딩했습니다 (테이블 B은 아직 사용되지 않음). 또한 .po 파일 메커니즘을 구현하여 인터페이스 언어를 전환했습니다. 인터페이스의 언어가 올바르게 전환됩니다.

테이블을 쉽게 꽂을 수 있습니다. B - 웹 사이트가 커지고 이미 포함 된 테이블 A에 많은 작업이 있기 때문에 모든 경우에 IF-ELSE 문을 사용하고 싶지 않습니다. 테이블 Apl_PLen_US (.po 개 파일을 통해)으로 선택된 경우 테이블 B과 같은 간단한 매핑을 만들 수 있습니까?

+0

내 마음에 오는 첫 번째 질문은 "_why_"입니까? 왜 [** translate behavior **] (https://book.cakephp.org/3.0/en/orm/behaviors/translate.html)를 사용하는 대신 그와 같은 것을 할 수 있습니까? – ndm

+0

응답 해 주셔서 감사합니다. 그러나 외부 프로그램에서 테이블을 채우므로이 솔루션을 사용할 수 없습니다. 예를 들어 A와 B는 각각 영어와 폴란드어로 데이터로 채워지며 사용자가 웹 사이트 – Annabelle

+0

에서 작업을 수행하면 C (en)와 D (pl)로 데이터를 추가해야합니다. 레거시 데이터베이스. – ndm

답변

1

내 마음에 가장 간단한 옵션은 기존 테이블 클래스에 현재 로케일을 주입하고 이에 따라 데이터베이스 테이블 이름을 설정하는 것입니다. (

// ... 

class SomeSharedTable extends Table 
{ 
    public function initialize(array $config) 
    { 
     if (!isset($config['locale'])) { 
      throw new \InvalidArgumentException('The `locale` config key is missing'); 
     } 

     $table = 'en_table'; 
     if ($config['locale'] === 'pl_PL') { 
      $table = 'pl_table'; 
     } 
     $this->table($table); 

     // ... 
    } 

    // ... 
} 

그리고 당신의 appplication 코드 전에

모델 층을 포함하고, 물론 로케일을 설정 한 후 :

이의 라인을 따라 뭔가를 볼 수의 기존 테이블 클래스는 SomeSharedTable 호출됩니다 가정하자 예를 들어 그 힘 (이 예를 들어 우리가) 별칭 테이블 이름과 일치한다고 가정하면 응용 프로그램 전체에서 사용하고있는 별칭을 구성,) 부트 스트랩에있을 : 그것은 가능 점을 감안

\Cake\ORM\TableRegistry::config('SomeShared', [ 
    'locale' => \Cake\I18n\I18n::locale() 
]); 

을 그 LOC 에일이 어떤 이유로 든 수업에 참여하지 못할 수도 있습니다. 몇 가지 안전 조치를 구현해야합니다. 예를 들어 isset() 기본 검사를 추가했습니다. 잘못 설정된 테이블 클래스로 인해 상당한 문제가 발생할 수 있다고 생각되면 좀 더 정교한 검사를 추가하고 싶을 것입니다.

+0

감사합니다, 이것은 단순히 완벽합니다! 날 구했어. – Annabelle