Symfony EntityType - 如何使用自定义布局?

时间:2017-11-13 20:47:41

标签: php symfony symfony-forms

在我的Symfony 3.x项目中,我有3个实体:

  1. 项目
  2. 属性
  3. 分类
  4. 假设:

    • 每个项目都有多个属性。
    • 每个属性都有一个类别。
    • 每个属性可能都有父属性。

    我想为Project实体渲染Symfony表单。我正在EntityType使用properties字段。但是,我不想将它们显示在一个长列表中,而是将它们分成列,将类别作为标题。

    显示EntityType字段的常规方式:

    enter image description here

    我想得到什么:

    enter image description here

    我该怎么做? - 不使用实体或视图中的脏黑客。

1 个答案:

答案 0 :(得分:2)

所以我发现它工作的唯一方法是:

在Repository类中(拉出包含子属性和类别的所有属性的列表):

$this->getEntityManager()
    ->createQueryBuilder()
    ->select('t, category, children')
    ->join('t.category', 'category')
    ->leftJoin('t.children', 'children')
    ->where('t.parent IS NULL')
    ->orderBy('category.sortOrder', 'ASC')
    ->addOrderBy('t.sortOrder', 'ASC')
    ->addOrderBy('t.name', 'ASC');

$entities = $query->getResult();

$options = [];
/** @var Property $entity */
foreach ($entities as $entity) {
    $options[$entity->getCategory()->getName()][] = $entity;
}

在Entity类中(拉动所选属性的ID列表,预先选择视图文件中的复选框):

public function getPropertyIds() {
    $properties = $this->getProperties();

    $propertyIds = [];
    foreach ($properties as $property) {
        $propertyIds[] = $property->getId();
    }

    return $propertyIds;
}

版本表格类,因此可以验证数据:

$builder
    ->add(
        'properties',
        EntityType::class,
        [
            'label' => 'Properties',
            'class' => Property::class,
            'choice_label' => 'name',
            'placeholder' => '',
            'expanded' => true,
            'multiple' => true,
            'required' => false,
        ]
    );

最后,视图文件:

{% for categoryName, items in properties %}
    <h2>{{ categoryName }}</h2>

    <ul>
        {% for property in items %}  
            <li>
                <input type="checkbox"
                       name="{{ form.properties.vars.full_name }}[]"
                       value="{{ property.id }}"
                       id="{{ form.properties.vars.id }}_{{ property.id }}">
                <label for="{{ form.properties.vars.id }}_{{ property.id }}">
                    {{ property.name }}
                </label>
            </li>
        {% endfor %}
    </ul>
{% endfor %}

{% do form.properties.setRendered %}

(我在视图中省略了“checked”和“children”部分)

然而,就我而言,这种解决方案并不理想。我宁愿摆脱在视图中手动生成<input...> - 我宁愿使用一些辅助函数。

无论如何,这是我的问题的某种低级解决方案。希望有所帮助。