পিটিএইচটিএমএল টেমপ্লেটগুলিতে গেটমোডেল ক্লাস ইনস্ট্যান্ট করা ভাল?


14

এটি ম্যাজেন্টোতে একটি ভাল প্রোগ্রামিং অনুশীলন সম্পর্কিত একটি প্রশ্ন।

থাম্বনেইলে এর সম্পর্কিত পণ্যগুলির সাথে পণ্যটি (বিভাগের তালিকার তালিকায়) প্রদর্শন করতে হবে। তাই আমি 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>';
    }
?>

এবং এটা খুব ভাল কাজ করে।

তবে আমার প্রশ্নটি: পিএইচটিএমএল ফাইলগুলিতে কোনও মডেল ক্লাস ইনস্ট্যান্ট করা কি এটি সঠিক?

যদি তা না হয় তবে এই কার্যকারিতাটি অর্জনের সর্বোত্তম উপায় কী হবে? মানে, কোন ফাইলটি সম্পাদনা করা ভাল বা কোন শ্রেণি যুক্ত করা ভাল, কোথায়? একজন সহায়ক?

আপনি কি একটি সামান্য উদাহরণ প্রদান করতে পারেন বা আমাকে ফাইলগুলি সম্পাদনা করার চেয়ে আরও ভাল।

উত্তর:


10

আমি সোনাসির উত্তরটির সাথে একমত হতে চাই :)

টেমপ্লেটে একটি মডেল সূচনা করা খারাপ অভ্যাস। কখনও কখনও এটি প্রয়োজন হয় এবং কখনও কখনও আমি এটিও করি। তবে যদি এটি সম্ভব হয় তবে আপনার পিএইচটিএমএল ফাইলগুলি এবং কেবলমাত্র echoদেওয়া জিনিসগুলিতে কোড যুক্ত করা আপনার আটকাতে হবে ।

এটি উদ্বেগের বিচ্ছেদ । এইচটিএমএল এবং কোডিং স্টাফগুলি মিশ্রিত করবেন না। এটি ব্লক শ্রেণিতে হওয়া উচিত।


3
আমি আপনার মতবিরোধের সাথেও একমত :) :) তবে একটি লুপের বাইরে একটি একক মডেল লোড করা বিশ্বের শেষ নয়। অন্যথায় এটি বিমূর্তকরণ ইনফিনিটামের ক্ষেত্রে পরিণত হয় - কেবলমাত্র একক লাইন কোডের দর্শন থেকে পৃথক করার জন্য বিদ্যমান অতিরিক্ত ক্লাস যুক্ত করা। এটি কেবল ওভারহেডগুলি পুনরায় লেখায় যুক্ত করে, রক্ষণাবেক্ষণের কথা উল্লেখ করে না।
বেন লেসানী - সোনাসি

আপনি যদি আমার সমস্ত বানান ভুল সংশোধন করতে চান তবে আপনার খুব সময় আছে, তার জন্য ধন্যবাদ :-)
ফ্যাবিয়ান ব্ল্যাচসমিট

বিটিডব্লিউ, আপনি ঠিক সোনাসি :-) এটি আমাদের কিছু যত্নশীল হওয়া উচিত। আমি পিটিএইচটিএমএল-ফাইলগুলিতে এসকিউএল কোয়েরিগুলি দেখেছি ... কোন নম্বর নেই :-)
ফ্যাবিয়ান ব্ল্যাচসমিডট

4

কোনও ফাইলে একটি মডেল লোড করাতে কোনও ভুল নেই phtml। তবে আপনি এটি করছেন কেন তা নির্ভর করে।

আপনার যদি পুরো মডেল এবং এর সাথে সম্পর্কিত সমস্ত ডেটা প্রয়োজন হয় তবে আপনি পাশাপাশি পুরো মডেলটি লোড করতে পারেন।

তবে আপনার যদি কেবল পণ্যের ইউআরএল প্রয়োজন (আপনার উদাহরণ থেকে), তবে আপনি কেবল সঠিক সংগ্রহটি লোড করতে পারেন

$_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 সেন্ট এখানে রাখতে চান। ম্যাজেন্টোতে ব্যবহৃত আর্কিটেকচার অধ্যক্ষদের আমাদের শ্রদ্ধা করা উচিত। ম্যাজেন্টোতে ব্যবহৃত মূল স্থাপত্য নিদর্শন হ'ল এমভিসি। ম্যাজেন্টোর ক্ষেত্রে "ভিউ" অংশটিতে বেশ কয়েকটি জিনিস রয়েছে (ব্লক, টেম্পলেট, বিন্যাস)। সামঞ্জস্য বিকাশকারীদের জন্য টেমপ্লেটগুলি আরও ক্লিনার এবং পাঠযোগ্য করে তোলার জন্য টেমপ্লেট থেকে ডেটা প্রস্তুতির যুক্তি সরিয়ে অন্য কোনও শ্রেণীর কাছে ব্লক তৈরি করা হয়েছিল। এখানে আমি ফ্যাবিয়ানের সাথে একমত হতে চাই।

অনেকগুলি অনিবন্ধিত ক্লাস সম্পর্কে সোনাসির উদ্বেগের ভিত্তিতে আমি ভিত্তিক এমভিসি চালিয়ে যাওয়ার অপেক্ষায় রয়েছি। এই ক্ষেত্রে আমরা কমান্ডার হিসাবে নিয়ামককে দেখি যে কোন ব্লক এবং কোন ডেটা থাকা উচিত তা সংজ্ঞায়িত করে। কন্ট্রোলার অ্যাকশনটিতে রেন্ডারিংয়ের আগে ডেটা লোড করতে এবং এটিকে ব্লকের (ম্যাজিক সেটটারের মাধ্যমে) রাখার জন্য প্রয়োজনীয় কোড থাকতে পারে।


3

আমি ফ্যাবিয়ান ব্লিশচমিডেটের সাথে একমত যে এটি খারাপ অভ্যাস এবং আপনার উদ্বেগকে আলাদা করা উচিত respect

একটি গঠনমূলক পরামর্শ যুক্ত করতে:

এটি এমন কিছু, ব্লক ক্লাসগুলি বোঝানো হয়। আপনার ক্ষেত্রে পছন্দসই কার্যকারিতা যুক্ত করতে আপনাকে পুনরায় লিখতে 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;
}

টেমপ্লেটে কীভাবে এই পদ্ধতিগুলি ব্যবহার করবেন তা স্পষ্ট হওয়া উচিত।

দ্রষ্টব্য: পুনর্লিখনের অর্থ মূল ফাইলটি সম্পাদনা করা নয়। আপনি কীভাবে কোনও ব্লক পুনর্লিখন করতে জানেন না তা কাস্টমাইজিং টিউটোরিয়াল অনুসরণ করুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.