Загрузите блок вне Magento и примените текущий шаблон - PullRequest
12 голосов
/ 14 июня 2011

У меня есть установка Magento, интегрированная с внешним веб-сайтом, и я хочу, чтобы блок корзины Magento отображался в заголовке этого внешнего сайта.

Я добился этого с помощью следующего кода:

<?php

require_once(dirname(__FILE__).'/store/app/Mage.php');

$app = Mage::app();
$session = Mage::getSingleton('core/session', array('name'=>'frontend'));

$block = $app
    ->getLayout()
    ->getBlockSingleton('checkout/cart_sidebar')
    ->setTemplate('checkout/cart/sidebar.phtml');

echo $block->toHtml();

Но я хочу (и считаю, что это возможно) более приятный подход.

Мне не нравится тот факт, что я должен указать шаблон вручную через setTemplate(), что включаеткодирование местоположения шаблона и повторение чего-то, что он определил где-то еще (в файлах макета макета дизайна).Я попытался загрузить блок через $app->getLayout()->getBlock($name) без результатов (где $name представляет ссылочное имя блока, как определено в файлах XML макета).

Так что вопрос:

Есть ли способ визуализации блока вне magento (со следующими реквизитами)?

  • Я хочу, чтобы базовый макет xml и обновления макета дизайна магазина с изменениями дизайна были загруженыавтоматически, поэтому мне не нужно указывать путь шаблона и тип блока (снова) вручную.
  • Я хочу загрузить блок по его ссылочному имени, чтобы я мог использовать свойства, примененные к немув файлах макета XML.

Цель этого вопроса - обернуть его в функцию и визуализировать каждый блок вне Magento так же, как это делается в шаблонах Magento.Например:

<div id="sidebar-cart-container">
    <?php echo $this->renderMagentoBlock('cart-block-reference-id'); ?>
</div>

Заранее спасибо.

1 Ответ

23 голосов
/ 15 июня 2011

Мне потребовалось пару минут на отладку, но это кажется относительно простым.

<?php

/*
 * Initialize magento.
 */
require_once 'app/Mage.php';
Mage::init();

/*
 * Add specific layout handles to our layout and then load them.
 */
$layout = Mage::app()->getLayout();
$layout->getUpdate()
    ->addHandle('default')
    ->addHandle('some_other_handle')
    ->load();

/*
 * Generate blocks, but XML from previously loaded layout handles must be
 * loaded first.
 */
$layout->generateXml()
       ->generateBlocks();

/* 
 * Now we can simply get any block in the usual way.
 */
$cart = $layout->getBlock('cart_sidebar')->toHtml();
echo $cart;

Обратите внимание, что вы должны вручную указать, из каких ручек макета вы хотите загружать блоки.Дескриптор макета «по умолчанию» будет содержать боковую панель, поскольку он помещен туда изнутри checkout.xml.

Но использование дескриптора макета «по умолчанию» может привести к значительным потерям производительности, поскольку многие модули размещают свои блокисправиться.Возможно, вы захотите поместить все блоки, которые вы используете на своем внешнем сайте, в отдельный дескриптор макета и просто загрузить его.

Выбор за вами.Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...