繁体   English   中英

允许编辑文本动态 php 表

[英]Allow editing of Text dynamic php 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 的单元格更改为一个下拉字段,以当前值作为起始值,将另一个值输入/输出作为另一个值以供选择。

我还想将 userDesc 更改为 textarea,我想我知道如何执行所有这些操作,但是当我尝试将其应用于动态表时,我在概念上遇到了问题。

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

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

这将导致数百行冗余代码,所以我认为必须有更好的方法。 有谁知道有什么方法可以做到这一点? 我发现了这一点: http://stackoverflow.com/questions/16202723/how-to-edit-data-onclick : http://stackoverflow.com/questions/16202723/how-to-edit-data-onclick与我想要的很接近,但这似乎是我希望能够为任何人执行此操作的静态值表中的行。

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>";             
}

因此,如您所见,我向<tr>添加了一个data-row属性,该属性应该获取数据库记录 ID 的值。 根据需要更改它 - 我假设它会被命名为“id”。 另外,我向<td>添加了data-column属性,它应该为我们标识每一列。 这就是 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 url 从“/dynamic-edit/edit.php”更改为您将在提交后实际进行更新的 PHP 脚本的任何位置。

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

笔记

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

您可以使用要更新的用户 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
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM