2011-01-02 16 views
6

Ładowanie bloków Magento poza Magento dla niektórych części mojej witryny. Mogę to zrobić z powodzeniem za pomocą czegoś podobnego.Ładowanie html Magento dla dzieci poza 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(); 

Problemem jest to, że jeśli blok jestem rozdzieranie ma bloki dziecko (HTML) nie zostały one uwzględnione w danych wyjściowych. W powyższym przykładzie plik header.phtml zawiera następujące wywołanie html podrzędnego, którego brakuje w danych wyjściowych.

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

Wygląda mi na to, Alan odpowiedział na pytanie całkiem dobrze. Być może nie rozwiązał problemu tak, jak chciałeś, ale sugeruję, abyś go oznaczył jako poprawny, chyba że jest w nim jakiś błąd, którego nie widzę. – shaune

+0

Jeśli chcesz zawierać nagłówek i stopkę Magento poza nim, powiedzmy na przykład dla trzeciej partii cms/aplikacji następnie można użyć wykonaj następujący artykuł:
http://www.blog.magepsycho.com/using -magento-header-footer-outside-of-magento/Happy E-Commerce !! – MagePsycho

Odpowiedz

12

Obiekt układu to zbiór obiektów blokowych. Bloki są zorganizowane w formie drzewa nadrzędnego/podrzędnego.

Twój układ ma jeden blok. Nie dodano do niego żadnych bloków potomnych. Dlatego gdy szablon bloku próbuje renderować element potomny za pomocą getChildHtml, nie może go znaleźć i nie jest generowany żaden dodatkowy wynik.

Dodatkowo, blok topLinks domyślnie nie czyni niczego. Musi mieć dodane do niego linki. Zwykle odbywa się to za pomocą innych plików layout.xml.

Wreszcie, to chyba lepiej skopać trójwymiarowa z wezwaniem do

echo $block_header->toHtml(); 

poniżej jest przykładem tego, jak można zagnieżdżać bloki poprawnie, jak również nazwać ich metody działania, tak, że będziesz możliwość renderowania twoich bloków poza normalną procedurą wysyłki. Różni się od ciebie tym, że tworzymy nowy blok linków, dodajemy do niego link i dodajemy go do twojego bloku najwyższego poziomu.

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(); 
+0

Dzięki, że było bardzo pomocne –

+0

Alan wydaje się, że działa "izolowany". Stworzyłem plik o nazwie test.php i uruchomiłem to. Tam, gdzie moje szablony zawierały $ this-> getUrl ("'), renderowało to jako BASE_URL. /test.php/. Czy istnieje sposób, aby to zrobić za pomocą xml układu Magento, aby nie trzeba było ręcznie dodawać dzieci? – JaseC

+0

@JaseC Nie rozumiem, o co w ogóle pytasz. Wygląda na to, że twój komentarz byłby lepszy jako nowe pytanie. –

0
# 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>'; 
+1

Czy możesz podać jakieś wyjaśnienie, a nie tylko ścianę kodu? –

+0

tym kodem można uzyskać tylko blok toplinks w nagłówku. –