允许编辑Text动态php表

时间:2016-05-03 19:35:56

标签: javascript php jquery html html-table

我有一个通过PHP生成的html表和数据库中的数据,我想要做的是在每行的最后一个单元格中有一个按钮,表示编辑,当你单击该按钮时,其他单元格中的文本变为文本框或其他类型的输入字段,以便您可以编辑它们然后按提交,这将发送该表单以在数据库中更新。我现在生成表的代码是:

<table style="width:100%; " class = "table table-striped table-bordered table-hover">
  <tr>
     <th>Name</th>
     <th>Status</th>
     <th>Description</th>
     <?php 
        if($_SESSION['editGroup'] != 0){
           echo "<th>Edit</th>";
        }
     ?>
  </tr>
 <?php
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $checkQuery = "SELECT userGiven, userStatus, userDesc FROM user_Status WHERE organization = 'myOrg' ORDER BY userGiven ASC";
    $prepared = $dbh->prepare($checkQuery);
    $prepared->execute();
    $data = $prepared->fetchAll(PDO::FETCH_ASSOC);
    foreach($data as $row){
      echo "<tr>";
      if($_SESSION['editGroup'] != 0){
      echo "<td width='20%'>" . $row['userGiven'] . "</td><td width='10%'>" . $row['userStatus'] . "</td><td width='70%'>" . $row['userDesc'] . "</td><td width='10%'><button type='button' class='btn btn-info'>Edit</button></td>";
      }else{
         echo "<td width='20%'>" . $row['userGiven'] . "</td><td width='15%'>" . $row['userStatus'] . "</td><td width='75%'>" . $row['userDesc'] . "</td>";
      }
      echo "</tr>";             
    }
 ?>
</table>

我要做的是将userStatus的单元格更改为一个下拉字段,其中当前值为起始值,另一个值为/ out作为另一个值进行选择。

我还想将userDesc更改为textarea,我想我知道如何做到这一切,但是当我尝试将它应用到动态表时,我在概念上遇到了问题。

我在想的是我可以使用jquery / javascript获取span变量的innerhtml,它可以包围这两个单元格,然后将html更改为包含当前文本的各种输入字段,允许用户编辑它们来更改那些值。

我如何解决这类问题,我需要针对所有按钮的onClick事件,我不知道会有多少按钮,这是基于表中的行数。

这将产生数百行冗余代码,因此我认为必须有更好的方法。任何人都知道如何实现这一目标?我发现这个:http://stackoverflow.com/questions/16202723/how-to-edit-data-onclick这与我想要的很接近,但这似乎是静态值,我希望能够为表中的任何行执行此操作。

2 个答案:

答案 0 :(得分:2)

for循环中,您需要在<tr><td>元素中添加可识别的内容。我个人会使用数据属性。例如:

回应行代码

foreach($data as $row){
  echo "<tr data-row='{$row[id]}'>";
  if($_SESSION['editGroup'] != 0){
     echo "<td width='20%' data-column='name'>" . $row['userGiven'] . "</td><td width='10%' data-column='status'>" . $row['userStatus'] . "</td><td width='70%' data-column='description'>" . $row['userDesc'] . "</td><td width='10%'><button type='button' class='btn btn-info'>Edit</button></td>";
  }else{
     echo "<td width='20%'>" . $row['userGiven'] . "</td><td width='15%'>" . $row['userStatus'] . "</td><td width='75%'>" . $row['userDesc'] . "</td>";
  }
  echo "</tr>";             
}

因此,正如您所看到的,我已向data-row添加了<tr>属性,该属性应获取数据库记录ID的值。根据需要改变它 - 我假设它被命名为'id'。另外,我向data-column添加了<td>属性,该属性应该为我们标识每一列。这是PHP中所需的所有修改。

现在,这是编辑按钮的JQuery的样子:

前端事件监听器:第1部分

$( function(){

    $(document).on("click", ".btn-info", function(){

        var parent = $(this).closest("tr");
        var id = $(parent).attr("data-row");
        var name = $(parent).children("[data-column='name']");
        var status = $(parent).children("[data-column='status']");
        var desc = $(parent).children("[data-column='description']");
        var nameTxt = $(name).html();
        var statusTxt = $(status).html();
        var descTxt = $(desc).html();

        $(name).html("<input name='name' data-dc='name' value='" + nameTxt + "'>");
        $(status).html("<input name='status' data-dc='status' value='" + statusTxt + "'>");
        $(desc).html("<textarea name='desc' data-dc='description'>" + descTxt + "</textarea>");

        $(this).replaceWith("<button class='btn-info-save'>Save</button>");
    });

}

最后,我们需要定义点击保存时发生的事情(上面的示例将“编辑”按钮更改为“保存”按钮)。这可能是任何事情,但我们假设它将是一个AJAX调用:

前端事件监听器:第2部分

$( function(){

    $(document).on("click", ".btn-info-save", function(){

        var parent = $(this).closest("tr");
        var id = $(parent).attr("data-row");
        var data = {id: id};

        $("[data-dc]").each( function(){
            var col = $(this).attr("data-dc");
            var val = $(this).val();

            data[col] = val;
        });

        $.ajax({
            url: "/dynamic-edit/edit.php", // Change this to your PHP update script!
            type: 'POST',
            dataType: 'json',
            data: data,
            success: function(ret){
                //Do Something
                console.log(ret.response);
               },
            error: function(ret){
                console.log(ret.response);
               }
        });

    });

}

现在,在处理AJAX请求的PHP脚本中:

'edit.php'的PHP代码

$name = $_POST['data_name'];
$status = $_POST['data_status'];
$description = $_POST['data_description'];

// Do whatever with the data

// Output JSON - get the response in JS with ret.response
// either inside the success or error portion of the AJAX
echo json_encode( ["response"=>"Row edited successfully."] );

这是一个非常简单的例子,但它得到了重点。请务必将AJAX网址从“/dynamic-edit/edit.php”更改为您提交的PHP脚本,以便在提交后实际进行更新。

成功编辑后,您可能希望进行清理;例如,将文本框更改回<td>中的文本。另外,请注意我刚刚将它们更改为文本框。我知道你在你的帖子中说过你想让一个状态成为下拉列表并将描述写成textarea,但这个例子应该很容易改变。我不知道下拉列表的值应该是什么,所以你必须做那个部分。

备注

我使用$(document).on("click" ...代替$(".btn-info").on("click" ...,因为无论何时处理动态内容,您总是希望在文档上使用事件侦听器,而不是元素。为什么?因为如果单击“编辑”按钮,它将消失并出现“保存”按钮,您现在将永远失去该事件监听器。如果您要重新添加“编辑”按钮(例如,成功保存后),该按钮将需要再次添加事件侦听器。但是,当您将事件监听器附加到文档的路径时,您可以删除/添加所需的所有内容,它仍然可以正常工作。

答案 1 :(得分:1)

您可以使用要更新的用户ID为每个按钮添加“数据”属性。例如:

<button data-iduser='<?= $use["id"] ?>' class='btn btn-info'>Edit</button>

$("btn btn-info").click( function() {
   var idUser = $(this).attr("data-iduser");
   // some ajax if you want with that iD
});