Ai đó có thể giải thích cho tôi cách sử dụng ReadHandler, SaveHandler và việc sử dụng EntityManager / ExtensionPool không?
Tôi đang cố quấn đầu quanh nó, nhưng tôi không thể hiểu được cách thực hiện nó. Nếu tôi hiểu chính xác, chúng có thể được sử dụng để thực hiện các hoạt động liên tục bổ sung trên các đối tượng, như tạo quan hệ nhiều-nhiều, giống như chúng được sử dụng trong mô-đun CMS để liên kết thực thể với cửa hàng.
Tôi đang cố gắng làm điều tương tự bằng cách liên kết một thực thể khác với các trang CMS, nhưng tôi dường như không thể làm cho nó hoạt động. Đó là, nếu tôi đang sử dụng mẫu thiết kế này đúng cách.
Bất cứ ai có thể chia sẻ một số ánh sáng về điều này? Tôi xin lỗi tôi không thể chia sẻ một số mã tại thời điểm này, vì tôi không làm việc.
EDIT: Đây là mã tôi hiện đang sử dụng:
Tôi đã thêm vào cms_page_form.xml
các mô-đun của view/adminhtml/ui_component
mình, vì vậy tôi có thêm một tab hiển thị các nhóm khách hàng:
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<fieldset name="customer_groups">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="collapsible" xsi:type="boolean">true</item>
<item name="label" xsi:type="string" translate="true">Customer Groups</item>
<item name="sortOrder" xsi:type="number">100</item>
</item>
</argument>
<field name="customer_groups">
<argument name="data" xsi:type="array">
<item name="options" xsi:type="object">Magento\Customer\Model\Config\Source\Group\Multiselect</item>
<item name="config" xsi:type="array">
<item name="dataType" xsi:type="string">int</item>
<item name="label" xsi:type="string" translate="true">Customer Groups</item>
<item name="formElement" xsi:type="string">multiselect</item>
<item name="source" xsi:type="string">page</item>
<item name="dataScope" xsi:type="string">customer_group</item>
<item name="default" xsi:type="string">0</item>
</item>
</argument>
</field>
</fieldset>
</form>
Những công việc này; tab được hiển thị và các nhóm khách hàng được hiển thị. Không có cái nào được chọn theo mặc định.
Đây là mục nhập của tôi trong toàn cầu di.xml
để đăng ký trình xử lý lưu và đọc của tôi. Cảm hứng của tôi là nhìn vào cách các cửa hàng được lưu trên các trang CMS:
<type name="Magento\Framework\EntityManager\Operation\ExtensionPool">
<arguments>
<argument name="extensionActions" xsi:type="array">
<item name="Magento\Cms\Api\Data\PageInterface" xsi:type="array">
<item name="read" xsi:type="array">
<item name="customerGroupReader"
xsi:type="string">Vendor\Module\Model\ResourceModel\Page\Relation\CustomerGroup\ReadHandler</item>
</item>
<item name="create" xsi:type="array">
<item name="customerGroupCreator"
xsi:type="string">Vendor\Module\Model\ResourceModel\Page\Relation\CustomerGroup\SaveHandler</item>
</item>
<item name="update" xsi:type="array">
<item name="customerGroupUpdater"
xsi:type="string">Vendor\Module\Model\ResourceModel\Page\Relation\CustomerGroup\SaveHandler</item>
</item>
</item>
</argument>
</arguments>
</type>
Đây là xử lý tiết kiệm của tôi:
<?php
namespace Vendor\Module\Model\ResourceModel\Page\Relation\CustomerGroup;
use Magento\Framework\EntityManager\Operation\ExtensionInterface;
use Magento\Cms\Model\ResourceModel\Page as PageResource;
/**
* Class SaveHandler
*/
class SaveHandler implements ExtensionInterface
{
/**
* @var PageResource
*/
protected $pageResource;
/**
* SaveHandler constructor.
* @param PageResource $pageResource
*/
public function __construct(
PageResource $pageResource
)
{
$this->pageResource = $pageResource;
}
/**
* @param \Magento\Cms\Model\Page $entity
* @param array $arguments
*/
public function execute($entity, $arguments = [])
{
$connection = $this->pageResource->getConnection();
// First delete all existing relations:
$connection->delete('cms_page_customer_group', sprintf('page_id = %d', (int) $entity->getId()));
// Re-create the relations:
foreach ($entity->getData('customer_group') as $customerGroupId) {
$connection->insert('cms_page_customer_group', [
'page_id' => (int) $entity->getId(),
'customer_group_id' => (int) $customerGroupId
]);
}
return $entity;
}
}
Cho đến thời điểm này mọi thứ hoạt động. Nếu tôi chọn các nhóm khách hàng trong quản trị viên, trình xử lý lưu sẽ được thực thi và các hàng thích hợp được thêm vào cơ sở dữ liệu.
Đây là xử lý đọc của tôi:
<?php
namespace Vendor\Module\Model\ResourceModel\Page\Relation\CustomerGroup;
use Magento\Framework\EntityManager\Operation\ExtensionInterface;
use Magento\Cms\Model\ResourceModel\Page as PageResource;
/**
* Class ReadHandler
*/
class ReadHandler implements ExtensionInterface
{
/**
* @var PageResource
*/
protected $pageResource;
/**
* SaveHandler constructor.
* @param PageResource $pageResource
*/
public function __construct(
PageResource $pageResource
) {
$this->pageResource = $pageResource;
}
/**
* @param \Magento\Cms\Model\Page $entity
* @param array $arguments
*/
public function execute($entity, $arguments = [])
{
if ($entity->getId()) {
$connection = $this->pageResource->getConnection();
$customerGroupIds = $connection
->fetchCol(
$connection
->select()
->from('cms_page_customer_group', ['customer_group_id'])
->where('page_id = ?', (int)$entity->getId())
);
$entity->setData('customer_group', $customerGroupIds);
}
return $entity;
}
}
Đây là nơi tôi bị mắc kẹt. Trình xử lý làm việc và được thực hiện. Nếu tôi thực hiện một var_dump()
trên $customerGroupIds
họ sẽ được điền bằng kết quả chính xác từ cơ sở dữ liệu.
Tuy nhiên, trong adminhtml, không có nhóm khách hàng nào trong multiselect được chọn. Tôi nghĩ rằng tôi thực sự gần gũi với việc giải quyết vấn đề này, nhưng tôi không thể hiểu mình đang làm gì sai. Ruột của tôi nói với tôi rằng nó có thể có liên quan đến cách tôi tuyên bố multiselect trong cms_page_form.xml
, nhưng tôi không chắc nó là gì.
Nhân tiện, đây là một ví dụ về sơ đồ cơ sở dữ liệu:
|page_id|customer_group_id|
|-------|-----------------|
|29 |1 |
|29 |2 |
Mọi sự trợ giúp sẽ rất được trân trọng.
save handler
không được gọi. Đọc Handler đang được gọi. Theo cách tiếp cận tương tự. Tôi đang thiếu gì?