这个问题更多与我希望在“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粉3080890802023-09-11 11:38:54
首先要注意的是,你实际上并不需要为每个表单输入项创建一个不同命名的局部变量。也就是说,不需要这样写:
<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; ?>">
为什么这样有帮助呢?因为现在只有两个与此输入项相关的内容:
这两个都只是字符串,所以很容易提取到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的细节),只剩下“有趣”的部分:定义要显示的字段列表。
如果某些字段需要稍微不同,你可以向函数(和配置数组)添加一些额外选项,但只要变化不多,代码应该保持相当简单明了。