web-dev-qa-db-ja.com

すべてのdrupalフォームにHTML5プレースホルダーを追加する

Webサイト全体のすべてのテキストフィールドにプレースホルダー属性を追加しようとしていますが、うまくいきません。

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

私もwebformモジュールを使用していることを教えてください。

22
Josua Pedersen

私はwebformモジュールを使用しているため、グローバルwebformテンプレート(webform-form.tpl.php)にテーマを設定して、テーマフォルダーに配置できます。モジュールで物事を複雑にする必要はありません。

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

これをテンプレートファイルの先頭に配置します。

14
Josua Pedersen

少し変更して....

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スコープの値型は参照ではありません。


編集:

次のコードを試してみたところ、フォーム全体を再帰的に反復して、テキストフィールドの属性を編集することができました。

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

おそらくhook_form_alterまたはhook_form_FORM_ID_alterを使用して"placeholder"属性を追加することで可能です。

例:テストされていないが、次のようなもの:

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

form_idという名前のWebフォームHTMLで非表示のフォーム要素を見つけて、form_alter関数名の正しいフォームIDを取得します。

4
David Thomas

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

@Josuaのテンプレートファイルソリューションのわずかな改善:このコードは、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"]);
    } 
}
3
Steven B

コードでは、変数_$value_を変更しますが、参照によって渡される変数_$form_に再び関連付けることはありません。

明らかに、あなたはいくつかの変更を行いますが、それをDrupalに送り返さないでください。

また、あなたはそのようにそれを行うことができます(私はそれをテストしていませんが、理論的にはそれはうまくいくはずです)。

_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のチェックを追加して子にプレースホルダーを追加するのは面倒でした。しかし、あなたはそれを非常に簡単に変更できると思います。

3
yvan

hook_form_alterを使用してこれを試してください

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

古いバージョンまたは古いバージョンの DrupalのWebformモジュール を使用している人は、7.x-4.x branch(2013年6月)のプレースホルダーサポート 追加された に注目する価値があります。

したがって、HTML5プレースホルダー機能は、コンポーネントのカスタムCSSクラスと、他のいくつかの長い間要求されてきた機能とともに、ネイティブの組み込みオプションになりました。

新しい機能がどのように表示されるかを示すスクリーンショットを次に示します。

Drupal Webform Component Settings showing HTML5 placeholder support

1
rjb

ほとんどの場合、私はおそらく、いくつかのフォームにプレースホルダー属性を追加したいと思うでしょう。

すべてのWebフォームにプレースホルダーを追加する場合は、次のようにします。

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
rosell.dk

そのためのモジュールを使用するだけです: Webform Hints

それはまさにあなたが必要とするものです。管理が簡単で、カスタムコードは必要ありません。このモジュールは、placeholder属性をサポートしないレガシーブラウザーのサポートも提供します。

0
ANDiTKO