2011-03-25 32 views
7


I18n davranışını genişletmek istiyorum, böylece çeviri tablosuna otomatik olarak, herhangi bir sorgu türünde (DQL, ilişkiler, getTable) katılır.
Ayrıca, varsayılan dil parametresini tanımlamalıdır, bu nedenle dil ayarı olmadan bir sorgu yaptığımda, varsayılan dile geri döner.
Not: Genelleştirilmiş bir davranış arıyorum, bu nedenle tüm i18n model nesnelerine uygulanır, sınıfların her biri için yazılmaz ve geçersiz kılınamaz. Yapmam akım çözümü ile> id, lang, adı, tanımı ...Doctrine 1.2 otomatik katılma i18n?

- -> id, category_id, fiyat ...
tablo product_translation
tablo product: Burada

bir örnektir Bunun gibi bir şey: Doctrine_Core::getTable('Product')->findAll(), tüm ürünleri çevirilere katılmadan alır.

  • Doctrine_Core::getTable('Product')->findAll() o lang katıldı değerleri almalısınız = 'tr:
    Yani denetleyicisi ben böyle bir şey istiyorum $product->name = $product->Translation['en']->name

    ile, döngü teknesi tüm kayıtlarına sahip ve tercüme değerlerini yeniden uygulamak 'Mesela ben çeviriler dahil olan bir koleksiyon dönmelidir birçok ürün $user->Products olan bir sınıf Kullanıcı varsa yüzden

  • yukarıdaki gibi
  • Doctrine_Core::getTable('Product)->findAll('en') aynı Ayrıca, ilişkiler çalışması gerekir.
  • Ayrıca $user->Products('en') gibi bir şey Herkes yardımcı olabilir
  • Sihirli fonksiyonlar da (mümkünse) güzel olurdu diğer (varsayılan olmayan) diller için toplama ... Doctrine_Core::getTable('Product')->getByCategoryAndLang(1,'en')

gibi bir şey dönmelidir? Şablonlara ve davranışlara bakıyorum, bu yoldan gitmenin bir yolu olduğunu düşünüyorum, ancak bu

DÜZENLEME: Nasıl uygulanacağına dair bir fikrim yok. daha basit bir soru. Genellikle i18n alanlarını ilişkilerle nasıl alırsınız. Örneğin, $user->Products numaralı telefonu nasıl arayabilirim ve yüklü çeviri olan ürünleri nasıl alabilirim?

cevap

1

Bunu tamamen otomatik olarak istemediğiniz sürece standart Doktrini davranışını genişletmeniz gerekmediğini düşünüyorum. Ama yine Sence yokmuş gibi bunu deneyebilirsiniz - bir DAO bize somut Doktrin varlık (Doktrin tablo gösterimini) döndürür (Data Access Object) kullanın: tablo için Classname standları PHP sınıfı modeli tarafından açıklanan

\DAO::get('Some\Namespace\Classname') 

. DAO sınıfımız, proxy içine kapsüllenmiş Classname örneğini oluşturur (bkz. Tasarım Kalıpları).

Tablo sınıfı modelinin ötesinde, bu tablo için, tablo modelinin üzerinde duran ve bu modelle işlenen başka bir sınıf oluşturuyoruz. Bu sınıfta, getProducts($args), getProduct($id), getProductsByCategory($catId) vb. Gibi yöntemleri yazıyoruz.

Bence bu sizin aradığınız şey ...Daha sonra $args parametrede verilen $lang tanımlayıcıyla tarafından çeviriler tablosunu katılacak DQL içinde ->leftJoin() uygulayabilir getProducts($args) yöntemde

. Basit bir örnek (test):

$products = DAO::get('Some\Namespace\Product')->getProducts(array('lang' => 1)); 

Sen yüklenen ingilizce çevirileri tüm ürünleri elde arayarak Sonra

class Products extends \DAO { 
    public function save($item) { 
     $item->save(); 
    } 

    public function getProducts($args = array()) { 
     $order = array('p.id'); 

     $result = \Doctrine_Query::create() 
      ->from('Some\Namespace\Product p') 
      ->where('1 = 1'); 

     if(!empty($args['lang'])) { 
      $result = $result->leftJoin('Some\Namespace\ProductTranslation pt ON pt.product_id = p.id AND pt.language = ?', $args['lang']); 
     } 

     $result = $result->orderBy($order); 

     $result = $result->execute(); 

     return $result; 
    } 
} 

...

Çok daha automaticated değildir ve Yapmalisin Her model için kendi DAO sınıfınızı yazın, ancak MVC/MVP nesne tabanlı uygulama mimarisi için gerekli olan farklı veri tanımlama sınıfına (model) ve veri işleme sınıfına (kontrolör) sahip olduğunuz için iyi bir yaklaşımdır ...

+0

Teşekkürler, ama önerileriniz DAO olmadan yapılabilir. Sadece ProductTable sınıfını belirtin ve Çeviri ile birleştirme işlemini gerçekleştiren getXy yöntemlerini ekleyin. Her neyse, bu sorunu çözmüyor, çünkü bu alanlara $ product-> name, ama $ product-> Translation ['en'] -> name – ZolaKt

+0

ile erişemiyorum. Bu modelde açıklanmayan ürün modeli (ve db tablosunda mevcut değildir). Benim yöntemimle, tüm sütunları tek bir nesnede (Doctrine_Collection içinde) ve ONE somut çeviri için alırsınız. Bu nedenle, $ products = DAO :: get ('Some \ Namespace \ Product') -> getProducts (dizi ('lang' => 1)); bu şekilde 'foreach ($ ürün olarak $ ürün) {. ..} '' ** ** IMHO '$ product-> name' öğesine erişebilir. Yapamıyor musun? – shadyyx

+0

Hmm ... Modalda açıklanmadığını söylediğin gibi ona hala erişebileceğini sanmıyorum. Yapabildiğim şey onu dizi olarak hidrolize etmek ve sonuçları yeniden düzenlemek (Çeviri'yi kaldırmak ve adı bir seviye yukarı ilerletmek). Şimdi kullanıyorum budur. Yine de, yöntem sınıflarında, Tablo sınıflarındaki normal tanımlama yöntemleriyle karşılaştırıldığında bir fark göremiyorum. – ZolaKt