@dev2expert

Symfony2: как в форме сделать выбор через модальное окно?

Есть документ с формой, в которой есть поле с выбором пользователя.
Связь один ко многим(один пользователь может быть выбран в разных документах).

Список пользователей можно вывести в виде селекта или набором чек-боксов, но если их будет больше 10, то это уже не удобно, не говоря уже о числах большего порядка.

Подскажите как лучше реализовать выбор пользователя, например через модальное окно с listview пользователей, которое будет открываться по клику на кнопку?

Пока у меня идея только скрывать текущее поле Пользователь, но просто так его не скрыть, видимо придется возиться с
->add('user', 'hidden',array('mapped' => false))
а дальше делать свое кастомное и в него с помощью js подгружать выбранного, а потом уже в контроллере из этого поля копировать значение в поле Пользователя и делать запись в БД, но тогда возникает проблема с отображением выбранного пользователя при открытии формы на редактирование.

Может быть есть какой-то стандартный механизм или же нечто подобное, что можно переписать.

UPD:
Видимо не совсем ясно выразился, к админке это не имеет никакого отношения, есть сущность документ, которая была создана при помощи CRUD, формы немного подправлены и в таком варианте они работают, но интерфейс выбора - селект:

public function buildForm(FormBuilderInterface $builder, array $options){
        $builder
            ->add('created_date')
            ->add('period')
            ...
            ->add('contact')
            ->add('assigned_user')
        ;
 }

Вызывается это контроллере для сущности в цепочке:

public function editAction($id){
    $em = $this->getDoctrine()->getManager();
    $entity = $em->getRepository('MyBundle:Documents')->find($id);
    if (!$entity) {
        throw $this->createNotFoundException('Unable to find Sales entity.');
    }
    $editForm = $this->createEditForm($entity);
    $deleteForm = $this->createDeleteForm($id);
    return $this->render('MyBundle:My:edit.html.twig', array(
        'entity'      => $entity,
        'edit_form'   => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),
    ));
}

private function createEditForm(Documents $entity){
    $form = $this->createForm(new MyType(), $entity, array(
        'action' => $this->generateUrl('my_update', array('id' => $entity->getId())),
        'method' => 'PUT',
    ));
    $form->add('submit', 'submit', array('label' => 'Update'));
    return $form;
}


Тут все было сделано при помощи CRUD, логика не менялась.

Суть задачи в том, чтобы можно было выбирать пользователей и контакты в модальном окне, а не через предлагаемые по умолчанию селект/ чекбоксы.
  • Вопрос задан
  • 948 просмотров
Решения вопроса 1
@dev2expert Автор вопроса
Воспользовался предложение skynetdev, модальные окна в моем случае вправду будут лишними.
Использовал PUGXAutocompleterBundle, но пришлось переписать метод поиска:
public function searchMyAction(Request $request){
  $q = $request->get('term');
  $em = $this->getDoctrine()->getManager();
  $contacts = $em->getRepository('MyBundle:Contacts')->findByLikePhoneMobile($q);
  $results = array();
  foreach ($contacts as $contact) {
    $results[] = array(
      'id' => $contact->getId(),
      'phone' => $contact->getPhoneMobile(),
      'label' => sprintf("%s", $contact->getName())
    );
  };
  return new JsonResponse($results);
}

т.к. тот что в документации выдавал ошибку:
The controller must return a response (Array(result => Array()) given).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@skynetdev

Список пользователей можно вывести в виде селекта или набором чек-боксов, но если их будет больше 10, то это уже не удобно, не говоря уже о числах большего порядка.
Подскажите как лучше реализовать выбор пользователя, например через модальное окно с listview пользователей, которое будет открываться по клику на кнопку?


Лучший механизм когда вы предполагаете что пользователей будет слишком много а выбрать пользователя в простом селекте будет сложно
это стандартный механизм под названием Autocomplete который в симфони можно реализовать
Ответ написан
Комментировать
lexxpavlov
@lexxpavlov
Программист, преподаватель
используйте тип sonata_type_model_list
https://sonata-project.org/bundles/doctrine-orm-ad...

Просто поставьте тип поля sonata_type_model_list и всё:
->add('user', 'sonata_type_model_list')
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы