Зміна дозволених тегів HTML: @tags для поля введення тексту довідки


11

Я хочу відобразити просту таблицю під полем форми як частину довідкового тексту для цього поля (точне поле файлу). Я повністю розумовий чи дійсно не існує простого способу зміни дозволених тегів HTML для цієї області тексту? На даний момент я вивів:

Instructions to present to the user below this field on the editing form. Allowed HTML tags: a b big code del em i ins pre q small span strong sub sup tt ol ul li p br img

Якщо немає простого способу, який наступний найпростіший спосіб зробити це?

ОНОВЛЕННЯ:

Клайв придумав чудовий спосіб зробити це нижче за допомогою спеціального модуля. Ви також можете додати до цього за допомогою ctools, щоб зробити довідковий текст розбірним наступним чином:

// Implement hook_field_widget_form_alter()
function MYMODULE_field_widget_form_alter(&$element, &$form_state, &$context) {
  // If some condition is matched based on the element provided...
  if (isset($element[0]) && $element[0]['#field_name'] == 'field_test') {
    // Alter the description using your more permissive set of tags
    $reworked = filter_xss($context['instance']['description'], _MYMODULE_field_filter_xss_allowed_tags());
    $element[0]['#description'] = theme('ctools_collapsible', array('handle' => 'Help text', 'content' => $reworked, 'collapsed' => TRUE));
  }
}

// Provide a more permissive set of tags to be used with filter_xss()
function _MYMODULE_field_filter_xss_allowed_tags() {
  // Merge the new set of allowed tags with the less permissive defaults
  $new_tags = array('table', 'thead', 'tbody', 'tfoot', 'tr', 'th', 'td');
  return array_merge(_field_filter_xss_allowed_tags(), $new_tags);
}

Ви говорите про текстове поле (назва питання) або поле файлу (опис питання).
googletorp

@ 7wonders Що ви додали до питання, було б добре як відповідь.
kiamlaluno

Відповіді:


7

Це непростий спосіб зробити це насправді, список дозволених тегів важко закодований у _field_filter_xss_allowed_tags()функцію .

Це в свою чергу викликається field_filter_xss()не тоді, коли дані зберігаються в базі даних, а, коли вони відображаються в field_default_form().

На щастя, є спосіб, але для цього знадобиться невеликий спеціальний модуль. Ви в основному хочете реалізувати гачок форми для форми віджета поля та встановити опис елемента для використання filter_xss()з більш дозволеним набором тегів.

Щось у цьому напрямку:

// Implement hook_field_widget_form_alter()
function MYMODULE_field_widget_form_alter(&$element, &$form_state, &$context) {
  // If some condition is matched based on the element provided...
  if (isset($element[0]) && $element[0]['#field_name'] == 'field_test') {
    // Alter the description using your more permissive set of tags
    $element[0]['#description'] = filter_xss($context['instance']['description'], _MYMODULE_field_filter_xss_allowed_tags());
  }
}

// Provide a more permissive set of tags to be used with filter_xss()
function _MYMODULE_field_filter_xss_allowed_tags() {
  // Merge the new set of allowed tags with the less permissive defaults
  $new_tags = array('table', 'thead', 'tbody', 'tfoot', 'tr', 'th', 'td');
  return array_merge(_field_filter_xss_allowed_tags(), $new_tags);
}

Це ґрунтується на припущенні, що ви хочете дозволити нові теги для елементу, який називається field_test, очевидно, якщо ви хочете зробити те ж саме для інших полів, вам потрібно буде змінити його, щоб відповідати іншій умові. Я раджу використовувати відмінну dpm()функцію, що міститься в Devel moduleоб'єкті для огляду об'єкта у вашій формі зміни форми.

Я щойно тестував вище, і це працює (тепер у мене є таблиця, де зазвичай описується моє поле файлу), це трохи схоже на злом, хоча технічно дотримується правил, але, сподіваємось, він потрапить у вас шлях.


Це спрацювало чудово. Хтось неодмінно повинен створити модуль, щоб зробити це правильно (як це не може бути основною особливістю, я не знаю!).
дивів

@ 7wonders Так, напевно, здається, що можливість пропущена, але, мабуть, з точки зору розробників, це дійсно означало б, що польовий модуль підтримує власний текстовий формат, і це, можливо, вважатиметься надмірним. Користувацький варіант змінити це було б непогано. Я міг би перетворити це на корисніший модуль і опублікувати його на drupal.org, фактично буде інформувати вас :)
Clive

Здається, гарна ідея. Дайте мені знати, коли ви підняли пісочницю, і я з радістю випробую це для вас.
дивів

2

Якщо ви використовуєте D6, ви можете перейти до / admin / settings / filter. Там вам потрібно натиснути параметр «налаштування» «Фільтрований HTML». Потім натисніть на вкладку налаштування. вам буде представлено текстове поле з написом "Дозволені теги HTML". Введіть html-теги, які вам потрібно там використовувати.

У випадку з D7 перейдіть до адміністратора / config / content / формати / filtered_html. У розділі Налаштування фільтра натисніть на вкладку "Обмежити дозволені теги HTML". Введіть HTML-теги, які ви хочете використовувати, у текстове поле.


Я використовую D7 і повірте, це було першим, що я зробив, і був шокований, коли це не працювало! (так, я також очищав кеш кілька разів). Це дійсно неприємно, і, мабуть, це стосується всіх текстових полів довідки для мого сайту. Навіть якщо я додати дозволений фільтр html до простого тексту та додати таблицю tr td, він не працює. Дуже дратує.
днів

Я щойно додав свіжу установку d7 і можу підтвердити її поведінку за замовчуванням. Це не дозволить змінити теги в розділі довідки = божевілля! Який гачок може це перекрити?
днів

1
Спробуйте встановити "Повний html" як формат введення за замовчуванням, а потім поставте прапорець.
аерозеппелін

Я можу підтвердити, що мені вдалося змінити дозволені теги для відфільтрованого HTML за допомогою Drupal 7.10, і фільтр працював так само, як відображення "дозволених тегів". Тож справді відповідь аерозеппеліна правильна. :-)
paul-m

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