- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
场景:我有一个包含 2 个选择的表单。当用户从第一个选择中选择某些内容时,第二个选择会填充新值。这部分工作正常。
但是表单没有得到验证,因为它包含一些初始表单中不允许的选项。
表格:
<?php
class MyType extends AbstractType
{
private $category;
public function __construct($category = null)
{
$this->category = $category;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('category', 'choice', array(
'choices' => array(
'foo' => 'foo',
'bar' => 'bar'
)
);
$builder->add('template', 'choice', array(
'choices' => $this->loadChoices()
);
}
private function loadChoices()
{
// load them from DB depending on the $this->category
}
}
最初类别是foo
。因此 foo 的模板被加载并设置为选项。但是如果用户选择 bar
,就会加载栏模板。但是表单仍然有 foo 选项并且不验证。
解决这个问题的最佳方法是什么?
我发现的一种方法是在 Controller 中重新启动表单:
<?php
$form = $this->createForm(new MyType());
if ($request->getMethod() === 'POST') {
if ($request->request->has($form->getName())
&& isset($request->request->get($form->getName())['category'])) {
$form = $this->createForm(new MyType($request->request->get($form->getName())['category']));
}
// ...
}
这行得通,但我无法测试它,因为它在设置值时抛出 IllegalArgumentException
并且只是假定默认值。对此有更好的解决方案吗?提前致谢!
最佳答案
我认为你必须使用事件来管理它,这是更正确的方法
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('category', 'choice', array(
'choices' => array(
'foo' => 'foo',
'bar' => 'bar'
)
));
$ff = $builder->getFormFactory();
// function to add 'template' choice field dynamically
$func = function (FormEvent $e) use ($ff) {
$data = $e->getData();
$form = $e->getForm();
if ($form->has('template')) {
$form->remove('template');
}
$cat = isset($data['category'])?$data['category']:null;
// here u can populate ur choices in a manner u do it in loadChoices
$choices = array('1' => '1', '2' => '2');
if ($cat == 'bar') {
$choices = array('3' => '3', '4' => '4');
}
$form->add($ff->createNamed('template', 'choice', null, compact('choices')));
};
// Register the function above as EventListener on PreSet and PreBind
$builder->addEventListener(FormEvents::PRE_SET_DATA, $func);
$builder->addEventListener(FormEvents::PRE_BIND, $func);
}
关于php - Symfony2 : Change choices with ajax and validation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13321771/
我正在使用 Python2 和 Django 1.9。 基本上我有一个包含两个下拉菜单的表单。第二个下拉列表取决于第一个下拉列表的值。 例如,如果下拉列表 #1 选择了“类别”选项,则下拉列表 #2
我有 2 个 Django 模型——主要(产品)和链接的详细信息(PhysicalProperty 是通过附加模型 ProductMetricals 的多对多链接)。 在主模型 Product 中,我
我正在尝试创建一个带有两个下拉菜单的网站:部门和类(class)编号。下拉菜单的数据来 self 的 SQL 数据库的“类(class)”表。现在我的网站正确初始化并在下拉菜单中显示正确的选项。然而,
你好,我对 python 相当陌生,我的一段代码遇到了问题。在一个“if”语句之后,当我不希望它执行时,我的代码将继续执行下一个“if”语句。我尝试过 elif 但它提出了无效的语法。 print(
我已经在我的 Django 项目中安装了 MongoDB。因为是我第一次使用 Mongo,我决定尝试一下它是如何工作的,我创建了一个简单的程序来存储数据(在我的例子中是价格和数量)。 该项目称为“ex
我已经尝试过 ActionListener 和 ItemListener,但它不起作用,而且我也尝试过搜索可能适用于它的代码和方法,但我只是没有找到它,主要可能是因为 JCombobox 更受欢迎,我
抱歉,我是编程界的新手。我正在创建一个控制台应用程序,它基本上会根据您的输入来确定您是想将摄氏温度转换为华氏温度,还是相反。 我遇到的问题是: "Error 3 A local variable na
random.SystemRandom().choice() 和有什么区别& random.choice()在 python ? 我有 seen the former being used ,不止一处
我的 XSD 有问题。我的 XSD 包含一个 xs:choice 来实现选择其中一种类型的选项。不允许选择无类型(或 Null)! 我已经通过 xsd.exe 从 xsd
我有 2 个应用程序。 input:具有包含下拉列表的形式:region。下拉列表值来自结果数据库(由用户上传)。填写表单时,用户需要从下拉列表中选择值。 result:有数据库 现在我可以在输入表单
有人可以告诉我我可能做错了什么吗?我在运行 python 代码时不断收到此消息: import random foo = ['a', 'b', 'c', 'd', 'e'] random_item =
为什么 numpy.random.choice 与 random.choice 不同?当我这样做时: >>> random.choice([(1,2),(4,3)]) (1, 2) 有用。 但是当
我有一个由 2 个 ChoiceField 和一个 CharField 组成的表单。当选择第一个 ChoiceField 的项目时,通过 ajax 填充第二个 ChoiceField。 填充它的模板如
为什么我们不能在表单中使用Choice.IMPLICIT,而我们可以使用Choice.EXCLUSIVE。当我使用 Choice.IMPLICIT 时,它给了我一个 java.lang.Illegal
例子: element = ['Flaming', 'Cold'] fire_properties = ['of Fire', 'of Flame'] cold_properties = ['of I
我正在生成我们的 Java Web 服务 WSDL,然后每次进行更改时将其导入到我们的 C# 应用程序中。每次这样做时,xs:choice元素会重新生成,但通常具有不同的数量,具体取决于首先生成的元素
我是 Django 新手。我使用简单的 ajax 根据类(class)选择动态更新选择字段学期。但是在提交表单时,我收到错误选择有效的选择。 所选选项不是可用选项之一。代码如下: 表单.py: fro
1)是否有symfony方法? 我有一个基本形式(未映射到数据库),其中包含一些选择字段,例如: $builder->add('civility', 'choice', array('cho
我已经为这个问题苦苦挣扎了一段时间,所以非常感谢任何帮助。 情况如下:我的应用程序有一个名为 InitialViewController 的 UIViewController 子类。这个 View C
这个问题在这里已经有了答案: How can I dynamic populate an option widget in tkinter depending on a choice from a
我是一名优秀的程序员,十分优秀!