AJAX kullanarak bir form nasıl doğrulanır ve gönderilir?


12

Form API'sini kullanarak bir web formu oluşturdum. #AJAXHer alana AJAX doğrulaması eklemek için alan seçeneğini kullanıyorum .

Sayfayı yeniden yüklemeden AJAX kullanarak formu doğrulamak ve göndermek mümkün mü? Doğrulama başarısız olursa Bir hata mesajı göstermek istiyorum ve doğrulama başarılı olursa bir mesaj göstermek (ideal olarak bir ışık kutusunda) ve form alanlarını sıfırlamak istiyorum.

Kodum şu ana kadar:

$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',
    ),
);

Geri arama işlevleri şöyle görünür:

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) {
}

Ancak _handle_form_submit, doğrulamak ve sonra bir ileti döndürmek veya form göndermek ve alanları sıfırlamak için işlevde ne gitmesi gerektiğinden emin değilim ?

Yanıtlar:


-2

Örnekler modülü siz de diğerleri gibi referans verebilmek ajax forma sahiptir. Kod deposunda ajax form örneği için bir bağlantı , ancak yine de uygulamaya bakmak için indirmenizi öneririz.


1
üzgünüm - Örnek modülde herhangi bir ajaxy validataion örneği
bulamıyorum

Evet, bu şişirilmiş bir cevap. Aslında orada da bir doğrulama görmüyorum. Her geri arama formu döndürür.
AlxVallejo

2
Kabul edilen cevap nasıl? Sağlanan bağlantıda nereye bakılacağını bile söylemiyor (ve bağlantının zaten doğrulama örneği yok).
robinmitra

Ajax form örneği için yeni bağlantı: cgit.drupalcode.org/examples/tree/ajax_example/…
Brentg

Cevabımı bir wiki yaptım, çünkü kabul edildi ancak kalitesiz
rocketeerbkw

11

Bu sorunun şu an için birkaç yıldır yatıyor olduğunu biliyorum, ama diğer cevapların hiçbirinin gerçekten Drupal 7 ajax formunun sunuluşunu anladığını hissetmiyorum, bu yüzden açıklamaya çalışacağım.

Sinya formunuz iyi uygulamalara göre ajax olmadan da çalışmalıdır, ajax gönderme işleyiciniz formu iade etmekten başka bir şey yapmamalıdır. Diğer her şey doğrulama ve gönderme işlevlerinizde olmalıdır.

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;
}

muhtemelen En iyi cevap
Andrew Kozoriz

Doğrula ve gönder yöntemlerinin otomatik olarak bir gönder düğmesindeki AJAX geri araması için çağrıldığını mı söylüyorsunuz? Yöntemler hangi sırayla çağrılır?
Jeff

3

Sanırım maxtorete'nin 17 Ekim 2011'deki gönderisi, her ikisini de kullanarak daha dolgun bir örnek veriyor gibi görünüyor form_validate()veform_submit()

(Henüz test etmedim.)

Ayrıca Joshua Stewardson'un yığın taşması üzerindeki cevabının güzel bir çalışma örneği var:

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, doğrulama hata mesajlarının öğeyi tamamen değiştirdiğine dikkat çeker, #ajax['wrapper']böylece geri çağrınızın bu öğeyi değiştirdiğinizde tekrar tedarik etmesi gerekir.


bu bağlantı geçersiz kılındığında, sorunun artık geçerli olmadığı bir işarettir!
ErichBSchulz

2
aşağı oy biraz sert - sadece bir bağlantı olsa bile - cevap için bir bağlantıydı - sadece cevabı olmayan bir modülün bağlantısı değil - kabul edilen cevabın aksine !! Neyse ben aşağı indirilirken bazı çalışma kodu sağladı.
ErichBSchulz

teşekkürler @ mbomb007 - Şimdi düzeltildi
ErichBSchulz

2

Genel olarak, doğrulama ve form gönderme işlemleri normal _validate () ve _submit () geri çağrılarında gerçekleşmelidir. Fikir, formların hala ajax olmadan çalışması gerektiğidir.

#Ajax geri çağrılarının yapması gereken tek şey, formun tanımlanan sargı kağıdına göre değiştirilmesi gereken kısmını döndürmektir.


2
İfadelerinize dikkat edin. Geri arama, form_state'ten yeniden oluşturulan THE WHOLE FORM'u döndürmelidir. Formun geri dönen kısmı en büyük Drupal / AHAH yanılgısıdır. Bkz. Katbailey.net/blog/ahah-drupal-may-it-one-day-live-its-acronym .

7
Bu soru Drupal 7 ile ilgili ... AHAH artık Drupal'da yok. #ajaxDrupal 7'deki bir geri çağırma işlevinde, formun yalnızca değiştirmek istediğiniz kısmını döndürürsünüz.
Clive

1
@ChrisD. Clive'nin de belirttiği gibi, Bu Drupal 7 ve şimdi çok güzel bir ajax çerçevesine sahibiz, bu da birden fazla ayrı form parçası döndürmek gibi her türlü süslü şeyi yapmanıza izin veriyor.
Berdir

@Clive drupal.stackexchange.com/a/142316/19205 başka bir ajax ile ilgili sorunla karşılaştım ve burada d7 için olan item_count değiştirildikten sonra formun yeniden oluşturulması gerekiyor. Kafam karıştı, hangi ifade doğrudur (kimin doğru olduğunu savunmadan :-)). Bu konuda biraz bilgi paylaşabilir misiniz?
kiranking

0

İki yol var

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) Örnek modül http://cgit.drupalcode.org/examples/tree/ajax_example/ajax_example.module?id=refs/heads;id2=7.x-1.x#l402


Şimdi cevabınızın ne kadar doğru olduğunu bilmiyorum, ancak cevaplamanın kesinlikle iyileştirilmesi gerekiyor (eğer moderatörler tarafından silinmesini istemiyorsanız). Gerekirse yardım sayfasını kontrol edin veya en azından kodunuzu ... kodu olarak işaretlemek için wysiwyg editör düğmelerinden bazılarını kullanın.
Pierre.Vriens

Doğru biçimlendirilmemiş kod, bir cevabı silmek için bir neden değildir. Bunu düzeltmek için yalnızca düzenleme ayrıcalığına sahip bir kullanıcı gerekir.
kiamlaluno

İşte geliyorum, umutsuz, bir çözüm arıyorum, bu cevaptan sadece 2 yıl sonra, beni var olmayan bir ağaca / şubeye götüren bir bağlantıyı tıkladım. Lütfen yanıtlarda bağlantı kullanmayın veya içeriği yazma sırasında yapıştırırsanız.
MacK

0

Benim durumumda, bir submittür kullanmak formun her zaman gönderilmesine neden oldu, bu yüzden belirtilen buttonile değiştirdim #ajax. Sonra, onayımı ajax geri aramada yapmak zorunda kaldım.

Bir ctools bölmesi yapıyordum; Bunun içine girip girmediğini bilmiyorum.

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.