php - Ajax in magento(cargar bloque de vista de producto)
(1)
Lo que quiero lograr: hacer clic en un enlace / imagen del producto (al menos en ciertas áreas) para abrir una ventana emergente con la información completa del producto (básicamente, todos los contenidos de la página de visualización del producto).
Lo que hice / intenté hasta ahora:
- creó todas las cosas fuera del código php ajax (el módulo, enlaces, plantillas, reescrituras)
- creó el controlador ajax (al que se puede acceder con un enlace similar a:
http://test.com/index.php/ajaxproductview/ajax/index/id/2
). - seguir varios tutoriales (como esto o esto ) - eso me ayudó a llegar tan lejos. Pero no quiero cargar mi bloque personalizado, quiero el bloque de vista de producto predeterminado.
intentado agregar algún código en indexAction (). Llega allí, pero el código falla. No recibo ningún error / aviso / informe, solo lo que parece ser un ciclo infinito que mata mi procesador.
$body = $this ->getLayout() ->createBlock(''product.info'') // taken from catalog.xml ->toHtml(); $this->getResponse()->setBody($body);
Todas las otras páginas funcionan bien, y es un magento nuevo con solo magneto y mi módulo instalado y activado.
Mi función AJAX simplemente obtiene esta respuesta HTML, la coloca en un div y abre una ventana emergente.
Mi (s) pregunta (s) es (son): ¿cómo puedo establecer la identificación del producto, para que el bloque sepa qué producto cargar y cómo puedo cargar este bloque correctamente? También intenté algo similar a esto:
Gracias.
PD: también intenté esto:
$layout = $this->getLayout();
$update = $layout->getUpdate();
$update->load(''catalog_product_view'');
$layout->generateXml();
$layout->generateBlocks();
$output = $layout->getOutput(); // $output is an empty string
El controlador del Producto usa un ayudante para configurar el producto activo. ¡Debería poder hacer lo mismo en su controlador!
Pruebe esto antes de hacer su diseño:
$productId = (int) $this->getRequest()->getParam(''id'');
Mage::helper(''catalog/product'')->initProduct($productId, $this);
Otra cosa a tener en cuenta: si agrega un bloque como el bloque product.info. Necesita bloques secundarios adicionales si los llama en su archivo de plantilla.
Sería más fácil usar un archivo xml de diseño personalizado. A continuación, puede agregar un diseño específico para su manejador de acción (su manejador de acción consiste en su nodo de enrutadores en el archivo etc / config.xml de su módulo en <frontend><routers>
, por ejemplo, en el nodo <Yourmodule>
, ¡asegúrese de minúsculas! luego con guiones bajos agregue el nombre del controlador y el nombre de la acción, en su caso index_index) de esta manera:
<yourmodule_index_index>
<remove name="right"/>
<remove name="left"/>
<block type="catalog/product_view" name="root" output="toHtml" template="catalog/product/view.phtml">
<!-- Add all the child blocks you need -->
</block>
</yourmodule_index_index>
Esto hace que view.phtml sea el bloque raíz que se renderiza usando su método toHtml. Por lo tanto, en su acción de controlador, todo lo que necesita son mis dos líneas arriba y luego:
$this->loadLayout();
$this->renderLayout();