$form_state
โดยทั่วไปจะใช้อะไรในบริบทของแบบฟอร์ม API หากใช้เป็นอาร์กิวเมนต์
โดยเฉพาะฉันกำลังมองหาตัวอย่างของเมื่อมีการใช้
$form_state
โดยทั่วไปจะใช้อะไรในบริบทของแบบฟอร์ม API หากใช้เป็นอาร์กิวเมนต์
โดยเฉพาะฉันกำลังมองหาตัวอย่างของเมื่อมีการใช้
คำตอบ:
$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']
$form
อาร์เรย์ $form_state
มันเป็นรูปแบบการสร้างการตรวจสอบว่าเนื้อหาของ นี่คือสิ่งที่ฉันเห็นในการเรียกกลับ AJAX ทั้งหมดที่ใช้โดยโมดูลที่ทำสิ่งที่ถูกต้อง