Eu tenho um componente de interface do usuário da grade que está dentro do fieldset de algum formulário editado. Eu preciso passar um entity_id
do formulário de edição para a grade, onde eu possa filtrar a coleção de alguns itens por algum valor, e a grade mostrará o resultado apropriado. Criei o componente da grade usando um componente insertListing.
<insertListing name="slide_grid">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="autoRender" xsi:type="boolean">true</item>
<item name="source" xsi:type="string">slide</item>
<item name="loading" xsi:type="boolean">true</item>
<item name="dataScope" xsi:type="string">some_slider_slide_listing</item>
<item name="externalProvider" xsi:type="string">${ $.ns }.some_slider_slide_listing_data_source</item>
<item name="ns" xsi:type="string">some_slider_slide_listing</item>
<item name="externalData" xsi:type="string">id</item>
<item name="imports" xsi:type="array">
<item name="slider_id" xsi:type="string">${ $.provider }:data.entity_id</item>
</item>
<item name="exports" xsi:type="array">
<item name="slider_id" xsi:type="string">${ $.externalProvider }:params.slider_id</item>
</item>
</item>
</argument>
</insertListing>
Para transferir dados para o dataProvider externo, estou usando
<item name="exports" xsi:type="array">
<item name="slider_id" xsi:type="string">${ $.externalProvider }:params.slider_id</item>
</item>
Dentro do meu provedor de dados externo, estou tentando obter os dados através de solicitação.
$this->request->getParam('slider_id');
Mas nada. No frontend, descobri que o Magento enviava uma solicitação ajax com meu parâmetro, mas não consigo capturar isso no meu DataProvider e filtrar a coleção.
magento2
uicomponent
data-provider
Mistério
fonte
fonte
Respostas:
Para adicionar a listagem de inserção por param do componente ui-pai, podemos usar o código abaixo.
A
externalProvider
tag Here é para adicionar o provedor de origem da listagem que estamos inserindo.A
imports
tag Here é usada para importar parâmetros da fonte de dados do formulário atualA
exports
tag Here é usada para exportar os parâmetros de dados do formulário atual para a listagem que será inserida.Adicione junção com a coluna relevante à coleção atual para usá-la de duas maneiras:
Para mais detalhes, verifique o código abaixo:
No provedor de dados, adicione filtro para este parâmetro:
Eu gosto de seguir a opção 1.
fonte
Depois de ler e depurar os arquivos principais do Magento 2 , encontrei uma solução limpa e simples sobre esse problema. A transmissão de dados de um formulário personalizado para uma grade personalizada usando o UIComponent insertListing é realmente difícil e não está documentada.
O objeto InsertListing possui dois parâmetros na tag: exportações e importações que usei na minha listagem:
e depois de horas para entender e encontrar uma solução na web, não encontrei nenhuma pista!
Então, eu li o arquivo Magento Core e descobri que o Magento combina a maneira de criar as grades de listagem aninhadas no projeto. Às vezes, ele usa o antigo método de inserção de bloco e algumas vezes o novo método de listagem UIComponent.
Encontrei a grade de listagem de endereços do cliente em customer_address_listing.xml (/vendor/magento/module-customer/view/adminhtml/ui_component/customer_address_listing.xml) e obtém a variável parent_id definida em customer_form.xml (/ vendor / magento /module-customer/view/base/ui_component/customer_form.xml), mas a pergunta é:
Como o Magento passa os dados do formulário para a grade de listagem aninhada?
Magento passa os dados pelo QUERYSTRING PARAMETER!
Se você ler o arquivo DataProvider.php, ficará surpreso porque ele obtém a variável parent_id (customer) pela QUERYSTRING! Veja /vendor/magento/module-customer/Ui/Component/Listing/Address/DataProvider.php linha 58:
mas como faço para definir o parâmetro no URL da lista de listagem? Eu encontrei o parâmetro filterUrlParams, mas há um problema estranho também aqui! Vamos dar uma olhada neste trecho de código dataSource:
Eu configurei o ticket_id com um curinga (*) que significa: obtenha todos os tickets! mas se você não definir nenhum ID no filterUrlParams, o URL insertListing NÃO TEM QUALQUER ticket_id SET! Então por que?!
A solução oferecida pelo @ hashish-raj não funciona para mim.
Estes são todos os posts que li sobre esse problema:
No final, encontrei uma solução temporária usando a sessão principal e armazene o parâmetro ticket_id na sessão. Em seguida, no provedor de dados personalizado, verifiquei e apliquei na coleção:
Se você tem uma solução alternativa ou entende como o Magento lida com esse relacionamento entre o UIComponent , compartilhe seu conhecimento!
Abri uma "recompensa" aqui: https://magento.stackexchange.com/a/306537/2004
fonte