我正在处理发票系统。默认情况下,它加载1行输入项。如果管理员想要添加其他项,则可以单击执行JavaScript的链接以添加其他行。这对我很有用。
我使用POST
方法将表单提交到同一页面。如果用户使用JavaScript添加了其他行,则会在提交页面时加载前一行的行。为此,我使用了PHP $table_rowcount = count( $_POST["item_details"] );
。仅供参考,{$table_rowcount}
不是语法错误,因为我使用的是模板引擎。
到目前为止,一切都很有效。管理员可以向输入数据添加其他行,当页面提交给自身时,它会加载这些行数。完善。 然而,这就是问题所在。
我需要做的是使用粘性表单的方法,因此如果出现错误,页面将重新加载(如目前所做),并为每个输入value=""
分配变量,以便管理员不必重新 - 输入所有细节。
问题是我不知道如何使用JavaScript和PHP的组合来做到这一点。我需要了解如何使用JavaScript中的for()
循环获取行的当前数量,然后在PHP变量中使用该数字,如下面HTML的tbody中所示,默认第1行。
基本上如果它是第3行并且for()
循环将它显示为var i = 2
(因为数组从0开始),我如何使用JavaScript来帮助我调用PHP变量{{1 }}
我假设我需要使用AJAX吗?但是我不知道AJAX。我希望有人可以帮助我这样做,以便我自己和其他人可以了解这是如何做得好的。
问题只需
如何使用JavaScript变量在HTML文件中选择PHP数组?
JavaScript的:
{$item.2.details}
HTML:
<script type="text/javascript">
window.onload = function loadRows() {
for( i = 1; i < {$table_rowcount}; i++ ) {
// Set table id.
var table = document.getElementById("invoice_items");
// Count rows.
var rowCount = table.rows.length;
// Row to insert into table.
var row = table.insertRow(rowCount);
// Cells to insert into row.
var cell1 = row.insertCell(0);
var cell2 = row.insertCell(1);
var cell3 = row.insertCell(2);
// Current Row.
var rowNumber = rowCount + 1;
// Data in cells.
cell1.innerHTML = "<textarea name=\"item_details[]\"></textarea>";
cell2.innerHTML = "<input type=\"text\" name=\"item_quantity[]\" value=\"\" />";
cell3.innerHTML = "<input type=\"text\" name=\"item_price[]\" value=\"\" />";
}
}
</script>
答案 0 :(得分:0)
只是为了确保我理解正确:您有用户输入新行,如果有错误,他们新输入的行以及他们输入的信息都会丢失。基于此:
我的第一直觉是通过AJAX发布表单,但是如果你想要PHP路由,我建议研究基于会话的flash messages。您可以使用会话数据发回已输入的值以及其他错误消息。我以前将flash数据设置为一个具有属性名称的对象,例如&#34; errors&#34;。 &#34;错误&#34;将是一组错误消息,但您也可以设置一个名为&#34; additionalItem&#34;的属性。并由用户添加新创建的项目。然后将这些添加到PHP中的行迭代中,避免使用JavaScript构建行的必要性。
$flashData = Array("additionalItem" => Array());
for ($_PARAMS["addedRows"] as $row) {
$flashData["additionalItem"] []= Array(
"rowDetails" => $row['details'],
"rowQuantity" => $row['quantity'],
"rowPrice" => $row['price']
)
}
我还建议尽可能使用客户端验证。但是,我也理解可能出现其他非客户端错误。
如果你必须在JavaScript中这样做,那么我认为你最好的选择是公开你要迭代的PHP数组并将其存储为JavaScript变量(所以无论哪种方式你都可能需要设置flash数据)。
<script type="text/javascript">
// I renamed item to items as I am assuming you have an array.
// This would preferably be an array of items from the server.
var items = {$items},
table = document.getElementById("invoice_items");
window.onload = function loadRows() {
for (i = 1; i < items.length; i++) {
var rowCount = table.rows.length,
row = table.insertRow(rowCount),
cell1 = row.insertCell(0),
cell2 = row.insertCell(1),
cell3 = row.insertCell(2),
rowNumber = rowCount + 1;
cell1.innerHTML = "<textarea name='item_details[]'>" +
items[i].details + "</textarea>";
cell2.innerHTML = "<input type='text' name='item_quantity[]'
value='' />";
cell3.innerHTML = "<input type='text' name='item_price[]'
value='' />";
}
}
</script>
我希望这会有所帮助,而且我没有误解这个问题:)