我的Symfony2项目中有两个实体“User”和“Team”。 用户可以拥有多个团队,团队可以拥有多个用户。
我现在将球员添加到球队的方式是通过选择框(包含数据库中的所有用户),用户可以选择多个用户,然后单击“保存”将其插入数据库。
我想要两个文本框而不是选择框,因为我不希望登录用户能够看到所有可用的用户(特别是当这个框会变得很长时)
我该怎么做? 所以,2个文本框(我将添加一个jquery自动完成器)和一个保存按钮,将2个用户添加到团队中。
THX。
编辑:
<?php
namespace Tennisconnect\DashboardBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
class TeamType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('player_one', 'text', array('property_path' => false))
->add('player_two', 'text', array('property_path' => false))
;
}
public function getName()
{
return 'team';
}
public function getDefaultOptions(array $options)
{
return array('data_class' => 'Tennisconnect\DashboardBundle\Entity\Team');
}
}
ChallengeType:
<?php
namespace Tennisconnect\DashboardBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
class ChallengeType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('teams', 'collection', array(
'type' => new TeamType(),
'allow_add' => true
))
->add('place')
->add('date');
}
public function getName()
{
return 'challenge';
}
public function getDefaultOptions(array $options)
{
return array('data_class' => 'Tennisconnect\DashboardBundle\Entity\Challenge');
}
}
答案 0 :(得分:1)
删除与用户相关的字段,并向TeamType
添加两个未绑定的字段,例如
$builder->add('new_member_1', 'text', array('property_path' => false))
->add('new_member_2', 'text', array('property_path' => false));
这将在您呈现的表单中显示两个文本字段。然后在控制器中编写一些读取这些字段的逻辑,提取用户并将其添加到您的团队中。
// ... controller action
// first bind request
$form->bindRequest($request);
if ($form->isValid()) {
// fetch first username
$username = $form->get('new_member_1')->getData();
$user = $this->getDoctrine()->getRepository('YourBundle:User')->findOneByUsername($username);
$team->addUser($user);
// same for second user
}
这是一个简约的例子。因此,您需要添加一些验证,错误处理等,但它会显示它可能对您有用。
修改强>
如果您有嵌套的表单类型,则可以通过向您的孩子下载路径来遍历这些元素。
$form->get('outer_type')->get('team_type')->get('new_member_1')->getData();
答案 1 :(得分:1)
这是我从集合中获取数据的方式:
foreach($form->get('teams') as $team_form)
{
$player_one = $team_form->get('player_one')->getData();
$player_two = $team_form->get('player_two')->getData();
}