从一个herited控制器调用一个表单

时间:2016-11-24 07:49:39

标签: php forms symfony

我有两个捆绑包:
MainBundle :谁拥有我网站的不同部分 SecondBundle ,带有可编码不同优惠的表单。(优惠套装)

我的问题是我想在MainBundle的主页面中调用我的商品表单控制器。

调用表单没有问题,但我的表单数据不会保存在我的数据库中。另一方面,如果我将表单放在主控制器中,我没有问题,它可以正确保存所有数据。

表格树枝代码:

$result = json_decode($yourJsonString);

foreach ($result->Appointments as $appointment) {
    echo $appointment->file_name;
}

我的主页摘要:

{{ form_start(form,{'attr': {'id': 'FootForm'}}) }}
<div class="field-warper">
    {{ form_label(form.titre, "Titre") }}
    {{ form_widget(form.titre,{'attr': {'placeholder': 'Titre'}}) }}
</div>
<div class="field-warper">
    {{ form_label(form.contenu, "Contenu") }}
    {{ form_widget(form.contenu,{'attr': {'placeholder': 'Contenu'}}) }}
</div>
<div class="field-warper">
    {{ form_label(form.price, "Price") }}
    {{ form_widget(form.price,{'attr': {'placeholder': 'Price'}}) }}
</div>
<div class="field-warper submit-warper">
    {{ form_widget(form.send,{'attr':{'class':'submit'}}) }}
</div>
{{ form_end(form) }}

我的商品控制器(表单控制器):

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

{% block body %}
    <div>
        <p>i'm the Body</p>

        {% block formu %}
            {{ render(controller('DellexisOfferBundle:Offer:index')) }}
        {% endblock %}

    </div>
{% endblock %}

我的主控制器:

class OfferController extends Controller
{
    public function indexAction(Request $request)
    {
        $entity_manager = $this->getDoctrine()->getManager();

        $offer=new Offer();

        $form = $this->get('form.factory')->createBuilder('form', $offer)
            ->add('titre','text')
            ->add('contenu','textarea')
            ->add('price','text')
            ->add('send', 'submit')
            ->getForm();
        // on joint la requete Post à notre classe
        $form->handleRequest($request);

        if($form->isValid()) {
            $entity_manager->persist($offer);
            $entity_manager->flush();
        }

        return $this->render('DellexisOfferBundle:Default:index.html.twig', array(
            'form' => $form->createView()
        ));
    }
}

的routing.yml

class DefaultController extends Controller
{
    public function indexAction(Request $request)
    {
        return $this->render('DellexisMainBundle:Home:index.html.twig');
    }
}

OfferBundle routing.xml

dellexis_offer:
    resource: "@DellexisOfferBundle/Resources/config/routing.xml"
    prefix:   /offer

dellexis_main:
    resource: "@DellexisMainBundle/Resources/config/routing.xml"
    prefix:   /

MainBundle routing.yml

<?xml version="1.0" encoding="UTF-8" ?>

<routes xmlns="http://symfony.com/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">

    <route id="dellexis_offer_homepage" path="/offer">
        <default key="_controller">DellexisOfferBundle:Default:index</default>
    </route>
</routes>

编辑:

通过转发我的OfferController请求和转储我的DefaultController(主捆绑包),POST方法在DefaultController上,OfferController保留在GET方法上。

编辑2:解决方案:

我最终找到了解决方案。由于第二个控制器没有与第一个控制器相同的请求。我想将请求转发给第二个控制器。 symfony的魔力想要有效!

因此,如果有人遇到同样的问题,请转发请求:

<?xml version="1.0" encoding="UTF-8" ?>

<routes xmlns="http://symfony.com/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">

    <route id="dellexis_main_homepage" path="/">
        <default key="_controller">DellexisMainBundle:Default:index</default>
    </route>
</routes>

1 个答案:

答案 0 :(得分:1)

首先,你应该有不同的路由后缀,因为你在两个Bundles中使用相同的路由(\),这是个坏主意。您可以在offerBundle路由配置(\offer)中添加后缀。

另外,在routing.yml中,您没有加载offerBundle路由配置文件。

而且,通过查看你的控制器,没有什么可以保存的。 indexAction显示页面并保存一个空对象new Offer()

您必须区分POST请求(当您提交数据时)和GET请求(当您想要显示表单时)

你的代码应该是这样的:

class OfferController extends Controller
{
    public function indexAction(Request $request)  {
      $entity_manager = $this->getDoctrine()->getManager();

      $offer=new Offer();

      $form = $this->get('form.factory')->createBuilder('form', $offer)
        ->add('titre','text')
        ->add('contenu','textarea')
        ->add('price','text')
        ->add('send', 'submit')
        ->getForm();
      // on joint la requete Post à notre classe
      $form->handleRequest($request);

      if($request->isMethod('POST') && $form->isValid()) {
        $entity_manager->persist($offer);
        $entity_manager->flush();
      }

      return $this->render('DellexisOfferBundle:Default:index.html.twig', array(
          'form' => $form->createView()
      ));
  }


}