以symfony 2形式显示集合,其中包含来自外表的数据

时间:2015-02-17 15:02:38

标签: forms symfony collections twig symfony-forms

我是symfony的新手,我找不到有关以正确方式显示表单的问题的解决方案。

我有三张桌子:活动,存在和人

desc activities;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| start    | datetime     | NO   |     | NULL    |                |
| stop     | datetime     | YES  |     | NULL    |                |
| activity | varchar(100) | NO   |     | NULL    |                |
| location | varchar(45)  | NO   |     | NULL    |                |
| event_id | int(11)      | YES  | MUL | NULL    |                |
+----------+--------------+------+-----+---------+----------------+

desc presences;
+-------------+----------------------------------------------+------+-----+---------+-------+
| Field       | Type                                         | Null | Key | Default | Extra |
+-------------+----------------------------------------------+------+-----+---------+-------+
| activity_id | int(11)                                      | NO   | PRI | NULL    |       |
| person_id   | int(11)                                      | NO   | PRI | NULL    |       |
| status      | enum('afwezig','aanwezig','verontschuldigd') | NO   | PRI | afwezig |       |
+-------------+----------------------------------------------+------+-----+---------+-------+

desc persons;
+---------------+----------------+------+-----+-------------------+-----------------------------+
| Field         | Type           | Null | Key | Default           | Extra                       |
+---------------+----------------+------+-----+-------------------+-----------------------------+
| id            | int(11)        | NO   | PRI | NULL              | auto_increment              |
| firstname     | varchar(20)    | YES  |     | NULL              |                             |
| name          | varchar(30)    | YES  |     | NULL              |                             |

+ --------------- + ---------------- + ------ + ----- + ------------------- + ----------------------------- +

我创建了2个formtypes 一个活动

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add(
                'start',
                'datetime',
                array(
                    'label' => 'Start'

                )
            )
            ->add(
                'stop',
                'datetime',
                array(
                    'label' => 'Stop'

                )
            )
            ->add('activity', 'text', array('label' => 'Naam'))
            ->add('location', 'text', array('label' => 'Locatie'))
            ->add(
                'presences',
                'collection',
                array(
                    'type' => new PresencesType()
                )
            )
            ->add('save', 'submit', array('label' => 'Aanpassen'));
    }

用于显示特定活动的存在

  public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add(
                    'persons',
                    'entity',
                    array(
                        'class' => 'KHOSAdminBundle:Persons',
                        'label' => false,
                        'property' => 'fullname',
                        'read_only' => true,
                        'disabled' =>true
                    )
                )
                ->add(
                    'status',
                    'choice',
                    array(
                        'label' => false,
                        'multiple' => false,
                        'expanded' => true,
                        'choices' => array(
                            'afwezig' => 'afwezig',
                            'aanwezig' => 'aanwezig',
                            'verontschuldigd' => 'verontschuldigd'
                        )
                    )
                );
        }

使用twig我可以渲染它,以便显示活动的详细信息并显示在场列表下方。

{% for presence in form_activity.presences %}
   <div class="row">
       <div class="col-md-4">
         {{ form_row(presence.persons) }}
       </div>
       <div class="col-md-6">
          {{ form_row(presence.status, { 'style': 'inline' }) }}
       </div>
    </div>
{% endfor %}

然而,所有人都是下拉列表,加载需要很长时间。 但我不想要那个

我只想了解活动的详细信息,并在下面列出所有具有放射性按钮状态的人员

Start: <<inputfield>>   Stop: <<inputfield>>
location: <<inputfield>>

firstname1 name1 : O afwezig  O  aanwezig  O verontschuldigd
firstname2 name2 : O afwezig  O  aanwezig  O verontschuldigd
firstname3 name3 : O afwezig  O  aanwezig  O verontschuldigd
firstname4 name4 : O afwezig  O  aanwezig  O verontschuldigd

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

正如我在评论中建议的那样,您应该使用不使用entity字段的自定义类型(您不希望能够编辑Presence实例中包含的Person) ,这意味着你不想要firstName和lastName字段。)

这是php部分:

<?php

namespace Demo {
    class Activity
    {
        protected $id;
        protected $start;
        protected $stop;

        /** @var Presence[] */
        protected $presences = [];

        // ...
    }

    class Presence {
        /** @var Activity */
        protected $activity;
        /** @var Person */
        protected $person;
        protected $status;

        // ...
    }

    class Person {
        protected $firstName;
        protected $lastName;
        /** @var Presence[] */
        protected $presences;

        // ...
    }

    class ActivityType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('start')
                ->add('stop')
                ->add('location')
                ->add('presences', 'collection', [
                    'type' => new PresenceType(),
                ])
            ;
        }

        public function getName()
        {
            return 'activity';
        }
    }

    class PresenceType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('status', 'choice', [
                    'multiple' => true,
                    'expanded' => false,
                    'choices' => [
                        'afwezig' => 'afwezig',
                        'aanwezig' => 'aanwezig',
                        'verontschuldigd' => 'verontschuldigd'
                    ]
                ])
            ;
        }

        public function getName()
        {
            return 'presence';
        }
    }
}

树枝形式主题(可能需要进行一些调整才能实际工作,但想法是定义在调用form_row(窗体)时窗体是如何呈现的,而窗体是PresenceType视图实例):

{% block presence_row %}
    {{ form.vars.data.user.firstName }} {{ form.vars.data.user.lastName }} {{ form_widget(form) }}
    # form.vars.data contains the Presence instance
{% endblock %}

正如您所看到的,我使用表单主题来显示Person的firstName和lastName,而我还没有在PresenceType类中添加它,因为我不需要firstName和lastName输入字段。