Загрузка Magento дочернего HTML за пределами Magento - PullRequest
6 голосов
/ 02 января 2011

Я загружаю блоки 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') ?>
...

Ответы [ 3 ]

12 голосов
/ 02 января 2011

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

Ваш макет содержит один блок.Вы не добавили к нему дочерние блоки.Поэтому, когда шаблон вашего блока пытается отобразить дочерний элемент с помощью 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();
2 голосов
/ 04 января 2011

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

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

0 голосов
/ 04 сентября 2012
# Init Magento
require_once 'app/Mage.php';
umask(0);

$app = Mage::app('default');

$app->getTranslator()->init('frontend'); 

# Init User Session
session_name('frontend');
$session = Mage::getSingleton('customer/session');

# Init Blocks
$linksBlock = $app->getLayout()->getBlockSingleton("page/template_links");

$checkoutLinksBlock = $app->getLayout()->getBlockSingleton("checkout/links");
$checkoutLinksBlock->setParentBlock($linksBlock);

$wishlistLinksBlock = $app->getLayout()->getBlockSingleton('wishlist/links');
$wishlistLinksBlock->setParentBlock($linksBlock);

# Add Links
$linksBlock->addLink($linksBlock->__('My Account'), 'customer/account', $linksBlock->__('My Account'), true, array(), 10, 'class="first"');
$wishlistLinksBlock->addWishlistLink();
$checkoutLinksBlock->addCartLink();
$checkoutLinksBlock->addCheckoutLink();

if ($session->isLoggedIn()) {
    $linksBlock->addLink($linksBlock->__('Log Out'), 'customer/account/logout', $linksBlock->__('Log Out'), true, array(), 100, 'class="last"');
} else {
    $linksBlock->addLink($linksBlock->__('Log In'), 'customer/account/login', $linksBlock->__('Log In'), true, array(), 100, 'class="last"');
}

echo '<div class="toplinks">'.$linksBlock->renderView().'</div>';
...