我正在使用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
}
我觉得我错过了什么。
感谢您的帮助!
答案 0 :(得分:4)
当您致电render(controller('your_route'))
时,您实际上正在提出子请求,这意味着行李被清空参数,因此您的请求不会被表单“处理”。
如果您使用的是2.4+,则可以使用..
从请求堆栈中获取主请求/** @var \Symfony\Component\HttpFoundation\RequestStack $requestStack */
$requestStack = $this->get('request_stack');
$masterRequest = $requestStack->getMasterRequest();
然后你可以在渲染的控制器中处理该请求,而不是当前(子)请求,如..
$form->handleRequest($masterRequest);
答案 1 :(得分:0)
在你的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);