$ form_state ใช้ทำอะไร


33

$form_stateโดยทั่วไปจะใช้อะไรในบริบทของแบบฟอร์ม API หากใช้เป็นอาร์กิวเมนต์

โดยเฉพาะฉันกำลังมองหาตัวอย่างของเมื่อมีการใช้

คำตอบ:


48

$form_stateเป็นหนึ่งในข้อโต้แย้งที่ส่งผ่านไปยังตัวจัดการการส่งฟอร์มหรือตัวจัดการการตรวจสอบความถูกต้องของฟอร์ม การใช้งานหลักของมันคือการดึงค่าที่ป้อนจากผู้ใช้ในรูปแบบดูเนื้อหาของ$form_state['values']) แต่มันมีค่าอื่น ๆ ที่สามารถนำมาใช้เพื่อวัตถุประสงค์อื่น ๆ
เอกสารสำหรับdrupal_build_form ()มีรายการค่าอื่น ๆ ที่มีอยู่ในอาเรย์นั้นซึ่งรวมถึงค่าต่อไปนี้:

  • สร้างใหม่: โดยปกติหลังจากการประมวลผลแบบฟอร์มทั้งหมดเสร็จสิ้นและตัวจัดการการส่งได้เรียกใช้แล้วจะถือว่าฟอร์มเสร็จและ drupal_redirect_form () จะเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าใหม่โดยใช้คำขอ GET (ดังนั้นการรีเฟรชเบราว์เซอร์จะไม่ส่งซ้ำอีกครั้ง แบบฟอร์ม) อย่างไรก็ตามหากตั้ง 'สร้างใหม่' เป็น TRUE แล้วสำเนาใหม่ของแบบฟอร์มจะถูกสร้างและส่งไปยังเบราว์เซอร์ทันทีแทนที่จะเปลี่ยนเส้นทาง ใช้สำหรับแบบฟอร์มหลายขั้นตอนเช่นตัวช่วยสร้างและแบบฟอร์มยืนยัน โดยปกติแล้ว$form_state['rebuild']จะถูกตั้งค่าโดยตัวจัดการการส่งเนื่องจากโดยทั่วไปแล้วจะเป็นตรรกะภายในตัวจัดการการส่งที่กำหนดว่าจะทำแบบฟอร์มหรือต้องมีขั้นตอนอื่น อย่างไรก็ตามตัวจัดการการตรวจสอบความถูกต้องอาจตั้งค่า$form_state['rebuild']เพื่อทำให้การประมวลผลแบบฟอร์มเพื่อเลี่ยงผ่านตัวจัดการการส่งและสร้างฟอร์มใหม่แทนแม้ว่าจะไม่มีข้อผิดพลาดในการตรวจสอบความถูกต้อง
  • เปลี่ยนเส้นทาง: ใช้เพื่อเปลี่ยนเส้นทางแบบฟอร์มในการส่ง มันอาจจะเป็นสตริงที่มี URL drupal_goto()ปลายทางหรืออาร์เรย์ของการขัดแย้งที่เข้ากันได้กับ ดูdrupal_redirect_form()ข้อมูลที่ครบถ้วน
  • แคช: หากตั้งค่าTRUEเป็นโครงสร้างแบบดั้งเดิมที่ยังไม่ได้ประมวลผลจะถูกแคชซึ่งจะช่วยให้ฟอร์มทั้งหมดถูกสร้างใหม่จากแคช เวิร์กโฟลว์ของแบบฟอร์มทั่วไปเกี่ยวข้องกับการร้องขอสองหน้า ก่อนฟอร์มสร้างและแสดงผลให้ผู้ใช้กรอกข้อมูลจากนั้นผู้ใช้กรอกแบบฟอร์มและส่งแบบฟอร์มทริกเกอร์คำขอหน้าสองที่ฟอร์มจะต้องสร้างและประมวลผล โดยค่าเริ่มต้น$formและ$form_stateถูกสร้างขึ้นตั้งแต่เริ่มต้นในระหว่างการร้องขอแต่ละหน้า บ่อยครั้งที่มีความจำเป็นหรือต้องการที่จะคงอยู่$formและ$form_stateตัวแปรจากการร้องขอหน้าเริ่มต้นไปยังหนึ่งที่ประมวลผลการส่ง 'แคช' สามารถตั้งค่าเป็น TRUE เพื่อทำสิ่งนี้ ตัวอย่างที่โดดเด่นคือรูปแบบที่เปิดใช้งาน Ajax ซึ่งในนั้นajax_process_form()เปิดใช้งานการแคชฟอร์มสำหรับฟอร์มทั้งหมดที่รวมองค์ประกอบด้วยคุณสมบัติ #ajax (ตัวจัดการ Ajax ไม่มีวิธีสร้างฟอร์มเองดังนั้นต้องพึ่งพาเวอร์ชันที่แคช) โปรดทราบว่าการคงอยู่$formและ$form_stateเกิดขึ้นโดยอัตโนมัติสำหรับฟอร์ม (หลายขั้นตอน) ที่มีการตั้งค่าสถานะ 'สร้างใหม่' โดยไม่คำนึงถึงค่าสำหรับ 'แคช'
  • พื้นที่เก็บข้อมูล: $form_state['storage']ไม่ใช่รหัสพิเศษและไม่มีการสนับสนุนที่เฉพาะเจาะจงสำหรับมันใน Form API ตามธรรมเนียมแล้วเป็นที่เก็บข้อมูลเฉพาะแอปพลิเคชันสำหรับการสื่อสารระหว่างฟังก์ชั่นการส่งการตรวจสอบความถูกต้องและการสร้างฟอร์มโดยเฉพาะอย่างยิ่งในรูปแบบหลายขั้นตอน การใช้แบบฟอร์มอาจใช้รหัสใด ๆ ภายใน$form_state(นอกเหนือจากคีย์ที่แสดงไว้ที่นี่และสิ่งอื่น ๆ ที่สงวนไว้ซึ่งใช้โดยแบบฟอร์ม API ภายใน) สำหรับพื้นที่เก็บข้อมูลประเภทนี้ วิธีที่แนะนำเพื่อให้แน่ใจว่าคีย์ที่เลือกไม่ขัดแย้งกับที่ใช้โดย Form API หรือโมดูลอื่น ๆ คือการใช้ชื่อโมดูลเป็นชื่อคีย์หรือคำนำหน้าสำหรับชื่อคีย์ ตัวอย่างเช่นโมดูล Node ใช้$form_state['node'] ในรูปแบบการแก้ไขโหนดเพื่อเก็บข้อมูลเกี่ยวกับโหนดที่ถูกแก้ไขและข้อมูลนี้ยังคงมีอยู่ในการคลิกที่ต่อเนื่องของปุ่ม "ดูตัวอย่าง" เช่นเดียวกับเมื่อปุ่ม "บันทึก" ถูกคลิกในที่สุด

