バージョン選択

フォーラム

メニュー

オンライン状況

27 人のユーザが現在オンラインです。 (18 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 27
もっと...

サイト内検索

質問 > フロント機能 > プラグインから独自フォームを追加したときhandleRequest後のフォームからTextTypeのデータ以外取得できない

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
mamorika
投稿日時: 2021/3/17 10:58
対応状況: −−−
新米
登録日: 2021/3/17
居住地:
投稿: 5
プラグインから独自フォームを追加したときhandleRequest後のフォームからTextTypeのデータ以外取得できない
▼テンプレート
[EC-CUBE] 4.0.5、新規インストール
[レンタルサーバ] XServer
[OS] Linux(詳細不明)
[PHP] PHP 7.2.34
[データベース] MySQL 5.7
[WEBサーバ] Apache 2.4.6
[ブラウザ] Google Chrome 89.0.4389.90
[導入プラグインの有無] Web APIプラグイン、ゼウス決済プラグイン、独自プラグイン(本件対象)
[カスタマイズの有無] 特定のカテゴリなどの中から任意の商品複数を一括でカートに入れられるような一括購入プラグインを開発しています
[現象]

独自に作ったプラグインで、新規のフォーム画面を自作のFormTypeで動作させようとしています。

フォーム画面の表示まではできたのですが、それをControllerで受けてデータ保存の処理をするためにhandleRequestをすると「TextTypeだけ取得でき、ChoiceTypeやその他のTypeは取得できない」という現象が発生しています。
全部消えるのではなく、いくつかパターンを試しましたが、TextTypeだけは複数個でも取得でき、ChoceType以外のTypeも取得できません。

ソースは以下のようなものです。

/**
 * Class OrderSheetController front.
 */
class OrderSheetController extends AbstractController
{

    /**
     * @Route("/order_sheet")
     * @Template("MyPlugin/Resource/template/default/index.twig")
     */
    public function index(Request $request)
    {

      // hidden項目modeで処理切り替え
      switch ($request->get('mode')) {
          case 'confirm':
              // フォーム送信後の処理
              $form = $this->createForm(OrderSheetType::class);
              $form->handleRequest($request);

              // 入力チェック
              var_dump($request->getContent()); // リクエストで確認する限り、type_idもorder_requestも送信されているが
              var_dump($form->getData()); // handleRequestを通してフォームに設定sると、type_id(TextType)は入っているがorder_requestは配列にキーがない。

              // 登録処理
              ......

              return $this->redirectToRoute('cart');

          case default:
              // フォームの入力画面
              $form = $this->createForm(OrderSheetCopyType::class);
              $form->handleRequest($request);

              ......

              return ['form' => $form->createView()];
      }
    }

}


{% extends 'default_frame.twig' %}

{% form_theme form 'Form/form_div_layout.twig' %}

{% block main %}

<form name="order_sheet" action="" method="post">

<div class="center">
注文用紙
</div>

<!-- Controllerで設定したセレクトボックス(ChoiceType)から種類を選ぶ -->
{{ form_widget(form.type_id) }}
<!-- テキスト入力(TextType)で備考を自由入力する -->
{{ form_widget(form.order_request) }}

......(商品情報の一覧と選択)......

<div class="center">
    <input type="hidden" name="mode" value="confirm">
    <input type="submit" value="注文する">
</div>

</form>


何か使い方など単純なことを見落としているのかもしれません。
どなたがお気づきのことがありましたら、ヒントでもお知らせいただけると大変助かります。

よろしくお願いいたします。
umebius
投稿日時: 2021/3/17 22:48
対応状況: −−−
登録日: 2016/7/22
居住地: 東京日本橋
投稿: 2000
Re: プラグインから独自フォームを追加したときhandleRequest後のフォームからTextTypeのデータ以外取得できない
おそらく作られているフォームクラスのコードを書いていただく方が良いかと思います。
mappedオプションは付けていないですか?


----------------
EC-CUBE4系 カスタマイズ ECのプロがシステム急ぎの案件承ります。
EC-CUBE開発 リモートで働くエンジニア募集中

mamorika
投稿日時: 2021/3/17 23:03
対応状況: −−−
新米
登録日: 2021/3/17
居住地:
投稿: 5
Re: プラグインから独自フォームを追加したときhandleRequest後のフォームからTextTypeのデータ以外取得できない
お返事ありがとうございます。

こちらが作成したFormTypeです。
※一部変数名などは修正しています。

mappedを使用している項目はないのですが。。

<?php

namespace Plugin\MyPlugin\Form\Type;

use Eccube\Common\EccubeConfig;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\DependencyInjection\ContainerInterface;

class OrderSheetCopyType extends AbstractType
{
    /**
     * @var EccubeConfig
     */
    protected $eccubeConfig;

    /**
    * @var ContainerInterface
    */
    protected $containerInterface;

    /**
     * OrderSheetCopyType constructor.
     *
     * @param EccubeConfig $eccubeConfig
     */
    public function __construct(EccubeConfig $eccubeConfig, ContainerInterface $container)
    {
        $this->eccubeConfig = $eccubeConfig;
        $this->containerInterface = $container;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // フォームの定義
        $builder
        // 注文タイプ
        ->add('type_id', ChoiceType::class, [
          'label' => '注文タイプ',
          'choices' => [],
          'expanded' => false,
          'multiple' => false,
          'placeholder' => false,
          'constraints' => [
            new Assert\NotBlank(),
          ],
        ])
        // 備考
        ->add('order_request', TextType::class, [
          'label' => '備考',
          'constraints' => [
            new Assert\NotBlank(),
          ],
        ])
        // 注文される商品(複数)
        // *** 商品ID
        ->add('product_ids', CollectionType::class, [
            'entry_type' => HiddenType::class,
            'prototype' => true,
        ])
        // *** 商品画像
        ->add('product_main_list_images', CollectionType::class, [
            'entry_type' => HiddenType::class,
            'prototype' => true,
        ])
        // *** 商品名
        ->add('product_names', CollectionType::class, [
            'entry_type' => HiddenType::class,
            'prototype' => true,
        ])
        // *** 商品説明
        ->add('product_description_details', CollectionType::class, [
            'entry_type' => HiddenType::class,
            'prototype' => true,
        ])
        // *** 商品コード
        ->add('product_code_mins', CollectionType::class, [
            'entry_type' => HiddenType::class,
            'prototype' => true,
        ])
        // *** 商品価格
        ->add('product_price02_inc_tax_mins', CollectionType::class, [
            'entry_type' => HiddenType::class,
            'prototype' => true,
        ])
        ;
    }
}
umebius
投稿日時: 2021/3/17 23:56
対応状況: −−−
登録日: 2016/7/22
居住地: 東京日本橋
投稿: 2000
Re: プラグインから独自フォームを追加したときhandleRequest後のフォームからTextTypeのデータ以外取得できない
'choices' => [],となっておりますが
var_dump($form->getData()); で値がNULLになるのではなく、「そもそもキーがない」ということですと、
確かその現象が発生するのはTransformationFailedException が発生した場合で、ChoiceTypeではchoicesの選択肢にない値を送信したなどのケースだったと記憶しています。


----------------
EC-CUBE4系 カスタマイズ ECのプロがシステム急ぎの案件承ります。
EC-CUBE開発 リモートで働くエンジニア募集中

mamorika
投稿日時: 2021/3/18 0:23
対応状況: −−−
新米
登録日: 2021/3/17
居住地:
投稿: 5
Re: プラグインから独自フォームを追加したときhandleRequest後のフォームからTextTypeのデータ以外取得できない
お返事ありがとうございます。
解決しました!

実は、以下のようにControllerで後から設定しており、リクエスト送信後はこの処理が入っていませんでした。


                // 親カテゴリ一覧の取得
                $qb = $this->entityManager->createQueryBuilder();
                $query = $qb->select("ctg")
                ->from("Eccube\\Entity\\Category", "ctg")
                ->where('ctg.Parent is null')
                ->getQuery();
                $parent_categories_result = $query->getResult();
                foreach ($parent_categories_result as $category_id => $category) {
                  $parent_categories[$category->getId()] = $category->getName();
                }

                $form->remove('parent_category_id');

                $form->add('parent_category_id', ChoiceType::class, [
                  'label' => '親カテゴリ',
                  'choices' => array_flip($parent_categories),
                  'expanded' => false,
                  'multiple' => false,
                  'placeholder' => false,
                  'constraints' => [
                    new Assert\NotBlank(),
                  ],
                ]);


さしあたり、こちらを追加したところ取得できました。
本来は、FormTypeで展開しておくべきなのでしょうか。


また、同じフォームにCollectionTypeのHiddenTypeも複数入っているのですが、これも空になってしまいます。
こちらもChoiceType同様に、はまるポイントなどありそうでしょうか。
umebius
投稿日時: 2021/3/18 11:48
対応状況: −−−
登録日: 2016/7/22
居住地: 東京日本橋
投稿: 2000
Re: プラグインから独自フォームを追加したときhandleRequest後のフォームからTextTypeのデータ以外取得できない

CollectionTypeは難しいのでコードの一部分だけ見ても判断は難しいです。
何かフォームのエラーがないかデバッグされると良いですね。


----------------
EC-CUBE4系 カスタマイズ ECのプロがシステム急ぎの案件承ります。
EC-CUBE開発 リモートで働くエンジニア募集中

mamorika
投稿日時: 2021/3/18 13:04
対応状況: −−−
新米
登録日: 2021/3/17
居住地:
投稿: 5
Re: プラグインから独自フォームを追加したときhandleRequest後のフォームからTextTypeのデータ以外取得できない
内容把握が難しいなかご返答いただきましてありがとうございます。

実は、これらのFormTypeの選択肢やデータの内容についてもControllerから指定するようにしていましたが、そちらが原因のようです。

こちらでその後実験したところ、CollectionTypeも同様に、入力画面表示と同じように初期値を設定すると正しくフォームデータに展開されました。

              // 商品取得
              $qb = $this->productRepository->getQueryBuilderBySearchData($searchData);
              $query = $qb->setMaxResults(100)->getQuery();
              $products_result = $query->getResult();

              $i = 0;
              foreach ($products_result as $product_id => $product) {
                $product_ids[$i] = $product->getId();
                $product_main_list_images[$i] = $product->getMainListImage();
                $product_names[$i] = $product->getName();
                $product_description_details[$i] = $product->getDescriptionDetail();
                $product_code_mins[$i] = $product->getCodeMin();
                $product_price02_inc_tax_mins[$i] = $product->getPrice02IncTaxMin();
                $i++;
              }

              $form->get('product_ids')->setData($product_ids);
              $form->get('product_main_list_images')->setData($product_main_list_images);
              $form->get('product_names')->setData($product_names);
              $form->get('product_description_details')->setData($product_description_details);
              $form->get('product_code_mins')->setData($product_code_mins);
              $form->get('product_price02_inc_tax_mins')->setData($product_price02_inc_tax_mins);


こちらで、「データが取得できない」という問題は解決したのですが、この解決方法が正しいのかが不明です。

データベース上のデータ(Entity)と形が違うFormTypeを自作したとき、どの段階で初期値を設定するのが良いのでしょうか。

FormTypeのbuildForm()で設定しようとした際にデータがうまくとれず、フォーム生成後にControllerから設定することにしたのですが、これが間違っているのでしょうか。

長くなりましたが、ご質問としては、
「FormTypeの初期値は、本来どこで設定すべきなのか?」
です。

ご回答いただけると非常に助かります。
よろしくお願いいたします。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

公式ストアEC-CUBE4系デザインテンプレート続々リリース中

統計情報

総メンバー数は71,530名です
総投稿数は101,307件です

投稿数ランキング

1
seasoft
7333
2
468
2998
3
AMUAMU
2712
4
nanasess
2147
5
umebius
2000
6
yuh
1612
7
red
1449
8
h_tanaka
1080
9
tsuji
936
10
fukap
907
11
shutta
835
12
tao_s
793
13 ramrun 789
14 karin 689
15 sumida 641
16
homan
633
17 DELIGHT 572
18
patapata
502
19
flealog
485
20 tonton 437


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.