क्या phtml टेम्प्लेट पर एक गेटमॉडल क्लास को तुरंत करना अच्छा है?


14

यह Magento में एक अच्छी प्रोग्रामिंग प्रथाओं के बारे में एक सवाल है।

मुझे उत्पाद (श्रेणी उत्पाद सूची में) को अपने संबंधित उत्पादों के साथ थंबनेल में दिखाना होगा। तो मैंने mypackage/mytheme/template/catalog/product/list.phtmlकुछ इस तरह से संपादित किया

<?php 
    $related=$_product->getRelatedProductIds();
    if(count($related)>0){
        echo '<div class="a'.$ap.'"></div>';
        echo '<div class="li_p"><ul>';
        foreach($related as $rela){
            $rela_nom=Mage::getModel('catalog/product')->load($rela);
            echo '<li><a href="'.$rela_nom->getProductUrl().'"> <img src="'.$this->helper('catalog/image')->init($rela_nom, 'small_image')->resize(20).'" width="20" height="20"> </a><li>';
        }
        echo '</ul></div>';
    }
?>

और यह बहुत अच्छी तरह से काम करता है।

लेकिन मेरा सवाल यह है: क्या यह phtml फ़ाइलों पर एक मॉडल वर्ग को तत्काल करने के लिए सही है?

यदि नहीं, तो इस कार्यक्षमता को प्राप्त करने का सबसे अच्छा तरीका क्या होगा? मेरा मतलब है, किस फ़ाइल को संपादित करना बेहतर है या किस वर्ग को जोड़ना बेहतर है, कहाँ है? एक सहायक?

क्या आप एक छोटा सा उदाहरण प्रदान कर सकते हैं या मुझे एक झलक दे सकते हैं कि कौन सी फाइलें संपादित करने के लिए बेहतर हैं।

जवाबों:


10

मैं सोनासी के जवाब से असहमत होना चाहता हूं :)

टेम्पलेट में एक मॉडल की शुरुआत करना बुरा व्यवहार है। कभी-कभी इसकी जरूरत होती है और कभी-कभी मैं भी करता हूं। लेकिन अगर यह संभव है तो आपको अपनी pHTML फ़ाइलों और केवल echoदी गई चीजों में कोड जोड़ने से रोकना चाहिए ।

यह चिंताओं का पृथक्करण है । HTML और कोडिंग सामग्री को न मिलाएं। यह ब्लॉक वर्ग में होना चाहिए।


3
मैं आपकी असहमति से भी सहमत हूं :) लेकिन पाश के बाहर एक एकल मॉडल को लोड करना दुनिया का अंत नहीं है। अन्यथा यह अमूर्तता का मामला बन जाता है - केवल देखने के लिए कोड की एक पंक्ति को अलग करने के लिए मौजूदा अतिरिक्त कक्षाएं जोड़ना। यह सिर्फ रखरखाव का उल्लेख करने के लिए, ओवरहेड्स को फिर से लिखने के लिए जोड़ता है।
बेन लेसानी - सोनासी

यदि आपके पास मेरी सभी वर्तनी की गलतियों को ठीक करना है, तो उसके लिए धन्यवाद देना होगा :-) इसके लिए धन्यवाद
Fabian Blechschmidt

Btw, आप सही हैं सोनासी :-) यह सिर्फ एक ऐसी चीज है जिससे हमें सावधान रहना चाहिए। मैंने phtml-files में SQL क्वेरी देखी ... NO NO :-)
Fabian

4

किसी फ़ाइल में मॉडल लोड करने में कुछ भी गलत नहीं हैphtml । लेकिन यह इस बात पर निर्भर करता है कि आप ऐसा क्यों कर रहे हैं।

यदि आपको संपूर्ण मॉडल और इसके साथ जुड़े सभी डेटा की आवश्यकता है, तो आप पूरे मॉडल को लोड कर सकते हैं।

लेकिन अगर आपको केवल उत्पाद URL (आपके उदाहरण से) की आवश्यकता है, तो आप सही संग्रह लोड कर सकते हैं

$_product->getRelatedProductCollection();

फिर आवश्यक के रूप में उस के माध्यम से पुनरावृति

<?php $_relatedCollection = $_product->getRelatedProductCollection(); ?>
<?php foreach ($_relatedCollection as $_item): ?>
<li>
  <a href="<?php echo $_item->getProductUrl(); ?>">
    <img src="<?php echo $this->helper('catalog/image')->init($_item, 'small_image')->resize(20); ?>" width="20" height="20">
  </a>
<li>
<?php endforeach; ?>

3

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

सोनासी की चिंताओं के बारे में बहुत सी अनावश्यक कक्षाओं के बारे में मैं सुझाव देता हूं कि वे एमवीसी को आगे बढ़ाने के लिए तत्पर हैं। इस मामले में हम कमांडर के रूप में देखते हैं कि कौन सा ब्लॉक परिभाषित करता है और कौन सा डेटा होना चाहिए। नियंत्रक में कार्रवाई में डेटा लोड करने के लिए आवश्यक कोड हो सकता है और रेंडर करने से पहले इसे ब्लॉक (मैजिक सेटर्स के माध्यम से) में डाल सकता है।


3

मैं फैबियन ब्लेसश्मिड से सहमत हूं कि यह बुरा अभ्यास है और आपको सेपरेशन ऑफ कंसर्न का सम्मान करना चाहिए।

रचनात्मक सुझाव जोड़ने के लिए:

यह कुछ ऐसा है, ब्लॉक कक्षाओं के लिए हैं। अपने मामले में आपको वांछित कार्यक्षमता जोड़ने के लिए फिर Mage_Catalog_Block_Product_List से लिखना होगा :

public function hasRelatedProducts()
{
    return count($this->getRelatedProductIds()) > 0;
}
public function getRelatedProducts()
{
    $products = array();
    foreach ($this->getRelatedProductIds() as $id) {
        $products[] = Mage::getModel('catalog/product')->load($id);
    }
    return $products;
}

यह स्पष्ट होना चाहिए कि टेम्पलेट में इन विधियों का उपयोग कैसे किया जाए।

नोट: रीराइट का मतलब कोर फाइल को एडिट करना नहीं है। यदि आप ब्लॉक को फिर से लिखना नहीं जानते हैं तो कस्टमाइज़िंग ट्यूटोरियल का पालन करें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.