ฟังก์ชั่นอื่น ๆ ที่ได้รับ$form_stateเป็นอาร์กิวเมนต์เป็นhook_form_alter ()และhook_form_FORM_ID_alter ()

ตัวอย่างของรหัสที่ใช้อาร์กิวเมนต์นั้นคุณสามารถดูcomment_form_submit ()ซึ่งมีรหัสต่อไปนี้:

function comment_form_submit($form, &$form_state) {
  $node = node_load($form_state['values']['nid']);
  $comment = comment_form_submit_build_comment($form, $form_state);
  if (user_access('post comments') && (user_access('administer comments') || $node->comment == COMMENT_NODE_OPEN)) {
    // Save the anonymous user information to a cookie for reuse.
    if (user_is_anonymous()) {
      user_cookie_save(array_intersect_key($form_state['values'], array_flip(array('name', 'mail', 'homepage'))));
    }

    comment_save($comment);
    $form_state['values']['cid'] = $comment->cid;

    // Add an entry to the watchdog log.
    watchdog('content', 'Comment posted: %subject.', array('%subject' => $comment->subject), WATCHDOG_NOTICE, l(t('view'), 'comment/' . $comment->cid, array('fragment' => 'comment-' . $comment->cid)));

    // Explain the approval queue if necessary.
    if ($comment->status == COMMENT_NOT_PUBLISHED) {
      if (!user_access('administer comments')) {
        drupal_set_message(t('Your comment has been queued for review by site administrators and will be published after approval.'));
      }
    }
    else {
      drupal_set_message(t('Your comment has been posted.'));
    }
    $query = array();
    // Find the current display page for this comment.
    $page = comment_get_display_page($comment->cid, $node->type);
    if ($page > 0) {
      $query['page'] = $page;
    }
    // Redirect to the newly posted comment.
    $redirect = array('node/' . $node->nid, array(
        'query' => $query,
        'fragment' => 'comment-' . $comment->cid,
      ));
  }
  else {
    watchdog('content', 'Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject), WATCHDOG_WARNING);
    drupal_set_message(t('Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject)), 'error');
    // Redirect the user to the node they are commenting on.
    $redirect = 'node/' . $node->nid;
  }
  $form_state['redirect'] = $redirect;
  // Clear the block and page caches so that anonymous users see the comment
  // they have posted.
  cache_clear_all();
}

เพื่อให้เข้าใจถึงสิ่งที่$form_state['values']มีคุณต้องดูที่ค่าที่เพิ่มให้$formในcomment_form () ตัวอย่างเช่น$form_stateมี$form_state['values']['name']เพราะมี$form $form['author']['name']โดยทั่วไปถ้า$form['field']เป็นเขตข้อมูลฟอร์มแล้วจะมี$form_state$form_state['values']['field']


หากเราต้องการเปลี่ยนค่าของฟอร์มหรือปิดใช้งานปุ่มเขตข้อมูลแบบหลายค่าโดยใช้ hook_form_alter ตัวแปรใดที่ควรเปลี่ยน $ form หรือ $ from_state? (เมื่อใช้งานโดยใช้ AJAX หรือไม่มี AJAX) $ form_state ใช้สำหรับอาแจ็กซ์โดยเฉพาะหรือไม่?
kiranking

1
@kiranking โดยปกติแล้วการโทรกลับ AJAX จะส่งกลับส่วนของ$formอาร์เรย์ $form_stateมันเป็นรูปแบบการสร้างการตรวจสอบว่าเนื้อหาของ นี่คือสิ่งที่ฉันเห็นในการเรียกกลับ AJAX ทั้งหมดที่ใช้โดยโมดูลที่ทำสิ่งที่ถูกต้อง
kiamlaluno
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.