Добавление HTML5-заполнителя для всех форм drupal

22

Я пытаюсь добавить атрибут placeholder во все текстовые поля на моем сайте, но мне не повезло.

Я создал модуль, который переопределяет 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"]);
        }
    }
}

Я должен сказать вам, что я также использую модуль веб-формы.

Хосуа Педерсен
источник

Ответы:

14

Поскольку я использую модуль веб-формы, я могу просто создать тему для глобального шаблона веб-формы (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 ()
Matteo
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добавив атрибут 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');
}

Найдите скрытый элемент формы в HTML- названии веб-формы, form_idчтобы получить правильный идентификатор формы для имени 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']);
   }
 }
}
Sohail
источник
+1, этот код работает отлично, я просто скопировал и вставил в свой пользовательский модуль с drupal 6, но я получил это предупреждение об ошибке: неверный аргумент передан foreach () в C: \ wamp \ www \ r4launch \ sites \ all \ modules \ advanced \ advanced.module в строке 16.
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: этот код также добавит текст заполнителя в поля электронной почты веб-формы.

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"]);
    } 
}
Стивен Б
источник
Чтобы быть настоящим улучшением, вы должны сделать 2 вещи: 1) проверить индекс, который будет установлен 2) использовать лучший синтаксис для проверки различных случаев
Matteo
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 , стоит отметить, что поддержка заполнителей была добавлена в 7.x-4.x branch(июнь 2013 г.).

Таким образом, функциональность заполнителя HTML5 теперь является встроенной встроенной опцией наряду с пользовательскими классами CSS для компонентов и некоторыми другими давно запрашиваемыми функциями.

Вот скриншот того, как появляется новая функциональность:

Настройки компонента Drupal Webform, показывающие поддержку заполнителя HTML5

rjb
источник
0

Я полагаю, что в большинстве случаев можно добавить атрибуты-заполнители только для некоторых форм.

Если вы хотите добавить заполнитель для всех веб-форм, вы можете сделать это следующим образом:

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;
      } 
    }
  }
}
rosell.dk
источник
0

Просто используйте для этого модуль: Webform Hints

Это именно то, что вам нужно. Его легко управлять, и нет необходимости настраивать код. Этот модуль также поддерживает устаревшие браузеры, которые не поддерживают атрибут placeholder.

ANDiTKO
источник