PHP数组变量中的Javascript变量?

时间:2014-08-14 03:09:27

标签: javascript php ajax

我正在处理发票系统。默认情况下,它加载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>

1 个答案:

答案 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>

我希望这会有所帮助,而且我没有误解这个问题:)