Ich habe in Magento eine Grid-Komponente konfiguriert - und das Sortierverhalten scheint gestört zu sein. Wo kann ich dies auf der Javascript-Ebene debuggen, und / oder hat jemand eine Idee, warum dies passieren könnte?
Wenn ich das Raster einmal sortiere, wird eine Ajax-Anfrage gestellt und alles wird korrekt sortiert.
Bei der zweiten Sortierung wird das Raster jedoch ohne Ajax-Anforderung mit denselben IDs gerendert.
Das Verhalten wird in Magento-Kerngittern nicht wiederholt, daher bin ich mir ziemlich sicher, dass ich das tue. Ich kenne das UI-Komponentensystem einfach nicht gut genug, um zu wissen, wo ich mit dem Debuggen beginnen soll.
quelle
TL; DR
Dies ist in der Tat ein interessantes Problem.
So habe ich das System verstanden, aber möglicherweise habe ich nicht 100% Recht.
Wie Sie gesehen haben, generiert das Klicken auf die Kopfspalte eine AJAX-Anforderung an die folgende Route:
/admin_key/mui/index/render
mit den folgenden Parametern:Das letzte Feld ist das Feld, nach dem Sie Ihr Raster sortieren.
Diese Route ist standardmäßig deklariert in
app/code/Magento/Ui/view/base/ui_component/etc/definition.xml
:In einer Auflistung von ui_component-XML wird jedoch auch Folgendes deklariert:
Diese Route wird
app/code/Magento/Ui/Controller/Adminhtml/Index/Render.php
basierend auf dem Namespace-Parameter (normalerweise der Name Ihrer UI-Komponente) behandelt.Wenn die
prepareComponent
Methode für die untergeordneten Komponenten rekursiv ist:Wenn die Spaltenkomponente vorbereitet ist, erfolgt die Sortierung der Spalten wie folgt
app/code/Magento/Ui/Component/Listing/Columns/Column.php
:Wenn die
applySorting()
Methode auf dem Sortierparameter basiert und dem Datenprovider einfach die Reihenfolge hinzufügt:Sobald jede Komponente vorbereitet ist, rendert die Aktionsklasse die Komponente (erneut rekursiv) für die Antwort:
Ich gehe davon aus, dass dies die wichtigen PHP-Schritte für die Sortierung sind.
Jetzt werden der JS die Render- und Update-URLs (oben deklariert
definition.xml
) dem Element zugewiesen inapp/code/Magento/Ui/view/base/web/js/form/components/insert.js
:In dieser Datei befindet sich noch eine
requestData
Methode zum Abrufen der AJAX-Daten:Sie können sehen, dass diese Methode aufgerufen wird, wenn die
render()
Methode aufgerufen wird:Sobald dies erledigt ist, wird eine Rückrufmethode aufgerufen, um die Daten anzuwenden. Es ist
onRender()
:Ich gehe davon aus, dass dort die neuen Inhalte angewendet werden.
quelle