Функция запуска Drupal 7 Form API при отправке формы

Я создал собственный модуль, который мне нужен для сбора информации и запуска функции при заполнении и отправке формы.

Он имеет две текстовые области и кнопку.

Это то, что у меня есть, что отлично отображается на странице:

Файл: myFunction.admin.inc

function myFunction_form($form)
{

    $form['pages'] = array(
    '#type' => 'fieldset',
    '#title' => t('Data'),
    '#collapsible' => FALSE,
    '#collapsed' => FALSE,
  );

    $form['pages']['title'] = array(
    '#type'          => 'textarea',
    '#title'         => t('Title'),
    '#rows'          => 5,
    '#resizable'    => FALSE,
  );

  $form['pages']['body'] = array(
    '#type'          => 'text_format',
    '#title'         => t('Body'),
    '#rows'          => 5,
    '#resizable'    => FALSE,
    '#format' => 'full_html',
  );

  $form['submit'] = array('#type' => 'submit', '#value' => t('Run Function'));

    myFunction($form);
    return $form;

}

function myFunction()
{
//This is where I use the data collected from my form and do what I need to do.
}

Итак, что мне не хватает в этой форме (и, пожалуйста, скажите мне, если я ошибаюсь в этом), мне нужно подтвердить, что форма была заполнена, и вернуть сообщение об ошибке, если нет.

если форма была заполнена, то правильно передайте данные поля моей функции, что я и сделал, просто добавив function myFunction() перед return $form;, но это кажется неправильным способом сделать это. Я не хочу, чтобы myFunction() запускался, если есть ошибки в форме.

Может ли кто-нибудь помочь мне с этой последней частью моего пользовательского модуля.

Обратите внимание, что этот модуль НЕ добавляет ничего в базу данных.

Еще раз, пожалуйста, скажите мне, если я иду неправильным путем об этом.


person Cybercampbell    schedule 11.03.2013    source источник


Ответы (3)


Вы должны следовать стандартной структуре именования, используемой API формы. Если ваша функция:

мояФункция_форма(),

тогда

myFunction_form_validate() будет вызываться при отправке для выполнения любой проверки. Если все пройдет, то

myFunction_form_submit() будет вызываться. Вы должны разместить логику отправки (или вызов пользовательской функции) в файле submit.

Это предпочтительнее, чем установка $form['#submit'][] и $form['#validate'][].

См. Модуль примеров для простых примеров того, как это работает.

person Atomox    schedule 30.05.2013

Да, вы, вероятно, идете неправильным путем. Вам нужно будет добавить свой собственный валидатор и отправить такие функции, как

<?php

$form['#submit'][] = my_submit_callback
$form['#validate'][] = my_validator_callback


function my_submit_callback($form, &$form_state) {
  // form_state array contains the submitted values
}
function my_validator_callback($form, &$form_state) {
  // form_state array contains the submitted values
  if ($form_state['values']['body'] == '') {
   form_set_error(...)
}
}

и, конечно же, удалите вызов myFunction() из вашей функции form_builder.

person Pan Chrono    schedule 11.03.2013

Подойдите к этому так:

$form['#validate'][] = 'myCustomValidateFunction';
$form['#submit'][]   = 'myCustomSubmitFunction';

function myCustomValidateFunction($form, &$form_state) { 
  \\if validation was not passed use form_set_error()
}

function myCustomSubmitFunction($form, &$form_state) { 
   //submit logic, $form_state includes the values
}
person Dimitri leonidas    schedule 11.03.2013