我正在使用PHP创建一个用户必须提交表单的Web应用程序。目前我使用简单的html来渲染表单,如下所示。
<?php ?>
<form class='form-horizontal' method='post'>
<div class='form-group mail-right-element'>
<label class='col-sm-12 control-label mail-form-single-line-label' for='name 1'>Label 1</label>"
<div class='col-sm-12'>
<input name='name1' class='form-control validate' maxlength='100' placeholder='placeholder' value='value1'/>");
</div>
</div>
..
..
..// Some 20+ similar form fields
..
<div class='form-group mail-right-element'>
<label class='col-sm-12 control-label mail-form-single-line-label' for='name 20'>Label 20</label>"
<div class='col-sm-12'>
<input name='name20' class='form-control validate' maxlength='100' placeholder='placeholder' value='value20'/>");
</div>
</div>
</form>
这看起来非常混乱,难以维护。所以我按照下面给出的php方式。
<?php
function GetFormRowHtml($label, $name, $maxlength, $placeholder, $value)
{
return "<div class='form-group mail-right-element'>"
. "<label class='col-sm-12 control-label mail-form-single-line-label' for='$name'>$label</label>"
. "<div class='col-sm-12'>"
. "<input name='$name' class='form-control validate' maxlength='$maxlength' placeholder='$placeholder' value='$value'/>"
. "</div></div>";
}
?>
<form class='form-horizontal' method='post'>
<?php
echo GetFormRowHtml('Label1', 'Name1', 'abc', 'abc');
echo GetFormRowHtml('Label2', 'Name2', 'abc', 'abc');
echo GetFormRowHtml('Label3', 'Name3', 'abc', 'abc');
?>
</form>
有没有更好的方法来做到这一点?我已经读过在PHP中使用html是一个非常糟糕的设计。那么我应该采用HTML方式还是继续使用这种方法?使用上述方法有哪些缺点?
答案 0 :(得分:1)
您可以将输入作为单独的PHP文件用于包括:
<强>输入的template.php 强>
<div class='form-group mail-right-element'>
<label class='col-sm-12 control-label mail-form-single-line-label' for='<?= $name ?>'><?= $label ?></label>"
<div class='col-sm-12'>
<input id='<?= $name ?>' name='<?= $name ?>' class='form-control validate' maxlength='100' placeholder='<?= $placeholder ?>' value='<?= $value ?>'/>");
</div>
</div>
在你的HTML中:
<form class='form-horizontal' method='post'>
<?php
$values = [
[ "Label 1", "Name 1", "abc" , "abc" ],
[ "Label 2", "Name 2", "abc" , "abc" ],
[ "Label 3", "Name 3", "abc" , "abc" ],
[ "Label 4", "Name 4", "abc" , "abc" ]
];
foreach ($values as $array) {
list($label,$name,$placeholder,$value) = $array;
include "input-template.php"
}
?>
</form>
我个人选择这种风格的原因是IDE通常可以分析模板中的HTML并帮助格式化和检测错误,而字符串HTML通常不会被这样处理。
答案 1 :(得分:0)
在查看这样的常见问题时,最好的办法是查看一些PHP框架,看看它们是如何处理的。
查看Laravel或Yii,他们将任何输入或标签抽象为生成标记的函数。所以你走在了正确的轨道上。上面代码的主要问题是您将布局与标签/字段标记相结合。本质上这不是&#39;一个大问题,但没有给你的代码很大的灵活性。
标记应该移动到它自己的部分文件中,因此它很容易维护,形成php函数一般应该更加明确。
答案 2 :(得分:0)
这是我的方法......
function GetFormRowHtml($label, $name, $maxlength, $placeholder, $value)
{
/**
* @var array
* Grouping all searches and replaces in one array
*/
$sar = [
'{label}' => $label,
'{name}' => $name,
'{maxlength}' => $maxlength,
'{placeholder}' => $placeholder,
'{value}' => $value
];
/**
* @var $elementTemplate
* Template for a row
*/
$elementTemplate = "
<div class='form-group mail-right-element'>
<label class='col-sm-12 control-label mail-form-single-line-label' for='{name}'>{label}</label>
<div class='col-sm-12'>
<input name='{name}' class='form-control validate' maxlength='{maxlength}' placeholder='{placeholder}' value='{value}'/>
</div>
</div>
";
return str_replace(array_keys($sar), array_values($sar), $elementTemplate);
}
?>
<form class='form-horizontal' method='post'>
<?php
echo GetFormRowHtml('Label1', 'Name1', 'abc', 'abc');
echo GetFormRowHtml('Label2', 'Name2', 'abc', 'abc');
echo GetFormRowHtml('Label3', 'Name3', 'abc', 'abc');
?>
</form>
来自apokryfos的方法是另一个很好的解决方案。