Загрузка дочернего HTML-кода Magento вне Magento

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

require_once $docRoot.'/app/Mage.php';
umask(0);
Mage::app('default');
...

$layout = Mage::getSingleton('core/layout');
$block = $layout->createBlock('Mage_Page_Block_Html_Header');
$block->setTemplate('page/html/header.phtml');
echo $block->renderView();

Проблема в том, что если блок, который я рендерю, имеет дочерние блоки (html), они не включаются в вывод. В приведенном выше примере файл header.phtml содержит следующий вызов дочернего html, который отсутствует в выходных данных.

...
<?php echo $this->getChildHtml('topLinks') ?>
...

person Christian    schedule 02.01.2011    source источник
comment
Мне кажется, что Алан довольно хорошо ответил на вопрос. Возможно, это не решило проблему так, как вы хотели, но я предлагаю вам отметить ее как правильную, если только в ней нет какой-то ошибки, которую я не вижу.   -  person shaune    schedule 02.02.2011
comment
Если вы хотите включить верхний и нижний колонтитулы magento за его пределы, например, для стороннего cms/приложения, вы можете использовать следующую статью:‹br /› blog.magepsycho.com/ Удачной электронной коммерции!   -  person MagePsycho    schedule 06.12.2011


Ответы (3)


Объект макета представляет собой набор блочных объектов. Блоки организованы в форме родительского/дочернего дерева.

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

Кроме того, блок topLinks по умолчанию ничего не отображает. В него нужно добавить ссылки. Обычно это делается с помощью других файлов layout.xml.

Наконец, вероятно, лучше начинать рендеринг с вызова

echo $block_header->toHtml();

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

require_once 'app/Mage.php';
umask(0);
Mage::app('default');

$layout         = Mage::getSingleton('core/layout');

$block_header   = $layout->createBlock('page/html_header')->setTemplate('page/html/header.phtml');

// <block type="" name="top.links" as="topLinks"/>
$block_links    = $layout->createBlock('page/template_links','top.links')->setTemplate('page/template/links.phtml');
$block_header->setChild('topLinks',$block_links);

//<reference name="top.links">
//  <action method="addLink" translate="label title" module="customer"><label>My Account</label><url helper="customer/getAccountUrl"/><title>My Account</title><prepare/><urlParams/><position>10</position></action>
//</reference>
$block_links->addLink('My Account','foo/baz/bar/','My Account','','',10);

echo $block_header->toHtml();
person Alan Storm    schedule 02.01.2011
comment
Спасибо, это было очень полезно - person Kamesh Jungi; 22.08.2013
comment
Алан, похоже, это работает изолированно. Я создал файл с именем test.php и запустил его. Там, где мои шаблоны содержали $this-›getUrl(''), они отображались как BASE_URL. /test.php/ . Есть ли способ сделать это с помощью макета Magento xml, чтобы вам не приходилось вручную добавлять детей? - person JaseC; 16.01.2014
comment
@JaseC Я вообще не понимаю, о чем ты спрашиваешь. Похоже, ваш комментарий было бы лучше сделать новым вопросом. - person Alan Storm; 16.01.2014
comment
@AlanStorm, наверное, прав. Кстати, спасибо за все другие ресурсы, которые вы разместили в Интернете на Magento. Я видел твое имя много раз. Я имел в виду, что если мы запустим приведенный выше код в 'test.php', а 'page/html/header.phtml' будет содержать echo $this->getUrl("contactus"), он будет отображаться как 'myshop.com/magento/test.php/contactus' вместо 'myshop.com/magento/contactus". - person JaseC; 17.01.2014

Ссылка ниже обеспечивает несколько похожий подход, подобный упомянутому Аланом, хотя он включает в себя добавление других блоков, которые могут содержать файлы JS и CSS. Вы также можете попробовать проверить это:

Как добавить блоки Magento, CSS и Javascript на внешний сайт

person Richard Feraro    schedule 04.01.2011

person    schedule
comment
Можете ли вы дать какое-то объяснение, а не просто стену кода? - person Austin Henley; 25.09.2012