【问题标题】:Symfony forms question (restoring selected value of a dynamically populated sfWidgetFormSelect widget)Symfony 表单问题(恢复动态填充的 sfWidgetFormSelect 小部件的选定值)
【发布时间】:2010-03-09 09:45:55
【问题描述】:

我在 Ubuntu 9.10 上使用带有 Propel ORM 的 Symfony 1.3.2。

我开发了一个表单,该表单使用 AJAX 动态填充选定国家/地区的城市的选定小部件。

在保存表单上输入的数据之前,我会验证表单。如果验证失败,则将表单返回给用户进行更正。但是,由于国家列表是动态生成的,因此提交的用于更正的表单没有选择有效的城市(它是空的,因为国家小部件尚未更改)。

这对用户来说很不方便,因为这意味着他们必须选择另一个国家(因此会触发更改事件),然后更改回他们选择的原始国家,然后最终选择他们最后选择的城市。

所有这些都是强加给用户的,因为另一个(可能不相关的)字段没有生效。

我尝试了 $form->getValue('widget_name'),在 $form->bind() 之后立即调用,但似乎(事实上,IIRC,如果表单验证失败,所有值都重置为 null) -所以这不起作用。

我目前正在尝试一种令人讨厌的 hack,它涉及使用通过 $_POST 直接访问输入(即被污染的)数据,并将它们设置为 flash 变量 - 但我觉得这是一种非常讨厌的 hack)

我正在尝试做的是一个常见的用例场景 - 有没有比使用 $_POST 等更好的方法来做到这一点?

【问题讨论】:

    标签: php forms symfony1 symfony-forms


    【解决方案1】:

    我针对这个确切问题所做的是将表单发布到生成它的同一操作中,并且在该操作中,我将任何选定的国家/地区/城市作为 POST 变量并将它们传递回模板(无论的验证)。然后,在模板中,我使用 JQuery 将选择值设置为原来的值。当验证通过时,它们就会被使用。如果没有,它们会被传递回模板。

    如果您可以在 JQuery 中容忍一点 PHP,您可以在模板中执行此操作:

    $(document).ready(function()
    {
       $("#country-select").val('<?php echo $posted_country; ?>');
    });
    

    如果你使用这种方法,不要忘记第一次在你的模板中初始化 $this->posted_country 否则 Jquery 会混淆。

    我猜你也可以使用 $this->form->setWidget(...)->setDefault(...) 或类似的东西,但我还没有找到使用 $_POST 的方法,因为访问元素似乎否则需要绑定表单。

    针对以下评论的更新代码:

    if($_POST['profile']['country_id'] != '') 
    {
        $this->posted_country = $_POST['profile']['country_id'];
        $q = Doctrine_Query::create()
            ->select('c.city_id, c.city_name')
            ->from('City c')
            ->where('c.country_id = ?', $this->posted_country);     
        $cities = $q->execute(array(), Doctrine_Core::HYDRATE_NONE);
        foreach($cities as $city) $list[$city[0]] = $city[1];
        $this->form->setWidget('city_id', new sfWidgetFormChoice(array('choices' => array('' => 'Please select') + $list)));
    }
    

    所以...我从帖子中获取国家/地区,用它查询数据库,获取城市,然后将城市重新制作成下拉列表。然后在模板中,您可以使用 $this->posted_city 之类的内容设置默认选定城市(如果存在,这也将是一个 POST 变量)。

    【讨论】:

    • 谢谢汤姆,你在正确的轨道上(我已经投票赞成你的问题)。不过,我正在做的事情稍微复杂一些。是那些“迷失”的城市。之前选择的国家仍然存在。我想要的行为是:当表单无法验证时,之前选择的国家/地区仍然存在(这已经在工作),而且,我希望该国家/地区的城市列表保持可用并且最后选择的城市是一个选择。所以,换句话说,如果错误来自表单中的其他地方,那么用户不需要再次触摸国家/城市字段
    • ...(除非他们愿意)。我相信我可以使用 jQuery 来做到这一点。我只需要再考虑一下,因为我不会“考虑”jQuery。
    • 你总是可以在这里发布一点 jQuery sn-p 让我继续前进;) - 一旦我成功地使用/构建你的 sn-p 的行为,我会接受你的回答作为最后一个。
    • 好的,基本上,我检查是否发布了一个国家/地区。如果是,我会为该小部件重新生成国家/地区列表...然后您可以使用 jquery 再次设置默认选定城市,例如国家/地区。我在上面添加了一些代码。
    • 嗨汤姆,我没有编辑原始问题,因为当我解释我需要做什么时,我意识到,我有实现逻辑!。但有一件事,val 方法: $("#country-select").val('');似乎没有工作。我将检查 jQuery 文档以找出原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多