Подтвердить что ты не робот

Загрузите блок за пределы Magento и примените текущий шаблон

У меня есть установка 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(), который включает расположение шаблонов жесткого кодирования и повторение того, что он определил где-то еще (в XML файлах макета дизайна). Я попытался загрузить блок через $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>

Спасибо заранее.

4b9b3361

Ответ 1

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

<?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.

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

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