Как реализовать такой обработчик для кнопки, что бы он не отправлял форму?

Главные вкладки

Аватар пользователя shlop shlop 14 декабря 2017 в 23:22

Здравствуйте, подскажите пожалуйста. Вот у меня есть своя форма. И есть две кнопки. По нажатию на первую кнопку, отправляются начальные данные в базу данных, а по нажатию на вторую, должны взяться из этой базы данных только что добавленный значения, рассчитаться, и обратно вставиться в базу данных.
Собственно первая кнопка работает хорошо, все введенные данные уходят в БД. Но когда происходит нажатие на вторую кнопку, форма пытается отправиться, так как кнопка submit. Как сделать так, что бы эта кнопка не отправляла форму, а просто выполняла функцию? Заранее благодарю.

<?php
$form
['submit'] = array(
        
'#type' => 'submit',
        
'#value' => t('Подтвердить ввод данных'),
        
'#submit' => array('webformizi_form_submit_one'),
    );
$form['submit2'] = array(
        
'#type' => 'submit',
        
'#value' => t('Высчитать поверку'),
        
'#submit' => array('webformizi_form_submit_two'),
    );
?>

Лучший ответ

Аватар пользователя bumble bumble 15 декабря 2017 в 10:29

1. Если на странице нужна только форма - можно указывать коллбеком сразу генератор формы:

<?php
function webformizi_menu() {
    
$items = array();
    
$items['newselect'] = array(
        
'title' => 'Новая поверка',
        
'page callback' => 'drupal_get_form',
        
'page arguments' => array('webformizi_main_form'), // Имя функции генератора формы.
        
'type'=> MENU_NORMAL_ITEM,
        
'access callback' => TRUE,
    );
    return 
$items;
}
?>

2. Названия функциям следует давать более безопасные и понятные, хорошей практикой считается начинать с названия модуля:

<?php
function webformizi_main_form($form, &$form_state) {
    
// Реализация формы
    
return $form;
}
?>

3. Если нужно вывести более чем 1 форму на странице, можно выводить ее как часть рендер-массива. Коллбек страницы предназначен для возврата рендер-массива, не нужно в нем рендерить элементы:

<?php
function webformizi_menu() {
  
$items = array();
  
$items['newselect'] = array(
    
// Заголовок правильнее передавать на латинице. 
    // Вы сможете перевести эту надпись в интерфейсе переводов:
    // admin/config/regional/translate/translate
    
'title' => 'New check',
    
'page callback' => 'webformizi_main_page',
    
'type'=> MENU_NORMAL_ITEM,
    
'access callback' => TRUE,
  );
  
  return 
$items;
}
 
function 
webformizi_main_page() {
  
$output = array();
  
  
$output['main_form'] = drupal_get_form('webformizi_main_form');
  
$output['secondary_form'] = drupal_get_form('webformizi_secondary_form');
  
  return 
$output// Возвращайте рендер-массив
}
?>

Комментарии

Аватар пользователя bumble bumble 15 декабря 2017 в 2:10

В каком плане он не должен отправлять форму??

Если он не будет отправлять форму - как Вы будете получать данные формы в той же "выполняемой функции"?

Вам нужно просто не в FORMNAME_submit реализовывать логику сохранения в БД, а в коллбеке нужного сабмита.

Аватар пользователя shlop shlop 15 декабря 2017 в 9:14

Ну когда происходит нажатие на вторую кнопку, форм пытаются отправиться, а получать данные формы мне не нужно во второй кнопке. Во второй кнопке мне нужно получить данные из БД, сделать расчёт исходя из полученных данных, и записать в базу данных что посчиталось. И функции разные же, на одной кнопке функция просто записывает в БД, а вторая берёт из БД

Аватар пользователя shlop shlop 15 декабря 2017 в 9:59

Ну кнопка к форме отношения не имеет. Просто вот какой тип тогда кнопки создать, что к кнопке добавить, что бы по нажатию на неё выполнить конкретную функцию

Аватар пользователя bumble bumble 15 декабря 2017 в 10:04

Если кнопка к форме отношения не имеет - делать ее в форме не нужно.

