我是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
有人可以帮助我吗?
答案 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输入字段。