Metin giriş alanlarına form yer tutucuları ekleme


22

Düzenli bir form dönüştürmenin ve yer tutucuları bir modülle eklemenin bir yolu var mı, yoksa bu bir form şablonuyla mı yoksa jQuery ile mi yapılmalı?

Yanıtlar:


31

Bu bir HTML5 yer tutucusu, sadece herhangi bir öğeye bir özellik olarak ekleyebilirsiniz ve HTML5 özellikli tarayıcılar buna göre tepki verecektir:

function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'some_form') {
    $form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
  }
}

Bunun gibi kısa bir özyinelemeli işlev, bir formdaki her bir metin alanı için otomatik olarak yer tutucu eklemek istiyorsanız (bu örnekteki alanın başlığına göre) kullanışlı olabilir:

function MYMODULE_auto_placeholders(&$element) {
  if ( isset($element['#type']) && $element['#type'] == 'textfield') {
    // set placeholder
    $element['#attributes']['placeholder'] = $element['#title'];
    // hide label
    $element['#title_display'] = 'invisible';
  }
  foreach (element_children($element) as $key) {
    MYMODULE_auto_placeholders($element[$key]);
  }
}

O zaman formunu değiştir fonksiyonunu çağır.

MYMODULE_auto_placeholders($form);

Bu yöntem, #processfonksiyonlara eklenenler dışında ( örneğin bir resim alanının alt ve başlık metin alanları gibi) , bir formdaki hemen hemen her metin alanı için işe yarar .


Sonuç: Hata: bla_auto_placeholders () öğesinde tanımlanmamış işlev element_children () işlevini çağırın (temaların 605 satırı / custom / BLA / bla.theme).
Thomas

15

Clive'nin cevabını denedim:

function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'some_form') {
    $form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
  }
}

Ama benim için sürpriz, yer tutucu metin alanı değil, metin alanı paketleyicisine getirildi. Sonra aşağıdaki gibi bir varyasyon denedim, işe yaradı!

function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'some_form') {
    $form['some_element']['und'][0]['value']['#attributes']['placeholder'] = t('Placeholder text');
  }
}

Teşekkürler! Biraz delirmeye başlamıştım - bunun hakkında düşünmedim bile.
Mike Crittenden

"Some_element" nedir, öğenin kimliği nedir? Bunu nasıl bulabilirim?
sokratis

@sokratis öğelerin kimliklerini dpm ($ form) ile alabilirsiniz, $ form dizisinin ilk düzeyinde görünürler. Aşağıdaki, yorum formunu değiştirmenin gerçek bir örneğidir: <code> işlevi MYMODULE_form_alter (& $ form, & $ form_state, $ form_id) {if ($ form_id == 'comment_node_post_form') {$ form ['konu'] ['# nitelikler '] [' yer tutucu '] = t (' Konu '); $ form ['comment_body'] ['und'] [0] ['değer'] ['# nitelik'] ['yer tutucu'] = t ('İçerik'); }} </code>
Henry,

15

Yer tutucuyı, aşağıdaki kodda olduğu gibi, form alanı öğesinin #attributes dizisine ekleyin.

   $form['my_textfield'] = array(
      '#type' => 'textfield',
      '#attributes' => array(
        'placeholder' => t('My placeholder text'),
      ),
    );

2
thx, bu benim için Drupal 8'de çalıştı.
No Sssweat

D8'de iyi çalıştı.
15’te

5

Bunun üzerine tökezledi ve Clive'nin cevabını otomatik olarak yer tutucu eklemek için iyi göründüğünü düşündüm.

Drupal 8'de doğru şekilde elde etmek için birkaç küçük değişiklik yapmanız gerekiyor, bu yüzden hemen hemen aynı cevap, ama drupal 8 temanız için uygun.

/**
 * Implements hook_form_alter
 */
function THEME_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
  add_placeholders($form);
}


/**
 * Add placeholders to suitable form elements -> textfield, password, email, textarea
 */
function add_placeholders(&$element) {
  if(isset($element['#type']) && in_array($element['#type'], ['textfield', 'password', 'email', 'textarea'])) {
    $element['#attributes']['placeholder'] = $element['#title'];
  }
  foreach(\Drupal\Core\Render\Element::children($element) as $key) {
    add_placeholders($element[$key]);
  }
}

0

Bir form örneğini hedeflemek istiyorsanız, doğrudan hook_form_FORM_ID_alter kullanın. Koşullu kullanmaktan daha düzenli olabilir. Yalnızca arama formu blok örneğini hedeflemeye yönelik çözümüm.

function eyecare_form_search_block_form_alter(&$form, $form_state) {
  $form['keys']['#attributes']['placeholder'] = t('Search');
}
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.