Menambahkan pengganti HTML5 ke semua formulir drupal

22

Saya mencoba menambahkan atribut placeholder ke semua bidang teks di situs web saya, tetapi saya tidak beruntung.

Saya telah membuat modul yang menimpa hook_form_alter

function mymodule_form_alter(&$form, &$form_state, $form_id)
{
    foreach ($form as $key => $value) {
        if ("textfield" == $value["#type"]){
            $value['#attributes']["placeholder"] = t($value["#title"]);
        }
    }
}

Saya harus memberi tahu Anda bahwa saya juga menggunakan modul webform.

Josua Pedersen
sumber

Jawaban:

14

Karena saya menggunakan modul webform saya hanya bisa tema templat webform global (webform-form.tpl.php) dan meletakkannya di folder tema saya. Tidak perlu menyulitkan hal-hal dengan modul.

foreach ($form["submitted"] as $key => $value) {
    if ("textfield" == $value["#type"]) {
        $form["submitted"][$key]['#attributes']["placeholder"] = t($value["#title"]);
    } 
}

Saya meletakkan ini di bagian atas file template.

Josua Pedersen
sumber
3
Ini dapat menghasilkan beberapa kesalahan "indeks tidak ditentukan" ketika melakukan foreach loop, ingatlah untuk memeriksa apakah indeks mengeluarkan ()
Matteo
10

Ubah sedikit menjadi ....

function mymodule_form_alter(&$form, &$form_state, $form_id)
{
    foreach ($form as $key => $value) {
        if ("textfield" == $value["#type"]){
            $form[$key]['#attributes']["placeholder"] = t($value["#title"]);
        }
    }
}

$value dalam lingkup foreach adalah tipe nilai bukan referensi.


EDIT:

Saya baru saja bereksperimen dengan mengikuti kode dan saya berhasil mengulangi seluruh formulir secara textfield untuk mengedit atribut mereka.

function add_placeholder(&$form){
    foreach($form as $key => $val){
        if(substr($key,0,1) == '#' && $form[$key] == 'textfield'){
            $form['#attributes'] = array('placeholder' => t('some text'));
        }else if(is_array($form[$key])){
            add_placeholder($form[$key]);
        }
    }
}
Shoaib Nawaz
sumber
Terima kasih atas bantuan Anda! Seharusnya melihat itu sendiri. Karena itu tidak menyelesaikan masalah awal saya, saya tidak bisa memberi Anda jawaban yang benar.
Josua Pedersen
4

Anda mungkin dapat melakukannya dengan hook_form_alteratau hook_form_FORM_ID_alterdan menambahkan atribut "placeholder"

mis. belum diuji, tetapi sesuatu seperti:

/**
 * Implements hook_form_FORM_ID_alter
 */
function mymodule_form_webform_client_form_12_alter(&$form, &$form_state) {
  drupal_set_message('<pre>'.print_r($form,1).'</pre>'); // debug form
  $form['submitted']['my_form_component']['#attributes'] = array('placeholder' => 'placeholder 1');
}

Temukan elemen formulir tersembunyi di HTML formulir web yang dinamai form_iduntuk mendapatkan id formulir yang benar untuk form_alternama fungsi.

David Thomas
sumber
apakah saya harus membuat modul untuk ini?
1
Anda dapat melakukan modul atau mengaturnya di template.php tema Anda, mengubah modul saya dengan nama mesin templat.
mariomc
Apakah kode ini juga berfungsi untuk D6?
Bala
4

Pendekatan yang lebih baik untuk kode Josua Pedersen:

foreach ($form['submitted'] as $key => $value) {
 if (isset($form['submitted'][$key])) {
   $types = array('textfield', 'webform_email', 'textarea');

   if (isset($value['#type']) && in_array($value['#type'], $types)) {
     $form['submitted'][$key]['#attributes']['placeholder'] = t($value['#title']);
   }
 }
}
Sohail
sumber
+1, kode ini berfungsi dengan baik, saya hanya menyalin dan menempel di modul khusus saya, dengan drupal 6, tapi saya mendapat peringatan kesalahan ini: Argumen tidak valid diberikan untuk foreach () di C: \ wamp \ www \ r4launch \ sites \ all \ modules \ advanced \ advanced.module on line 16.
Bala
1
Saya menyelesaikannya dengan menempatkan di dalam kondisi if. if (isset ($ form_state ['webform']))) {kode di atas ada di sini ..}
Bala
3

