class - Magento Ajax: cómo mostrar programáticamente un bloque personalizado desde Controller(mi contenido HTML siempre está en blanco)
block (1)
Encuentro estas cosas muy difíciles. Voy a tratar de responder en dos partes:
PARTE UNO
Es posible que desee intentar mostrar el diseño en el controlador, intente esto primero y luego lea los elementos adicionales a continuación:
//file: app/code/local/MyModule/Ajax/controllers/ProductController.php
//class: MyModule_Ajax_ProductController
//function: indexAction()
$this->loadLayout();
$this->renderLayout();
PERO usted está haciendo un módulo Ajax. Por lo tanto, es posible que desee utilizar métodos de control como, por ejemplo:
//set the response
$this->getResponse()
//->clearHeaders()
->setHeader(''Content-Type'', ''application/json'')
->setBody(json_encode($someReturnObject));
return;
Y si desea establecer setBody()
en el HTML de un bloque, entonces, en el controlador, el código que ha publicado arriba se ve bien (pero consulte la segunda parte a continuación):
$this->loadLayout();
$myBlock = $this->getLayout()->createBlock(''ajax/product'');
$myBlock->setTemplate(''mymodule_ajax/product.phtml'');
$myHtml = $myBlock->toHtml(); //also consider $myBlock->renderView();
$this->getResponse()
->setHeader(''Content-Type'', ''text/html'')
->setBody($myHtml);
return;
Y en realidad, incluso solo llamando a exit();
al final de indexAction()
se indexAction()
el búfer de salida PHP al navegador.
Noto que está haciendo un controlador de producto. Estudiar el código en la clase que está extendiendo puede ayudar:
//file: app/code/core/Mage/Catalog/controllers/ProductController.php
//class: Mage_Catalog_ProductController
//function: viewAction()
public function viewAction()
{
// Get initial data from request
$categoryId = (int) $this->getRequest()->getParam(''category'', false);
$productId = (int) $this->getRequest()->getParam(''id'');
$specifyOptions = $this->getRequest()->getParam(''options'');
// Prepare helper and params
$viewHelper = Mage::helper(''catalog/product_view'');
$params = new Varien_Object();
$params->setCategoryId($categoryId);
$params->setSpecifyOptions($specifyOptions);
// Render page
try {
$viewHelper->prepareAndRender($productId, $this, $params);
} catch (Exception $e) {
//...
}
}
que podría darle algunas ideas sobre el envío de HTML relacionado con el producto estándar de Magento al navegador. Puede encontrar la función de ayuda prepareAndRender()
más interesante, pero finalmente utiliza $this->renderLayout()
para crear el html de salida (aquí $this
es el controlador).
LA SEGUNDA PARTE
Creo que debes concentrarte en la línea de tu código:
echo $this->getLayout()->createBlock(''ajax/product'')->setTemplate(''mymodule_ajax/product.phtml'')->toHtml();
y cambiarlo a
echo $this->getLayout()->createBlock(''mymodule_ajax/product'')->setTemplate(''mymodule_ajax/product.phtml'')->toHtml();
o, en el archivo config.xml de su módulo, agregue algo como: (Creo que esta es la respuesta que necesita)
<config>
<global>
<!-- ... -->
<blocks>
<ajax>
<class>MyModule_Ajax_Block</class>
</ajax>
</blocks>
<!-- ... -->
</global>
</config>
para que Magento pueda entender que createBlock(''ajax/product'')
significa MyModule_Ajax_Block_Product
y no Mage_Ajax_Block_Product
.
También te recomiendo que cambies MyModule
a Mymodule
todo momento para que no haya una letra mayúscula en el medio. Porque
$this->getLayout()->createBlock(''mymodule_ajax/product'')
bueno, no entiendo los detalles, pero en general Magento convertirá mi mymodule
en Mymodule
no MyModule
¿Tiene sentido?
Intento mostrar un bloque como parte de una respuesta a una llamada ajax. Todo funciona, excepto que no puedo hacer que el controlador repita el código HTML de la plantilla.
Mi clase de módulo:
class MyModule_Ajax_ProductController extends Mage_Catalog_ProductController {
public function indexAction() {
if ($product = $this->_initProduct()) {
echo ''<div>hello</div>''; //this works
echo $this->getLayout()->createBlock(''ajax/product'')->setTemplate(''mymodule_ajax/product.phtml'')->toHtml();
//I also tried:
//$layout = $this->getLayout();
//$update = $layout->getUpdate();
//$update->load(''ajax_product_index'');
//$layout->generateXml();
//$layout->generateBlocks();
//$output = $layout->getOutput();
//echo $output;
}
}
}
Dentro de mi archivo de plantilla product.phtml - este HTML nunca se muestra. (guardado en app / design / frontend / default / default / template / mymodule_ajax / product.phtml)
<div>HERE!</div>
Mi clase de bloque:
class MyModule_Ajax_Block_Product extends Mage_Catalog_Block_Product
{
private $product;
protected function _construct()
{
parent::_construct();
$this->setTemplate(''mymodule_ajax/product.phtml'');
}
protected function _toHtml() {
return parent::_toHtml();
}
public function setProduct($product) {
$this->product = $product;
return $this;
}
public function getProduct() {
return $this->product;
}
}
Mi diseño / mymodule_ajax.xml
<?xml version="1.0"?>
<layout>
<ajax_product_index>
<reference name="root">
<block type="ajax/project" name="root" output="toHtml" template="mymodule_ajax/product.phtml"/>
</reference>
</ajax_product_index>
</layout>
Asumo que porque estoy configurando la plantilla programáticamente en mi clase de bloque, ¿no debería necesitar la referencia del módulo? Eliminar la referencia no hace diferencia.
No obtengo ningún error de PHP, el HTML muestra renders
<html>
<head></head>
<body></body>
</html>
Simplemente no puedo entender lo que estoy haciendo mal? Estoy usando Magento CE 1.8.1