Для того чтоб при нажатии на кнопку выполнить функцию - необходимо задать атрибут #submit.

Аватар пользователя shlop shlop 15 декабря 2017 в 10:11

Понятно. А подскажите пожалуйста, как отдельно сделать тогда кнопку? Просто ведь я создаю страницу

<?php
function webformizi_menu() {
    
$items = array();
    
$items['newselect'] = array(
        
'title' => 'Новая поверка',
        
'page callback' => 'main_funct'//Отрисовка стр.
        
'type'=> MENU_NORMAL_ITEM,
        
'access callback' => TRUE,
    );
    return 
$items;
}
?>

А потом возвращаю форму

<?php
function main_funct() {
    
$form drupal_get_form('webformizi_form');
    
$form drupal_render($form);
    return 
$form;
}
?>
Аватар пользователя bumble bumble 15 декабря 2017 в 10:29

1. Если на странице нужна только форма - можно указывать коллбеком сразу генератор формы:

<?php
function webformizi_menu() {
    
$items = array();
    
$items['newselect'] = array(
        
'title' => 'Новая поверка',
        
'page callback' => 'drupal_get_form',
        
'page arguments' => array('webformizi_main_form'), // Имя функции генератора формы.
        
'type'=> MENU_NORMAL_ITEM,
        
'access callback' => TRUE,
    );
    return 
$items;
}
?>

2. Названия функциям следует давать более безопасные и понятные, хорошей практикой считается начинать с названия модуля:

<?php
function webformizi_main_form($form, &$form_state) {
    
// Реализация формы
    
return $form;
}
?>

3. Если нужно вывести более чем 1 форму на странице, можно выводить ее как часть рендер-массива. Коллбек страницы предназначен для возврата рендер-массива, не нужно в нем рендерить элементы:

<?php
function webformizi_menu() {
  
$items = array();
  
$items['newselect'] = array(
    
// Заголовок правильнее передавать на латинице. 
    // Вы сможете перевести эту надпись в интерфейсе переводов:
    // admin/config/regional/translate/translate
    
'title' => 'New check',
    
'page callback' => 'webformizi_main_page',
    
'type'=> MENU_NORMAL_ITEM,
    
'access callback' => TRUE,
  );
  
  return 
$items;
}
 
function 
webformizi_main_page() {
  
$output = array();
  
  
$output['main_form'] = drupal_get_form('webformizi_main_form');
  
$output['secondary_form'] = drupal_get_form('webformizi_secondary_form');
  
  return 
$output// Возвращайте рендер-массив
}
?>
Аватар пользователя shlop shlop 15 декабря 2017 в 10:58

Разобрался, спасибо большое. Собственно сделал вот так:

Создал кнопку вот так

<?php
function webformizi2_form($form, &$form_state) {
    
$form['submit'] = array(
        
'#type' => 'submit',
        
'#value' => t('Высчитать поверку'),
        
'#submit' => array('webformizi2_form_submit_two'),
        );
    return 
$form;
}
?>

А затем добавил в рендер-массив

<?php
function main_funct() {
    
$output = array();
    
$output['forma1'] = drupal_get_form('webformizi_form');
    
$output['forma2'] = drupal_get_form('webformizi2_form');
    return 
$output;
}
?>

А тут отрисовал

<?php
function webformizi_menu() {
    
$items = array();
    
$items['newselect'] = array(
        
'title' => 'Новая поверка',
        
'page callback' => 'main_funct'//Отрисовка стр.
        
'type'=> MENU_NORMAL_ITEM,
        
'access callback' => TRUE,
    );
    return 
$items;
}
?>

Большое спасибо за помощь

Аватар пользователя adano adano 15 декабря 2017 в 6:47

Сделайте независимую кнопку от формы и повесьте на нее коллбек... через js скорее всего. Но, имхо, чего-то "мудрите", т.к. все равно вам нужны значения из формы и вывод... это судя по названиям кнопок.

Аватар пользователя shlop shlop 15 декабря 2017 в 9:18

Ну во второй кнопке значения из формы не нужны, тут просто по нажатию кнопки "Высчитать поверку", берём из БД только что добавленные значения и считаем, а потом обратно записываем результат в БД