لماذا يبدأ Magento 1.9.2 "loadLayout" في تحميل المنتجات؟

magento.stackexchange https://magento.stackexchange.com//questions/82945

  •  13-12-2019
  •  | 
  •  

سؤال

هل يعرف أحد لماذا يحب Magento تحميل المنتجات عندما يُطلب منه تحميل التصميم فقط؟

أنا فقط أتصفح بعض أكواد Magento من 1.9.2.ولقد كتبت وحدة تحكم مع فقط:LoadLayout و renderLayout.لذلك اعتقدت أنه يمكنني تغيير الكتل بين الوظيفتين، ولكن اتضح أن هذا ليس هو الحال بالنسبة لمعظم الكتل "الأساسية".على سبيل المثال، في هذه الكتلة، يتم ملء رأس HTML إذا قلت:"تخطيط التحميل".

هل لدى أي شخص خبرة في إزالة الكتل التي "غيرت" عالم Magento العالمي بالفعل؟

على سبيل المثال:Mage_Catalog_Block_Product_View

/**
 * Retrieve current product model
 *
 * @return Mage_Catalog_Model_Product
 */
public function getProduct()
{
    if (!Mage::registry('product') && $this->getProductId()) {
        $product = Mage::getModel('catalog/product')->load($this->getProductId());
        Mage::register('product', $product);
    }
    return Mage::registry('product');
}
/**
     * Add meta information from product to head block
     *
     * @return Mage_Catalog_Block_Product_View
     */
    protected function _prepareLayout()
    {
        $this->getLayout()->createBlock('catalog/breadcrumbs');
        $headBlock = $this->getLayout()->getBlock('head');
        if ($headBlock) {
            $product = $this->getProduct();
            $title = $product->getMetaTitle();
            if ($title) {
                $headBlock->setTitle($title);
            }
            $keyword = $product->getMetaKeyword();
            $currentCategory = Mage::registry('current_category');
            if ($keyword) {
                $headBlock->setKeywords($keyword);
            } elseif ($currentCategory) {
                $headBlock->setKeywords($product->getName());
            }
            $description = $product->getMetaDescription();
            if ($description) {
                $headBlock->setDescription( ($description) );
            } else {
                $headBlock->setDescription(Mage::helper('core/string')->substr($product->getDescription(), 0, 255));
            }
            if ($this->helper('catalog/product')->canUseCanonicalTag()) {
                $params = array('_ignore_category' => true);
                $headBlock->addLinkRel('canonical', $product->getUrlModel()->getUrl($product, $params));
            }
        }

        return parent::_prepareLayout();
    }

هذا هو اختباري:

<?php
include_once('../initMage.php');
initMage();

$controller = initController('Gn_Test_IndexController');
$product = Mage::getModel('catalog/product')->load(1);
Mage::register('product', $product);
$controller->loadLayout();
هل كانت مفيدة؟

المحلول

إن شرح ذلك بالكامل يتجاوز إجابة Stack Exchange واحدة، حيث يمكن لنظام التخطيط أن يملأ كتابًا صغيرًا (و لقد كتبت هذا الكتاب).

باختصار - عند الاتصال loadLayout أنت تقول الماجنتو

  1. دمج كافة ملفات تحديث Layout XML (app/design/area/theme/layout) في شجرة واحدة
  2. ابحث عن الأجزاء المحددة من تلك الشجرة لاستخدامها في هذا الطلب
  3. استخدم تلك الأجزاء المحددة من الشجرة لتحديد كائنات الكتلة التي سيتم إنشاء مثيل لها، ثم قم بإنشاء مثيل لكائنات الكتلة

إنه الجزء الأخير من رقم 3 الذي يرميك - عندما يقوم Magento بإنشاء مثيل للكتلة عبر التخطيط الذي يستدعيه _construct و و _prepareLayout في الكتلة.غالبًا ما تقوم هذه الأساليب بدورها بأشياء مثل تحميل مجموعة المنتجات.

لإنهاء ما سبق، عند الاتصال renderLayout أنت تخبر Magento "اتصل بوحدة الجذر toHtml الطريقة التي تعرض كتلة الجذر phtml القالب، الذي يتتالي إلى الكتلة الأخرى phtml القوالب عبر getChildHtml (يؤدي هذا أيضًا في بعض الأحيان إلى إنشاء مثيل مباشر وعرض كائنات كتلة أخرى)

هل لدى أي شخص خبرة في إزالة الكتل التي "غيرت" عالم Magento العالمي بالفعل؟

على العموم انت من المحتمل لا أريد أن أفعل هذا.قد تعتمد الكتل والتعليمات البرمجية الأخرى على الحالة التي تريد تغييرها، وقد تؤدي إزالتها إلى حدوث أخطاء فادحة.

اذا أنت حقًا أريد أن أفعل هذا، وأود أن ننظر في الأحداث التالية

controller_action_layout_load_before
controller_action_layout_generate_xml_before
controller_action_layout_generate_blocks_before

ثم قم بتعديل كائن تحديث التخطيط و/أو التخطيط مباشرةً (من المراقب الذي تم تمريره) لإزالة XML المسؤول عن إنشاء الكتلة التي تريد إزالتها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى magento.stackexchange
scroll top