Question

Quelqu'un sait pourquoi Magento aime à charge des produits de lors de il suffit de charger la mise en page ?

Je viens de marcher à travers quelques Magento code de 1.9.2.Et j'ai écrit un contrôleur avec juste:loadLayout fr renderLayout.J'ai donc enseigné que je pouvais changer les blocs entre les deux fonctions, mais il s'avère que ce n'est pas le cas pour la plupart du "noyau dur" des blocs.Par exemple, dans ce bloc de remplissage dans l'en-Tête HTML est fait si vous dites:"loadLayout".

Quelqu'un a une expérience avec la suppression des blocs déjà "changé" le mondial Magento monde ?

Par exemple: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();
    }

C'est mon 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();
Était-ce utile?

La solution

Expliquant dans ce dans plein va au-delà d'une simple Pile de Change réponse, le système de mise en page pourrait remplir un petit livre (et J'ai écrit ce livre).

En bref -- lorsque vous appelez loadLayout vous dites à Magento

  1. Fusionner l'ensemble de la Mise en page XML de mise à Jour des fichiers (app/design/area/theme/layout) dans un arbre
  2. Trouver les parties spécifiques de l'arbre à utiliser pour cette demande
  3. L'utilisation de ces parties spécifiques de l'arbre pour déterminer le bloc objets à instancier, et puis instancier le bloc objets

C'est la dernière partie de #3 c'est à vous jeter -- quand Magento instancie un bloc via la mise en page des appels _construct et et _prepareLayout dans le bloc.Ces méthodes, à son tour, va souvent faire des choses comme la charge d'un produit collection.

Pour terminer, lorsque vous appelez renderLayout vous dites Magento "appeler le bloc de la racine de l' toHtml la méthode, ce qui rend le bloc de la racine de l' phtml modèle, qui s'applique à l'autre de l'édifice de l' phtml modèles via getChildHtml (cela déclenche parfois directe de l'instanciation et le rendu de l'autre bloc objets)

Quelqu'un a une expérience avec la suppression des blocs déjà "changé" le mondial Magento monde ?

En général, vous probablement ne voulez pas le faire.D'autres blocs de code et peut s'appuyer sur cet état que vous êtes à la recherche à modifier, et l'enlever peut provoquer des erreurs fatales.

Si vous vraiment voulez faire cela, j'aurais l'air dans les événements suivants

controller_action_layout_load_before
controller_action_layout_generate_xml_before
controller_action_layout_generate_blocks_before

et puis en modifiant directement la mise en page et/ou mise à jour de l'objet (de l'observateur) pour supprimer le XML responsable de la création du bloc que vous souhaitez supprimer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top