如何在我的树枝模板中调用服务以使用 Symfony 2 创建表单

How to call a service in my twig template to create a form with Symfony 2

我正在制作菜单,我想让它尽可能成为最好的方式。有问题的菜单将始终出现在我的站点中,因此,我为该菜单制作了一个树枝模板,每个页面都对其进行了扩展。

问题是,根据我现在的情况,我的控制器每次使用该模板时都必须将表单传递给我的模板,因此这意味着我的所有控制器都需要重复创建表单的代码并将其传递给表格。我不要那个!

我想过,我想我可以创建一个服务,该服务将由我的 twig 模板调用,并且该服务将传递有问题的表单,而我的模板将仅显示它。如果能做到这一点,那就意味着我的代码将在服务中编写一次并在模板中调用一次, 将是完美的。

但是,最大的问题是……我真的可以这样做吗?如果有可能我如何注册我的服务以在我的树枝中调用,我如何在我的树枝中调用它最后,因为它是一个表单,我可以在我的服务中使用表单上的 handleRequest() 函数并使当有人提交该表单时页面会发生变化?

这是我现在拥有的代码:

树枝:

{% extends  "::base.html.twig"%}

{# Feuilles de style de la page #}
{% block stylesheets %}

    <link href="{{ asset("bundles/admin/css/main.css") }}" type="text/css" rel="stylesheet" />

{% endblock %}

{# Contenu de la balise Body #}
{% block contenu_body %}

    <header>
        <a href="{{ path("deconnexion") }}">
            <img src="{{ asset("bundles/admin/images/deconnexion.png") }}" alt="Déconnexion" />
        </a>
    </header>
    <main>
        <nav>
            {{ form_start(formulaire) }}
                {{ form_widget(formulaire.Ajouter) }}
                {{ form_widget(formulaire.projet) }}
                {{ form_row(formulaire.modifier) }}
                {{ form_row(formulaire.supprimer) }}
            {{ form_end(formulaire) }}
        </nav>
        <section>

        </section>
    </main>

{% endblock %}

控制器:

<?php

namespace AdminBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use AdminBundle\Form\ModifierSupprimerProjet;

class AdminController extends Controller
{
  public function indexAction(Request $request)
  {
    //Gets the list of my projects
    $listeProjets=$this->container->get('portfolio')->chercherListeProjets();      

    //Form to select to modify, delete or add a project
    $formulaire=$this->createForm(new ModifierSupprimerProjet(), null, array('choix' => $listeProjets, ));


    $formulaire->handleRequest($request);

    //If valid
    if($formulaire->isValid())
    {

      if($formulaire->get('Ajouter')->isClicked())
      {
        echo 'add';
      }


      if($formulaire["projet"]->getData()!=='')
      {

        if($formulaire->get('modifier')->isClicked())
        {
          echo $formulaire["projet"]->getData();
        }

        else if($formulaire->get('supprimer')->isClicked())
        {
          echo $formulaire["projet"]->getData();
        }
      }
    }

    return $this->render('AdminBundle::admin.html.twig', array(
                                                                'formulaire'=>$formulaire->createView()
                                                              ));
  }

  public function testAction()
  {
    return $this->render('AdminBundle::admin.html.twig', array());
  }
}

您应该首先确保您确实必须使用表单来执行您尝试执行的操作。也许在带有表单的页面上使用 link 就足够了。

但这并没有回答你的问题所以这里是: 由于该表单将在每个页面上使用,因此应将其放置在您的主模板中,在本例中为 base.html.twig。事实上,<main><header> 标签中的内容应该移动到您的 base 模板中。然后,你应该在你的控制器中添加一个处理表单的动作,或者只是重命名 indexAction 给它一个与你想要完成的事情更相关的名称。之后,您将从表单中的代码移动到另一个模板中,而没有任何块标记。

menu.html.twig

{{ form_start(formulaire) }}
    {{ form_widget(formulaire.Ajouter) }}
    {{ form_widget(formulaire.projet) }}
    {{ form_row(formulaire.modifier) }}
    {{ form_row(formulaire.supprimer) }}
{{ form_end(formulaire) }}

控制器

use Symfony\Component\HttpFoundation\Request;

class AdminController extends Controller
    ...

    public function menuAction() {
        $request = Request::createFromGlobals();

        // code that was in the indexAction

        return $this->render('AdminBundle::menu.html.twig', array(
            'formulaire'=>$formulaire->createView()
        ));
    }
}

在您的基地中,您将渲染动作。

base.html.twig

{{ render(controller('AdminBundle:Admin:menu')) }}

您还可以在此页面上找到更多文档: http://symfony.com/doc/current/book/templating.html