Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.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 Symfony 3与奏鸣曲动态形式更新。基于从“选择”字段中选择的值_Php_Jquery_Ajax_Symfony_Sonata - Fatal编程技术网

Php Symfony 3与奏鸣曲动态形式更新。基于从“选择”字段中选择的值

Php Symfony 3与奏鸣曲动态形式更新。基于从“选择”字段中选择的值,php,jquery,ajax,symfony,sonata,Php,Jquery,Ajax,Symfony,Sonata,我想要做的。我有帖子、分类和属性。我可以在我的Post Admin页面上创建与许多属性相关的类别。在我的帖子中,我可以选择一个类别。当我选择类别(选择字段)后,我会将所选属性显示为(输入字段) 我的表单上的下拉列表和文本字段: 当我用所选类别保存帖子时,我将在提交属性输入字段后看到。这是有效的 这是必要的,但不好。好的,我需要一个ajax解决方案。没有Symfony没问题但有一个大的^^ 我用谷歌搜索了一下,我需要一个CRUD控制器和一个表单类型类中的事件 我的打字班: class Prope

我想要做的。我有帖子、分类和属性。我可以在我的Post Admin页面上创建与许多属性相关的类别。在我的帖子中,我可以选择一个类别。当我选择类别(选择字段)后,我会将所选属性显示为(输入字段)

我的表单上的下拉列表和文本字段:

当我用所选类别保存帖子时,我将在提交属性输入字段后看到。这是有效的

这是必要的,但不好。好的,我需要一个ajax解决方案。没有Symfony没问题但有一个大的^^

我用谷歌搜索了一下,我需要一个CRUD控制器和一个表单类型类中的事件

我的打字班:

class PropertiesType extends AbstractType
{

    public $em;

    private $session;

    public function __construct(EntityManagerInterface $em,Session $session)
    {
        $this->em = $em;
        $this->session = $session;

    }

    protected function generateFormInputs(FormEvent $event){

        $form = null;

        if(!is_array($event->getData()) && ($event->getData() === null || !$event->getData()->getCategory())){
            return false;
        }

        if(!is_array($event->getData())){
            $furniture = $event->getData();
            $form = $event->getForm();
        }else{
            $pp = $this->em->getRepository('ProductBundle:Furniture')->findOneBy(array('id' => $event->getData()['furniture_id']));
            $pp->setCategory($this->em->getRepository('ProductBundle:Category')->findOneBy(array('id' => $event->getData()['category_id'])));
            $event->setData($pp);
            $furniture = $event->getData();
            $form = $event->getForm();
        }


        if($furniture !== null){

            foreach($furniture->getCategory()->getProperties() as $val){

                $repo = $this->em->getRepository('ProductBundle:FurnitureProperties')->findOneBy(array('furniture' => $furniture->getId(), 'property' => $val->getId()));

                if($repo === null){
                    $repo = new FurnitureProperties();
                    $repo->addProperty($val);
                    $repo->addFurniture($furniture);
                    $repo->setPropertyId($val->getId());
                    $repo->setCurrentLocale($this->session->get('_locale'));
                }

                $form->add('properties_'.$val->getId(), 'text', array(
                    'mapped' => false,
                    'label' => $val->getName(),
                    'data' => $repo,
                    'required' => false
                ));
            }

        }
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {

            if($event->getData() !== null){

                foreach($event->getData() as $key => $val){
                    $obj = '';
                    $obj = $event->getForm()->get($key)->getData();

                    if($val !== ''){
                        $obj->setText($val);


                        $this->em->persist($obj);
                        $obj->mergeNewTranslations();
                        $this->em->flush();
                    }else{
                        $this->em->remove($obj);
                        $this->em->flush();
                    }
                }
            }

        });

        $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
            $this->generateFormInputs($event);
        });
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'ProductBundle\Entity\Furniture',
            'empty_data' => new FurnitureProperties(),
        ));
    }

}
我的积垢控制器:

<?php

namespace ProductBundle\Controller;

use ProductBundle\Form\Type\PropertiesType;
use Sonata\AdminBundle\Controller\CRUDController as Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;

class FurnitureCRUDController extends Controller
{
    public function ajaxAction($furniture_id, $category_id, Request $request)
    {
        $form = $this->createForm(PropertiesType::class, array(
            'furniture_id' => $furniture_id,
            'category_id' => $category_id
        ));



        $form->handleRequest($request);


        return $this->render('form/fields.html.twig',
            array(
                'form' => $form->createView()
            )
        );


    }
}
是的,我知道。ID为的解决方案不是最好的:

'properties_'.$val->getId()

但这是另一个问题:)

这里没有人能帮助我吗?我唯一想做的就是将文本字段添加到表单(使用ajax)并保存到db。您解决了这个问题吗?如果是,请张贴答案。这样可以帮助像我这样的人。谢谢
<div class="category_replacement">

    <div id="sonata-ba-field-container-properties_properties_1" class="form-group">
        <label for="properties_properties_1" class="control-label ">höhe</label>

        <div class="sonata-ba-field sonata-ba-field-standard-natural">
            <input class="form-control" name="properties[properties_1]" id="properties_properties_1" value="">
        </div>
    </div>

    <div id="sonata-ba-field-container-properties__token" class="form-group">
        <label for="properties__token" class="control-label "></label>

        <div class="sonata-ba-field sonata-ba-field-standard-natural">
            <input class="form-control" name="properties[_token]" id="properties__token" value="AhNHvQrq_8f6ObAOTB1MmbX7Nv_FBmFsgQe3z_sH7qg">
        </div>
    </div>

</div>
<div class="category_replacement">

    <div id="sonata-ba-field-container-s594d9b1861e8e_furniture_properties_1" class="form-group">
        <label for="s594d9b1861e8e_furniture_properties_1" class="control-label ">height</label>

        <div class="sonata-ba-field sonata-ba-field-standard-natural">
            <input class="form-control" name="s594d9b1861e8e[furniture][properties_1]" id="s594d9b1861e8e_furniture_properties_1" value="">
        </div>
    </div>

</div>
"php": ">=5.5.9",
"doctrine/doctrine-bundle": "^1.6",
"doctrine/orm": "^2.5",
"friendsofsymfony/rest-bundle": "^2.2",
"incenteev/composer-parameter-handler": "^2.0",
"knplabs/doctrine-behaviors": "^1.4",
"nelmio/api-doc-bundle": "^2.13",
"sensio/distribution-bundle": "^5.0.20",
"sensio/framework-extra-bundle": "^3.0.2",
"sonata-project/admin-bundle": "3.19.0",
"sonata-project/doctrine-orm-admin-bundle": "^3.1",
"sonata-project/google-authenticator": "^2.0",
"sonata-project/media-bundle": "^3.5",
"sonata-project/translation-bundle": "^2.1",
"sonata-project/user-bundle": "dev-master",
"stof/doctrine-extensions-bundle": "^1.2",
"symfony/assetic-bundle": "^2.8",
"symfony/monolog-bundle": "^3.1.0",
"symfony/polyfill-apcu": "^1.0",
"symfony/swiftmailer-bundle": "^2.3.10",
"symfony/symfony": "3.3.*",
"twig/twig": "1.34.3"
'properties_'.$val->getId()