あなたは、パラメータの値を設定する必要がrender_urlにinsertListingしてからデータプロバイダのこのURLの内部を更新します。フォームコンポーネント用に1つのデータプロバイダーとリストコンポーネント用に固有のデータプロバイダーが必要になるため、このアクションを2回実行する必要があります。
1-insertListingコンポーネントの正しい宣言:
(Vendor / Module / view / adminhtml / ui_component / vendor_module_form.xml)
<insertListing name="testInsertListing">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="dataLinks" xsi:type="array">
<item name="imports" xsi:type="boolean">false</item>
<item name="exports" xsi:type="boolean">true</item>
</item>
<item name="autoRender" xsi:type="boolean">true</item>
<!-- the namespace attribute should be the name of the listing XML file -->
<item name="ns" xsi:type="string">vendor_module_listing</item>
<!-- This is the default render_url. We are going to update this value
in the DataProvider -->
<item name="render_url" xsi:type="url" path="mui/index/render"/>
<!-- Here we add the parameters that we want to add to the render_url. -->
<item name="filter_url_params" xsi:type="array">
<!-- You can add as many as you want -->
<item name="id" xsi:type="string">*</item>
</item>
<item name="storageConfig" xsi:type="array">
<item name="indexField" xsi:type="string">id</item>
</item>
</item>
</argument>
</insertListing>
2-次の変更をフォームページのデータプロバイダーに追加します。これにより、URLの末尾にパラメーター「id」を追加してrender_urlが変更されます。
(ベンダー/モジュール/ Ui / DataProvider / [データパスへのパス])
- RequestInterfaceクラスを追加します。
- データプロバイダークラスで属性$ requestを宣言します。
- RequestInterfaceオブジェクトを__constructメソッドに追加します。prepareUpdateUrl()メソッドを呼び出します。
- クラスにprepareUpdateUrl()を追加します。
注:以下のブロック全体をデータプロバイダーにコピー/貼り付けしないでください。代わりに、コードから欠落している部分を選択してください
<?php use Magento\Framework\App\RequestInterface;
use Magento\Framework\UrlInterface;
class MyListingDataProvider extends AbstractDataProvider
{
protected $data;
protected $meta;
protected $collection;
protected $urlBuilder;
public function __construct(
string $name,
string $primaryFieldName,
string $requestFieldName,
Collection $collection,
RequestInterface $request,
UrlInterface $urlBuilder,
array $meta = [],
array $data = []
)
{
$this->collection = $collection;
$this->data = $data;
$this->meta = $meta;
$this->request = $request;
$this->urlBuilder = $urlBuilder;
$this->prepareUpdateUrl();
parent::__construct($name, $primaryFieldName, $requestFieldName, $this->meta, $data);
}
protected function prepareUpdateUrl()
{
$id = $this->request->getParam('id');
$this->meta = array_replace_recursive(
$this->meta,
[
'testInsertListing' =>
['arguments' => [
'data' => [
'config' => [
'render_url' => $this->urlBuilder
->getUrl('mui/index/render/id/' . $id),
'update_url' => $this->urlBuilder->getUrl('mui/index/render/id/' . $id)
]
],
]
]
]
);
}
//Implement the other methods you need
}
3-リスティングコンポーネントを更新します。DataSourceコンポーネント内にupdateUrlパラメータが必要です。
(ベンダー/モジュール/view/adminhtml/ui_component/vendor_module_listing.xml)
<?xml version="1.0" encoding="UTF-8"?>
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<argument name="data" xsi:type="array">
<item name="js_config" xsi:type="array">
<item name="provider" xsi:type="string">
vendor_module_listing.module_listing_data_source
</item>
</item>
</argument>
<settings>
<spinner>vendor_module_listing_columns</spinner>
<deps>
<dep>vendor_module_listing.module_listing_data_source</dep>
</deps>
</settings>
<dataSource name="module_listing_data_source">
<argument name="dataProvider" xsi:type="configurableObject">
<argument name="class" xsi:type="string">Vendor\Module\Ui\DataProvider\[name-of-your-listing-data-provider-class]</argument>
<argument name="name" xsi:type="string">module_listing_data_source</argument>
<argument name="primaryFieldName" xsi:type="string">id</argument>
<argument name="requestFieldName" xsi:type="string">id</argument>
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="component" xsi:type="string">Magento_Ui/js/grid/provider</item>
<item name="update_url" xsi:type="url" path="mui/index/render"/>
<item name="storageConfig" xsi:type="array">
<item name="indexField" xsi:type="string">id</item>
</item>
<!-- fields to be added to the URL when retrieving the data -->
<item name="filter_url_params" xsi:type="array">
<item name="id" xsi:type="string">*</item>
</item>
</item>
</argument>
</argument>
</dataSource>
<columns name="vendor_module_listing_columns">
<!-- Declare your columns here -->
</columns>
</listing>
4-リスティングデータプロバイダーを更新して、上記のリスティングコンポーネントのupdateUrlを変更します。
(ベンダー/モジュール/ Ui / DataProvider / [自分のリストへのパス-データプロバイダー.php])
注:以下のブロック全体をデータプロバイダーにコピー/貼り付けしないでください。代わりに、コードから欠落している部分を選択してください
<?php
use Magento\Framework\App\RequestInterface;
class MyListingDataProvider extends AbstractDataProvider
{
protected $request;
public function __construct(
string $name,
string $primaryFieldName,
string $requestFieldName,
Collection $collection,
RequestInterface $request,
array $meta = [],
array $data = []
)
{
$this->collection = $collection;
$this->request = $request;
$this->data = $data;
parent::__construct($name, $primaryFieldName, $requestFieldName, $meta, $data);
$this->prepareUpdateUrl();
}
protected function prepareUpdateUrl()
{
if (!isset($this->data['config']['filter_url_params'])) {
return;
}
foreach ($this->data['config']['filter_url_params']
as $paramName => $paramValue) {
if ('*' == $paramValue) {
$paramValue = $this->request->getParam($paramName);
}
if ($paramValue) {
$this->data['config']['update_url'] = sprintf(
'%s%s/%s/',
$this->data['config']['update_url'],
$paramName,
$paramValue
);
}
}
}
//Get the parameter "id" inside of the getData() method:
public function getData()
{
$item_id = $this->request->getParam('id');
//Apply a filter to your collection using $item_id
/**
Return your data in the appropriate format
$totalRecords should be an integer
$items should be an array
*/
return array('totalRecords' => $totalRecords, 'items' => $items);
}
}
それでも問題が解決しない場合はお知らせください。コメントに回答できない場合がありますが、回答は更新できます。