PHP - 在回发期间保留表单值的最佳实践

时间:2010-12-30 18:00:31

标签: php postback retain

在这里完成PHP新手,几乎我以前的所有工作都在ASP.NET中。我现在正在研究一个PHP项目,我偶然发现的第一个摇滚是在回发中保留价值。

对于最简单但仍然现实的例子,我有10个下拉菜单。它们甚至还没有数据包,因为这是我的下一步。它们是简单的下拉列表。

我的整个页面都包含在标签中。每个下拉列表的onclick()事件,调用一个javascript函数,该函数将填充相应的下拉列表隐藏元素,并选择下拉列表值。然后,在页面重新加载时,如果该隐藏值不为空,我设置所选选项=我隐藏的选项。

这适用于单个回发。但是,当另一个下拉列表发生变化时,原始的第1个下拉列表会失去其值,因为其相应的隐藏值也会失去其价值!

这使我开始研究使用查询字符串或会话,或者......其他一些想法。

有人能指出我正确的方向,在我的情况下哪个选项最好?我是一个PHP新手,但是我被要求为我的技能水平做一些非常激烈的事情,所以我需要一些灵活的东西,并且更容易使用。

谢谢!

- - - - - - - - 编辑

对我的问题稍微澄清一下:)

当我说'PostBack'时,我指的是提交的页面/表单。控件将传回服务器,并再次执行HTML / PHP代码。

关于下拉菜单& hiddens,我使用隐藏变量保留“选定值”或“选定索引”的原因是,当提交页面时,我能够使用之前的选择重绘下拉列表,而不是默认返回第一个索引。当我使用$ _POST []命令时,我无法按名称检索下拉列表,但我可以按名称检索隐藏值。这就是为什么在下拉更改事件时,我调用javascript将下拉列表中的选定值设置为其隐藏的相应值。

--------再次编辑-------- 好吧好吧,我看到我需要退步并解释整体目标:)我很抱歉开始时不是很清楚。

我的最终设计将是一个页面,用户可以在该页面中选择我们公司内的部门来查看数据。一旦选择了该部门(从下拉列表中),我将显示更具体的数据选择下拉列表:颜色,大小,供应商,样式,日期,商店#等...此时我还将显示销售数据选定的部门。在选择任何颜色,尺寸等时,我将更新销售数据结果以满足新标准

---------编辑---------- 我无法提供对我的示例的外部访问,但是这里是一个带有探索的sceenshot。在下图中,用户将展开“部门”下拉列表,以选择一个部门。此时,下面的销售数据将根据该部门刷新。然后,用户将选择“分组依据”选项,例如商店,页面/数据将刷新以显示按商店分组的数据。然后他们可以在我的示例中选择一种颜色,例如黑色,数据将显示所选部门和颜色的销售额,按商店分组。

为了完成所有这些操作,页面需要在每次刷新/发布时保留部门,颜色和分组下拉选项......

alt text

3 个答案:

答案 0 :(得分:4)

自动回发没有本地方法,你必须像这样回显$ _POST数组中的数据:

<input name="id" value="<?php isset($_POST['id']) ? (int)$_POST['id'] : "" ?>" />

另一种方法是创建一个表单助手,为您动态创建输入等,然后检查post数组中的键,例如:

class FormHelper
{
    public function input($name,$type = "text",$default_value = "",$postback = false)
    {
        return '<input name="' . $name  . '" type="' . $type . 'value="' . $this->_postback($name,$default_value ) . '" />';
    }

    //More Methods


    private function _postback($key,$default = "")
    {
        return isset($_REQUEST[$key]) ? htmlentities($_REQUEST[$key]) : $default;
    }
}

然后你可以添加将能够构建表单,指定它应该包含以前的值。

你会创建这样的表格:

<form>
    <?php echo FormHelper::getInstance()->input("id","text","Enter Id",true); ?>
</form>

很有可能创建单例方法getInstance()

一些可能对您有用的链接。

  1. Form validation using PHP
  2. PHP/CSS Form validation
  3. PHP Form Validation

  4. 更新后,我可能知道您的意思,甚至认为您的帖子很难理解。

    如果我正确你想要做以下事情:

    • 在您的信息页上显示表单
    • 让用户填写表格
    • 当用户点击提交时
      • 通过Ajax将数据发送到服务器
      • 处理用户提供的信息
      • 生成新表单,或重新生成错误的旧表单
      • 将表格从管道发回页面
      • 删除旧表单,用新生成的表单替换旧表单

    如果以上是正确的,那么这不是PHP的特定功能,但主要基于javascript

    完成上述操作的最佳方法是确保您的应用程序是基于模板的,因此在您的初始页面加载中,您将显示如下表单:

    <html>
        <!-- Head, Meta, Etc-->
        <body>
            <?php $this->template->load("templates/forms/specific_form.php"); ?>
        </body>
    </html>
    

    这通常是我们加载页面的方式,然后点击你想通过ajax提交表单,我会为此合并jQuery。

    表格如下:

    <form rel="__postback" ... >
    </form>
    

    然后在jQuery中,您将执行以下操作:

    $(document).ready(function(){
        $("form[rel*=__postback]").each(function(){
            var Form = $(this);
    
            //Send the form with ajax, bin the __PostbackComplete()
            function __PostbackComplete(server_data)
            {
                //Overwite the form using jQuery LIVE!!!!
            }
        });
    });
    

    在PHP中,您将分析数据并从模板部分处理表单。

    希望这会有所帮助。

答案 1 :(得分:0)

如果我的问题正确,我认为问题实际上是你的javascript解决方案。

为什么只发送所选字段?有多种形式吗?我的意思是,如果所有下拉列表只在一个表单内,您应该在输入更改时发送完整表单,是的,您将再次发送上一个下拉值,但这是使用$ _POST获取该值的方法。

答案 2 :(得分:0)

听起来您只需要重新输出表单字段,并预先填充正确的值。

例如,假设你想要一个这样的下拉列表:

<select name="department">
  <option value="s">Sales</option>
  <option value="m">Marketing</option>
</select>

当您提交表单时,该值将作为$ _POST [“department”]提供给PHP。现在,您希望再次输出表单,并选择正确的部门。

你需要这样的功能(这只是一个快速草图):

function outputSelect($name, $values, $currentValue) {
  echo '<select name="'.htmlspecialchars($name).'">';
  foreach ($values as $value => $text) {
    if ($value === $currentValue) {
      echo '<option value="'.htmlspecialchars($value).'" selected>'.htmlspecialchars($text).'</option>';
    } else {
      echo '<option value="'.htmlspecialchars($value).'">'.htmlspecialchars($text).'</option>';
    }
  }
  echo '</select>';
}

当您想要显示菜单时,您可以调用它。通常这是来自HTML模板:

<?php outputSelect("department", array("s" => "Sales", "m" => "Marketing"), $_POST["department"]) ?>

对于文本字段,隐藏字段,单选按钮等,您将需要类似的功能。最后,您将最终得到一个可重用函数库,用于输出表单字段。

不要忘记在任何HTML标记的属性或内容周围使用htmlspecialchars,如上所述。这在显示用户输入的数据时尤为重要,以防止XSS攻击,但无论数据来源如何,都应该这样做。