2015-12-07 2 views
0

Создайте свое первое простое приложение с symfony 2 и создайте combobox для поля поиска.Создайте combox как поле поиска в 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 класс преобразует идентификатор местоположения в текстовое поле.

Вот шаблон HTML:

<div class="row"> 
    <!-- other fields go here --> 
    <div class="small-2 columns">{{ form_row(appointment.location) }}</div> 
</div> 

Это все работает отлично. Я могу создать встречи, заполняющие текстовое поле местоположения, с действительным идентификатором. Позже местоположения будут просто небольшим количеством, поэтому Я бы хотел, чтобы имел поле combobox или dropdown, которое показывает все доступные места, и я могу выбрать один.

Я также создал простой контроллер местоположения, который дает мне список всех мест:

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

Просто используйте 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.
Ссылки:
entity field type;
select2 examples page

+0

Спасибо, я знал, что это может быть так просто, но мой поиск не нашел подсказки в этом направлении. – Mik

+0

Без проблем, человек! :) –

Смежные вопросы