Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony表单问题(还原动态填充的sfWidgetFormSelect小部件的选定值)_Php_Forms_Symfony1_Symfony Forms - Fatal编程技术网

Php Symfony表单问题(还原动态填充的sfWidgetFormSelect小部件的选定值)

Php Symfony表单问题(还原动态填充的sfWidgetFormSelect小部件的选定值),php,forms,symfony1,symfony-forms,Php,Forms,Symfony1,Symfony Forms,我在Ubuntu 9.10上使用Symfony 1.3.2和推进ORM 我开发了一个表单,使用AJAX动态地将选定国家的城市填充到选定的小部件中 在保存表单上输入的数据之前,我验证表单。如果验证失败,表单将返回给用户进行更正。但是,由于国家/地区列表是动态生成的,因此提交更正的表单没有选择有效的城市,因此该表单为空,因为国家/地区小部件尚未更改 这对用户来说很不方便,因为这意味着他们必须选择另一个国家,以便触发更改事件,然后更改回他们选择的原始国家,最后选择他们上次选择的城市 所有这些都是强制用

我在Ubuntu 9.10上使用Symfony 1.3.2和推进ORM

我开发了一个表单,使用AJAX动态地将选定国家的城市填充到选定的小部件中

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

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

所有这些都是强制用户执行的,因为另一个可能不相关的字段没有指定日期

我尝试了$form->getValue'widget_name',在$form->bind之后立即调用,但实际上,IIRC,如果表单无法验证,所有的值都会重置为null,所以这不起作用

我目前正在尝试一个令人讨厌的黑客行为,包括使用直接访问输入,即通过$u POST访问受污染的数据,并将其设置为flash变量,但我觉得这是一个非常讨厌的黑客行为


我试图做的是一个常见的用例场景-有没有更好的方法来实现这一点,而不是使用$u POST等进行黑客攻击?

我针对这个问题所做的就是将表单发布到生成表单的同一个操作中,在该操作中,我获取任何选定的国家/地区/城市作为POST变量,并将其传递回模板,而不考虑验证。在模板中,我然后使用JQuery将select值设置为原来的值。当验证通过时,它们就会被使用。否则,它们会被传递回模板

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

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

所以。。。我从帖子中得到了国家,我用它查询数据库,得到城市,然后把工艺城市返回到下拉列表中。然后在模板中,您可以使用类似$this->posted\u city的内容设置默认选定的城市,如果存在,这也将是一个POST变量。

谢谢Tom,您的选择是正确的,我已经投票支持了您的问题。不过我现在做的事情稍微复杂一点。“迷失”的是城市。以前选定的国家仍然存在。我想要的行为是:当表单无法验证时,以前选择的国家/地区保持不变。这已经在运行,但我希望该国家/地区的城市列表保持可用,最后选择的城市是选定的城市。因此,换句话说,如果错误来自表单中的其他地方,则用户无需再次触摸国家/城市字段。。。除非他们愿意。我相信我可以使用jQuery来实现这一点。我只是需要再仔细考虑一下,因为我不使用jQuery进行思考。你可以在这里发布一个jQuery代码片段,让我继续;-一旦我用你的代码片段成功地完成了这个行为,我会接受你的最终答案。好的,基本上,我会检查一个国家是否发布了。如果是,我将重新生成该窗口小部件的国家列表。。。然后,您可以使用jquery再次设置默认的选定城市,如country。我在上面添加了一些代码。嗨,汤姆,我没有在事后编辑原始问题,因为当我解释我需要做什么时,我意识到,我有了实现逻辑!。但是有一件事,val方法:$country-select.val;似乎不起作用。我将检查jQuery文档以找出原因
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)));
}