Я настроил компонент сетки в Magento - и сортировка кажется нарушенной. Где я могу отладить это на уровне javascript, и / или кто-нибудь еще знает, почему это может происходить?
Если я сортирую сетку один раз, делается запрос ajax, и все сортируется правильно.
Однако второй вид без запроса ajax отображает сетку с одинаковыми идентификаторами.
Поведение не повторяется в основных сетках Magento, поэтому я уверен, что это то, что я делаю. Я просто недостаточно хорошо знаю систему компонентов пользовательского интерфейса, чтобы знать, с чего начать отладку.
источник
TL; DR
Это действительно интересная проблема.
Вот как я понял систему, но я не могу быть на 100% прав.
Как вы уже видели, щелчок по столбцу заголовка создает запрос AJAX по следующему маршруту:
/admin_key/mui/index/render
со следующими параметрами:Последнее - это поле, в котором вы сортируете свою сетку.
Этот маршрут объявлен по умолчанию в
app/code/Magento/Ui/view/base/ui_component/etc/definition.xml
:Но в листинге ui_component XML также объявлено:
Этот маршрут обрабатывается на
app/code/Magento/Ui/Controller/Adminhtml/Index/Render.php
основе параметра пространства имен (обычно это имя вашего компонента пользовательского интерфейса)Где
prepareComponent
метод является рекурсивным для дочерних компонентов:Когда компонент столбца подготовлен, сортировка столбца выполняется
app/code/Magento/Ui/Component/Listing/Columns/Column.php
:Где
applySorting()
метод основан на параметре сортировки, и он просто добавляет заказ поставщику данных:Как только каждый компонент подготовлен, класс действия визуализирует компонент (снова рекурсивно) для ответа:
Я считаю, что это важные шаги PHP в том, что происходит во время сортировки.
Теперь для JS URL рендеринга и обновления (объявленные
definition.xml
выше) назначены элементу вapp/code/Magento/Ui/view/base/web/js/form/components/insert.js
:В этом файле есть
requestData
метод, который используется для извлечения данных AJAX:Вы можете видеть, что этот метод вызывается при вызове
render()
метода:После этого вызывается метод обратного вызова для применения данных. Это
onRender()
:Я считаю, что именно там применяется новый контент.
источник