亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Symfony 4. 為什么提交的表單只是部分填充模型?

Symfony 4. 為什么提交的表單只是部分填充模型?

PHP
慕的地8271018 2021-08-27 10:05:30
有點恐慌 - 我正在為復雜的搜索生成 Symfony 表單,即映射到實體的數據將僅用于搜索查詢構建。我從 ChoiceType 創建了簡單的表單、模型和一些擴展類型,用于通過某種邏輯進行預填充選擇。表單是通過 GET 方法提交的。例如,在模型中您可以找到maker和model字段。選擇 maker 后,后者使用 AJAX 填充到前端。當我提交表單maker并且model具有非默認值時,handleRequest僅填充maker模型的屬性,但model保留為空。如果選中,復選框也會正確填充??偠灾?form->getData()只返回 Maker 和復選框,其他字段為空。$request->query有所有參數。數據映射器在這里毫無意義。而且數據中沒有什么可以轉換的,模型主要來自標量值。請求包含所有內容,但未正確處理。我試圖實現ChoiceLoaderInterface,但這對我不起作用,因為在加載選擇期間我必須有權訪問options表單的 ,而我沒有(我使用了這篇文章https://speakerdeck.com/heahdude/symfony -forms-use-cases-and-optimization)。我正在使用 Symfony 4.2.4;PHP 7.2??刂破鞯姆椒?**     * @Route("/search/car", name="car_search", methods={"GET"})     * @param Request $request     */    public function carSearchAction(Request $request)    {        $carModel = new CarSimpleSearchModel();        $form     = $this->createForm(CarSimpleSearchType::class, $carModel);        $form->handleRequest($request);        $form->getData();        .....    }汽車簡單搜索模型class CarSimpleSearchModel{    public $maker;    public $model;    public $priceFrom;    public $priceTo;    public $yearFrom;    public $yearTo;    public $isCompanyOwner;    public $isPrivateOwners;    public $isRoublePrice;}CarSimpleSearchType 表單class CarSimpleSearchType extends AbstractType{    protected $urlGenerator;    public function __construct(UrlGeneratorInterface $urlGenerator)    {        $this->urlGenerator = $urlGenerator;    }    public function buildForm(FormBuilderInterface $builder, array $options)    {        $builder            ->add('vehicle_type', HiddenType::class, [                'data' => VehicleTypeType::CAR,                'mapped' => false,            ])            ->add('maker', CarMakerSelectType::class)            ->add('model', CarModelsSelectType::class)            ->add(                'priceFrom',                VehiclePriceRangeType::class,                [                    'vehicle_type' => VehicleTypeType::CAR,                ]            )
查看完整描述

1 回答

?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊

就我而言,我有一個EntityType由最初禁用的 ajax 填充的依賴項。從choiceswhere 開始null,它InvalidValueException在提交時返回一個。我必須做的是創建一個EventListener并添加choices當前“主要”字段的有效值?;旧暇褪沁@樣,或多或少適合您的情況。


原始形式:


// Setup Fields

$builder

    ->add('maker', CarMakerSelectType::class)

    ->add('model', CarModelsSelectType::class, [

            'choices' => [],

            // I was setting the disabled on a Event::PRE_SET_DATA if previous field was null

            // since I could be loading values from the database but I guess you can do it here

            'attr' => ['disabled' => 'disabled'],

        ]

    );

$builder->addEventSubscriber(new ModelListener($this->extractor));

添加回有效選擇的事件訂閱者:


class ModelListener implements EventSubscriberInterface

{

    public function __construct(VehicleExtractorService $extractor)

    {

        $this->extractor = $extractor;

    }


    public static function getSubscribedEvents()

    {

        return [

            FormEvents::PRE_SUBMIT => 'onPreSubmitData',

        ];

    }


    public function onPreSubmitData(FormEvent $event)

    {

        // At this point you get only the scalar values, Model hasn't been transformed yet

        $data = $event->getData();

        $form = $event->getForm();


        $maker_id = $data['maker'];

            $model= $form->get('model');

            $options = $model->getConfig()->getOptions();


            if (!empty($maker_id)) {

                unset($options['attr']['disabled']);

                $options['choices'] = $this->extractor->getModelsFor($maker_id);


                $form->remove('model');

                $form->add('model', CarModelsSelectType::class, $options );

            }

        }

    }

}



查看完整回答
反對 回復 2021-08-27
  • 1 回答
  • 0 關注
  • 147 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號