J'essaie de trouver la meilleure façon de rendre le HTML via AJAX dans Magento 2.
Méthode 1: Utilisation du contrôleur sans mise en page
Fichier Foo/Bar/Controller/Popin/Content.php
<?php
namespace Foo\Bar\Controller\Popin;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
/**
* Class Content
*/
class Content extends Action
{
/**
* Content constructor.
*
* @param Context $context
*/
public function __construct(
Context $context
) {
parent::__construct($context);
}
/**
*
*/
public function execute()
{
/** @var \Magento\Framework\View\Layout $layout */
$layout = $this->_view->getLayout();
/** @var \Foo\Bar\Block\Popin\Content $block */
$block = $layout->createBlock(\Foo\Bar\Block\Popin\Content::class);
$block->setTemplate('Foo_Bar::popin/content.phtml');
$this->getResponse()->setBody($block->toHtml());
}
}
Méthode 2: utilisation du contrôleur avec une disposition personnalisée
Fichier Foo/Bar/Controller/Popin/Content.php
<?php
namespace Foo\Bar\Controller\Popin;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
/**
* Class Content
*/
class Content extends Action
{
/**
* Content constructor.
*
* @param Context $context
*/
public function __construct(
Context $context
) {
parent::__construct($context);
}
/**
*
*/
public function execute()
{
$this->_view->loadLayout();
$this->_view->renderLayout();
}
}
Fichier Foo/Bar/view/frontend/page_layout/ajax-empty.xml
<?xml version="1.0"?>
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_layout.xsd">
<container name="root"/>
</layout>
Fichier Foo/Bar/view/frontend/layout/foo_bar_popin_content.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="ajax-empty" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="root">
<block class="Foo\Bar\Block\Popin\Content" name="foo_bar_popin_content" template="Foo_Bar::popin/content.phtml" cacheable="false"/>
</referenceContainer>
</body>
</page>
OMI, la meilleure pratique semble être la voie 2 car elle sépare la logique du contrôleur.
Mais le problème avec Way 2 est que le <body>
et <head>
avec CSS
/ JS
sont générés, donc ce n'est pas un HTML entièrement nettoyé avec seulement mon modèle de bloc.
- est-ce que j'utilise la disposition personnalisée dans le mauvais sens?
- La voie 1 est-elle considérée comme une bonne pratique?
- Y a-t-il d'autres façons de le faire?
la source
Hors de la boîte, Magento n'utilise aucune de ces méthodes pour rendre HTML via AJAX.
D'après ce que j'ai vu, chaque fois qu'une telle chose doit être faite, JSON est utilisé pour transporter le résultat.
Exemple de
Magento/Checkout/Controller/Cart/Add
:Ensuite, Magento 2 utilise un nouveau mécanisme appelé sections, pour gérer les données sur le frontend et mettre à jour les blocs spécifiques qui doivent être mis à jour, vous pouvez en savoir plus sur les sections dans ce Q&A: /magento//a/ 143381/2380
EDITER concernant la deuxième partie de ma réponse: comme indiqué par Max dans le commentaire, les sections ne sont utilisées qu'avec des données spécifiques au client et utiliser cette fonctionnalité à la place de chaque appel AJAX n'est pas la bonne solution.
la source
Dans mon exemple, je ne peux pas l'utiliser
sections
car ce n'est pas le cascustomer data
et ce n'est pas après une actionPUT
/POST
mais en utilisant laRaphael at Digital Pianism
réponse, j'ai compris comment Magento rend les sections.Si nous prenons l'exemple de
cart
section, il utilise la méthode\Magento\Customer\CustomerData\SectionPool::getSectionDataByNames
pour récupérer les données des sections. Cela nous amène à\Magento\Checkout\CustomerData\Cart::getSectionData
un seul tableau contenant des zones de la section, y compris$this->layout->createBlock('Magento\Catalog\Block\ShortcutButtons')->toHtml()
En fonction de cela, voici la classe finale du contrôleur:
la source