Вы здесь

Как добавить в форме к тегу input атрибут placeholder?

1

В общем форма редактирования профиля пользователя (id: user_profile_form), хочу ко всем input только в этой форме добавить тег placeholder и спрятать label.
Всё безрезультатно.
Пробовал hook_form_alter(), theme_form_element(), в последней $variables['element']['#children'] приходит уже в виде html кода.
В theme_textfield() рендер и происходит, не могу никак понять какой hook заюзать, чтобы изменить $variables['element']['#attributes'] прежде чем оно попадет в эту функцию.

Добавлено
В общем я не знаю как так получилось, но в форме редактирования профиля пользователя пришлось сделать так:

<?php
$field_name = 'field_lastname';
$lang  = $form[$field_name]]['#language'];
$title = $form[$field_name][$lang]['#title'];
$form[$field_name][$lang][0]['value']['#title_display'] = 'invisible';
$form[$field_name][$lang][0]['value']['#attributes']['placeholder'] = array($title);
Версия Drupal: 
7.x
Категория: 
Form API
Вопрос задан 08.04.2015 - 00:18

Протестировал не свежем друпале, hook_form_alter() справляется с задачей отлично.

function THEME_form_alter(&$form, &$form_state, $form_id) {
  if($form_id = 'user_login_block') {
      $form['name']['#title_display'] = 'invisible';
      $form['name']['#attributes'] = array('placeholder' => t('Login'));
  }
}

Значит где-то конфликт в другом месте.

Комментарий оставлен 08.04.2015 - 01:36

Ответы

2

Есть модуль Form placeholder. Модуль умеет прятать label и вставлять его в placeholder. Можно настраивать в каких формах использовать.

Программное решение:
hook_form_FORM_ID_alter() хотя можно и обычным hook_form_alter(). Не суть.
ID формы будет user_profile_form, а не тот, что Вы указали в коде в комментарии (он для входа на сайт).
Не забывайте! Если Вы используете тему для админки Seven (стандратная), то код нужно писать в ней и для неё! Или в отдельном модуле.
Выйдет что-то типа:

function THEME_form_user_profile_form_alter(&$form, &$form_state) {
  $form['name']['#title_display'] = 'invisible';
  $form['name']['#attributes']['placeholder'] = $form['name']['#title'];
  // Или свой плейсхолдер
  //$form['name']['#attributes']['placeholder'] = t('Login');
  $form['pass']['#title_display'] = 'invisible';
  $form['pass']['#attributes']['placeholder'] = $form['pass']['#title'];
}
Ответ дан 08.04.2015 - 01:49
Аватар пользователя SAM
SAM
212

Спасибо за ответ. Тестировал я form_placeholder, он через js атрибуты выставляет, так что мне этот вариант не подошел.

Комментарий оставлен 08.04.2015 - 02:30
1

Вот пример с формы контакта. Здесь нет проверочного условия, а просто идет скрытие заголовков и описаний, а затем вывод полей с placeholder
function framework_form_contact_site_form_alter( &$form, &$form_state, $form_id ){
unset($form['name']['#title']);
unset($form['name']['#description']);
unset($form['mail']['#title']);
unset($form['mail']['#description']);
unset($form['subject']['#title']);
unset($form['subject']['#description']);
unset($form['message']['#title']);
unset($form['message']['#description']);

   $form['name']['#attributes']['placeholder'] = t( 'Ваше имя' );
    $form['mail']['#attributes']['placeholder'] = t( 'Ваш e-mail' );
    $form['subject']['#attributes']['placeholder'] = t( 'Тема сообщения' );
     $form['message']['#attributes']['placeholder'] = t( 'Ваше сообщение' );

}

Ответ дан 08.04.2015 - 13:47

Никогда не делайте, так - t( 'Ваше имя' )
Если там русский, то без функции перевода.

Комментарий оставлен 08.04.2015 - 14:35

Более правильно будет писать английским и транслитерировать через модуль перевода?

Комментарий оставлен 08.04.2015 - 15:12

Более правильно будет писать английским и транслитерировать через модуль перевода?

Да, но не транслитерировать, а перевести. Или просто по-русски, но без t().

Комментарий оставлен 08.04.2015 - 16:17
0

Все написанное верно. Единственное что не учитывается в ответах, то что поля $form['name'] и $form['pass'] и.т.д. в форму user_login_block не являются полями добавленными модулем Field.
В связи с чем все работает нормально. Если речь о кастомных полях профиля пользователя, то делай следующим образом.

$field_name = 'field_lastname';
$lang = $form[$field_name]['#language'];
$title = $form[$field_name][$lang]['#title'];
foreach(element_children($form[$field_name][$lang]) as $key){
    $form[$field_name][$lang][$key]['value']['#title_display'] = 'invisible';
    $form[$field_name][$lang][$key]['value']['#attributes']['placeholder'] = $title;
}

Это добавит плейсхолдер как к стандартному полю с одним значением, так и к полю с множественным значением.
И еще, если речь не только о форме редактирования профиля. но и создания профиля(т.е. регистрации), то надо так же учесть форму с id user_register_form

А для стандартных полей регистрации/профиля пользователя нужно прописывать аттрибуты к элементу $form['account']['name'], $form['account']['mail'] и.т.д. (dsm в помощь).

Ответ дан 14.04.2015 - 01:10