it-swarm-eu.dev

Jak ověřit a odeslat formulář pomocí AJAX?

Vytvořil jsem webový formulář pomocí Form API. Používám #AJAX možnost pole přidat AJAX ověření do každého pole).

Je možné ověřit a odeslat formulář pomocí AJAX bez opětovného načtení stránky. Pokud se ověření nezdaří, chci zobrazit chybové hlášení a pokud je ověření úspěšné, chci zobrazit zprávu (ideálně v lightbox) a resetujte pole formuláře.

Můj kód doposud:

$form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('Name'),
    '#default_value' => '',
    '#maxlength' => '128',
    '#required' => TRUE,
    '#ajax' => array(
        'callback' => '_validate_name',
        'wrapper' => 'name-error-icon-container',
        'method' => 'html',
        'effect' => 'none',
        'progress' => array(
            'message' => NULL,
        ),
    ),
);

$form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Submit',
    '#ajax' => array(
        'callback' => '_handle_form_submit',
        'effect' => 'fade',
    ),
);

funkce zpětného volání vypadají takto:

function _validate_name($form, $form_state) {

    if ($form_state['values']['name'] != '') {
    $output = 'OK';
    }
    else {
      $output = 'Enter a value';
    }

   return $output;

}

function _handle_form_submit($form, $form_state) {
}

Ale nejsem si jistý, co by mělo jít v _handle_form_submit funkce k ověření a pak buď vrátit zprávu nebo odeslat formulář a resetovat pole?

11
Camsoft

Vím, že se jedná o otázku, která už několik let ležela, ale nemám pocit, že by některá z ostatních odpovědí skutečně dostala smysl Drupal 7 podání formuláře ajax, takže jsem Pokusím se to vysvětlit.

Pokud váš formulář bude fungovat i bez Ajaxu, podle dobré praxe by váš zpracovatel Ajaxu neměl dělat nic jiného než vrátit formulář. Všechno ostatní by mělo být ve vaší validaci a odesílání funkcí.

function ex_form($form, $form_state) {
  $form['name'] = array(
    '#type' => 'textfield',
     '#title' => t('Name'),
     '#default_value' => '',
     '#maxlength' => '128',
     '#required' => TRUE,
  );

  $form['submit'] = array(
   '#type' => 'submit',
   '#value' => 'Submit',
   '#ajax' => array(
     'callback' => 'ex_form_ajax_handler',
     'effect' => 'fade',
   ),
  );
}

function ex_form_submit(&$form, &$form_state) {
  // Submit logic - runs when validation is ok
  // You can alter the form here to be just a markup field if you want.
}

function ex_form_validate(&$form, &$form_state) {
  // Validation logic - invalidate using form_set_error() or form_error()
}

function ex_form_ajax_handler(&$form, &$form_state) {
  return $form;
}
10
OWast

Myslím, že příspěvek od maxtorete 17. října 2011 vypadá, že dává úplnější příklad pomocí obou form_validate() a form_submit()

(Ještě jsem to netestoval.)

Také odpověď Joshua Stewardsonové na přetečení zásobník má pěkný pracovní příklad:

function dr_search_test_form($form, &$fstate) {

  $form['wrapper'] = [
    '#markup' => '<div id="test-ajax"></div>',
  ];

  $form['name'] = [
    '#type'     => 'textfield',
    '#required' => TRUE,
    '#title'    => 'Name',
  ];

  $form['submit'] = [
    '#type'  => 'submit',
    '#value' => 'Send',
    '#ajax'  => [
      'callback' => 'dr_search_test_form_callback',
      'wrapper'  => 'test-ajax',
      'effect'   => 'fade',
    ],
  ];

  return $form;
}

function dr_search_test_form_callback($form, &$fstate) {

  return '<div id="test-ajax">Wrapper Div</div>';
}

function dr_search_test_form_validate($form, &$fstate) {

  form_set_error('name', 'Some error to display.');
}

Joshua uvádí, že validační chybové zprávy nahrazují #ajax['wrapper'] element úplně, aby vaše zpětné volání muselo tento prvek znovu použít, když jej nahradíte.

3
ErichBSchulz

Obecně by ověřování a zpracování formulářů mělo probíhat v obvyklých zpětných voláních _validate () a _submit (). Myšlenka je, že formuláře by měly fungovat i bez Ajaxu.

Docela jedinou věcí, kterou by měla zpětná volání #ajax provádět, je vrátit část formuláře, která by měla být nahrazena podle definovaného obalu.

2
Berdir

V mém případě použití typu submit způsobilo, že se formulář vždy odeslal, takže jsem jej změnil na button s #ajax uvedeno. Potom jsem musel provést validaci zpětného volání ajaxu.

Dělal jsem tabulku ctools; Nevím, jestli to do toho hraje.

function mymodule_form($form, &$form_state) {
  ...
  $form['button'] = array(
    '#type' => 'button',
    '#value' => t('Subscribe'),
    '#ajax' => array(
      'callback' => '_mymodule_ajax',
    ),
  );
  return $form;
}

function _mymodule_ajax($form, &$form_state) {
  if ( ! valid_email_address($form_state['values']['email']) ) {
    form_set_error($form, t('Please enter a valid email address.'));
  } else {
    $form = array(
      '#markup' => t('You have subscribed.'),
    );
  }
  return $form;
}
0
user1359

Existují dva způsoby

1)

function abc_form_validate(&$form, &$form_state) {
  // Validation logic - invalidate using form_set_error() or form_error()
}

function abc_form_ajax_handler(&$form, &$form_state) {
  return $form;
}

2) Příklad modulu http://cgit.drupalcode.org/examples/tree/ajax_example/ajax_example.module?id=refs/heads;id2=7.x-1.x#l402

0
Drock