Intereting Posts

Загрузите блок за пределы 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-файлах макета).

Итак, вопрос:

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

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

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

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

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

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

 <?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; по <?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.

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

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