草庐IT

php - 选择为空时显示所有条目的 Symfony2 实体字段

coder 2024-05-01 原文

我的 Symfony2 项目中有一个实体类型表单字段。

$builder = $this->createFormBuilder();
$projects = $this->getProjects();

$builder->add('project', 'entity',
        array(
            'class' => 'MyBundle:Project',
            'required' => false,
            'choices' => $projects,
        ));

我遇到的问题是,当 getProjects() 方法将返回空结果集时,下拉列表将包含项目中的所有项目表。

有什么办法可以禁止这种行为吗?

最佳答案

我相信意外行为的发生是因为您混淆了 Choice 和 Entity 表单字段类型的使用。

您正在指定实体字段($builder->add() 的第二个参数),然后尝试使用“选择”选项用值填充它。但是,“选择”选项并不直接适用于 Entity field type ,虽然据说继承自Choice。相反,实体字段旨在为您自动加载数据库中的选择。如果您仅设置实体“类”,则该字段将按主键升序填充表中的所有实体。为了加载实体的子集和/或以特定顺序加载它们,您可以设置“query_builder”函数。

例如,创建一个按名称升序排列的所有国家/地区的下拉列表:

$builder->add('country', 
              'entity', 
              array('class' => 'My\Bundle\Entity\Country',
                    'property' => 'name', 
                    'query_builder' => function(EntityRepository $er) {
                        return $er->createQueryBuilder('country')
                                  ->orderBy('country.name', 'ASC');
                    },
                    'required' => true, 
                    'empty_value' => false));

查询可以根据需要简单或复杂。参见 Using Doctrine's Query Builder .

我怀疑问题中创建项目字段的方式会导致下拉菜单的基本选择被设置两次 - 第一次是在设置“类”选项时,对所有可用的项目实体,第二次是'choices' 选项被设置为 $this->getProjects() 的结果。据推测,如果后者是一个空数组,它不会覆盖前者,因此所有项目都会出现在列表中。

如果出于某种原因您无法使用查询生成器来获取下拉列表的项目,那么您可以使用 Choice 字段类型并将项目数据手动映射到“选择”选项。例如,像这样:

$builder = $this->createFormBuilder();
$projects = $this->getProjects();

$projectChoices = array();
foreach ($projects as $project) {
    $key = $project->getId();
    $value = $project->getName();
    $projectChoices[$key] = $value;
}

$builder->add('project', 
              'choice',
               array('choices' => $projectChoices,
                     'required' => false));

请注意,在这种情况下,“项目”字段的值将是一个项目 ID,而对于实体字段,它将是一个实际的项目实体,这是使用实体字段更可取的另一个原因。

关于php - 选择为空时显示所有条目的 Symfony2 实体字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9459985/

有关php - 选择为空时显示所有条目的 Symfony2 实体字段的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  3. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  4. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  5. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  6. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  7. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  8. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  9. ruby - Rails 3 的 RGB 颜色选择器 - 2

    状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基

  10. ruby-on-rails - Sphinx - 何时对字段使用 'has' 和 'indexes' - 2

    我几天前在我的ruby​​onrails2.3.2上安装了Sphinx和Thinking-Sphinx,基本搜索效果很好。这意味着,没有任何条件。现在,我想用一些条件过滤搜索。我有公告模型,索引如下所示:define_indexdoindexestitle,:as=>:title,:sortable=>trueindexesdescription,:as=>:description,:sortable=>trueend也许我错了,但我注意到只有当我将:sortable=>true语法添加到这些属性时,我才能将它们用作搜索条件。否则它找不到任何东西。现在,我还在使用acts_as_tag

随机推荐