在Symfony 2中将combox创建为查找字段

时间:2015-12-07 21:10:07

标签: symfony

我用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,
          ));
    }
}

有了它,我可以渲染一个选择输入。也许,这不是必要的,但最终 我不知道,如何把各个部分放在一起。

1 个答案:

答案 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