Додавання заповнювача 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"]);
        }
    }
}

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

Відповіді:


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 ()
Маттео

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

Спасибі за вашу допомогу! Повинен був би сам це помітити. Оскільки це не вирішує мою первісну проблему, я не можу нагородити вас правильною відповіддю.
Josua Pedersen

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

Знайдіть прихований елемент форми у HTML-формі веб-форми, названий, form_idщоб отримати правильний ідентифікатор форми для імені form_alterфункції.


мені доведеться зробити модуль для цього?

1
Ви можете зробити модуль або встановити це в template.php теми, змінюючи мій модуль на ім'я машини шаблону.
mariomc

Чи буде цей код працювати і для D6?
Бала

4

Кращий підхід до коду Джосуа Педерсена:

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, цей код працює чудово, я просто скопіював і вставив у свій спеціальний модуль, з drupal 6, але я отримав це попередження про помилку: Неправильний аргумент, наданий для foreach () у C: \ wamp \ www \ r4launch \ sites \ all \ модулі \ розширений \ просунутий.модуль на рядок 16.
Бала

1
Я вирішив це, поставивши всередину умови if. if (isset ($ form_state ['webform'])) {вище код йде сюди ..}
Бала

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) використовувати кращий синтаксис, щоб перевірити різні випадки
Маттео

2

за допомогою гака_форма_альтера спробуйте це

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

Для тих , хто використовує стару або застарілу версію модуля Webform в Drupal , варто відзначити , що підтримка заміщає була додана в 7.x-4.x branch(червень 2013 р ).

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

Ось скріншот того, як з'являється новий функціонал:

Налаштування компонентів веб-форми Drupal, що відображає підтримку заповнювачів HTML5


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

0

Просто використовуйте модуль для цього: Підказки веб-форми

Це саме те, що вам потрібно. Його легко керувати, і немає необхідності в користувацькому коді. Цей модуль також підтримує застарілі веб-переглядачі, які не підтримують атрибут заповнення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.