バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > フロント機能 > プラグインから独自フォームを追加したとき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
居住地:
投稿: 2085
Re: プラグインから独自フォームを追加したときhandleRequest後のフォームからTextTypeのデータ以外取得できない
おそらく作られているフォームクラスのコードを書いていただく方が良いかと思います。
mappedオプションは付けていないですか?


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

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
居住地:
投稿: 2085
Re: プラグインから独自フォームを追加したときhandleRequest後のフォームからTextTypeのデータ以外取得できない
'choices' => [],となっておりますが
var_dump($form->getData()); で値がNULLになるのではなく、「そもそもキーがない」ということですと、
確かその現象が発生するのはTransformationFailedException が発生した場合で、ChoiceTypeではchoicesの選択肢にない値を送信したなどのケースだったと記憶しています。


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

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
居住地:
投稿: 2085
Re: プラグインから独自フォームを追加したときhandleRequest後のフォームからTextTypeのデータ以外取得できない

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


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

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公式 Amazon Payプラグイン

統計情報

総メンバー数は88,294名です
総投稿数は109,692件です

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1568
9
mcontact
1240
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
796
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

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

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