Метка с двойным экранированием в SelectOneMenu в PrimeFaces 12

В SelectOneMenu PrimeFaces я использую параметры (часто заполнители), такие как <please select>, загружаемые из контроллера через f: selectItems и автоматически экранируемые компонентом SelectOneMenu. После обновления PrimeFaces 11 до версии 12 компонент начал дважды экранировать символы <, >, & в своей метке, в то время как список параметров по-прежнему отображается должным образом. (Когда я нажимаю <please select>, метка показывает &lt;please select&gt;.)

Я пробовал все комбинации этих настроек:

  • представление: f:selectItems.itemLabelEscaped = "true"/"false"
  • контроллер: SelectItem.escape = "true"/"false"
  • контроллер: SelectItem.label экранируется/не экранируется вручную

Атрибут itemLabelEscaped не действует. Другие комбинации работают следующим образом:

Нет. SelectItem.escape SelectItem.метка Вариант в раскрывающемся списке Показана этикетка в PF 11 Показана этикетка в PF 12 1 ЛОЖЬ < <i>italics</i> < курсив курсив курсив 2 ЛОЖЬ &lt; &lt;i&gt;italics&lt;/i&gt; < <i>курсив</i> < курсив < <i>курсив</i> 3 истинный < <i>italics</i> < <i>курсив</i> < <i>курсив</i> &lt; &lt;i&gt;курсив&lt;/i&gt; 4 истинный &lt; &lt;i&gt;italics&lt;/i&gt; &lt; &lt;i&gt;курсив&lt;/i&gt; &lt; &lt;i&gt;курсив&lt;/i&gt; (ещё больше убежало)

В PrimeFaces 11 я использовал настройку №3, а метка была такой же, как и опция в выпадающем списке. После обновления метка ломается и кажется, что единственная рабочая настройка №2, но я не хочу обновлять все вхождения selectItems без необходимости.

Поскольку я не нашел никакой соответствующей информации в примечаниях к выпуску PrimeFaces, я бы посчитал это ошибкой, но мне интересно, что никто еще не сообщил об этом, поэтому я не уверен: это ошибка или функция? Этот старый вопрос кажется актуальным, но как он сработал в PrimeFaces 11?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это известная и исправленная проблема . До выхода PrimeFaces 13 вы можете MonkeyPatch обходной путь.

Отлично, уже несколько дней ищу отчет. Однако MonkeyPatch проблематичен. Это действительно исправляет обработку <>&, о которой я просил, но в то же время — независимо от любых настроек — удаляет все символы после первой двойной кавычки, так что some "quoted" value становится some. По этой причине я боюсь, что патч неприменим в моем случае, но, по крайней мере, я знаю, что это ошибка.

Josef Plch 05.01.2023 17:18

@JosefPlch он работал неправильно в PF11, его также нужно экранировать и обрабатывать HTML. если вы читаете здесь, у нас даже есть интеграционные тесты для этого, потому что он должен уметь отображать HTML: github.com/primefaces/primefaces/issues/…

Melloware 05.01.2023 20:05

@JasperdeVries Хорошо, я сообщил о проблеме и предложил решение на GitHub. После исправления настройки №2 и №3, перечисленные выше, ведут себя одинаково.

Josef Plch 06.01.2023 12:34

Хорошо, это должно быть исправлено навсегда в PF 13.0, и этот MonkeyPatch должен решить все ваши текущие проблемы.

if (PrimeFaces.widget.SelectOneMenu) {
    PrimeFaces.widget.SelectOneMenu.prototype.renderSelectItem = function(item, isGrouped) {
        var content = "";
        var $item = $(item);
        var label;
        var title = $item.data("title");
        var escape = $item.data("escape");
        var cssClass;

        if (item.tagName === "OPTGROUP") {
            label = $item.attr("label");
            if (escape) {
                label = $("<div>").text(label).html();
            }
            cssClass = "ui-selectonemenu-item-group ui-corner-all";
        } else { //OPTION
            if (escape) {
                label = $item.html();
                if ($item.text() === "&nbsp;") {
                    label = $item.text();
                }
            } else {
                label = $item.text();
            }
            
            cssClass = "ui-selectonemenu-item ui-selectonemenu-list-item ui-corner-all";
            if (isGrouped) {
                cssClass += " ui-selectonemenu-item-group-children";
            }
        }

        var dataLabel = escape ? label.replaceAll('"', '&quot;') : this.escapeHTMLIfNecessary(label);

        if ($item.data("noselection-option")) {
            cssClass += " ui-noselection-option";
        }

        content += '<li class = "' + cssClass + '" tabindex = "-1" role = "option"';
        if (title) {
            content += ' title = "' + title + '"';
        }
        if ($item.is(':disabled')) {
            content += ' disabled';
        }
        content += ' data-label = "' + dataLabel + '"';
        content += '>';
        content += label;
        content += '</li>';

        if (item.tagName === "OPTGROUP") {
            content += this.renderSelectItems($item, true);
        }

        return content;
    };

    PrimeFaces.widget.SelectOneMenu.prototype.escapeHTMLIfNecessary = function(value) {
            return String(value).replace(/[<>"'`=/]/g, function(s) {
                return PrimeFaces.entityMap[s];
            });
     };
}

Это заставляет метку в PrimeFaces 12 работать так же, как и в версии 11. Вопрос: не лучше ли оставить метку без изменений и сохранить < <i>italics</i> и для № 2, и для № 3? Это поведение моего исправления. Решение, которое лучше, остается за каждым разработчиком.

Josef Plch 09.01.2023 10:10

Я ответил в билете PF. Похоже, у вас отсутствует один из ваших вариантов использования.

Melloware 09.01.2023 14:51

Другие вопросы по теме