Pregunta

¿Alguien sabe por qué a Magento le gusta cargar productos cuando se le pide que simplemente cargue el diseño?

Estoy repasando un código de Magento desde 1.9.2.Y he escrito un controlador con solo:loadLayout y renderLayout.Entonces pensé que podía cambiar bloques entre las dos funciones, pero resulta que ese no es el caso para la mayoría de los bloques "centrales".Por ejemplo, en este bloque, el llenado del encabezado HTML se realiza si dice:"cargar diseño".

¿Alguien tiene experiencia en la eliminación de bloques que ya "cambiaron" el mundo global de Magento?

Por ejemplo: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();
    }

Esta es mi prueba:

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

$controller = initController('Gn_Test_IndexController');
$product = Mage::getModel('catalog/product')->load(1);
Mage::register('product', $product);
$controller->loadLayout();
¿Fue útil?

Solución

Explicar esto en su totalidad va más allá de una sola respuesta de Stack Exchange, el sistema de diseño podría llenar un libro pequeño (y He escrito ese libro).

En resumen: cuando llamas loadLayout le estás diciendo a Magento

  1. Fusionar todos los archivos de actualización XML de diseño (app/design/area/theme/layout) en un árbol
  2. Encuentre las partes específicas de ese árbol para usar en esta solicitud
  3. Utilice esas partes específicas del árbol para determinar qué objetos de bloque crear instancias y luego crear instancias de los objetos de bloque.

Es la última parte del punto 3 la que te sorprende: cuando Magento crea una instancia de un bloque a través del diseño al que llama. _construct y y _prepareLayout en el bloque.Estos métodos, a su vez, suelen hacer cosas como cargar una colección de productos.

Para terminar lo anterior, cuando llames renderLayout le estás diciendo a Magento "llame al bloque raíz toHtml método, que representa el bloque raíz phtml plantilla, que cae en cascada al otro bloque phtml plantillas a través de getChildHtml (Esto a veces también desencadena la creación de instancias directas y la representación de otros objetos de bloque)

¿Alguien tiene experiencia en la eliminación de bloques que ya "cambiaron" el mundo global de Magento?

En general, tu probablemente No quiero hacer esto.Otros bloques y códigos pueden depender del estado que desea modificar, y eliminarlo puede provocar errores fatales.

Si usted en realidad Si quiero hacer esto, investigaría los siguientes eventos

controller_action_layout_load_before
controller_action_layout_generate_xml_before
controller_action_layout_generate_blocks_before

y luego modificar directamente el diseño y/o el objeto de actualización de diseño (del observador pasado) para eliminar el XML responsable de crear el bloque que desea eliminar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top