Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2在不同的JQuery UI选项卡中有多个表单,但只有一个页面_Php_Javascript_Jquery Ui_Symfony_Twig - Fatal编程技术网

Php Symfony2在不同的JQuery UI选项卡中有多个表单,但只有一个页面

Php Symfony2在不同的JQuery UI选项卡中有多个表单,但只有一个页面,php,javascript,jquery-ui,symfony,twig,Php,Javascript,Jquery Ui,Symfony,Twig,我面临一个问题,我可以总结如下: 我有一个类似这样的小树枝模板页面(reg.html.TWIG): 实体文件: class Person { protected $name; protected $surname; protected $addresses; public function __construct(){ $this->addresses = new ArrayCollection(); } } 在DefaultCo

我面临一个问题,我可以总结如下: 我有一个类似这样的小树枝模板页面(reg.html.TWIG):

实体文件:

class Person {
    protected $name;
    protected $surname;
    protected $addresses;

    public function __construct(){
        $this->addresses = new ArrayCollection();
    }
}
在DefaultController中:

public function tab1Action(Request $request){
    $person = new Person();
    $address = new Address();
    $addr_coll = new ArrayCollection();
    $addr_coll->add($address);
    $tab1_type = new Tab1Type();
    $person->setAddresses($addr_coll);
    $form = $this->createForm($tab1_type, $person);
    if ($request->getMethod() == 'POST')
    {
        $form->bindRequest($request);
        if ($form->isValid())
    /*ecc ecc ecc*/
}

public function tab2Action(Request $request){
    $person = new Person();
    $tab2_type = new Tab2Type();
    $form = $this->createForm($tab2_type, $person);
    if ($request->getMethod() == 'POST')
    {
        $form->bindRequest($request);
        if ($form->isValid())
    /*ecc ecc ecc*/
}
事实上,我采取的方法是让每个FormType都有我不需要渲染的所有字段,但将“hidden”和“property_path”=>设置为false,因为我不能只渲染我想要的字段,因为其他字段在运行时会导致错误(它们为null),但我仍然无法以联合方式处理这两种情况

将每个表单放在不同的页面(=不同的路径),使用不同的控制器,一切都很好,因此这不是与symfony的基本使用相关的问题,而是将N个表单集成到一个页面和JQuery UI中让我哭泣

修正了我必须使用这个标签,我如何解决

  • 我需要做一个单一的动作来处理一切吗
  • 我必须填写一张表格吗
  • 我错过什么了吗

  • 提前谢谢,我希望我已经清楚地解释了我的问题。

    您刚刚对不同的表单使用了相同的变量

    <div id="tab1" class="blocco-tab">
        <form action="{{ path('AAA') }}" method="post" {{ form_enctype(**form1**) }}>
            <div id="name_field">
                {{ form_row(**form1**.name) }}
            </div><!-- /name_field -->
            <div id="address">
                 {{ form_row(**form1**.addresses[0].road) }}
            </div><!-- /address_field -->
        </form>
    </div>
    <div id="tab2" class="blocco-tab">
        <form action="{{ path('BBB') }}" method="post" {{ form_enctype(**form2**) }}>
            <div id="surname_field">
                {{ form_row(**form2**.surname) }}
            </div><!-- /surname_field -->
        </form>
    </div>
    
    
    {{form_行(**form1**.name)}
    {{表格行(**form1**.地址[0].道路)}
    {{表格行(**表格2**.姓氏)}
    
    尝试使用单一表单

    {% extends "::base.html.twig" %}
    {% block body %}
    <form action="{{ path('AAA') }}" method="post" {{ form_enctype(form) }}>
    <ul class="tabs">
        <li class="left"><a href="#tab1">tab1</a></li>
        <li class="left"><a href="#tab2">tab2</a></li>
        <li class="left"><a href="#tab3">tab3</a></li>
        <li class="right"><a href="#tab4">tab4</a></li>
    </ul>
    <div class="tabs_container">
        <div id="tab1" class="blocco-tab">
                <div id="name_field">
                    {{ form_row(form.name) }}
                </div><!-- /name_field -->
                <div id="address">
                     {{ form_row(form.addresses[0].road) }}
                </div><!-- /address_field -->
        </div>
        <div id="tab2" class="blocco-tab">
                <div id="surname_field">
                    {{ form_row(form.surname) }}
                </div><!-- /surname_field -->
        </div>
    </div> <!-- contenitore_tabs -->
     </form>
    {% endblock %}
    
    和类的窗体生成器

    class PersonType extends AbstractType {
    
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder
                    ->add('name', null, array())
                    ->add('surname', null, array())
                    ->add('addresses', null, array())
            ;
        }
    
        public function getName()
        {
            return 'person';
        }
    
        public function getDefaultOptions(array $options)
        {
            return array(
                'data_class' => 'Acme\YourBundle\Entity\Person',
            );
        }
    }
    

    正如我前面提到的,我解决了将所有选项卡包装在一个表单中的问题。您的两种解决方案都可以,谢谢您的时间


    Linuxatico

    如果其他人有这个问题,你可以这样解决(我不确定这是否是最优雅的解决方案,但我认为这比为所有事情制作一个大表单要好)。此示例混合了profile和changePassword FOSUserBundle表单:

    在主显示模板内(在我的示例中为Profile:show.html.twig):

    为更改密码重复以下步骤:

            {% if passwdForm is defined %}
                {% include 'MyBundle:ChangePassword:changePassword.html.twig' with {'form':passwdForm} %}
            {% else %}
                {% render 'FOSUserBundle:ChangePassword:changePassword' %}
            {% endif %}
    
    在控制器中(添加其他项):

    相应地添加profileForm和passwdForm。在我的例子中,修改过的控制器是ProfileController和ChangePasswordController(FOSUserBundle覆盖)

    对于选项卡,如果发现任何错误,可以添加javascript(或细枝)打开选项卡


    希望这有帮助:)

    我不再需要这些信息,我把每个标签都放在一个表单标签中
    public function aaaAction(Request $request){
        $person = new Person();
        $address = new Address();
        $addr_coll = new ArrayCollection();
        $addr_coll->add($address);
        $person->setAddresses($addr_coll);
        $form = $this->createForm(new PersonType(), $person);
        if ($request->getMethod() == 'POST')
        {
            $form->bindRequest($request);
            if ($form->isValid())
        /*ecc ecc ecc*/
    }
    
    class PersonType extends AbstractType {
    
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder
                    ->add('name', null, array())
                    ->add('surname', null, array())
                    ->add('addresses', null, array())
            ;
        }
    
        public function getName()
        {
            return 'person';
        }
    
        public function getDefaultOptions(array $options)
        {
            return array(
                'data_class' => 'Acme\YourBundle\Entity\Person',
            );
        }
    }
    
            {% if profileForm is defined %}
                {% include 'MyBundle:Profile:edit.html.twig' with {'form':profileForm} %}
            {% else %}
                {% render 'MyBundle:Profile:edit' %}
            {% endif %}
    
            {% if passwdForm is defined %}
                {% include 'MyBundle:ChangePassword:changePassword.html.twig' with {'form':passwdForm} %}
            {% else %}
                {% render 'FOSUserBundle:ChangePassword:changePassword' %}
            {% endif %}
    
    if ($form->isValid()) {
        .....
    else {
        return $this->container->get('templating')->renderResponse('FOSUserBundle:Profile:show.html.'.$this->container->getParameter('fos_user.template.engine'),
                         array('user' => $user, 'profileForm' => $form->createView()));
            }