Skip to content

Admin grid form submit button not working

When I open my admin grid form and click the Save button, nothing happens, the button just displays as clicked (no network activity, no errors in console or logs, doesnt reach Index/Save.php). When I comment out line 37 ‘class_name’ => Container::SPLIT_BUTTON, from SaveButton.php everything works fine (except the button is not split as it should be), which leads me to believe that the root of the issue is the button / connecting it to the form.
enter image description here

Magebit/Faq/view/adminhtml/ui_component/mb_faq_questions_form.xml

<?xml version="1.0" encoding="UTF-8"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <argument name="data" xsi:type="array">
        <item name="js_config" xsi:type="array">
            <item name="provider" xsi:type="string">mb_faq_questions_form.mb_faq_questions_form_data_source</item>
            <item name="deps" xsi:type="string">mb_faq_questions_form.mb_faq_questions_form_data_source</item>
        </item>
        <item name="label" xsi:type="string" translate="true">Edit Question</item>
        <item name="layout" xsi:type="array">
            <item name="type" xsi:type="string">tabs</item>
        </item>
    </argument>

    <settings>
        <buttons>
            <button name="save" class="MagebitFaqBlockAdminhtmlQuestionsEditSaveButton"/>
            <button name="back" class="MagebitFaqBlockAdminhtmlQuestionsEditBackButton"/>
        </buttons>
        <namespace>mb_faq_questions_form</namespace>
        <dataScope>data</dataScope>
        <deps>
            <dep>mb_faq_questions_form.mb_faq_questions_form_data_source</dep>
        </deps>
    </settings>

    <dataSource name="mb_faq_questions_form_data_source">
        <argument name="data" xsi:type="array">
            <item name="js_config" xsi:type="array">
                <item name="component" xsi:type="string">Magento_Ui/js/form/provider</item>
            </item>
        </argument>
        <settings>
            <submitUrl path="mb_faq/index/save"/>
        </settings>
        <dataProvider class="MagebitFaqModelQuestionsDataProvider" name="mb_faq_questions_form_data_source">
            <settings>
                <requestFieldName>id</requestFieldName>
                <primaryFieldName>entity_id</primaryFieldName>
            </settings>
        </dataProvider>
    </dataSource>

    <fieldset name="question">
        <settings>
            <label/>
        </settings>

        <!-- This field represents form id and is hidden -->
        <field name="entity_id">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="visible" xsi:type="boolean">false</item>
                    <item name="dataType" xsi:type="string">text</item>
                    <item name="formElement" xsi:type="string">input</item>
                    <item name="source" xsi:type="string">questions</item>
                </item>
            </argument>
        </field>

        <field name="status" sortOrder="10" formElement="checkbox">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="source" xsi:type="string">questions</item>
                    <item name="default" xsi:type="number">1</item>
                </item>
            </argument>
            <settings>
                <validation>
                    <rule name="required-entry" xsi:type="boolean">true</rule>
                </validation>
                <dataType>boolean</dataType>
                <label translate="true">Enable Question</label>
                <dataScope>status</dataScope>
            </settings>
            <formElements>
                <checkbox>
                    <settings>
                        <valueMap>
                            <map name="false" xsi:type="number">0</map>
                            <map name="true" xsi:type="number">1</map>
                        </valueMap>
                        <prefer>toggle</prefer>
                    </settings>
                </checkbox>
            </formElements>
        </field>

        <field name="question">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string">Question</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <item name="dataType" xsi:type="string">text</item>
                    <item name="formElement" xsi:type="string">input</item>
                    <item name="source" xsi:type="string">questions</item>
                </item>
            </argument>
            <settings>
                <validation>
                    <rule name="required-entry" xsi:type="boolean">true</rule>
                </validation>
            </settings>
        </field>

        <field name="answer">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string">Answer</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <item name="dataType" xsi:type="string">text</item>
                    <item name="formElement" xsi:type="string">textarea</item>
                    <item name="source" xsi:type="string">questions</item>
                </item>
            </argument>
            <settings>
                <validation>
                    <rule name="required-entry" xsi:type="boolean">true</rule>
                </validation>
            </settings>
        </field>

    </fieldset>
</form>

Magebit/Faq/Block/Adminhtml/Questions/Edit/GenericButton.php

<?php

declare(strict_types=1);

namespace MagebitFaqBlockAdminhtmlQuestionsEdit;

use MagentoBackendBlockWidgetContext;
use MagebitFaqApiQuestionsRepositoryInterface;
use MagentoFrameworkExceptionNoSuchEntityException;

/**
 * Class GenericButton
 */
class GenericButton
{
    protected $context;
    protected $questionRepository;

    public function __construct(
        Context $context,
        QuestionsRepositoryInterface $questionRepository
    ) {
        $this->context = $context;
        $this->questionRepository = $questionRepository;
    }

    /**
     * Return FAQ question ID
     *
     * @return int|null
     */
    public function getQuestionId()
    {
        try {
            return $this->questionRepository->getById(
                $this->context->getRequest()->getParam('id')
            )->getId();
        } catch (NoSuchEntityException $e) {
        }
        return null;
    }

    public function getUrl($route = '', $params = []): string
    {
        return $this->context->getUrlBuilder()->getUrl($route, $params);
    }
}

Magebit/Faq/Block/Adminhtml/Questions/Edit/SaveButton.php

<?php

declare(strict_types=1);

namespace MagebitFaqBlockAdminhtmlQuestionsEdit;

use MagentoFrameworkViewElementUiComponentControlButtonProviderInterface;
use MagentoUiComponentControlContainer;

class SaveButton extends GenericButton implements ButtonProviderInterface
{
    /**
     * Get button data
     *
     * @return array
     */
    public function getButtonData(): array
    {
        return [
            'label' => __('Save'),
            'class' => 'save primary',
            'data_attribute' => [
                'mage-init' => [
                    'buttonAdapter' => [
                        'actions' => [
                            [
                                'targetName' => 'mb_faq_questions_form.mb_faq_questions_form',
                                'actionName' => 'save',
                                'params' => [
                                    false
                                ]
                            ]
                        ]
                    ]
                ]
            ],
            'class_name' => Container::SPLIT_BUTTON,
            'options' => $this->getOptions(),
            'sort_order' => 90,
            'dropdown_button_aria_label' => __('Save options'),
        ];
    }

    /**
     * Retrieve options
     *
     * @return array
     */
    private function getOptions(): array
    {
        $options = [
            [
                'id_hard' => 'save_and_close',
                'label' => __('Save & Close'),
                'data_attribute' => [
                    'mage-init' => [
                        'buttonAdapter' => [
                            'actions' => [
                                [
                                    'targetName' => 'mb_faq_questions_form.mb_faq_questions_form',
                                    'actionName' => 'save',
                                    'params' => [
                                        true,
                                        [
                                            'back' => 'close',
                                        ],
                                    ]
                                ]
                            ]
                        ]
                    ]
                ],
            ]
        ];

        return $options;
    }
}