我用symfony 2创建了我的第一个简单的应用程序,并通过创建一个组合框来挣扎 查找字段。
该应用程序包含具有位置的约会。每次预约 可以有一个位置,这些位置与所有约会共享。
这是我目前的工作:
class Appointment
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
// other fields here
/**
* @ORM\ManyToOne(targetEntity="Location")
* @ORM\JoinColumn(name="location_id", referencedColumnName="id")
*/
private $location;
// more stuff here
}
/**
* Location
*
* @ORM\Table()
* @ORM\Entity
*/
class Location
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
// other fields here
}
然后,我为我的类创建了类型:
class AppointmentType extends AbstractType
{
...
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// other field here
->add('location', 'text')
;
$builder->get('location')
->addModelTransformer(new LocationToNumberTransformer($this->manager));
}
...
}
LocationToNumberTransformer
类将位置ID转换为文本字段。
这是html模板:
<div class="row">
<!-- other fields go here -->
<div class="small-2 columns">{{ form_row(appointment.location) }}</div>
</div>
一切正常。我可以创建填充位置文本字段的约会 有效的身份证。以后这些地点只是少数,所以我想 有一个组合框或下拉字段显示所有可用的位置,我可以 选择一个。
我还创建了一个简单的位置控制器,它为我提供了所有位置的列表:
class LocationsController extends Controller
{
public function activeLocationsAsChoiceAction(Request $request, $selectedId = -1) {
$em = $this->getDoctrine()->getManager();
$locations = $em->createQuery('SELECT l FROM AppBundle:Location l')->execute();
return $this->render('locations/active_list_as_choice.html.twig', array(
'locations' => $locations,
'selected_id' => $selectedId,
));
}
}
有了它,我可以渲染一个选择输入。也许,这不是必要的,但最终 我不知道,如何把各个部分放在一起。
答案 0 :(得分:0)
只需使用entity
字段类型:
->add('location', 'entity', array(
'class' => 'Class\Namespace\Location',
'property' => 'name',
'label' => 'choice_field_label',
'query_builder' => function(EntityRepository $er) {
return $er->findAllLocationsForAppointmentForm();
//Where findAllLocationsForAppointmentForm is the name of method in your
//locationsRepo which returns queryBuilder,
//instead of this you could just write your custom query like
//$qb = $er->createQueryBuilder('l');
//$qb->andWhere(...);
//return $qb;
}
))
如果您在选择字段中需要搜索功能,那么您可以实现像select2
jQuery lib这样的smth。
的链接强>:
entity
field type;
select2
examples page