[英]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.