Eu configurei um componente de grade no Magento - e o comportamento de classificação parece quebrado. Onde posso depurar isso no nível do javascript e / ou mais alguém tem alguma idéia de por que isso pode estar acontecendo?
Se eu classificar a grade uma vez, uma solicitação ajax será feita e tudo será classificado corretamente.
No entanto, o segundo tipo, sem uma solicitação de ajax, renderiza a grade com os mesmos IDs.
O comportamento não se repete nas redes principais do Magento, por isso tenho certeza de que isso é algo que estou fazendo. Eu apenas não conheço o sistema de componentes da interface do usuário o suficiente para saber por onde começar a depurar isso.
fonte
TL; DR
Este é realmente um problema interessante.
Aqui está como eu entendi o sistema, mas posso não estar 100% certo.
Como você viu, clicar na coluna do cabeçalho gera uma solicitação AJAX para a seguinte rota:
/admin_key/mui/index/render
com os seguintes parâmetros:O último é o campo no qual você está classificando sua grade.
Esta rota é declarada por padrão em
app/code/Magento/Ui/view/base/ui_component/etc/definition.xml
:Mas em uma listagem ui_component XML, também é declarado:
Essa rota é tratada com
app/code/Magento/Ui/Controller/Adminhtml/Index/Render.php
base no parâmetro namespace (que normalmente é o nome do seu componente de interface do usuário)Onde o
prepareComponent
método é recursivo nos componentes filhos:Quando o componente da coluna é preparado, a classificação da coluna é tratada por
app/code/Magento/Ui/Component/Listing/Columns/Column.php
:Onde o
applySorting()
método se baseia no parâmetro de classificação e simplesmente adiciona a ordem ao provedor de dados:Depois que cada componente é preparado, a classe de ação renderiza o componente (novamente recursivamente) para a resposta:
Acho que essas são as etapas importantes do PHP que acontecem durante a classificação.
Agora para o JS, os URLs de renderização e atualização (declarados
definition.xml
acima) são atribuídos ao elemento emapp/code/Magento/Ui/view/base/web/js/form/components/insert.js
:Ainda neste arquivo, há um
requestData
método usado para recuperar os dados AJAX:Você pode ver que esse método é chamado quando o
render()
método é chamado:Feito isso, um método de retorno de chamada é chamado para aplicar os dados. É
onRender()
:Eu acho que é aí que o novo conteúdo está sendo aplicado.
fonte