当表单在单独的树枝中呈现时如何访问表单输入?
How to access a form input when the form is rendered in a separate twig?
我想在我的导航栏中创建一个搜索栏,这样就可以简单地在我的页面上搜索用户。
我有一个 base.html.twig
,其中定义了导航栏、页眉、页脚等,以使我的所有页面具有相同的布局。然后我有每个子页面,例如a profile.html.twig
,它定义了页面的实际内容。
我想在导航栏中包含一个搜索行,所以我阅读了有关嵌入控制器的内容,这对我来说似乎是个完美的主意。所以我创建了一个 SearchForm
class,它构建了一个带有 FormBuilderInterface
的表单,如下所示:
class SearchForm extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('searched_name')
;
}
}
然后我创建了一个 SearchController
,它将包含提交搜索表单时应该发生的事情的逻辑,并且应该 return 呈现表单。
class SearchController extends AbstractController
{
/**
* @param Request $request
*
* @return Response|RedirectResponse
*
* @Route("/search", name="search", methods={"GET","POST"})
*/
public function renderSearch(Request $request) {
$form = $this->createForm(SearchForm::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
return $this->redirectToRoute('ping');
//TODO: Implement search logic
}
return $this->render('searchForm.html.twig', [
'form' => $form->createView()
]);
}
}
我想,我现在可以简单地继续让搜索表单呈现在 base.html.twig
:
<div class="topnav" id="navbar">
<a href="/start">Startseite</a>
<a href="/overview">Übersicht</a>
<a href="/about">Über uns</a>
{{ render(url('search')) }}
<a href="/profile" style="float:right">
{% if app.user %}
{{ app.user.username }}
{% else %}
Mein Profil
{% endif %}
</a>
</div>
它确实被渲染了,但问题是,一旦我按 Enter 键提交带有搜索输入的表单,POST
请求就不会发送到 searchController
,但是无论哪个控制器负责处理,比方说,配置文件页面。
我想它必须对在那里呈现的整个网站做一些事情,因为我只是继承了我所有其他页面中的 base.html.twig
,所以提交请求被发送到那里。我通过直接调用搜索路由来测试它,它完全可以正常工作。
如何在每个站点上制作此模板,而不必在每个控制器中重新实现搜索逻辑? (毕竟,这就是这个基地的目的......)
首先你可以(当然)设置表单的动作属性。按照此 link 了解如何操作:https://symfony.com/doc/4.2/form/action_method.html
但是由于您在网站的每个页面上都显示了表单,因此您应该问问自己是否要在提交表单后将用户重定向到其他页面。答案可能是肯定的,也可能不是,但如果不是,那么您就有机会使用 AJAX 提交。
我想在我的导航栏中创建一个搜索栏,这样就可以简单地在我的页面上搜索用户。
我有一个 base.html.twig
,其中定义了导航栏、页眉、页脚等,以使我的所有页面具有相同的布局。然后我有每个子页面,例如a profile.html.twig
,它定义了页面的实际内容。
我想在导航栏中包含一个搜索行,所以我阅读了有关嵌入控制器的内容,这对我来说似乎是个完美的主意。所以我创建了一个 SearchForm
class,它构建了一个带有 FormBuilderInterface
的表单,如下所示:
class SearchForm extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('searched_name')
;
}
}
然后我创建了一个 SearchController
,它将包含提交搜索表单时应该发生的事情的逻辑,并且应该 return 呈现表单。
class SearchController extends AbstractController
{
/**
* @param Request $request
*
* @return Response|RedirectResponse
*
* @Route("/search", name="search", methods={"GET","POST"})
*/
public function renderSearch(Request $request) {
$form = $this->createForm(SearchForm::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
return $this->redirectToRoute('ping');
//TODO: Implement search logic
}
return $this->render('searchForm.html.twig', [
'form' => $form->createView()
]);
}
}
我想,我现在可以简单地继续让搜索表单呈现在 base.html.twig
:
<div class="topnav" id="navbar">
<a href="/start">Startseite</a>
<a href="/overview">Übersicht</a>
<a href="/about">Über uns</a>
{{ render(url('search')) }}
<a href="/profile" style="float:right">
{% if app.user %}
{{ app.user.username }}
{% else %}
Mein Profil
{% endif %}
</a>
</div>
它确实被渲染了,但问题是,一旦我按 Enter 键提交带有搜索输入的表单,POST
请求就不会发送到 searchController
,但是无论哪个控制器负责处理,比方说,配置文件页面。
我想它必须对在那里呈现的整个网站做一些事情,因为我只是继承了我所有其他页面中的 base.html.twig
,所以提交请求被发送到那里。我通过直接调用搜索路由来测试它,它完全可以正常工作。
如何在每个站点上制作此模板,而不必在每个控制器中重新实现搜索逻辑? (毕竟,这就是这个基地的目的......)
首先你可以(当然)设置表单的动作属性。按照此 link 了解如何操作:https://symfony.com/doc/4.2/form/action_method.html
但是由于您在网站的每个页面上都显示了表单,因此您应该问问自己是否要在提交表单后将用户重定向到其他页面。答案可能是肯定的,也可能不是,但如果不是,那么您就有机会使用 AJAX 提交。