2012-11-28 19 views
6

मैं विभिन्न एमवीसी ढांचे (जैसे सिम्फनी) से Magento तक आ रहा हूं। मैंने Magento सर्वोत्तम प्रथाओं के बारे में बहुत कुछ पढ़ा और मैं देख सकता हूं कि Magento ठेठ एमवीसी शैली का उपयोग नहीं करता है।Magento - ब्लॉक में रूपों को संभालने का सबसे अच्छा तरीका?

यह नहीं देखने के लिए चर सेट करने के लिए नियंत्रक की जिम्मेदारी [...] नियंत्रक का काम मॉडल करने के लिए कुछ काम करने के लिए है, और तो यह लेआउट प्रतिपादन है प्रणाली बता: एलन तूफान निम्नलिखित लिखा था पहर।

मुझे लगता है कि मैं इस दृष्टिकोण को समझता हूं क्योंकि यह ब्लॉक के लिए एक प्रकार की लचीलापन प्रदान कर सकता है।

दाएं। लेकिन रूपों के बारे में क्या?

एक विशिष्ट एमवीसी ढांचे में आपको नियंत्रक में अनुरोध पैरामीटर मिलेंगे, नियंत्रक में फॉर्म डेटा मान्य करेंगे, मॉडल ऑपरेशन (सेव, लोड इत्यादि) या फिर आवश्यक होने पर पुनर्निर्देशन करें, और जब सब कुछ साफ और साफ हो, आप दृश्य के लिए ताजा बेक्ड आउटपुट टुकड़े प्रदान करेंगे।

Magento में इन सभी को एक ब्लॉक के अंदर होना चाहिए और (पतला) नियंत्रक केवल लेआउट तैयार करना है और फिर इसे प्रस्तुत करना है। (अगर मैं समझता हूं।)

मैंने एक लेख (मैनुअल, फोरम विषय, कुछ भी) खोजने की कोशिश की, जो एक अलग मॉड्यूल के साथ एक अलग मॉड्यूल के निर्माण चरणों का वर्णन करता है, जो अग्रभाग में एक रूप के माध्यम से संपादन योग्य हो सकता है उपयोगकर्ता द्वारा मैं देखना चाहता हूं कि फ्रंटएंड में कस्टम फॉर्म कैसे काम करना चाहिए। मुझे ब्लॉक, फॉर्म, संशोधित करने या adminhtml रूपों को बनाने या संपर्क या न्यूजलेटर साइनअप फ़ॉर्म को कस्टमाइज़ करने के बारे में केवल सामान्य लेख मिल गए हैं।

मैंने इसे बनाया। यह अब काम करता है, लेकिन मैं संतुष्ट नहीं हूँ। तो फिर, मैंने कोर मॉड्यूल में संपर्क फ़ॉर्म के स्रोत कोड की जांच की, और उन लोगों ने मेरे लिए पूरी तस्वीर को गड़बड़ कर दिया। अंतर्निहित संपर्क फ़ॉर्म उपर्युक्त परिचालनों में से अधिकांश में इंडेक्स कंट्रोलर का उपयोग करता है, (लगभग) मानक एमवीसी की तरह।

क्या कोई मुझे सबसे अच्छा अभ्यास सुझा सकता है, निम्न प्रकार का सरल प्रवाह कैसे प्रबंधित करें? (मैं इन नीचे के लिए एक समाधान मिल गया है, लेकिन मुझे यकीन है कि नहीं हूँ, यह है कि "सही Magento रास्ता"):

  • जब पृष्ठ लोड हो तो एक ब्लॉक में एक रूप है, जो में शामिल है दिखाने अलग पेज
  • लोड डीबी से एक मॉडल वस्तु के रूप में
  • आबाद वस्तु डेटा एक अनुरोध पैरामीटर द्वारा
  • उपयोगकर्ता फार्म, प्रक्रिया प्रपत्र डेटा, सबमिट करता है उन्हें
  • मान्य सत्यापन त्रुटि दिखाते हैं तो फिर से फॉर्म, और त्रुटि संदेश पॉप अप
  • I च ठीक है, डीबी में डाटा स्टोर, दिखाने के एक धन्यवाद पृष्ठ

