Frage

Weiß jemand, warum Magento gerne Produkte lädt, wenn man nur das Layout laden soll?

Ich gehe gerade Magento-Code aus 1.9.2 durch.Und ich habe einen Controller geschrieben mit nur:LoadLayout und RenderLayout.Also habe ich mir überlegt, dass ich Blöcke zwischen den beiden Funktionen wechseln könnte, aber es stellte sich heraus, dass dies bei den meisten „Kern“-Blöcken nicht der Fall ist.In diesem Block erfolgt beispielsweise das Ausfüllen des HTML-Headers, wenn Sie Folgendes sagen:„loadLayout“.

Hat jemand Erfahrung mit dem Entfernen von Blöcken, die die globale Magento-Welt bereits „verändert“ haben?

Zum Beispiel: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();
    }

Das ist mein Test:

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

$controller = initController('Gn_Test_IndexController');
$product = Mage::getModel('catalog/product')->load(1);
Mage::register('product', $product);
$controller->loadLayout();
War es hilfreich?

Lösung

Dies vollständig zu erklären geht über eine einzelne Stack Exchange-Antwort hinaus, das Layoutsystem könnte ein kleines Buch füllen (und Ich habe dieses Buch geschrieben).

Kurz gesagt – wenn Sie anrufen loadLayout Sie sagen es Magento

  1. Führen Sie alle Layout-XML-Update-Dateien zusammen (app/design/area/theme/layout) in einen Baum
  2. Suchen Sie die spezifischen Teile dieses Baums, die für diese Anfrage verwendet werden sollen
  3. Verwenden Sie diese spezifischen Teile des Baums, um zu bestimmen, welche Blockobjekte instanziiert werden sollen, und instanziieren Sie dann die Blockobjekte

Es ist der letzte Teil von #3, der Sie aus der Fassung bringt – wenn Magento einen Block über das aufgerufene Layout instanziiert _construct und und _prepareLayout im Block.Diese Methoden wiederum führen oft Dinge wie das Laden einer Produktsammlung aus.

Um das oben Gesagte abzuschließen, rufen Sie uns an renderLayout Sie sagen Magento: „Rufen Sie die Root-Blöcke auf.“ toHtml Methode, die die Root-Blöcke rendert phtml Vorlage, die auf die anderen Blöcke übertragen wird phtml Vorlagen über getChildHtml (Dies löst manchmal auch die direkte Instanziierung und Darstellung anderer Blockobjekte aus.)

Hat jemand Erfahrung mit dem Entfernen von Blöcken, die die globale Magento-Welt bereits „verändert“ haben?

Im Allgemeinen Sie wahrscheinlich Ich möchte das nicht tun.Andere Blöcke und Code stützen sich möglicherweise auf den Status, den Sie ändern möchten, und das Entfernen kann zu schwerwiegenden Fehlern führen.

Wenn du Wirklich Wenn Sie dies tun möchten, würde ich mir die folgenden Ereignisse ansehen

controller_action_layout_load_before
controller_action_layout_generate_xml_before
controller_action_layout_generate_blocks_before

und dann direktes Ändern des Layouts und/oder des Layoutaktualisierungsobjekts (aus dem übergebenen Beobachter), um das XML zu entfernen, das für die Erstellung des Blocks verantwortlich ist, den Sie entfernen möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top