“System_settings_form” voodoo mu?


8

Bir arkadaşım bana form için bir yapılandırma dosyasında system_settings_form eylemini gösterdi.

Söz konusu kod şuna benzer (basitleştirilmiş).

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, gönderme düğmelerine ekler ve değişkenleri kaydederek form gönderimini işler. Ayrıca, tüm değişkeni varsayılana sıfırlayan bir "Varsayılana sıfırla" düğmesi ekler.

Temelde ne yaptığını tahmin ettim çünkü orada çok fazla belge yok ve arkadaşım da ne yaptığını tam olarak bilmiyor. Benim sorum kaydedilecek / sıfırlanacak değişkenleri nasıl biliyor? Sadece bir diziyi geçmiyor muyum?

Ayrıca system_settings_form içinde bilmem gereken başka bir sihir var mı?

Yanıtlar:


14

Uygulama ayrıntıları için bkz. System_settings_form ve system_settings_form_submit . Drupal 7'de Varsayılana Sıfırla düğmesi Sistem Ayarları formundan kaldırılmıştır.

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;
}

Sistem_ayarları_formu:

Eklentinin kaydetme yapılandırması Gönder düğmesi ve system_settings_form_submit işlevine geri arama gönderin.

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.'));
}

Tüm form öğeleri arasında yineleme yapar ve her form öğesi için değişkenleri anahtar olarak form öğesi anahtarı ve değeri kullanıcı tarafından gönderilen form öğesi değeri olarak $ form_state ['değerleri'] kullanılarak okunur.

Yani, sadece default_set işlevini kullanarak tüm form değerleri için değişkenler ayarlayan send işleyicili bir formdur.


5
İyi açıklama. "Form öğesi anahtarı olarak anahtarı olan her bir form öğesi" ile karıştırıyorsanız, yukarıdaki örnekte $ form ['super_secret_password'] Drupal'ın değişken_set ('super_secret_password', ...) çağrmasına neden olacağı anlamına gelir. çünkü system_settings_form_submit değişkenin adını formunuzun dizi anahtarından ('super_secret_password') alır.
greg_1_anderson

1
Bu yardımcı olur. Neden api.drupal.org sadece basit ingilizce ne yaptığını açıklayamıyor. Bunun yerine sadece kodu verir ... Yani özet olarak voodoo değil, sadece alan anahtarlarımı kullanarak.
Coomie

1
Ben büyük bir depolamak için kullanmamanız gerektiğini düşünüyorum çünkü bu doğrudan değişken_get olsun ya da olmasın, her sayfa isteği için bellekte kalacak. Hepsi bellekte bir kez önbelleğe alınır. Ayrıca, düzenli gönderme ve doğrulama işleyicileri sorunsuz çalışacaktır. Bunları eklemekten çekinmeyin.
AyeshK
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.