Чтобы создать внутреннюю форму через ui_component, я определяю следующее в файле конфигурации, чтобы отобразить кнопки « Сохранить» и « Сохранить» и « Продолжить». Кнопка
<item name="buttons" xsi:type="array">
<item name="save" xsi:type="string">namespace\module\Block\Adminhtml\Edit\SaveButton</item>
<item name="save_and_continue" xsi:type="string">namespace\module\Block\Adminhtml\Edit\SaveAndContinueButton</item>
</item>
Соответственно два файла SaveButton.php
и SaveAndContinueButton.php
создаются и оба реализуютButtonProviderInterface
Как я знаю, кнопка в основном отображается из getButtonData
функции. ВидетьSaveAndContinueButton.php
public function getButtonData()
{
$TodoItemId = $this->getTodoItemId();
$data = [];
if ($TodoItemId) {
$data = [
'label' => __('Save and Continue Edit'),
'class' => 'save',
'data_attribute' => [
'mage-init' => [
'button' => ['event' => 'saveAndContinueEdit'],
],
],
'sort_order' => 80,
];
}
return $data;
}
Это то data_attribute
, где я не понимаю. Как узнать, какой файл обрабатывать запрос на сохранение?
Если мы проверим SaveButton.php
, мы увидели
$data = [
'label' => __('Save TodoItem'),
'class' => 'save primary',
'data_attribute' => [
'mage-init' => ['button' => ['event' => 'save']],
'form-role' => 'save',
],
'sort_order' => 90,
];
Я знаю в конфигурационном файле ui_component, есть
<item name="submit_url" xsi:type="url" path="path/to/save"/>
Оба действия успешно выполняют один Save.php
и тот же файл, и это имеет смысл. Что меня смущает, так это то, data_attribute
как SaveAndContinueButton
параметр " back
" передает параметр, чтобы он знал, что нужно оставаться на одной странице, а не переходить к сетке (обычно сетка - это точка входа в форму, то есть страница редактирования).
Если мы возьмем другой взгляд на это deleteButton
, это другой пейзаж
$data = [
'label' => __('Delete'),
'class' => 'delete',
'on_click' => 'deleteConfirm(\'' . __(
'Are you sure you want to do this?'
) . '\', \'' . $this->getDeleteUrl() . '\')',
'sort_order' => 20,
];
Он непосредственно выполняет событие JavaScript onClick. Любая идея / предложение будет оценено. Спасибо
Еще один вопрос: в чем разница data_attribute
и on_click
? или преимущество одного над другим?
Ответы:
У меня нет полного объяснения, но у меня есть идея.
Все элементы, отображаемые с помощью
mage-init
will /, должны обрабатываться некоторым кодом JavaScript.Вы связываете эти кнопки с формой, и форма обрабатывается этим js-файлом, в
lib/web/mage/backend/form.js
котором создается виджет пользовательского интерфейса jquery.Это параметры для виджета
Вы можете увидеть
saveAndContinueEdit
там где-то внутриhandlersData
.Поиск
handlersData
ваших привычек приводит к тому, что_beforeSubmit
происходит какое-то волшебство (я там не совсем понимаю), и в какой-то момент_processData
это называется.Переходя к
_processData
вам, вы увидите нечто подобноеэто означает, что
action
форма изменяется в зависимости от нажатой кнопки.то
_getActionUrl
функция выглядит следующим образомвы можете увидеть там,
data.args
участвую. Та же переменная в настройках виджета дляsaveAndContinueEdit
.Вывод: когда вы устанавливаете роль для
saveAndContinueEdit
кнопки отправки, действие формы изменяется с помощью js иback/edit
добавляется в URL.on_click
преобразуется вonclick
событие и просто называется.Я, честно говоря, понятия не имею, почему есть 2 способа сделать это. Возможно
delete
действия еще не подвергались рефакторингу.источник