Debe establecer un valor para el parámetro render_url en insertListing y luego actualizar esta URL dentro de su proveedor de datos. Es necesario realizar esta acción dos veces ya que necesitará tener un Proveedor de datos para su componente de formulario y otro específico para el componente de listado.
1 - Declaración correcta del componente 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 - Agregue los siguientes cambios al proveedor de datos de la página del formulario. Esto cambiará el render_url agregando el parámetro "id" al final de la URL:
(Proveedor / Módulo / Ui / DataProvider / [path-to-your-data-provider.php] )
- Agregue la clase RequestInterface:
- Declare el atributo $ request en su clase de proveedor de datos.
- Agregue un objeto RequestInterface al método __construct; llame al método prepareUpdateUrl ().
- Agregue prepareUpdateUrl () a su clase:
Nota: no copie / pegue todo el bloque a continuación en su proveedor de datos. En cambio, selecciona las piezas que faltan en tu código
<?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 - Actualice su componente de listado. Debe tener un parámetro updateUrl dentro del componente DataSource:
(Proveedor / Módulo / vista / 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 - Actualice su proveedor de datos de listado para cambiar updateUrl en el componente de listado anterior
(Proveedor / Módulo / Ui / DataProvider / [ruta-a-su-LISTING-data-provider.php] )
Nota: no copie / pegue todo el bloque a continuación en su proveedor de datos. En cambio, selecciona las piezas que faltan en tu código
<?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);
}
}
Avísame si aún tienes algún problema. Es posible que no pueda responder a los comentarios, pero puedo actualizar mi respuesta.