将修改后的 json 从视图发送到控制器
Send a modified json from the view to controller
目前在我看来有一个 editable table,它是从 json 开始创建的,带有 javscript 函数。在此 table 中,可以更改 json 的每个字段。我目前正在寻找一种方法来在单击按钮后传递此用户编辑的 json。问题是我从来没有打过 Ajax 电话...
首先这是我的看法:
{% extends 'default/index.html.twig' %}
{% block content %}
<div class="json-view"> <!-- here is where I print my table -->
</div>
{% endblock %}
{% block javascripts %}
// Here is where I execute all the function below
{% endblock %}
这是我的起点json:
[{"a" : 0, "b" : 7, "c": "/", "d" : 5, "e" : "/", "f" : 5, "g" : "/"},
{"a" : 0.1, "b" : 15, "c": 30, "d" : 10, "e" : 30, "f" : 10, "g" : 30},
{"a" : 0.2, "b" : 15, "c": 30, "d" : 10, "e" : 30, "f" : 10, "g" : 30},
{"a" : 0.3, "b" : 15, "c": 30, "d" : 10, "e" : 30, "f" : 10, "g" : 30},
{"a" : 0.4, "b" : 15, "c": 30, "d" : 10, "e" : 30, "f" : 10, "g" : 30},
{"a" : 0.5, "b" : 15, "c": 30, "d" : 10, "e" : 30, "f" : 10, "g" : 30},
{"a" : 0.6, "b" : 20, "c": 30, "d" : 20, "e" : 30, "f" : 15, "g" : 30},
{"a" : 0.7, "b" : 20, "c": 30, "d" : 20, "e" : 30, "f" : 15, "g" : 30}]
这是我用来创建 editable 的 javascript 函数 table:
function jsonToTable(json, opts={}) {
let headers = Object.keys(json[0]);
let table = document.createElement('table');
let thead = document.createElement('thead');
let tbody = document.createElement('tbody');
let thead_tr = document.createElement('tr');
if (opts.class) table.classList.add(opts.class);
headers.forEach(header => {
let th = document.createElement('th');
th.textContent = header;
thead_tr.appendChild(th);
});
json.forEach(record => {
let tr = document.createElement('tr');
headers.forEach(field => {
let td = document.createElement('td');
td.textContent = record[field];
td.setAttribute('contenteditable', true);
tr.appendChild(td);
});
tbody.append(tr);
});
thead.appendChild(thead_tr);
table.appendChild(thead);
table.appendChild(tbody);
return table;
}
这是我用来从 table 中取回编辑值的函数:
function tableToJson(table, options={}) {
let fields = Array.from(table.querySelectorAll('thead tr th')).map(th => th.textContent);
return Array.from(table.querySelectorAll('tbody tr')).map(tr => {
return Array.from(tr.querySelectorAll('td')).reduce((record, td, index) => {
return Object.assign(record, { [fields[index]] : formatValue(td.textContent) });
}, {});
});
}
我必须 return 将 table 传给控制器,因为我必须在后者中修改它并将其保存在我的数据库中。
有什么方法可以做到吗?
当然可以!
这是 ajax 调用:
$.ajax({
url : "path('ajax_call_for_table')",
type: "POST",
data : table_data,
success: function() { // some code on success }
});
其中table_data是您要修改的数据。
然后,您必须在控制器中创建一个方法来处理此 ajax 调用:
/**
* @Route("/ajax/table-data", name="ajax_call_for_table")
* @Method("POST")
*/
public function setTableData(Request $request)
{
if ($request->isXmlHttpRequest()) { // <- Check that is an ajax call
$em = $this->getDoctrine()->getManager();
$table_data = $request->request->get('table_data'); // <- Get the *data* of ajax
/** Do something with this data */
return new Response();
}
}
请注意,此方法的名称必须与您在 ajax 调用的 url 中使用的名称相同。
对不起我的英语。
目前在我看来有一个 editable table,它是从 json 开始创建的,带有 javscript 函数。在此 table 中,可以更改 json 的每个字段。我目前正在寻找一种方法来在单击按钮后传递此用户编辑的 json。问题是我从来没有打过 Ajax 电话...
首先这是我的看法:
{% extends 'default/index.html.twig' %}
{% block content %}
<div class="json-view"> <!-- here is where I print my table -->
</div>
{% endblock %}
{% block javascripts %}
// Here is where I execute all the function below
{% endblock %}
这是我的起点json:
[{"a" : 0, "b" : 7, "c": "/", "d" : 5, "e" : "/", "f" : 5, "g" : "/"},
{"a" : 0.1, "b" : 15, "c": 30, "d" : 10, "e" : 30, "f" : 10, "g" : 30},
{"a" : 0.2, "b" : 15, "c": 30, "d" : 10, "e" : 30, "f" : 10, "g" : 30},
{"a" : 0.3, "b" : 15, "c": 30, "d" : 10, "e" : 30, "f" : 10, "g" : 30},
{"a" : 0.4, "b" : 15, "c": 30, "d" : 10, "e" : 30, "f" : 10, "g" : 30},
{"a" : 0.5, "b" : 15, "c": 30, "d" : 10, "e" : 30, "f" : 10, "g" : 30},
{"a" : 0.6, "b" : 20, "c": 30, "d" : 20, "e" : 30, "f" : 15, "g" : 30},
{"a" : 0.7, "b" : 20, "c": 30, "d" : 20, "e" : 30, "f" : 15, "g" : 30}]
这是我用来创建 editable 的 javascript 函数 table:
function jsonToTable(json, opts={}) {
let headers = Object.keys(json[0]);
let table = document.createElement('table');
let thead = document.createElement('thead');
let tbody = document.createElement('tbody');
let thead_tr = document.createElement('tr');
if (opts.class) table.classList.add(opts.class);
headers.forEach(header => {
let th = document.createElement('th');
th.textContent = header;
thead_tr.appendChild(th);
});
json.forEach(record => {
let tr = document.createElement('tr');
headers.forEach(field => {
let td = document.createElement('td');
td.textContent = record[field];
td.setAttribute('contenteditable', true);
tr.appendChild(td);
});
tbody.append(tr);
});
thead.appendChild(thead_tr);
table.appendChild(thead);
table.appendChild(tbody);
return table;
}
这是我用来从 table 中取回编辑值的函数:
function tableToJson(table, options={}) {
let fields = Array.from(table.querySelectorAll('thead tr th')).map(th => th.textContent);
return Array.from(table.querySelectorAll('tbody tr')).map(tr => {
return Array.from(tr.querySelectorAll('td')).reduce((record, td, index) => {
return Object.assign(record, { [fields[index]] : formatValue(td.textContent) });
}, {});
});
}
我必须 return 将 table 传给控制器,因为我必须在后者中修改它并将其保存在我的数据库中。
有什么方法可以做到吗?
当然可以! 这是 ajax 调用:
$.ajax({
url : "path('ajax_call_for_table')",
type: "POST",
data : table_data,
success: function() { // some code on success }
});
其中table_data是您要修改的数据。
然后,您必须在控制器中创建一个方法来处理此 ajax 调用:
/**
* @Route("/ajax/table-data", name="ajax_call_for_table")
* @Method("POST")
*/
public function setTableData(Request $request)
{
if ($request->isXmlHttpRequest()) { // <- Check that is an ajax call
$em = $this->getDoctrine()->getManager();
$table_data = $request->request->get('table_data'); // <- Get the *data* of ajax
/** Do something with this data */
return new Response();
}
}
请注意,此方法的名称必须与您在 ajax 调用的 url 中使用的名称相同。
对不起我的英语。