通常のフォームを変換してモジュールでプレースホルダーを追加する方法はありますか、それともフォームテンプレートまたはjQueryを使用して行う必要がありますか?
これはHTML5プレースホルダーです。任意の要素に属性として追加するだけで、HTML5対応のブラウザーがそれに応じて反応します。
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
(この例ではフィールドのタイトルに基づいて)フォーム内のすべてのテキストフィールドにプレースホルダーを自動的に追加する場合は、このような短い再帰関数が便利です。
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]);
}
}
次に、フォームで変更関数を呼び出すだけです
MYMODULE_auto_placeholders($form);
このメソッドは、#process
関数に追加されたもの(イメージフィールドのaltおよびtitleテキストフィールドなど)を除いて、フォーム上のほとんどすべてのテキストフィールドで機能します。
次のコードのように、フォームフィールド要素の#attributes配列にプレースホルダーを追加するだけです。
$form['my_textfield'] = array(
'#type' => 'textfield',
'#attributes' => array(
'placeholder' => t('My placeholder text'),
),
);
私はクライヴの答えを試しました:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
しかし、驚いたことに、テキストフィールド自体ではなく、テキストフィールドのラッパーにプレースホルダーを入れました。それから私は次のようなバリエーションを試しました、それはうまくいきました!
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');
}
}
これにつまずいて、Cliveの答えがプレースホルダーを自動的に追加するのはいいように思えた。
drupal 8でそれを正しくするためにいくつかのマイナーな変更が必要なので、これはほとんど同じ答えですが、drupal 8のテーマに適しています。
/**
* 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]);
}
}
フォームインスタンスを直接ターゲットにする場合は、hook_form_FORM_ID_alterを使用します。条件文を使用するよりも整然としている場合があります。検索フォームブロックインスタンスのみを対象とする私のソリューション。
function eyecare_form_search_block_form_alter(&$form, $form_state) {
$form['keys']['#attributes']['placeholder'] = t('Search');
}