Tüm drupal formlara HTML5 yer tutucu ekleme


22

Yer tutucu özelliğini, web sitemdeki tüm metin alanlarına eklemeye çalışıyorum, ancak şansım yok.

Geçersiz kılan bir modül oluşturdum 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"]);
        }
    }
}

Size webform modülünü de kullandığımı söylemeliyim.

Yanıtlar:


14

Webform modülünü kullandığım için sadece global webform şablonunu (webform-form.tpl.php) temalı ve tema klasörüme koyabilirim. Modül ile işleri karmaşıklaştırmaya gerek yok.

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

Bunu şablon dosyasının en üstüne koydum.


3
Bu, foreach döngüsünü yaparken bazı "tanımsız dizin" hatası oluşturabilir, endeksin ayarlı olup olmadığını kontrol etmeyi unutmayın ()
Matteo

10

Hafifçe değiştirin ....

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 foreach kapsamında değer türü bir referans değil.


DÜZENLE:

Sadece aşağıdaki kodu denedim ve özniteliklerini düzenlemek için metin alanlarının tüm formlarını yinelemeli olarak yinelemeyi başardım.

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

Yardımın için teşekkürler! Bunu kendim görmeliydim. Asıl sorunumu çözmediği için size doğru bir cevap veremem.
Josua Pedersen

4

Muhtemelen bunu "yer tutucu" özniteliğiyle hook_form_alterveya hook_form_FORM_ID_alterekleyerek yapabilirsin

örneğin, denenmemiş, ancak şöyle bir şey:

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

İşlev adı form_idiçin doğru form kimliğini almak üzere adlandırılmış web form HTML'sinde gizli form öğesini bulun form_alter.


Bunun için modül yapmak zorunda mıyım?

1
Bir modül yapabilir veya temanın template.php dosyasında, modülün makine ismi ile mymodule değerini değiştirmesini sağlayabilirsiniz.
mariomc

Bu kod D6 için de işe yarar mı?
Bala

4

Josua Pedersen'in koduna daha iyi bir yaklaşım:

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

+1, bu kod harika çalışıyor, sadece drupal 6 ile özel modülüme kopyalayıp yapıştırdım, ancak şu hata uyarısını aldım: C: \ wamp \ www \ r4launch \ sites \ all içinde foreach () için geçersiz bir argüman verildi \ module \ advanced \ advanced.module 16. satırda
Bala

1
İf koşulunun içine yerleştirerek çözdüm. if (isset ($ form_state ['webform']))) {yukarıdaki kod buraya gelir.}
Bala

3

Kodunuzda, bir $valuedaha hiçbir zaman $formreferans tarafından iletilen değişkenle ilişkilendirilmediğinde , değişkeni değiştirirsiniz .

Açıkçası, bazı değişiklikler yaptınız ancak Drupal'a geri göndermeyin.

Ayrıca, böyle yapabilirsiniz (Test etmedim ancak teoride çalışması gerekir).

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

fieldsetÇocuklara bir çek eklemek ve yer tutucu eklemek için tembildim. Ama sanırım kolayca değiştirebilirsin.


3

@ Josua'nın şablon dosyası çözümünde küçük bir gelişme: Bu kod ayrıca, webform e-posta dosyalarına yer tutucu metin de ekler.

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"]);
    } 
}

Gerçek bir gelişme için 2 şeyi yapmanız gerekir: 1) ayarlanacak indeksi kontrol edin 2) farklı vakaları kontrol etmek için daha iyi bir sözdizimi kullanın
Matteo

2

hook_form_alter kullanarak bunu deneyin

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

1

Eski veya eski bir sürümünü kullanan herkes için Drupal Web Formu modülü , o tutucu desteği belirterek 's değerinde eklenmiştir içinde 7.x-4.x branch(Haziran 2013).

Bu nedenle, HTML5 yer tutucu işlevi, şimdi bileşenler için özel CSS sınıflarının yanı sıra uzun zamandır istenen diğer bazı özellikler için yerel, yerleşik bir seçenektir.

İşte yeni işlevselliğin nasıl göründüğünün ekran görüntüsü:

HTML5 yer tutucu desteğini gösteren Drupal Webform Bileşen Ayarları


0

Çoğu durumda, sanırım, yalnızca bazı formlarda yer tutucu özellikleri eklemek istersiniz.

Tüm web formlarına yer tutucu eklemek istiyorsanız, bunu şöyle yapabilirsiniz:

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

0

Sadece bunun için modülü kullanın: Webform İpuçları

Tam olarak ihtiyacın olan şey. Yönetimi kolaydır ve özel kod gerekmez. Bu modül ayrıca, yer tutucu özelliğini desteklemeyen eski tarayıcılar için destek sağlar.

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.