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


22

私は自分のウェブサイトのすべてのテキストフィールドにプレースホルダー属性を追加しようとしていますが、運がありません。

オーバーライドするモジュールを作成しました 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モジュールも使用していることをお伝えします。

回答:


14

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

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

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


3
これは、foreachのループを実行するときに、インデックスISSET()かどうかを確認するために覚えているいくつかの「未定義のインデックス」エラーを生成することができます
マッテオ

10

少し変更してください。

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

ご協力いただきありがとうございます!自分でそれを見つけたはずです。それは私の元の問題を解決していないため、正しい答えを与えることはできません。
ジョスアペダーセン

4

hook_form_alterまたはhook_form_FORM_ID_alter「プレースホルダ」属性を追加して、それを行うことができます

たとえば、テストされていませんが、次のようなものです。

/**
 * 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正しいフォームIDを取得するために名前が付けられたWebフォームHTMLで非表示のフォーム要素を見つけますform_alter


このためのモジュールを作成する必要がありますか?

1
モジュールを実行するか、テーマのtemplate.phpに設定して、テンプレートのマシン名でmymoduleを変更できます。
mariomc

このコードはD6でも機能しますか?
バラ

4

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

+1、このコードはうまく機能しています。drupal6でカスタムモジュールにコピーして貼り付けましたが、このエラー警告が表示されました:C:\ wamp \ www \ r4launch \ sites \ allのforeach()に無効な引数が指定されました16行目の\ modules \ advanced \ advanced.module
Bala

1
if条件内に配置することで解決しました。if(isset($ form_state ['webform'])){上記のコードはここに行きます。}
Bala

3

コードでは、参照によって渡される$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

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

)1 2を設定する指標を確認してください)別の例をチェックした方が良いの構文を使用します。あなたは2つのことを行う必要があり、真の改善であるために
マッテオ

2

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

1

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

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

以下は、新しい機能がどのように表示されるかのスクリーンショットです。

HTML5プレースホルダーサポートを示すDrupal Webformコンポーネント設定


0

ほとんどの場合、一部のフォームにプレースホルダー属性のみを追加したいと思うでしょう。

すべての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

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

そのまさに必要なもの。管理が簡単で、カスタムコードを作成する必要はありません。このモジュールは、プレースホルダー属性をサポートしていない従来のブラウザーもサポートします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.