मेरे भ्रम की स्थिति मुख्य रूप से चारों ओर है:

  • मैं कहां से मिलता है और अनुरोध पैरामीटर का प्रबंधन करना चाहिए? (मैंने इसे ब्लॉक क्लास फ़ाइल में किया था)
  • और डीबी से ऑब्जेक्ट लोड करें, इसके आधार पर? (इसके अलावा, और उसके बाद PHP को पास किया गया)
  • इसे देखने के लिए कैसे करें, अगर मैं इसे लोड नहीं करता हूं? (मुझे एक रास्ता पता होगा, लेकिन मुझे सबसे अच्छा तरीका नहीं पता।)
  • (POST) फॉर्म डेटा को संसाधित, मान्य और संग्रहीत किया जाना चाहिए? (ब्लॉक?)
  • मैं ब्लॉक में ठीक से पुनर्निर्देशन का उपयोग कैसे कर सकता हूं? क्या मुझे पुनर्निर्देशन की आवश्यकता है, क्योंकि धन्यवाद पृष्ठ एक अलग ब्लॉक/पृष्ठ होना चाहिए? या सिर्फ एक ही ब्लॉक के एक alternativ (सशर्त) देखो?

उत्तर

2

आप ग्राहक/खाता नियंत्रक में देख सकते हैं और देख सकते हैं कि loginPost, createPost विधियां आने वाले फॉर्म डेटा को प्रबंधित कर रही हैं।

मैं ब्लॉक में CRUD तर्क कभी नहीं जोड़ूंगा। आपको अपने नियंत्रक में अपने POST डेटा को सत्यापित और संसाधित करने की आवश्यकता है। ब्लॉक में केवल दृश्य-संबंधित तर्क होना चाहिए: प्रारूप यूआरएल की तरह, या Collection तैयार करें।

इसके अलावा फॉर्म तैयारी कंट्रोलर कंधों पर भी है। आपको अपनी ऑब्जेक्ट लोड करने और नियंत्रक कार्रवाई के अंदर इसे सत्यापित करने की आवश्यकता है।

  • Mage::register (रजिस्ट्री)
  • $this->getLayout->getBlock('your_form_block')->setEntity($object) (सीधे सेट ब्लॉक करने के लिए चर)

किसी भी पुनर्निर्देशन केवल नियंत्रक में किया जाना चाहिए: तो फिर वहाँ यह ब्लॉक करने के लिए पारित करने के लिए कुछ तरीके हैं।

अद्यतन नियंत्रक के अंदर लोड मॉडल के बारे में कुछ शब्द क्यों हैं।

  1. आप अपनी वस्तु को लोड करने में विफल रहते हैं, इसका मतलब है कि यूआरएल उपयोगकर्ता (वस्तु आईडी के साथ) का उपयोग किया जाता है पुरानी हो चुकी है और यह आप त्रुटि के साथ कुछ सुविधाजनक पृष्ठ पर ग्राहक रीडायरेक्ट करने के लिए की आवश्यकता होगी संभव है।
  2. जैसा कि मैंने उपरोक्त कहा है, सभी रीडायरेक्ट केवल नियंत्रक में ही किए जाने चाहिए। ऐसा क्यों है? क्योंकि फिलहाल ब्लॉक प्रक्रिया है, Magento द्वारा बूटस्ट्रैपिंग कार्य की बड़ी मात्रा पहले ही कर दी गई है - जैसे loadLayout और सभी ब्लॉक बनाएं। आप उपयोगकर्ता को उस समय के लिए बस उसे रीडायरेक्ट करने के लिए इंतजार नहीं करना चाहते हैं।
  3. कंट्रोलर में कहीं भी रीडायरेक्ट डालने से एप्लिकेशन को बनाए रखने योग्य नहीं बनाया जाता है। बेशक अपवाद हैं, लेकिन आपको पता होना चाहिए कि आप क्या कर रहे हैं।

