“Form modası geçmiş” hatası alınıyor


12

Çok adımlı bir düğüm formum var. Bir pop-up iletişim kutusu aracılığıyla formun yarısından yarısından önce kullanıcı giriş yapmamışsa giriş yapması istenir.

Düğüm formunun bir sonraki sayfasına devam ederken başarılı bir giriş yaptıktan sonra bu doğrulama hatasını alıyorum:

Form modası geçmiş. Kaydedilmemiş işleri aşağıdaki formda kopyalayın ve ardından bu sayfayı yeniden yükleyin.

Anlıyorum çünkü drupal_validation_form()doğrular $form['#token']ve $form_state['values']['form_token']aynıdır.

Bunu nasıl önleyebilirim, çünkü bu özel bir kullanım örneğidir (ve bazı dış malzemeler tarafından sahtecilik değildir).

Bu cephede herhangi bir girdi var mı?


1
Belki cevap için çok geç ama aynı sorunu kodladım. $ Form ["# token"] = drupal_get_token ($ form ['# form_id']) ile ilgili bir sorun buldum; $ formumu hazırladığımda.

1
Aslında bir formu bir sayfaya kodlamıyordum ve jetonu eklemem gerekiyordu. <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>Formu ekleyerek düzgün bir şekilde gönderebildim.
üçüncü çeyrek

Yanıtlar:


2

Gönderiniz beni ciddi sefaletten kurtardı. Bu bağlantının nasıl yapıldığını bilmiyorum ama mesajınız beni modül kodumda küçük bir değişikliğe yönlendiriyor. Gerçi "Form modası geçmiş hale geldi" hatasının neden olduğunu anlamak kolaydır. Öyleyse bunun düşüncelerinizi ilerletip geçiremeyeceğine ve davanıza yardımcı olup olmayacağına bakın.

Sayfa yöneticim / mymod'umda aşağıdakileri içeren bir menü öğesi ayarlandı.

'page callback' => 'drupal_get_form', 
'page arguments' => 'mymod_main',

Gelen mymod_main($op = '')belirli şartlarda 2 formlardan birini inşa ediyorum ancak her yapı kursu yeni bir form, örneğin taşımaktadır $build['mymod_admin'] = drupal_get_form('mymod_admin')veya $build['mymod_delete'] = drupal_get_form('mymod_delete').

Sayfa yöneticisi / mymod ilk yüklendiğinde ve mymod_admin çağrıldığında sorun değil. Ancak mymod_admin içinde oluşturulan gönder düğmesine tıklandığında mymod_delete çağrılır ve formu oluşturur. Form işlemeyi bozan "Form modası geçmiş hale geldi" hatası geliyor. Düzeltme basitçe mymod_main()sayfa geri arama olarak kullanmaktır .

Artık, yönetici / mymod sayfası, formların her biri için yeniden yüklendiğinde, manu geri aramasından bir başlangıç ​​formu ve ardından içinde tanımlanan ikinci form olmadığında formların kesişmesi yoktur $build.


'Düzeltme' açıklayabilir misiniz, ben aynı sorunu var sanırım ama '---' ve '+++' ile ne demek istediğini anlamıyorum, teşekkür ederim
iain maitland

Bu, sayfa geri aramasının değiştirildiği anlamına gelir mymod_main().
kiamlaluno

0

Hata, form_tokenihtiyaçların geçersiz olduğu ve yeniden oluşturulması gerektiği anlamına gelir . Bu temelde gizli bir form alanıdır (genellikle siteler arası sahteciliğe karşı koruma için kullanılır).

Normalde, her Drupal formuna tarafından bir token öğesi otomatik olarak eklenir drupal_prepare_form(), bu nedenle kendi kodunuzu yazmadığınız sürece genellikle kendiniz eklemek zorunda kalmazsınız.

Çok sayfalı bir form programlamaya çalışıyorsanız, büyük olasılıkla her bir gönderide jetonu drupal_get_token(), örneğin burada gösterildiği gibi kullanarak yeniden oluşturmanız gerekir :

$form_state['input']['form_token'] = drupal_get_token($form['#token']);

Form_alter'da form belirtecinin yeniden oluşturulmasını zorunlu kılmak için aşağıdaki örneği inceleyin:

/**
 * Implements hook_form_alter().
 */
function mymodule_form_alter(&$form, &$form_state, $form_id) {
    if ($form_id === 'your_form_entityform_edit_form' && !empty($form_state['input']['form_id'])) {
      $form_id = $form_state['input']['form_id'];
      $form ['#token'] = $form_id;
      $form ['form_token'] = array(
        '#id' => drupal_html_id('edit-' . $form_id . '-form-token'),
        '#type' => 'token',
        '#default_value' => drupal_get_token($form['#token']),
        '#parents' => array('form_token'),
      );
    }
}

Sorun giderme

  • Formunuzun sabit kodlanıp kodlanmadığını iki kez kontrol edin, aksi takdirde jetonu @ üçüncü tarafından önerilen şekilde ekleyin :

    <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>
  • Hatanın başka bir formda olabileceği gibi formunuzda olup olmadığını kontrol edin (örn. Form içindeki form).

  • Hata ayıkla drupal_valid_token().
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.