Dalam kode Anda, Anda mengubah variabel $valueyang tidak pernah ketika dikaitkan lagi dengan variabel $form, yang mana dilewatkan oleh referensi.

Secara jelas, Anda membuat beberapa perubahan tetapi tidak mengirimnya kembali ke Drupal.

Juga, Anda dapat melakukannya seperti itu (saya belum mengujinya tetapi secara teori itu harus bekerja).

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  $keys = element_children($form);
  foreach ($keys as $key) {
    if (in_array(array('textfield', 'textarea'), $form[$key]['#type'])) {
      if (!empty($form[$key]['#title'])) {
        $placeholder = array('placeholder' => t($form[$key]['#title']));
        if (is_array($form[$key]['#attributes'])) {
          $form[$key]['#attributes'] = array_merge($form[$key]['#attributes'], $placeholder);
        }
        else {
          $form[$key]['#attributes'] = $placeholder;
        }
      }
    }
  }
}

Saya malas menambahkan cek fieldsetdan menambahkan placeholder ke anak-anak. Tapi saya kira Anda bisa mengubahnya dengan sangat mudah.

yvan
sumber
3

Sedikit perbaikan pada solusi file templat @ Josua: Kode ini juga akan menambahkan teks placeholder ke feild email form web.

foreach ($form["submitted"] as $key => $value) {
    if ("textfield" == $value["#type"]) {
        $form["submitted"][$key]['#attributes']["placeholder"] = t($value["#title"]);
    }
    if($value['#type'] == "webform_email") {
        $form["submitted"][$key]['#attributes']["placeholder"] = t($value["#title"]);
    } 
}
Steven B
sumber
Untuk menjadi perbaikan sejati Anda harus melakukan 2 hal: 1) memeriksa indeks yang akan ditetapkan 2) menggunakan sintaks yang lebih baik untuk memeriksa kasus
Matteo
2

menggunakan hook_form_alter coba ini

function mymodule_survey_builder_form_alter(&$form, &$form_state, $form_id) {    
 if ($form_id == 'form_builder_field_configure') {
        $form['title']['#attributes']=array('placeholder' => t('Please enter the Qustion(English) name here.'));
}
}
Mohamed Ibrahim
sumber
1

Bagi siapa pun yang menggunakan versi yang lebih lama atau ketinggalan zaman modul Webform Drupal , perlu dicatat bahwa dukungan placeholder telah ditambahkan di 7.x-4.x branch(Juni 2013).

Dengan demikian, fungsionalitas placeholder HTML5 sekarang merupakan opsi bawaan bawaan bersama dengan kelas CSS khusus untuk komponen dan beberapa fitur lain yang telah lama diminta.

Berikut tangkapan layar tentang bagaimana fungsionalitas baru muncul:

Pengaturan Komponen Webform Drupal yang menunjukkan dukungan placeholder HTML5

rjb
sumber
0

Dalam kebanyakan kasus, saya kira, seseorang hanya ingin menambahkan atribut placeholder pada beberapa formulir.

Jika Anda ingin menambahkan placeholder ke semua formulir web, Anda dapat melakukannya seperti ini:

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  // If webform, add "placeholder" attributes to all textfields
  // got code here:http://drupal.stackexchange.com/questions/12706/adding-html5-placeholder-to-all-drupal-forms
  if (isset($form['#node']->type) && ($form['#node']->type == 'webform')) {
    foreach ($form["submitted"] as $key => $value) {
      switch ($value["#type"]) {
        case 'textfield':
        case 'textarea':
        case 'webform_email':
          $form["submitted"][$key]['#attributes']["placeholder"] = $value["#title"];
          break;
      } 
    }
  }
}
rosell.dk
sumber
0

Cukup gunakan modul untuk itu: Petunjuk Webform

Ini persis apa yang Anda butuhkan. Mudah dikelola dan tidak perlu kode khusus. Modul ini juga menyediakan dukungan untuk browser lawas yang tidak mendukung atribut placeholder.

ANDiTKO
sumber