2015-06-09 2 views
2

У меня есть три объекта для проекта: Book, Author and Theme. Для информации автор и тема связаны с книгой от многих к одному/одному. В книге есть один или несколько авторов и одна или несколько тем. И я сгенерировал краткий обзор тезисов для основных функций (добавить, отредактировать и удалить) и по умолчанию представления/формы.Symfony 2 - Различает поля для формы поиска, чем список

Но мне нужно сделать некоторые функции поиска, три точно:

  • Поиска книги с частью Поиска книг Названия
  • с одним Автором
  • Поиска книг с одним или более Темой.

Я закодировал три функции и работал хорошо, но у меня есть проблема с полями, используемыми в формах поиска.

Первый является правильным, это показывает поле ввода, где мы помещаем название и список книг, как результат является правильным, но два другими ...

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

Вот мои две формы Тип:

Поиск с одним Автор: Я просто хочу, чтобы отобразить поле ввода, а не список, но получаю ошибку каждый раз, когда

<?php namespace Projet\BibliothequeBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class BookByAuthorType extends AbstractType 
{ 
    /** 
* @param FormBuilderInterface $builder 
* @param array $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('authors') 
    ; 
} 

/** 
* @param OptionsResolverInterface $resolver 
*/ 
public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Projet\BibliothequeBundle\Entity\Book' 
    )); 
} 

/** 
* @return string 
*/ 
public function getName() 
{ 
    return 'authors'; 
} 

} 

Поиск книги с одним или несколькими Theme : Я попытался отобразить chechbox, связав массив «тем» с результатом, но не работает.

<?php namespace Projet\BibliothequeBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class BookByThemeType extends AbstractType 
{ 
    /** 
* @param FormBuilderInterface $builder 
* @param array $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    // $themes = array(); 
    // $themes=$builder->add('themes'); 
    $builder 
     ->add('themes', 'choice', [ 
      'choices' => 'themes', 
      'multiple' => true, 
      'expanded' => true 
     ]) 
    ; 
} 

/** 
* @param OptionsResolverInterface $resolver 
*/ 
public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Projet\BibliothequeBundle\Entity\Book' 
    )); 
} 

/** 
* @return string 
*/ 
public function getName() 
{ 
    return 'themes'; 
} 
} 

ОБНОВЛЕНИЕ: мои функции BookController, возможно, являются причиной моих проблем.

// AUTHOR SEARCH FUNCTIONS 
public function SearchByAuthorAction() { 
    $entity = new Book(); 
    $form = $this->CreateSearchAuthorForm($entity); 
    return $this->render('ProjetBibliothequeBundle:Book:searchbyauthor.html.twig', array( 
     'form' => $form->createView(), 
    )); 
} 

private function CreateSearchAuthorForm(Book $entity) { 
    $form = $this->createForm(new BookByAuthorType(), $entity, array(
     'action' => $this->generateUrl('book_submit_search_by_author'), 
     'method' => 'POST', 
    )); 

    $form->add('submit', 'submit', array('label' => 'Search')); 

    return $form; 
} 

public function SubmitSearchByAuthorAction(Request $request) { 
    $entity = new Book(); 
    $form = $this->CreateSearchAuthorForm($entity); 
    $form->handleRequest($request); 

    $author = $form->get('authors')->getData(); 

    $repository = $this->getDoctrine() 
         ->getEntityManager() 
         ->getRepository('ProjetBibliothequeBundle:Book'); 
    $Booklist = $repository->findByAuthor($author); 

    return $this->render('ProjetBibliothequeBundle:Book:resultbyauthor.html.twig', 
         array('Booklist' => $Booklist)); 
} 

//THEME SEARCH FUNCTIONS 
public function SearchByThemeAction() { 
    $entity = new Book(); 
    $form = $this->CreateSearchThemeForm($entity); 
    return $this->render('ProjetBibliothequeBundle:Book:searchbytheme.html.twig', array( 
     'form' => $form->createView(), 
    )); 
} 

private function CreateSearchThemeForm(Livre $entity) { 
    $entities = $this->getDoctrine()->getManager()->getRepository('ProjetBibliothequeBundle:Book')->findAll(); 
    $form = $this->createForm(new BookByThemeType(), $entity, array(
     'action' => $this->generateUrl('book_submit_search_by_theme'), 
     'method' => 'POST', 
    )); 

    $form->add('submit', 'submit', array('label' => 'Search')); 

    return $form; 
} 

public function SubmitSearchByThemeAction(Request $request) { 
    $entity = new Book(); 
    $form = $this->CreateSearchThemeForm($entity); 
    $form->handleRequest($request); 

    $theme = $form->get('themes')->getData(); 

    $repository = $this->getDoctrine() 
         ->getEntityManager() 
         ->getRepository('ProjetBibliothequeBundle:Book'); 
    $Booklist = $repository->findByTheme($theme); 

    return $this->render('ProjetBibliothequeBundle:Book:resultbytheme.html.twig', 
         array('Booklist' => $Booklist)); 
} 

ответ

0

Там нет необходимости устанавливать data_class для GET операций. Просто создайте основную форму, может быть, как это:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('themes', 'choice', [ 
      'choices' => 'themes', 
      'multiple' => true, 
      'expanded' => true 
     ]) 
    ; 
} 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(['method' => 'GET', 'csrf_protection' => false]); 
} 

в ваших действий значений вылова URL, передать их findBy методу или вручную построить вы запрашиваете:

public function someAction(Request $request) 
{ 
    ... 

    $form->createForm(new FORM_TYPE, null); 

    .... 

    $filters = $request->query->get($form->getName()); 

    $result = $entityManager->getRepository(REPOSITORY)->findBy($filters, $orderBy, $limit, $offset); 

    ... 
} 
+0

У меня есть ошибка: "Catchable Неустранимая ошибка: аргумент 1 передан в Symfony \ Component \ Form \ Extension \ Core \ ChoiceList \ SimpleChoiceList :: __ construct() должен быть из массива типа, строки, указанной в /.../symfony/vendor/symfony/symfony/ src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php в строке 172 и определен в /.../symfony/vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Core/ChoiceList/ Строка JustChoiceList.php 45 " – Tenebros

+0

Да, я использую три метода в BookRepository, которые являются FindByTitle, FindByThemes и FindByAuthors. – Tenebros

+0

Я обновил свой пост с помощью моих функций BookController. – Tenebros

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