Selectize.js неправильно считывает HTML-объекты

#php #html-entities #htmlspecialchars #selectize.js

#php #html-объекты #htmlspecialchars #selectize.js

Вопрос:

Я работаю с Selectize.js в настоящее время и я застрял на проблеме, связанной с неправильным отображением объектов HTML в полях выбора и, следовательно, сбоем проверок после отправки. Мы используем PHP в бэкэнде и запускаем все опции htmlspecialchars($option); Selectize . Затем мы экспортируем массив PHP в массив JSON, готовясь к добавлению его в сценарий / поле выбора.

 //Array of options
$options = getOptions();
$optionsArray = array();
foreach($options as $item) {
    $optionsArray[] = array('text' => htmlspecialchars($item), 'value' => htmlspecialchars($item));
}

//Create html script to run selectize initialization
$htmlcode = "<script>";
...
$htmlcode .= "var optionList = " . json_encode($"optionsArray") . ";";
$htmlcode .= "$('#selector').selectize({ options: optionList });";
...
$htmlcode .= "</script>";
  

Смысл здесь в том, чтобы защитить от вредоносных записей с помощью кодирования. Обычно это не проблема, поскольку браузеры обнаруживают объекты и преобразуют их автоматически (т. Е. обнаружит amp;amp; и отобразит как amp; . Однако этого НЕ происходит внутри selectize. Как вы можете видеть на изображении ниже, вывод параметра с амперсандом корректно отображается на странице, но он не отображается точно в поле выбора.

Пример: Выберите пример

Затем проблема становится больше, поскольку мы сравниваем выбранный элемент с базой данных после отправки, чтобы убедиться, что выбранная запись действительно существует. Если запись testOptionamp;stuff действительно существует, отправленная форма проверит testOptionamp;amp;stuff ее и, очевидно, не пройдет проверку.

 //For simplicity, checking against static option
var $selectedOption = $_POST["options"];
if ($selectedOption == "testOptionamp;stuff") {
    //Do success
} else {
    //Do failure
}
  

Как я могу решить эту проблему и сделать так, чтобы поле выбора сохраняло и отображало правильную запись (т.Е. amp; )?

Спасибо!

Комментарии:

1. как насчет html_entity_decode ? противоположность htmlentities перед проверкой if($selectedOption == ‘testOptionamp;stuff’)

2. Хм. Единственное, что может вызвать проблему здесь, это то, что проверка имени сильно функционализирована, и добавление декодирования для этой цели может нарушить другие области (несколько спагетти-код, с которым нужно иметь дело).

3. как насчет того, чтобы делать это при установке значения, а не при выполнении сравнения? пример: $('#selector').selectize({ options: DecodedThisListList(optionList) });";

4. @basher, это хороший момент; я должен попробовать это. Не уверен, $optionsArray используется ли где-либо еще на странице с верхней части моей головы, нужно было бы сделать это и там. Но это определенно стоит попробовать.