3

Hi i'm new at magento2 and i want to put a PHP function in an "on click" attribute of a button on ui component form.

Specifically on this "Save Header" button. button

So, actually i want to use this "Save Header" button to just save two fields of the form, the fields (Nome Header, Valor Header).

form

The "on click" attribute. In this "on click" i want to call a php function...

on click

routes.xml:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
<router id="admin">
    <route id="api" frontName="api">
        <module name="Hub_Api" />
    </route>
</router>

directories

------------------------------EDIT---------------------------------

So now my "SaveHeader" button is like that, but still don't working, maybe the url is passed wrong: new saveheader button

SaveHeader.php (Controller):

namespace Hub\Api\Controller\Adminhtml\Data;

class SaveHeader extends \Magento\Framework\App\Action\Action { protected $logger;

public function __construct(
    \Psr\Log\LoggerInterface $logger
) {
    $this->logger = $logger;
    parent::__construct();
}

/**

  • View page action
  • @return void

*/ public function execute() { $txt = 'HUDSON SAVEHEADER : '; $this->logger->log('DEBUG', $txt);

}

}

Rafael Fagundes
  • 435
  • 3
  • 14

3 Answers3

1

This is my idea hope it help. In getButtonData() function add on_click to javascript function something like 'saveHeader()'

add your template in layout call to UI form: sample we have MODULE-NAME_CONTROLLER-NAME-ACTION.xml this content like

<body>
   <referenceContainer name="content">
       <uiComponent name="your_ui_form"/>
       <block class="Magento\Framework\View\Element\Template" name="XXX"  template="NAMESPACE_MODULENAME::html/js.phtml"/>
   </referenceContainer>
</body>

In js.phtml file create new saveHeader() function call ajax to submit form element to your custom module controller (php).

This sample for js.phtml file content:

require([
        'jquery',
        'jquery/ui',
        'Magento_Ui/js/modal/modal'
    ], function($){
            function saveHeader() {
                 $form = $('#formId');
                 $.ajax({
                        type: 'POST',
                        url: 'url',
                        data: {
                            xxx,
                            form_key: 'qiIiwjIPOdmrA0Uq',
                            return_session_messages_only: 1
                        },
                        dataType: 'json',
                        showLoader: true,
                        context: $form
                    })
                    ...
           }

Good Luck!

xanka
  • 2,114
  • 6
  • 33
  • 65
  • For what i should replace the "xxx" ? and how i could call the controler by the button? – Rafael Fagundes Jun 17 '20 at 17:09
  • "xxx" are field you need send to save like nome_api: $('input[name="nome_api"]').val() when you click button it will call javascript function is saveHeader() then it will submit data to url. Url is mean your php controller file in this file you can get data and save it. All step above is mean get you "header" data and submit it to another php controller then save. – xanka Jun 18 '20 at 04:45
  • So i'm trying this but happens this exception: Invalid template file: 'Hub_Api::view/deleteheader.phtml' in module: '' block's name: 'deleteheader' – Rafael Fagundes Jun 23 '20 at 14:42
1

hello you can change your code with following code

$fieldset->addField('registered', 'button', array(
            'label' => Mage::helper('core')->__('Send e-mail to all registered customers'),
            'value' => Mage::helper('core')->__('Button Caption'),
            'name'  => 'registered',
            'class' => 'form-button',
            'onclick' => "setLocation('your url')",
        ));
ParulThakkar
  • 1,147
  • 3
  • 15
1

try this

public function getButtonData()
{
    $message ='Are you sure you want to do this?';
    $url = $this->getUrl("api/data/deleteheader"); 
    return
        [
            'label' => __('Save Header'),
            'class' => 'myclass',
            'on_click' => 'confirmSetLocation('{$message}', '{$url}')',
            'sort_order' => 100
    ];
}

You can write you php code into this controller action file.

I Hope This Helps You.

Msquare
  • 9,063
  • 7
  • 25
  • 63