2014-11-09 2 views
2

여러 기준으로 검색 양식을 만들려고하는데 작동하지 않으며 페이지를 다시 제출하기 만하면 페이지가 다시로드되기 때문에 컨트롤러가 양식을받지 못한다고 생각합니다. 여러 기준, Symfony2로 양식 검색

컨트롤러

/** 
* @ParamConverter("agence", options={"mapping": {"agence_slug":"slug"}}) 
*/ 
public function indexAction(Agence $agence, Request $request) 
{ 

    $form = $this->createForm(new SearchTravelType()); 

    $request = $this->getRequest(); 

    $em = $this->getDoctrine()->getManager(); 

    if ($request->getMethod() == 'POST') 
    { 
     $form->bind($request); 

     if ($form->isValid()) 
     { 
      $criteria = $form->getData(); 
      $listTravels = $em->getRepository('ProjectTravelBundle:Travel')->getListBy($criteria, $agence); 

     } 
    } 

    $listTravels = $em->getRepository('ProjectTravelBundle:Travel')->findByAgence($agence); 

    return $this->render('ProjectDashboardBundle:Travel:index.html.twig', 
    array(
     'listTravels' => $listTravels, 
     'agence' => $agence, 
     'form' => $form->createView() , 
    )); 
} 

이며, 이는 queryBuilder

class TravelRepository extends EntityRepository 
{ 

public function getListBy($criteria, $agence) 
{ 
    $qb = $this->createQueryBuilder('t'); 
    $qb = $this->whereAgence($qb, $agence); 
    $qb ->leftJoin('t.airport', 'a') 
     ->addSelect('a'); 

    foreach ($criteria as $field => $value) { 
     if (!$this->getClassMetadata()->hasField($field)) { 
      // Make sure we only use existing fields (avoid any injection) 
      continue; 
     } 

     $qb ->andWhere($qb->expr()->eq('t.'.$field, ':t_'.$field)) 
      ->setParameter('t_'.$field, $value); 
    } 

    return $qb->getQuery()->getResult(); 
} 

public function whereAgence (\Doctrine\ORM\QueryBuilder $qb, $agence) 
{ 
    $qb->where('a.agence = :agence') 
     ->setParameter('agence', $agence); 

    return $qb; 
} 

} 

이며,이

<form class="form-horizontal" role="form" method="post" > 
    <td>{{ form_widget(form.id) }}</td> 
    <td class="center">-</td> 
    <td>{{ form_widget(form.title) }}</td> 
    <td>{{ form_widget(form.country) }}</td> 
    <td>{{ form_widget(form.destination) }}</td> 
    <td>{{ form_widget(form.airport) }}</td> 
    <td>{{ form_widget(form.departureDate) }}</td> 
    <td>{{ form_widget(form.returnDate) }}</td> 
    <td>{{ form_widget(form.price) }}</td> 
    <td>{{ form_widget(form.enabled) }}</td> 
    <td><span class="input-group-btn"> 
    <button type="submit" class="btn btn-purple btn-sm">Search 
    <i class="icon-search icon-on-right bigger-110"></i></button> 
    </span> 
</form> 

내가 생각 페이지 나뭇 가지와 양식입니다 첫 프로 blem 양식 컨트롤러에서 회복되지 않는 것입니다, 내가주는 것을보고 대신

$listTravels = $em->getRepository('ProjectTravelBundle:Travel')->find(1); 

getListBy($criteria, $agence) 

로했습니다. 컨트롤러는 양식을 무시하고 당신이 작업에 요청 객체를 전달하는 것처럼 행동에서 $request = $this->getRequest();을 제거 할 수있는 다음과 같은 쿼리

$listTravels = $em->getRepository('ProjectTravelBundle:Travel')->findByAgence($agence); 

답변

2
  1. 로 직접 이동; 당신은 양식에 작업을 추가 할 필요가
  2. ,이 같은

:

<form class="form-horizontal" role="form" method="post" action="{{ path('ROUT') }}" > 

편집 :

우리는을 만들

$this->createForm(new SearchTravelType(), null, [ 
    'action' => $this->generateUrl('ROUT') 
]); 

또는 같은

GET 메서드를 사용하여 필터 양식 (POST를 사용해야합니다. 결과를 가져 오는 것이 아니라 DB에 삽입하는 방법) CSRF 보호를 비활성화하십시오.

public function indexAction(Agence $agence, Request $request) 
{ 

    $form = $this->createForm(new SearchTravelType(), null, [ 
     'action' => $this->generateUrl('ROUTE'), 
     'method' => 'GET' 
    ]); 

    $form->handleRequest($request); 

    if ($form->isValid()) 
    { 
     $em = $this->getDoctrine()->getManager(); 

     $criteria = explode('&', $request->query->get($form->getName())); // I didn't test this line, you should check it.. 

     $listTravels = $em->getRepository('ProjectTravelBundle:Travel')->getListBy($criteria, $agence); 

     // Terminate the request 
     return $this->render('ProjectDashboardBundle:Travel:index.html.twig', 
     array(
      'listTravels' => $listTravels, 
      'agence' => $agence, 
      'form' => $form->createView() , 
     )); 
    } 

    $listTravels = $em->getRepository('ProjectTravelBundle:Travel')->findByAgence($agence); 

    return $this->render('ProjectDashboardBundle:Travel:index.html.twig', 
    array(
     'listTravels' => $listTravels, 
     'agence' => $agence, 
     'form' => $form->createView() , 
    )); 
} 
+0

작동하지 않습니다. :/ – hous

+0

@hous 어떤 버전을 사용하고 있습니까? – xurshid29

+0

symfony 2.5 버전 – hous

1

당신은이 번들을 시도 할 수 있습니다 : 다중 기준이 교리 엔티티에서 검색을 위해

https://github.com/petkopara/PetkoparaMultiSearchBundle

양식이나 서비스를 제공합니다 우리는 컨트롤러 액션을 만듭니다.단지 단지에서 다음 코드

public function indexAction(Request $request) 
{ 
    $search = $request->get('search'); 
    $em = $this->getDoctrine()->getManager(); 
    $queryBuilder = $em->getRepository('ProjectTravel:Travel')->createQueryBuilder('e'); 
    $filterForm = $this->createForm('ProjectTravelBundle\Form\TravelType'); 

    // Bind values from the request 
    $filterForm->handleRequest($request); 

    if ($filterForm->isValid()) { 
     // Build the query from the given form object 
     $queryBuilder = $this->get('petkopara_multi_search.builder')->searchForm($queryBuilder, $filterForm->get('search')); 
    } 

    .. 
} 

를 추가하려면 컨트롤러에서 그런 다음 MultiSearchType

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('search', MultiSearchType::class, array(
      'class' => 'ProjectTravelBundle:Travel')); 
} 

를 추가 할 양식 유형

첫째, 귀하의 경우 형태의 솔루션으로 문제를 해결할 수 마지막으로 템플릿의 여행 양식을 렌더링하십시오.

{{form_render(filter_form)}}