gpt4 book ai didi

javascript - 允许编辑文本动态 php 表

转载 作者:太空宇宙 更新时间:2023-11-04 16:07:25 26 4
gpt4 key购买 nike

我有一个通过 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 更改为文本区域,我想我知道如何做这一切,但是当我尝试将它应用于动态表时,我在概念上遇到了问题。

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

但是对于这类问题,我该如何处理,我需要所有按钮的 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>";
}

因此,如您所见,我添加了一个 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 url 从“/dynamic-edit/edit.php”更改为您将在提交后实际进行更新的 PHP 脚本的任何位置。

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

注意事项

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

关于javascript - 允许编辑文本动态 php 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37012925/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com