इसके अलावा आप लगभग एक और मूल्यवान हिस्सा भूल गए हैं। यदि सत्यापन आपके नियंत्रक के अंदर विफल रहता है, तो आपको फ़ॉर्म को उपयोगकर्ता द्वारा भेजे गए मानों के साथ भरना होगा। Zend_Form में जो सुंदर हो गया है, लेकिन Magento रूपों के साथ आपको सत्र का उपयोग करने की आवश्यकता होगी (जैसे कि यह खाता नियंत्रक में किया गया है) - सत्र में सभी कुंजी-मूल्य भागों को सहेजें और फिर उन सत्र चर अस्तित्व के लिए ब्लॉक चेक में सहेजें। दोबारा, आपको यह करना चाहिए यदि आपका पोस्ट सत्यापन विफल हो गया है और आप उपयोगकर्ता को अपने फॉर्म पर रीडायरेक्ट कर रहे हैं। सफल मामले में फॉर्म से जुड़े सत्र चर साफ़ करें।

सलाह के सामान्य भाग के रूप में: यदि आप Magento शैली का पालन करना चाहते हैं, तो कम फ़ोरम और अधिक कोर कोड पढ़ें।

+0

धन्यवाद स्लेयर, मुझे यही संदेह है। ऐसा लगता है कि ज्यादा समझ में आता है! मैं उपरोक्त आपके सभी तर्कों से सहमत हूं। मैंने अपने एमवीसी ज्ञान के आधार पर कुछ ऐसा ही माना। मैं उन कोर कोड की जांच करूंगा। बहुत सराहना की! –

0

मैं एक Magento समर्थक या तो नहीं कर रहा हूँ, लेकिन मुझे लगता है कि मैं आपके सवालों के जवाब कर सकते हैं:

मैं कहां से मिलता है और अनुरोध पैरामीटर का प्रबंधन करना चाहिए? (मैंने इसे ब्लॉक क्लास फ़ाइल में किया था) इस पर निर्भर करता है कि आपको उनकी आवश्यकता है। यदि आप उन्हें मॉडल में सहेजने की योजना बना रहे हैं, तो नियंत्रक का उपयोग करें। यदि आप उन्हें किसी पृष्ठ पर आउटपुट करना चाहते हैं, तो ब्लॉक का उपयोग करें। ज्यादातर मामलों में आप इसके लिए नियंत्रक का उपयोग करना चाहते हैं।

और इसके आधार पर डीबी से ऑब्जेक्ट लोड करें? (इसके अलावा, और फिर PHP को पास किया गया) यदि आप किसी टेम्पलेट में मॉडल को पास करना चाहते हैं तो आपको मॉडल को प्राप्त करने वाले आपके ब्लॉक पर एक फ़ंक्शन लिखना चाहिए।

इसे देखने के लिए कैसे इसे पास किया जाए, अगर मैं इसे लोड नहीं करता? (मुझे एक रास्ता पता होगा, लेकिन मुझे सबसे अच्छा तरीका नहीं पता।) जैसा ऊपर बताया गया है, मॉडल को प्राप्त करने वाले फ़ंक्शन के साथ एक ब्लॉक बनाएं। फिर अपने टेम्पलेट से आप $ model = $ this-> functionThatGetsTheModel() का उपयोग कर सकते हैं; इस फ़ंक्शन तक पहुंचने के लिए और ब्लॉक प्राप्त करें।

(POST) फॉर्म डेटा को संसाधित, मान्य और संग्रहीत किया जाना चाहिए? (ब्लॉक?) बचत मॉडल की तरह चीजें नियंत्रक सामान है।

मैं ब्लॉक में ठीक से पुनर्निर्देशन का उपयोग कैसे कर सकता हूं? क्या मुझे पुनर्निर्देशन की आवश्यकता है, क्योंकि धन्यवाद पृष्ठ एक अलग ब्लॉक/पृष्ठ होना चाहिए? या सिर्फ एक ही ब्लॉक के एक alternativ (सशर्त) देखो? अपने नियंत्रक में रीडायरेक्ट करने के लिए सबसे अच्छा है। और प्रत्येक पृष्ठ के लिए एक नया ब्लॉक/टेम्पलेट बनाना भी सर्वोत्तम है जिसे आप बनाना चाहते हैं।

बारे में ब्लॉक/टेम्पलेट विषय: लेआउट एक्सएमएल के उपयोग के बारे में अधिक जानकारी के लिए इस पेज पढ़ें ब्लॉक और टेम्पलेट http://www.magentocommerce.com/knowledge-base/entry/magento-for-dev-part-4-magento-layouts-blocks-and-templates

मुझे आशा है कि यह मदद करता है आप Magento के साथ शुरू करने का उपयोग करने के!

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

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