Я разрабатываю блог в symfony, и я застрял в формах, которые встроены в макет. В моем случае простая форма поиска.
<div class="b-header-block m-search"> {{ render(controller('YagoQuinoySimpleBlogBundle:Blog:searchArticles')) }} </div>
Чтобы отобразить форму, я использую встроенный контроллер внутри файла ветви макета.
public function searchArticlesAction(Request $request) { $form = $this->createForm(new SearchArticlesType()); $form->handleRequest($request); if ($form->isValid()) { // Do stuff here } return $this->render('YagoQuinoySimpleBlogBundle:Blog:searchArticles.html.twig', array( 'form' => $form->createView() )); }
IndexAction – это тот, который извлекает данные формы и фильтрует список статей.
public function indexAction(Request $request) { $form = $this->createForm(new SearchArticlesType()); $form->handleRequest($request); if ($form->isValid()) { $data = $form->getData(); $criteria = array( 'title' => $data['search'] ); } else { $criteria = array(); } $articles = $this->getDoctrine()->getRepository('YagoQuinoySimpleBlogBundle:Article')->findBy($criteria, array( 'createDateTime' => 'DESC' ), 5); return $this->render('YagoQuinoySimpleBlogBundle:Blog:index.html.twig', array('articles' => $articles)); }
SearchArticlesType – это класс формы
class SearchArticlesType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('search', 'text', array( 'constraints' => new NotBlank() )) ->add('submit', 'submit', array( 'label' => 'Buscar' )); } public function getName() { return 'searchArticles'; } }
Проблема возникает, когда я отправляю эту форму. IndexAction делает свою часть, проверяя форму и фильтруя статьи, но когда контроллер встраивания пытается проверить данные (только для отображения информации или чего-то еще)
$form->handleRequest($request); if ($form->isValid()) { // Do stuff here }
Я чувствую, что что-то упускаю.
Спасибо за помощь!
Когда вы вызываете render(controller('your_route'))
вы фактически делаете запрос sub, который означает, что пакеты параметров опустели, поэтому ваш запрос не обрабатывается формой.
Если вы используете 2.4+, вы можете получить главный запрос из стека запросов, используя ..
/** @var \Symfony\Component\HttpFoundation\RequestStack $requestStack */ $requestStack = $this->get('request_stack'); $masterRequest = $requestStack->getMasterRequest();
И тогда вы можете обрабатывать этот запрос в вашем обработанном контроллере в отличие от текущего (вспомогательного) запроса, например ..
$form->handleRequest($masterRequest);
В вашем: public function searchArticlesAction(Request $request)
вам не хватает второго аргумента при создании формы
$searchArticle = new SearchArticle(); // I assume this is how you named the Entity, if not just change the entity name $form = $this->createForm(new SearchArticlesType(), $article);