J'ai configuré un composant de grille dans Magento - et le comportement de tri semble rompu. Où puis-je déboguer cela au niveau javascript, et / ou quelqu'un d'autre a-t-il une idée pourquoi cela pourrait se produire?
Si je trie la grille une fois, une demande ajax est effectuée et tout est correctement trié.
Cependant, le deuxième tri, sans demande ajax, rend la grille avec tous les mêmes ID.
Le comportement n'est pas répété sur les grilles de base de Magento, donc je suis sûr que c'est quelque chose que je fais. Je ne connais pas assez bien le système de composants ui pour savoir par où commencer le débogage.
la source
TL; DR
Il s'agit en effet d'un problème intéressant.
Voici comment j'ai compris le système, mais je n'ai peut-être pas 100% raison.
Comme vous l'avez vu, un clic sur la colonne d'en-tête génère une requête AJAX vers l'itinéraire suivant:
/admin_key/mui/index/render
avec les paramètres suivants:Le dernier est le champ sur lequel vous triez votre grille.
Cette route est déclarée par défaut dans
app/code/Magento/Ui/view/base/ui_component/etc/definition.xml
:Mais dans une liste ui_component XML, il est également déclaré:
Cette route est gérée par en
app/code/Magento/Ui/Controller/Adminhtml/Index/Render.php
fonction du paramètre namespace (qui est normalement le nom de votre composant d'interface utilisateur)Lorsque la
prepareComponent
méthode est récursive sur les composants enfants:Lorsque le composant de colonne est préparé, le tri des colonnes est géré par
app/code/Magento/Ui/Component/Listing/Columns/Column.php
:Où la
applySorting()
méthode est basée sur le paramètre de tri et ajoute simplement l'ordre au fournisseur de données:Une fois que chaque composant est préparé, la classe d'actions affiche le composant (à nouveau de manière récursive) pour la réponse:
Je pense que ce sont les étapes PHP importantes de ce qui se passe pendant le tri.
Maintenant, pour le JS, les URL de rendu et de mise à jour (déclarées
definition.xml
ci-dessus) sont attribuées à l'élément dansapp/code/Magento/Ui/view/base/web/js/form/components/insert.js
:Toujours dans ce fichier, il y a une
requestData
méthode qui est utilisée pour récupérer les données AJAX:Vous pouvez voir que cette méthode est appelée lorsque la
render()
méthode est appelée:Une fois cela fait, une méthode de rappel est appelée pour appliquer les données. C'est
onRender()
:Je pense que c'est là que le nouveau contenu est appliqué.
la source