#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
используется ли где-либо еще на странице с верхней части моей головы, нужно было бы сделать это и там. Но это определенно стоит попробовать.