Symfony 2 - 搜索表单的不同字段而不是列表

时间:2015-06-09 22:00:53

标签: php forms symfony

我有一个项目的三个实体:书籍,作者和主题。有关信息,作者和主题与Book in Many to One / One to Many相关联。一本书有一个或多个作者和一个或多个主题。 我已经为基本功能(添加,编辑和删除)和默认视图/表单生成了关于这些的问题。

但我需要做一些功能搜索,确切地说是三个:

  • 使用标题的一部分搜索书籍
  • 使用一位作者搜索图书
  • 使用一个或多个主题搜索图书。

我对这三个函数进行了编码并且运行良好,但我对搜索表单中使用的字段存在疑问。

第一个是正确的,它显示了一个输入字段,我们把标题和书籍列表的结果正确但另外两个......

由于关系,字段是用户选择项目并搜索它的下拉列表,结果是正确的但我希望第二个有一个输入字段用于搜索作者姓名和最后一个显示复选框所以我我做过研究,但我无法理解为什么在我的表格类型中,我无法改变我想要的那种领域。

这是我的两个表单类型:

使用一个作者搜索:我只想显示输入字段而不是列表,但每次都会出现错误

<?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';
}

}

使用一个或多个主题搜索图书:我尝试通过链接主题显示chechbox&#39;数组到复选框的结果,但也不起作用。

<?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));
}

1 个答案:

答案 0 :(得分: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]);
}

在您的操作中捕获来自网址的值,将其传递给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);

    ...
}