谁能向我解释如何使用ReadHandler,SaveHandler以及EntityManager / ExtensionPool的使用?
我正在努力解决这个问题,但是我不太了解如何实现它。如果我理解正确,它们可以用于在对象上执行其他持久性操作,例如创建多对多关系,就像在CMS模块中使用它们将实体链接到商店一样。
我正在尝试通过将另一个实体与CMS页面相关联来做同样的事情,但是我似乎无法使其正常工作。也就是说,如果我正确使用此设计模式。
谁能对此发表一些看法?很抱歉,由于我不在上班时间,目前无法共享一些代码。
编辑:这是我当前正在使用的代码:
我已将添加cms_page_form.xml
到模块的-文件view/adminhtml/ui_component
夹中,因此我还有一个附加选项卡,用于显示客户组:
<?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>
这有效;将显示该选项卡,并显示客户组。默认情况下未选择任何内容。
这是我在全局di.xml
变量中注册我的保存和读取处理程序的条目。我的灵感来自查看如何在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>
这是我的保存处理程序:
<?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;
}
}
到目前为止,一切正常。如果我在管理员中选择客户组,则将执行保存处理程序,并将适当的行添加到数据库中。
这是我的读取处理程序:
<?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;
}
}
这就是我卡住的地方。处理程序工作并执行。如果我执行var_dump()
,$customerGroupIds
则会从数据库中填充正确的结果。
但是,在adminhtml中,没有选择多选中的任何客户组。我想我真的很想解决这个问题,但是我不知道自己在做什么错。我的胆量告诉我,这可能与我在中声明multiselect的方式有关cms_page_form.xml
,但是我不确定它是什么。
顺便说一下,这是数据库方案的示例:
|page_id|customer_group_id|
|-------|-----------------|
|29 |1 |
|29 |2 |
任何帮助将不胜感激。
save handler
没有接到电话。读取处理程序被调用。遵循相同的方法。我想念什么?