大规模动态填充HTML表单:通过PHP中的SQL值实现
P粉765570115
P粉765570115 2023-09-10 17:28:20
0
1
598

这个问题更多与我希望在“SCALE”方面实现的过程/逻辑相关,而不是如何编写代码。

在WordPress中,我有几个以HTML形式加载的表单,当用户创建一个自定义文章(对于不熟悉CMS的人来说,实际上是一个新的数据库条目)来记录一个新的“事件”时加载。我不想手动映射所有内容,因为这是使用update_post_meta()来设置数据库条目/文章的名称和值 - 所以当提交表单时,我使用php循环foreach ($_POST as $name => $value) {来填充此事件的所有数据库表。

这个方法很好,但是现在,如果用户保存表单并稍后回来编辑它,我希望如果存在值,像这样回显:

<label for="reported_by">报告人(全名)</label>
<?php $reported_by = get_post_meta($incident_id, 'reported_by', true); ?>
<input type="text" name="reported_by" value="<?php echo $reported_by; ?>">

同样,这个方法也很好,但是我在这个页面上有近500个字段,所以为每个字段手动设置唯一变量(在这种情况下是$reported_by)将花费我很长时间,而且基本上会增加代码库近50%,使其难以维护且效率低下。

对于如何解决这个问题有什么想法吗?可以理解的是,我可以通过php构建表单并在HTML中回显,但是这也感觉像一个非常手动的过程。PHP是服务器端的,所以我不能轻松地在客户端获取标签/输入的名称值,除非使用AJAX,但我觉得这也会变得相当手动。

所以无论如何,我都面临着很多重复劳动,除非有一种方法可以使这个过程更容易扩展到所有500个字段,而不需要我手动设置变量名。

谢谢您的时间!

P粉765570115
P粉765570115

全部回复(1)
P粉308089080

首先要注意的是,你实际上并不需要为每个表单输入项创建一个不同命名的局部变量。也就是说,不需要这样写:

<label for="reported_by">报告人(全名)</label>
<?php $reported_by = get_post_meta($incident_id, 'reported_by', true); ?>
<input type="text" name="reported_by" value="<?php echo $reported_by; ?>">

你可以这样写:

<label for="reported_by">报告人(全名)</label>
<?php $current_value = get_post_meta($incident_id, 'reported_by', true); ?>
<input type="text" name="reported_by" value="<?php echo $current_value; ?>">

为什么这样有帮助呢?因为现在只有两个与输入项相关的内容:

  • 标签“报告人(全名)”
  • 字段名“reported_by”,在多个地方使用

这两个都只是字符串,所以很容易提取到PHP变量中:

<?php
$field_name = 'reported_by';
$label = '报告人(全名)';
?>
<label for="<?php echo $field_name; ?>"><?php echo htmlspecialchars($label); ?></label>
<?php $current_value = get_post_meta($incident_id, $field_name, true); ?>
<input type="text" name="<?php echo $field_name; ?>" value="<?php echo $current_value; ?>">

这些看起来很像参数,所以让我们把它变成一个函数,同时记得也传入$incident_id

<?php
function display_input($incident_id, $field_name, $label) {
    ?>
<label for="<?php echo $field_name; ?>"><?php echo htmlspecialchars($label); ?></label>
<?php $current_value = get_post_meta($incident_id, $field_name, true); ?>
<input type="text" name="<?php echo $field_name; ?>" value="<?php echo $current_value; ?>">
    <?php
}
display_input($incident_id, 'reported_by', '报告人(全名)');

现在,你只需要调用display_input函数500次就可以显示500个输入项。为了避免这样,可以使用一个数组和foreach循环:

$fields = [
    'reported_by' => '报告人(全名)',
];
foreach ( $fields as $field_name => $label ) {
    display_input($incident_id, $field_name, $label);
}

然后,你可以从配置文件或数据库表中获取数组,而不是硬编码。你已经自动化了重复的部分(渲染HTML的细节),只剩下“有趣”的部分:定义要显示的字段列表。

如果某些字段需要稍微不同,你可以向函数(和配置数组)添加一些额外选项,但只要变化不多,代码应该保持相当简单明了。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板