簡體   English   中英

如何在我的樹枝模板中調用服務以使用Symfony 2創建表單

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

我正在處理菜單,所以我希望使其成為最佳方法。 有問題的菜單將始終出現在我的站點中,因此,我為該菜單制作了一個樹枝模板,並且每個頁面都對其進行了擴展。

事實是,根據我現在擁有的內容,控制器每次使用該模板時都必須將表單傳遞給模板,因此這意味着我的所有控制器都需要重復創建表單的代碼並將其傳遞給模板。形成。 我不要那個!

我對此深信不疑,我可以創建一個服務,該服務將由我的樹枝模板調用,並且該服務將通過有問題的表單,並且我的模板將顯示它。 如果能夠做到這一點,那意味着我的代碼將在服務中編寫一次,並在模板中調用一次,witch將是完美的。

但是,一個大問題……我真的可以這樣做嗎? 如果有可能如何在樹枝中注冊可調用的服務,又如何在樹枝中調用它,最后,由於它是一種表單,我可以在服務中的表單上使用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());
  }
}

首先,請確保您確實必須使用表單來執行您要嘗試的操作。 也許使用帶有表單的頁面鏈接就足夠了。

但這並不能回答您的問題,因此請按以下步驟進行:由於該表單將在每個頁面上使用,因此應將其放置在您的主模板中,在本例中為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM