2011-01-02 12 views
6

Estoy cargando bloques de Magento fuera de Magento para ciertas partes de mi sitio. Puedo hacer esto con éxito con algo similar a lo siguiente.Cargando Magento child html fuera de 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(); 

El problema es que si el bloque estoy rasgando tiene bloques del niño (HTML) no están incluidos en la salida. En el ejemplo anterior, el archivo header.phtml contiene la siguiente llamada para child html que falta en el resultado.

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

Me parece que Alan respondió a la pregunta bastante bien. Puede que no haya resuelto el problema de la forma que usted quería, pero le sugiero que lo marque como correcto, a menos que haya algún error que no vea. – shaune

+0

Si desea incluir el encabezado y pie de página de magento fuera de él, por ejemplo, para cms/application de terceros, puede usar el siguiente artículo:
http://www.blog.magepsycho.com/using -magento-header-footer-outside-of-magento/Happy E-Commerce !! – MagePsycho

Respuesta

12

Un objeto de disposición es una colección de objetos de bloque. Los bloques están organizados en forma de árbol padre/hijo.

Su diseño tiene un solo bloque. No ha agregado ningún bloque de elementos secundarios. Por lo tanto, cuando la plantilla de su bloque intenta renderizar un elemento secundario con getChildHtml, no puede encontrar uno y no se produce ningún resultado adicional.

Además, el bloque topLinks, de forma predeterminada, no representa nada. Necesita tener enlaces agregados. Esto normalmente se realiza a través de otros archivos layout.xml.

Por último, es probable que sea mejor para dar comienzo a la prestación con una llamada a

echo $block_header->toHtml(); 

A continuación se muestra un ejemplo de cómo se puede bloques de nido correctamente, así como llamar a sus métodos de acción, de modo que usted será capaz de renderizar sus bloques fuera del procedimiento normal de envío. Es diferente de la tuya porque creamos un nuevo bloque de enlaces, agregamos un enlace a él y lo agregamos a tu bloque de nivel superior.

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

Gracias fue muy útil –

+0

Alan esto parece funcionar "aislado". Creé un archivo llamado test.php y lo ejecuté. Donde mis plantillas contenían $ this-> getUrl ('') lo representaba como BASE_URL. /test.php/. ¿Hay alguna manera de hacerlo a través del diseño xml de Magento para que no tenga que agregar manualmente los elementos secundarios? – JaseC

+0

@JaseC No entiendo lo que estás preguntando en absoluto. Parece que su comentario sería mejor como una nueva pregunta. –

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

¿Puede proporcionar alguna explicación en lugar de solo una pared de código? –

+0

con este código, solo puede obtener bloque de enlaces superiores en el encabezado. –