Devi impostare un valore per il parametro render_url su insertListing e quindi aggiornare questo URL all'interno del tuo provider di dati. È necessario eseguire questa azione due volte poiché sarà necessario disporre di un fornitore di dati per il componente del modulo e un altro specifico per il componente di elenco.
1 - Dichiarazione corretta del componente insertListing:
(Venditore / Modulo / vista / 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 - Aggiungere le seguenti modifiche al fornitore di dati della pagina del modulo. Questo cambierà render_url aggiungendo il parametro "id" alla fine dell'URL:
(Fornitore / Modulo / Ui / DataProvider / [percorso-al-tuo-fornitore-dati.php] )
- Aggiungi la classe RequestInterface:
- Dichiarare l'attributo $ request sulla classe del provider di dati.
- Aggiungi un oggetto RequestInterface al metodo __construct; chiama il metodo preparUpdateUrl ().
- Aggiungi PrepUpdateUrl () alla tua classe:
Nota: non copiare / incollare l'intero blocco sottostante sul provider di dati. Invece, cherrypick i pezzi che mancano nel tuo codice
<?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 - Aggiorna il componente dell'inserzione. Deve avere un parametro updateUrl all'interno del componente DataSource:
(Fornitore / modulo / 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 - Aggiorna il tuo fornitore di dati di inserzione per modificare updateUrl sul componente di quotazione sopra
(Venditore / Modulo / Ui / DataProvider / [percorso-al-tuo-ELENCO-fornitore-dati.php] )
Nota: non copiare / incollare l'intero blocco sottostante sul provider di dati. Invece, cherrypick i pezzi che mancano nel tuo codice
<?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);
}
}
Fammi sapere se hai ancora problemi. Potrei non essere in grado di rispondere ai commenti, ma posso aggiornare la mia risposta.