2011-03-25 12 views
7


मैं i18n व्यवहार का विस्तार करना चाहता हूं, ताकि यह किसी भी प्रकार की क्वेरी (डीक्यूएल, रिलेशनशिप, गेटटेबल) पर स्वचालित रूप से अनुवाद तालिका में शामिल हो।
इसके अतिरिक्त इसे डिफ़ॉल्ट भाषा पैरामीटर को परिभाषित करने की आवश्यकता है, इसलिए जब मैं भाषा सेट के बिना कोई क्वेरी करता हूं, तो यह डिफ़ॉल्ट भाषा पर वापस आ जाता है।
नोट: मैं एक सामान्यीकृत व्यवहार की तलाश में हूं, इसलिए यह सभी i18n मॉडल ऑब्जेक्ट्स पर लागू होता है, प्रत्येक वर्ग के लिए लिखना और ओवरराइड नहीं करना। -> आईडी, category_id, कीमत ...
तालिका product_translation -> आईडी, भाषा, नाम, विवरण ...सिद्धांत 1.2 ऑटो-जॉइन i18n?

वर्तमान समाधान जब मैं करता हूँ के साथ
तालिका product:

यहाँ एक उदाहरण है इस तरह कुछ: Doctrine_Core::getTable('Product')->findAll(), यह अनुवाद में शामिल किए बिना सभी उत्पादों को प्राप्त करता है।
तो नियंत्रक में मैं पाश गर्त सभी रिकॉर्ड करने के लिए है और अनुवाद मूल्यों पुन: लागू, $product->name = $product->Translation['en']->name

साथ मैं कुछ इस तरह करना चाहते हैं:

  • Doctrine_Core::getTable('Product')->findAll() यह लैंग के लिए शामिल हो गए मूल्यों को प्राप्त करना चाहिए = 'एन 'ऊपर
  • रूप
  • Doctrine_Core::getTable('Product)->findAll('en') ही यह भी संबंधों के साथ काम करना चाहिए ताकि उदाहरण के लिए मैं जो कई उत्पादों $user->Products यह एक संग्रह लौटना चाहिए अनुवाद के साथ शामिल है एक वर्ग उपयोगकर्ता है।
  • इसके अलावा $user->Products('en') की तरह कुछ अन्य (गैर डिफ़ॉल्ट) भाषाओं के लिए संग्रह
  • जादू कार्य भी अच्छा होगा (यदि संभव हो) ... Doctrine_Core::getTable('Product')->getByCategoryAndLang(1,'en')

की तरह कुछ लौट किसी को भी मदद कर सकते हैं करना चाहिए? मैं टेम्पलेट्स और व्यवहार को देख रहा हूँ, मुझे लगता है कि जाने का रास्ता है, लेकिन कोई सुराग नहीं है कि यह कैसे

संपादित लागू करने के लिए: मैं देख रहा हूँ कि इस में ज्यादा रुचि नहीं है, तो मुझे एक साथ की कोशिश करते हैं सरल सवाल आप आमतौर पर संबंधों के माध्यम से i18n फ़ील्ड कैसे प्राप्त करते हैं। उदाहरण के लिए मैं $user->Products पर कॉल कैसे कर सकता हूं और लोड किए गए अनुवाद वाले उत्पादों को प्राप्त कर सकता हूं?

उत्तर

1

मुझे लगता है कि आपको मानक सिद्धांत व्यवहार को विस्तारित करने की आवश्यकता नहीं है जबतक कि आप इसे पूरी तरह से स्वचालित नहीं चाहते हैं। लेकिन फिर भी आप की तरह हम करते हैं यह करने के लिए कोशिश कर सकते हैं - हम एक डीएओ (डेटा एक्सेस ऑब्जेक्ट) है कि रिटर्न हमें ठोस सिद्धांत इकाई (सिद्धांत तालिका प्रतिनिधित्व) का उपयोग करें:

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

जहां पीएचपी वर्ग मॉडल के आधार पर वर्णित तालिका के लिए Classname खड़ा । हमारी डीएओ कक्षा Classname का उदाहरण बनाती है जो proxy (डिजाइन पैटर्न देखें) में encapsulated है।

टेबल क्लास मॉडल से परे हम इस तालिका के लिए एक और कक्षा बनाते हैं जो तालिका मॉडल के ऊपर खड़ा है और इस मॉडल के साथ हेरफेर करता है। इस कक्षा के भीतर हम getProducts($args), getProduct($id), getProductsByCategory($catId) आदि

मुझे लगता है कि यह वही है जो आप ढूंढ रहे हैं ...

विधि getProducts($args) फिर आप DQL कि $args पैरामीटर में दिए गए $lang identificator द्वारा अनुवाद तालिका में शामिल हो जाएगा के भीतर ->leftJoin() को लागू कर सकते हैं। सरल उदाहरण (परीक्षण नहीं):

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; 
    } 
} 
फिर

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

आप लोड अंग्रेज़ी अनुवाद के साथ सभी उत्पादों प्राप्त फोन करके

...

यह इतना automaticated नहीं है और आप के लिए है प्रत्येक मॉडल के लिए अपनी खुद की डीएओ कक्षा लिखें लेकिन यह अच्छी दृष्टिकोण है क्योंकि आपके पास विभिन्न डेटा परिभाषा वर्ग (मॉडल) और डेटा मैनिपुलेशन क्लास (नियंत्रक) है जो एमवीसी/एमवीपी ऑब्जेक्ट उन्मुख अनुप्रयोग आर्किटेक्चर के लिए आवश्यक है ...

+0

धन्यवाद, लेकिन आप जो सुझाव दे रहे हैं वह डीएओ के बिना किया जा सकता है। बस ProductTable क्लास घोषित करें, और getXy विधियों को जोड़ें जो अनुवाद के साथ जुड़ते हैं। वैसे भी यह समस्या का समाधान नहीं करता है, क्योंकि मैं अभी भी उन उत्पादों को $ product-> नाम के साथ एक्सेस नहीं कर सकता, लेकिन $ product-> अनुवाद ['en'] -> नाम – ZolaKt

+0

आप 'नाम' संपत्ति का उपयोग ' उत्पाद' मॉडल जैसा कि इस मॉडल में वर्णित नहीं है (और डीबी तालिका में मौजूद नहीं है)। मेरी विधि के साथ आप एक ऑब्जेक्ट में सभी कॉलम प्राप्त करते हैं (Doctrine_Collection के भीतर) - और एक ठोस अनुवाद के लिए। तो '$ उत्पादों = डीएओ :: के माध्यम से लूपिंग ('कुछ \ Namespace \ product') प्राप्त करें -> getProducts (सरणी ('lang' => 1)); इस तरह 'foreach ($ उत्पाद के रूप में $ उत्पादों) {। ..} 'आप ** ** IMHO तक पहुंच सकते हैं '$ product-> name'। तुम नहीं कर सकते? – shadyyx

+0

हम्म ... मुझे नहीं लगता कि आप अभी भी इसका उपयोग कर सकते हैं, जैसा कि आपने कहा था कि इसे मोडल में वर्णित नहीं किया गया है। मैं क्या कर सकता था इसे सरणी के रूप में हाइड्रेट करता है, और परिणामों को पुनर्व्यवस्थित करता है (अनुवाद हटाएं, और नाम एक स्तर ऊपर प्रसारित करें)। यही वह है जो मैं अब उपयोग कर रहा हूं। लेकिन फिर भी, तालिका तालिकाओं में सामान्य परिभाषा विधियों की तुलना में मैं आपकी विधि में कोई अंतर नहीं देख सकता – ZolaKt

संबंधित मुद्दे