Domanda

Qualcuno sa perché Magento piace caricare i prodotti quando viene chiesto di caricare il layout ?

Ho appena sono a piedi attraverso alcuni Magento codice 1.9.2.E ho scritto un controller solo con:loadLayout it renderLayout.Così ho pensato che avrei potuto cambiare i blocchi tra le due funzioni, ma si scopre che non è il caso per la maggior parte del "core", con i blocchi.Per esempio in questo blocco di riempimento nell'Intestazione HTML è fatto se si dice:"loadLayout".

Qualcuno ha esperienza con la rimozione dei blocchi che gia 'cambiato' globale Magento mondo ?

Per esempio: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();
    }

Questo è il mio 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();
È stato utile?

Soluzione

Spiegare questo in pieno va al di là di un singolo Stack Exchange risposta, il sistema di layout potrebbe riempire un piccolo libro (e Ho scritto quel libro).

In breve, quando si chiama loadLayout stai dicendo a Magento

  1. Unire tutti i Layout XML file di Aggiornamento (app/design/area/theme/layout) in un albero
  2. Trovare le parti specifiche di un albero che per questa richiesta
  3. Utilizzare quelle specifiche parti dell'albero per determinare quali oggetti di blocco per creare un'istanza, e quindi creare istanze di oggetti di blocco

È l'ultima parte del #3 gettando -- quando Magento crea un'istanza di un blocco tramite il layout chiamate _construct e e _prepareLayout nel blocco.Questi metodi, a sua volta, spesso di fare le cose come caricare una collezione di prodotti.

Al fine di cui sopra, quando si chiama renderLayout stai dicendo a Magento "chiama la radice del blocco toHtml il metodo, che rende la radice del blocco phtml modello, che a cascata per l'altro blocco phtml modelli via getChildHtml (anche questo a volte innesca diretto la creazione di istanze di rendering e di altri oggetti di blocco)

Qualcuno ha esperienza con la rimozione dei blocchi che gia 'cambiato' globale Magento mondo ?

In generale, si probabilmente non si vuole fare questo.Altri blocchi di codice e può contare su che stato sei cercando di cambiare, e che la sua rimozione potrebbe causare errori irreversibili.

Se si davvero voglio fare questo, mi piacerebbe guardare nelle seguenti eventi

controller_action_layout_load_before
controller_action_layout_generate_xml_before
controller_action_layout_generate_blocks_before

e poi direttamente modificando il layout e/o aggiornamento layout oggetto (dal passato osservatore) per rimuovere il codice XML responsabile per la creazione del blocco che si desidera rimuovere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top