Magento 1.9.2 "LoadLayout"が製品のロードを開始するのはなぜですか?

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

  •  13-12-2019
  •  | 
  •  

質問

誰かに、レイアウトをロードするように頼まれたときにMagentoが製品をロードするのが好きな理由を知っていますか?

私は1.9.2からいくつかのマゼントコードを歩いています。 そして、私はちょうどコントローラを警告しました:loadLayout en renderLayout。 だから私は2つの関数の間のブロックを変更することができましたが、ほとんどの「コア」ブロックの場合はそうではありません。たとえば、このブロックでHTMLヘッダーを記入している場合は、「loadLayout」

は、グローバルマゼントの世界をすでに変更されたブロックを削除したことの経験がありますか?

次のように: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();
.

役に立ちましたか?

解決

これでの説明では、単一のスタック交換回答を超えて説明すると、レイアウトシステムは小さな本を埋めることができます(http://store.pulsestorm.net/products/no-froils-magento-layout "rel=" nofollow ">その本)を書いた。

短い - Magento

に告げるloadLayoutを呼び出すとき

  1. すべてのレイアウトXMLアップデートファイル(app/design/area/theme/layout)を1つのツリーにマージする
  2. このリクエストに使用するそのツリーの特定の部分を見つけます
  3. ツリーの特定の部分を使用して、どのブロックオブジェクトをインスタンス化してからブロックオブジェクトをインスタンス化するかを判断します。
  4. #3の最後の部分です。これらの方法は、順番に、製品コレクションをロードすることのようなものをします。

    上記を終了するには、Magentoに_constructを呼び出すと、ルートブロックの_prepareLayoutメソッドを呼び出します。これは、ルートブロックのrenderLayoutテンプレートをtoHtmlを介して他のブロックのphtmlテンプレートにレンダリングします(これは直接インスタンス化をトリガーすることがあります)。および他のブロックオブジェクトのレンダリング)

    は、グローバルマゼントの世界をすでに変更されたブロックを削除したことの経験がありますか?

    一般的に、あなたはおそらくをやりたくないです。他のブロックとコードはあなたが変更しようとしていて、それを削除しようとしているその状態に頼るかもしれません。

    本当にをやりたい場合は、次のイベントを調べます

    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