Zmiana dozwolonych tagów HTML: @tags dla pola wprowadzania tekstu pomocy


11

Chcę wyświetlić prostą tabelę pod polem formularza jako część tekstu pomocy dla tego pola (dokładnie pola pliku). Czy jestem całkowicie mentalny, czy naprawdę nie ma łatwego sposobu na zmianę dozwolonych tagów HTML dla tego obszaru tekstowego? W tej chwili wyświetlałem:

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

Jeśli nie ma łatwego sposobu, jaki jest następny najłatwiejszy sposób?

AKTUALIZACJA:

Clive wymyślił świetny sposób na zrobienie tego poniżej z niestandardowym modułem. Możesz do tego dodać również ctools, aby tekst pomocy był zwijany w następujący sposób:

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

Czy mówisz o polu tekstowym (tytuł pytania) lub polu pliku (opis pytania).
googletorp

@ 7wonders To, co dodałeś do pytania, byłoby dobrą odpowiedzią.
kiamlaluno

Odpowiedzi:


7

Nie ma łatwego sposobu, aby to zrobić, lista dozwolonych tagów jest na stałe zakodowana w _field_filter_xss_allowed_tags()funkcji .

Jest to z kolei wywoływane przez field_filter_xss(), nie wtedy, gdy dane są zapisywane w bazie danych, ale kiedy są wyświetlane w field_default_form().

Na szczęście istnieje sposób, ale zajmie to mały niestandardowy moduł. Zasadniczo chcesz zaimplementować hak zmiany formy dla formularza widżetu pola i ustawić opis elementu do użycia filter_xss()z bardziej liberalnym zestawem tagów.

Coś w tym stylu:

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

Jest to oparte na założeniu, że chcesz zezwolić tylko na nowe tagi dla elementu o nazwie field_test, oczywiście jeśli chcesz zrobić to samo dla innych pól, musisz to zmienić, aby dopasować inny warunek. Radzę użyć doskonałej dpm()funkcji zawartej w Devel modulecelu sprawdzenia obiektu w funkcji zmiany formy.

Właśnie przetestowałem powyższe i działa (mam teraz tabelę, w której normalnie byłby mój opis pola pliku), wygląda to trochę jak hack, chociaż technicznie jest zgodny z zasadami, ale mam nadzieję, że dostaniesz się na droga.


Działa idealnie. Ktoś zdecydowanie powinien stworzyć moduł, aby zrobić to poprawnie (jak to nie może być podstawową funkcją, nie wiem!).
7wonders

@ 7wonders Tak, zdecydowanie wydaje się, że stracono okazję, ale z punktu widzenia programistów zgaduję, że tak naprawdę oznaczałoby to, że moduł pola zachowałby swój własny format tekstowy, co można uznać za przesadę. Przydałaby się niestandardowa opcja zmiany. Mogę przekształcić to w bardziej użyteczny moduł i opublikować go na drupal.org, będę cię na bieżąco informować :)
Clive

Brzmi jak dobry pomysł. Daj mi znać, kiedy dostaniesz piaskownicę, a ja chętnie ją przetestuję.
7 odpowiedzi

2

Jeśli używasz D6, możesz przejść do / admin / settings / filter. Tam należy kliknąć opcję „konfiguruj” w „Filtrowanym HTML”. Następnie kliknij kartę konfiguracji. zostanie wyświetlone pole tekstowe oznaczone „Dozwolone tagi HTML”. Wprowadź tagi html, których musisz tam użyć.

W przypadku D7 przejdź do admin / config / content / format / filter_html. W obszarze Ustawienia filtru kliknij kartę „Ogranicz dozwolone tagi HTML”. Wpisz znaczniki HTML, których chcesz użyć, w polu tekstowym.


Używam D7 i zaufaj mi, to była pierwsza rzecz, którą zrobiłem i byłem zszokowany, gdy to nie zadziałało! (tak, wyczyściłem pamięć podręczną kilka razy). To naprawdę zaskakujące i wydaje się, że tak jest we wszystkich polach tekstowych pomocy dla mojej witryny. Nawet jeśli dodam dozwolony filtr HTML do zwykłego tekstu i dodam tabelę t td, to nie działa. Bardzo irytujące.
7 odpowiedzi

Właśnie dodałem świeżą instalację d7 i mogę potwierdzić jej domyślne zachowanie. Nie pozwoli na zmianę tagów w sekcji pomocy = szaleństwo! Jaki hak może to zmienić?
7wonders

1
Spróbuj ustawić „Pełny HTML” jako domyślny format wejściowy, a następnie sprawdź.
aerozeppelin

Mogę potwierdzić, że byłem w stanie zmienić dozwolone tagi dla Filtrowanego HTML za pomocą Drupala 7.10, a filtr działał tak samo, jak wyświetlanie „dozwolonych tagów”. Tak naprawdę odpowiedź aerozeppelina jest poprawna. :-)
paul-m

1
Ale jeśli przeczytasz pytanie Pawła, dotyczy to dozwolonych znaczników w tekście pomocy dla pola, więc odpowiedź jest nieprawidłowa.
7 odpowiedzi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.