FormType内のチェックボックス(CheckboxFormType)のお話です。チェックボックスのFormTypeにintやsmallintのカラムを割り当てた場合TransformationFailedExceptionが発生します。
EC-CUBEのフレームワークではチェックボックスはbool値をデータとしてとることが原因となります(trueかfalse)

EC-CUBEではチェックボックスタイプがほとんど使用されていないためチェックボックスに整数値のカラムをそのまま入れられないことは盲点となっています。(管理画面のチェックボックスはほぼmultipleなchoiceタイプ)

チェックボックスタイプにdel_flgなど整数値をそのまま渡すと”TransformationFailedException expected a boolean”というエラーが発生します。

コントローラでbooleanにキャストする

チェックボックスタイプが使用されている貴重なページがコンテンツ管理の新着情報編集ページです。
「別ウィンドウを開く」の部分で使用されています。

チェックボックスタイプ

一方でこのチェックボックスにマッピングされているカラムは「link_method」でsmallint(整数)となっています。
そのためNewsController内では次のようなキャストが行われています。

        if ($id) {
            $News = $app['eccube.repository.news']->find($id);
            if (!$News) {
                throw new NotFoundHttpException();
            }
            $News->setLinkMethod((bool) $News->getLinkMethod()); // intをbooleanにキャストしている
        } else {
            $News = new \Eccube\Entity\News();
        }

チェクボックスフォームにIntegerToBooleanTransformerを使う

FormType内だけで完結するにはIntegerToBooleanTransformerを使用する方法があります。
これは整数値が渡された場合にFormTypeがbooleanに変換してデータを扱うためのTransFormerクラスです。下のようにaddModelTransformerすることで自動で変換してくれます。

$builder->add($builder->create('link_method', 'checkbox', array(
                'required' => false,
                'label' => '別ウィンドウを開く',
                'value' => '1',
            ))->addModelTransformer(new \Eccube\Form\DataTransformer\IntegerToBooleanTransformer()))

ECサイトの開発は開発工程の90%以上がフォームとの格闘だと思っています。FormTypeを制するものはEC-CUBEを制す!ぜひEC-CUBEのフォームカスタマイズに慣れ親しんでみてください。

ECCUBE制作トップへ

EC-CUBEカスタマイズに関するお問い合わせはこちら

    脆弱性修正