“ system_settings_form” voodoo เป็นหรือไม่


8

เพื่อนเพิ่งแสดงให้ฉัน system_settings_form ในการดำเนินการในไฟล์การกำหนดค่าสำหรับแบบฟอร์ม

รหัสที่เป็นปัญหาจะมีลักษณะเช่นนี้ (ลดความซับซ้อน)

function my_module_generateAdminForm($form){
  $form = array();
  $form['super_secret_password'] = array(
    '#type' => 'textfield',
    '#title' => t('Headline'),
    '#default_value' => variable_get('super_secret_password','password'),
  );
  system_settings_form($form);
}

system_settings_form เพิ่มปุ่มส่งและจัดการการส่งแบบฟอร์มบันทึกตัวแปร นอกจากนี้ยังเพิ่มปุ่ม "รีเซ็ตเป็นค่าเริ่มต้น" ซึ่งจะรีเซ็ตตัวแปรทั้งหมดเป็นค่าเริ่มต้น

ฉันคาดเดาสิ่งที่มันทำเพราะไม่มีเอกสารมากมายที่นั่นและเพื่อนของฉันก็ไม่รู้เหมือนกันว่ามันทำอะไร คำถามของฉันคือมันรู้ได้อย่างไรว่าตัวแปรที่จะบันทึก / รีเซ็ต? ฉันจะไม่ผ่านอาร์เรย์หรือ

นอกจากนี้ยังมีเวทมนต์อื่น ๆ ใน system_settings_form ที่ฉันควรรู้เกี่ยวกับ?

คำตอบ:


14

ดูที่system_settings_formและsystem_settings_form_submitสำหรับรายละเอียดการใช้งาน ใน Drupal 7 รีเซ็ตเป็นปุ่มเริ่มต้นจะถูกลบออกจากแบบฟอร์มการตั้งค่าระบบ

function system_settings_form($form) {
  $form['actions']['#type'] = 'actions';
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save configuration'),
  );

  if (!empty($_POST) && form_get_errors()) {
    drupal_set_message(t('The settings have not been saved because of the errors.'), 'error');
  }
  $form['#submit'][] = 'system_settings_form_submit';
  // By default, render the form using theme_system_settings_form().
  if (!isset($form['#theme'])) {
    $form['#theme'] = 'system_settings_form';
  }
  return $form;
}

System_settings_form:

เพิ่มการบันทึกการกำหนดค่าปุ่มส่งและส่งกลับไปยังฟังก์ชัน system_settings_form_submit

system_settings_form_submit:

function system_settings_form_submit($form, &$form_state) {
  // Exclude unnecessary elements.
  form_state_values_clean($form_state);

  foreach ($form_state['values'] as $key => $value) {
    if (is_array($value) && isset($form_state['values']['array_filter'])) {
      $value = array_keys(array_filter($value));
    }
    variable_set($key, $value);
  }

  drupal_set_message(t('The configuration options have been saved.'));
}

ทำซ้ำผ่านองค์ประกอบแบบฟอร์มทั้งหมดและตั้งค่าตัวแปรสำหรับแต่ละองค์ประกอบแบบฟอร์มด้วยคีย์เป็นคีย์องค์ประกอบแบบฟอร์มและค่าตามที่ผู้ใช้ส่งค่าองค์ประกอบแบบฟอร์มที่อ่านโดยใช้ $ form_state ['values']

ดังนั้นมันเป็นเพียงแบบฟอร์มที่มีตัวจัดการการส่งที่ตั้งค่าตัวแปรสำหรับค่าฟอร์มทั้งหมดโดยใช้ฟังก์ชั่น variable_set


5
คำอธิบายที่ดี หากคุณสับสนโดย "แต่ละองค์ประกอบฟอร์มที่มีคีย์เป็นองค์ประกอบองค์ประกอบคีย์" สิ่งที่เขาหมายถึงคือในตัวอย่างของคุณข้างต้น $ form ['super_secret_password'] จะทำให้ Drupal โทร Vari_set ('super_secret_password', ... ), เนื่องจาก system_settings_form_submit ใช้ชื่อของตัวแปรจากคีย์อาร์เรย์ ('super_secret_password') ของแบบฟอร์มของคุณ
greg_1_anderson

1
สิ่งนี้มีประโยชน์ ทำไม api.drupal.org ไม่สามารถอธิบายสิ่งที่เป็นภาษาอังกฤษธรรมดาได้ มันให้รหัสแทน ... ดังนั้นโดยสรุปแล้วไม่ใช่วูดูแค่ใช้คีย์ฟิลด์ของฉัน
Coomie

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