#javascript #php #json
#javascript #php #json
Вопрос:
Я пытаюсь передать php-массив в ajax.
Когда я передаю его в функцию onclick, я получаю неперехваченный SyntaxError: отсутствует ) после списка аргументов.
Когда я изменяю только переменную $ module, ошибка исчезает.
PHP-код :
<?php foreach($this->data AS $module_name => $module):
if ($module_name == "Descriptions") {
continue;
}
?>
<table>
<thead>
<tr>
<th onclick="loadModule('<?=$module_name?>', '<?=htmlspecialchars(json_encode($module))?>', '<?=json_encode($this)?>')" data-module="<?=$module_name?>" colspan="<?php echo count($this->langs) 2; ?>"><?= $module_name; ?>
Модуль загрузки функции JS:
function loadModule(module_name, module, thisObj) {
console.log("load");
if (!$(event.target).hasClass("btnEditDesc")) {
$.ajax({
url: "<?php echo linkGenerator::getIT()->buildURL('administration/webpage/loadSubmodules.php'); ?>",
type: "POST",
dataType: "html",
data: {
'thisObj': thisObj,
'module': module
},
beforeSend: function() {
console.log("before");
},
success: function(data) {
console.log(data);
// $("tbody['" module_name "']").html(data);
$(this).parents("table").find("tbody").fadeToggle(200);
},
error: function(jqXHR, textStatus, errorThrown) {
console.log(jqXHR);
console.log(textStatus);
console.log(errorThrown);
}
});
}
}
дамп var массива модулей:
> array (size=2)
'names' =>
array (size=7)
'name' => string 'Names' (length=5)
'table_name' => string 'dictionary_words_names' (length=22)
'type' => int 2
'cols' => null
'key' => string 'dictionary_word_name_term' (length=25)
'col_prefix' => string 'dictionary_word_name_' (length=21)
'data' =>
array (size=7)
'en' => string 'The query to database has failed. Unknown column 'dictionary_word_name_en' in 'field list'' (length=90)
'cs' =>
array (size=275)
...
'de' =>
array (size=275)
...
'pl' =>
array (size=275)
...
'it' => string 'The query to database has failed. Unknown column 'dictionary_word_name_it' in 'field list'' (length=90)
'fr' => string 'The query to database has failed. Unknown column 'dictionary_word_name_fr' in 'field list'' (length=90)
'hu' => string 'The query to database has failed. Unknown column 'dictionary_word_name_hu' in 'field list'' (length=90)
'descriptions' =>
array (size=7)
'name' => string 'Descriptions' (length=12)
'table_name' => string 'dictionary_words_descriptions' (length=29)
'type' => int 2
'cols' => null
'key' => string 'dictionary_word_description_term' (length=32)
'col_prefix' => string 'dictionary_word_description_' (length=28)
'data' =>
array (size=7)
'en' => string 'The query to database has failed. Unknown column 'dictionary_word_description_en' in 'field list'' (length=97)
'cs' =>
array (size=275)
...
'de' =>
array (size=275)
...
'pl' =>
array (size=275)
...
'it' => string 'The query to database has failed. Unknown column 'dictionary_word_description_it' in 'field list'' (length=97)
'fr' => string 'The query to database has failed. Unknown column 'dictionary_word_description_fr' in 'field list'' (length=97)
'hu' => string 'The query to database has failed. Unknown column 'dictionary_word_description_hu' in 'field list'' (length=97)
Я не силен в стилизации этих вопросов, извините за это.
Комментарии:
1. Зачем вы это делаете?
htmlspecialchars(json_encode($module))
? Это изменит строку JSON и, возможно, сделает ее недопустимым JSON. Если модулю это нужно, вы должныjson_encode(htmlspecialchars($module))
.2. Если ошибка возникает на стороне клиента, то первое, что вам нужно сделать, это изучить код на стороне клиента, а не код на стороне сервера, который генерирует код на стороне клиента. Найдите, что не так в результате вашего кода, это поможет вам определить, что вам, возможно, потребуется изменить.
3. $module содержит «, ‘ и другие html-теги, и если я не использую htmlspecialchars и json_encode, массив выводится на экран, потому что он завершает onclick и th
4.В чем смысл
<?=htmlspecialchars(json_encode($module))?>
и<?=json_encode($this)?>
, когда то, что вы$module
содержите здесь, уже является частью$this
? (Вы перебираете$this->data
здесь, чтобы заполнить$module
в первую очередь.) Зачем вам нужна эта повторная информация?5. Синтаксический вопрос на уровне JavaScript: Вы знаете, в чем разница между
foo(["bar", "baz"])
иfoo('["bar", "baz"]')
…?
Ответ №1:
Одним из подходов может быть передача строки в кодировке base 64 в html вместо использования htmlspecialchars. ПРИМЕЧАНИЕ: вам также потребуется кодировать 3-й параметр на базе 64.
<th onclick="loadModule('<?=$module_name?>', '<?=base64_encode(json_encode($module))?>', '<?=base64_encode(json_encode($this))?>')" data-module="<?=$module_name?>" colspan="<?php echo count($this->langs) 2; ?>"><?= $module_name; ?>
И затем в javascript вы можете использовать atob для декодирования базового 64 перед разбором json.
module = JSON.parse(atob(module));
thisObj = JSON.parse(atob(thisObj));