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

时间:2015-06-21 22:03:25

标签: forms symfony service

我正在制作菜单,我希望尽可能做到最好。有问题的菜单将始终显示在我的网站中,因此,我为该菜单制作了一个树枝模板,每个页面都扩展了它。

问题是,凭借我现在所拥有的,我的控制器必须在每次使用该模板时将表单传递给我的模板,因此这意味着我的所有控制器都需要重复创建表单的代码并通过它的形式。我不想要那个!

我为之奋斗,我想我可以创建一个可以通过我的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());
  }
}

1 个答案:

答案 0 :(得分:1)

您首先要确保您确实必须使用表单来执行您要执行的操作。也许使用带有表单的页面链接就足够了。

但这并不能回答你的问题,所以这里有: 由于表单将在每个页面上使用,因此应将其放在主模板中,在本例中为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