【问题标题】:Symfony2.7 entity type population from GET来自 GET 的 Symfony2.7 实体类型填充
【发布时间】:2015-11-04 11:56:48
【问题描述】:

可以通过 GET 请求填充如下所示的实体类型设置吗?

目前,当查询字符串包含正确的密钥对时,实体类型不会填充(?category=232,查询字符串是表单提交的结果 - 所以配对是正确的),但是,如果我将类型设置为使用选择类型,它会很好地填充 - 我想将其保留为实体类型。

->add('category', 'entity', array(
    'required' => false,
    'class' => 'AppBundle:FormElementOption',
    'choices' => $this->form_repository->getOptionsForSelectEntities($this->directory->getProject()->getId()),
    'choices_as_values' => true,
    'choice_label'=>'label',
    'choice_value'=>'id',
    'group_by' => function ($currentObject) {
        return $currentObject->getFormElement()->getLabel();
    },
))

呈现的表单元素为:

<select id="category" name="category" class="form-control">
    <option value=""></option>
    <optgroup label="Car Brand">
        <option value="221">6 Door</option>
        <option value="222">Toyota</option>
        <option value="223">Jaguar</option>
        <option value="224">Skodai</option>
    </optgroup>
    <optgroup label="Car Doors Count">
        <option value="226">6 Door</option>
        <option value="227">Green</option>
    </optgroup>
    <optgroup label="Car Doors">
        <option value="228">1 Door</option>
        <option value="229">2 Door</option>
        <option value="230">3 Door</option>
        <option value="231">4 Door</option>
        <option value="232">6 Door</option>
    </optgroup>
</select>

【问题讨论】:

    标签: php forms symfony doctrine-orm


    【解决方案1】:

    当然可以,但是您需要在表单类型“之外”进行更多配置。此方法非常适合“过滤/搜索”表单类型,但在创建资源/实体时应避免使用。

    每当您创建一个 FormType 实例时,您给它一个名称,比如“search”,表单将在请求参数中查找名为“search[category]”的参数。

    要使用“无名”表单类型,您应该在控制器中使用另一种创建表单的语法,即:

    $form = $this->get('form.factory')->createNamed(null, new SearchType(), $search);
    

    第一个null表示没有名字。

    此外,请确保将表单选项 _method 设置为 get,以便在查询字符串中搜索数据,而不是在请求正文中(即 _POST)。

    【讨论】:

    • 我从 form::getName 返回 null,这与 createNamed(null,..) 的行为是否相同,导致 html 中的元素之前没有名称?所以不是formname[categories],输出只是类别
    • 我认为它可能应该这样做,但我不会推荐它,因为它甚至没有记录在 FormTypeInterface 中。使用 createNamed 以确保安全。另外,请确保handleRequest($request) 确实使用isSubmitted 提交您的表单;如果没有,请检查_method 选项。
    • 似乎都无法纠正这一点。另外我不认为提交表单有问题,因为表单的其余部分工作正常,并且使用从数组构建的选择字段可以工作,它只是在使用实体类型时 - 我只能假设,因为 GET 没有包含实体,仅包含它的 id。需要使用数据转换器。但是自从新的'choice_label/value'引入以来,我认为它可以使用 id 填充字段?附言也是的,这是一个过滤器表单
    • 好的,所以我在实体类型中添加了一个数据转换器,它可以工作。有点烦人的是你可以设置类型来使用任何标签和值 - 但是你需要使用数据转换器来转换传入而不是传出时的值..
    • 一切似乎都不起作用,因为您混合了许多不能很好地结合的概念。如果您使用“选择”类型,则使用分组字段定义“选择”。如果您使用“实体”类型,请勿使用“选择”。由于您需要复杂的行为,请查看“choice_loader”选项(替换 datatransformer、choices、choices_as_value)。创建一个实现ChoiceLoaderInterface 的类,将其设置为choice_loader,就完成了。
    猜你喜欢
    • 2016-05-04
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2015-03-03
    • 2019-06-02
    • 1970-01-01
    • 2020-12-28
    • 2014-09-04
    相关资源
    最近更新 更多