Saya mencoba mencari cara terbaik untuk membuat HTML melalui AJAX di Magento 2.
Cara 1: Menggunakan Pengontrol tanpa tata letak
Mengajukan 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());
}
}
Cara 2: Menggunakan Kontroler dengan tata letak khusus
Mengajukan 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();
}
}
Mengajukan 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>
Mengajukan 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>
IMO praktik terbaik tampaknya menjadi Way 2 karena memisahkan logika dari Controller.
Tetapi masalah dengan Way 2 adalah bahwa <body>
dan <head>
dengan CSS
/ JS
dihasilkan sehingga bukan HTML yang dibersihkan sepenuhnya dengan hanya templat blok saya di dalamnya.
- Apakah saya menggunakan tata letak kustom dengan cara yang salah?
- Apakah Jalan 1 dianggap sebagai praktik yang baik?
- Apakah ada cara lain untuk melakukan itu?
sumber
Di luar kotak, Magento tidak menggunakan metode apa pun untuk merender HTML melalui AJAX.
Dari apa yang saya lihat, setiap kali hal seperti itu perlu dilakukan, JSON digunakan untuk mengangkut hasilnya.
Contoh dari
Magento/Checkout/Controller/Cart/Add
:Kemudian Magento 2 menggunakan mekanisme baru yang disebut bagian, untuk menangani data di frontend dan memperbarui blok spesifik yang perlu diperbarui, Anda dapat mempelajari lebih lanjut tentang bagian dalam T&J ini: /magento//a/ 143381/2380
EDIT mengenai bagian kedua dari jawaban saya: seperti yang dinyatakan oleh Max dalam komentar, bagian hanya digunakan dengan data spesifik pelanggan dan menggunakan fungsi ini sebagai ganti setiap panggilan AJAX bukanlah solusi yang tepat.
sumber
Dalam contoh saya, saya tidak dapat menggunakan
sections
karena tidakcustomer data
dan tidak setelahPUT
/POST
tindakan tetapi menggunakanRaphael at Digital Pianism
jawaban saya tahu bagaimana Magento membuat bagian.Jika kita mengambil contoh
cart
bagian itu menggunakan metode\Magento\Customer\CustomerData\SectionPool::getSectionDataByNames
untuk mengambil data dari bagian. Ini membawa kita ke\Magento\Checkout\CustomerData\Cart::getSectionData
dengan array tunggal yang mengandung area bagian, termasuk$this->layout->createBlock('Magento\Catalog\Block\ShortcutButtons')->toHtml()
Bergantung pada itu di sini adalah kelas Controller terakhir:
sumber