ได้รับข้อผิดพลาด“ แบบฟอร์มล้าสมัยแล้ว”


12

ฉันมีรูปแบบโหนดหลายขั้นตอน ผ่านไปครึ่งทางแบบฟอร์มผ่านผู้ใช้กล่องโต้ตอบป๊อปอัพขอให้เข้าสู่ระบบหากพวกเขาไม่ได้เข้าสู่ระบบก่อน

เมื่อล็อกอินสำเร็จเมื่อดำเนินการกับหน้าถัดไปของฟอร์มโหนดฉันได้รับข้อผิดพลาดในการตรวจสอบนี้:

แบบฟอร์มล้าสมัยแล้ว คัดลอกงานที่ไม่ได้บันทึกในแบบฟอร์มด้านล่างจากนั้นโหลดหน้านี้ซ้ำ

ฉันเข้าใจว่าเป็นเพราะdrupal_validation_form()ตรวจสอบ$form['#token']และ$form_state['values']['form_token']เหมือนกัน

ฉันจะหลีกเลี่ยงสิ่งนี้ได้อย่างไรเนื่องจากเป็นกรณีการใช้งานพิเศษ (และไม่ใช่ของปลอมบางอย่างจากภายนอก)

ด้านหน้ามีอินพุตอะไรบ้าง?


1
อาจจะสายเกินไปที่จะตอบ แต่ฉันก็สนับสนุนปัญหาเดียวกัน ฉันพบปัญหากับ $ form ["# token"] = drupal_get_token ($ form ['# form_id']); เมื่อฉันเตรียมแบบฟอร์ม $ ของฉัน

1
จริงๆแล้วฉันเขียนโค้ดลงในฟอร์มยาก ๆ และจำเป็นต้องเพิ่มโทเค็น โดยการเพิ่ม<input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>แบบฟอร์มก็สามารถที่จะส่งอย่างถูกต้อง
บุคคลที่สาม

คำตอบ:


2

โพสต์ของคุณเพิ่งช่วยฉันจากความทุกข์ยาก ไม่ทราบวิธีการเชื่อมต่อที่เกิดขึ้น แต่โพสต์ของคุณทำให้ฉันมีการเปลี่ยนแปลงเล็กน้อยในรหัสโมดูลของฉัน ง่ายต่อการเข้าใจว่าทำไมข้อผิดพลาด "แบบฟอร์มล้าสมัย" เกิดขึ้นในขณะนี้ ดังนั้นดูว่าสิ่งนี้อาจเขย่าเบา ๆ ความคิดของคุณและช่วยสำหรับกรณีของคุณ

หน้าของฉันผู้ดูแลระบบ / mymod มีรายการเมนูการตั้งค่าที่รวมต่อไปนี้

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

ในmymod_main($op = '')ฉันกำลังสร้างเงื่อนไขหนึ่งใน 2 รูปแบบ แต่แต่ละสร้างเป็นหลักสูตรรูปแบบใหม่เช่นหรือ$build['mymod_admin'] = drupal_get_form('mymod_admin')$build['mymod_delete'] = drupal_get_form('mymod_delete')

ไม่มีปัญหาเมื่อเพจผู้ดูแลระบบ / mymod ถูกโหลดครั้งแรกและ mymod_admin ถูกเรียกใช้ แต่เมื่อคลิกปุ่มส่งที่สร้างใน mymod_admin mymod_delete จะถูกเรียกและสร้างฟอร์ม มีข้อผิดพลาด "แบบฟอร์มกลายเป็นล้าสมัย" ข้อผิดพลาดที่ทำลายการประมวลผลแบบฟอร์ม การแก้ไขเป็นเพียงการใช้mymod_main()เป็นหน้าโทรกลับ

ตอนนี้ไม่มีการข้ามขึ้นจากรูปแบบเมื่อ admin / โหลดหน้า mymod $buildสำหรับแต่ละรูปแบบที่มีไม่ได้เป็นรูปแบบที่เริ่มต้นจากการเรียกกลับมนูแล้วรูปแบบที่สองที่กำหนดไว้ใน


คุณช่วยอธิบาย 'แก้ไข' ของคุณฉันคิดว่าฉันมีปัญหาเดียวกัน แต่ฉันไม่เข้าใจสิ่งที่คุณหมายถึงด้วย '---' และ '+++' ขอบคุณ
iain maitland

mymod_main()มันหมายถึงการเรียกกลับหน้าก็เปลี่ยนไปเป็น
kiamlaluno

0

ข้อผิดพลาดหมายถึงform_tokenความต้องการที่ไม่ถูกต้องและจะต้องมีการสร้างใหม่ นี่เป็นฟิลด์แบบฟอร์มที่ซ่อนอยู่ (โดยทั่วไปใช้เพื่อป้องกันการปลอมแปลงข้ามไซต์)

โดยปกติแล้วจะมีการเพิ่มองค์ประกอบโทเค็นในแต่ละรูปแบบ Drupal โดยdrupal_prepare_form()อัตโนมัติดังนั้นโดยทั่วไปคุณไม่จำเป็นต้องเพิ่มตัวเองยกเว้นว่าคุณกำลังเขียนโค้ดของคุณเอง

หากคุณกำลังพยายามตั้งโปรแกรมรูปแบบหลายหน้าบางหน้าคุณอาจต้องสร้างโทเค็นใหม่ในการส่งแต่ละครั้งโดยใช้drupal_get_token()เช่นที่แสดงที่นี่ :

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

สำหรับวิธีแก้ปัญหาเพื่อบังคับให้สร้างโทเค็นของฟอร์มใหม่ใน form_alter ให้ตรวจสอบตัวอย่างต่อไปนี้:

/**
 * 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'),
      );
    }
}

การแก้ไขปัญหา

  • ตรวจสอบอีกครั้งว่าแบบฟอร์มของคุณไม่ได้ hardcoded มิฉะนั้นเพิ่มโทเค็นตามที่แนะนำโดย@thirdender :

    <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>
  • ตรวจสอบว่าข้อผิดพลาดเกิดขึ้นกับแบบฟอร์มของคุณหรือไม่ในแบบฟอร์มอื่น ๆ (เช่นแบบฟอร์มภายในแบบฟอร์ม)

  • drupal_valid_token()ตรวจแก้จุดบกพร่อง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.