如何生成重复的HTML表单字段?

时间:2017-09-17 08:11:14

标签: php html

我正在使用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方式还是继续使用这种方法?使用上述方法有哪些缺点?

3 个答案:

答案 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框架,看看它们是如何处理的。

查看LaravelYii,他们将任何输入或标签抽象为生成标记的函数。所以你走在了正确的轨道上。上面代码的主要问题是您将布局与标签/字段标记相结合。本质上这不是&#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的方法是另一个很好的解决方案。