質問 > フロント機能 > ご注文手続き画面に新たにラジオボタン項目を追加したい |
フロント機能
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
gwkozaki |
投稿日時: 2019/11/12 15:31
対応状況: −−−
|
常連 登録日: 2019/7/30 居住地: 日本 投稿: 53 |
ご注文手続き画面に新たにラジオボタン項目を追加したい ▼テンプレート
[EC-CUBE] EC-CUBE4.0.3、新規インストール [レンタルサーバ] ローカル環境 [現象] 現在、ご注文手続き画面にラジオボタンの項目追加を考えております。 以下のEntityのカスタマイズを参照しながら、データベースの追加までは出来ました。 https://doc4.ec-cube.net/customize_entity app\Customize\Entity\Example.phpと、app\Customize\Repository\ExampleRepository.phpを追加し、idとnameを持ったテーブルを作成し、 Migrationファイルを作成し、id=1とid=2の2つのデータをExampleテーブルに追加しております。 その後、app\Custmize\Entity\OrderTrait.phpにより、Orderテーブルにexample_idをExampleテーブルのidとJoinする形で追加しました。 しかしその後、OrderTraitのexample_idに@FormAppendを追記してラジオボタンを表示しようとすると、以下のエラーが発生し表示できない状態です。
int型になっていないとのエラーだと思うのですが、Exampleテーブルのid、Orderに追加したexample_id共にint(10)でテーブルが作成してあります。 また、mappedをfalseにするとラジオボタン 自体は表示されていたため、データのやり取りができていないのではと考えています。 以下にExample.phpとOrderTrait.phpを添付いたしますので、 どこかおかしな点があれば、ご教授いただけると幸いです。 何卒よろしくお願い申し上げます。 Example.php
OrderTrait.php
|
umebius |
投稿日時: 2019/11/12 23:59
対応状況: −−−
|
神 登録日: 2016/7/22 居住地: 投稿: 2085 |
Re: ご注文手続き画面に新たにラジオボタン項目を追加したい $example_idですが、ManyToOneのリレーションになっているので、
formのdataは1などの数値ではなく、Customize\Entity\Exampleエンティティインスタンスになります。 ChoiceTypeではなく、Eccube\Form\Type\MasterTypeあたりを使うと良いように思います。
|
gwkozaki |
投稿日時: 2019/11/13 10:48
対応状況: −−−
|
常連 登録日: 2019/7/30 居住地: 日本 投稿: 53 |
Re: ご注文手続き画面に新たにラジオボタン項目を追加したい umebius様
ご教授いただきありがとうございます。 引用: $example_idですが、ManyToOneのリレーションになっているので、 リレーションによって宣言に違いがあるのですね。 エンティティインスタンスでの宣言に変更し、TypeをMasterTypeに切り替えた上でまた試行錯誤してみます。 行き詰まりましたら、また改めてこちらで質問をさせていただけたらありがたいです。 |
gwkozaki |
投稿日時: 2019/11/14 14:55
対応状況: −−−
|
常連 登録日: 2019/7/30 居住地: 日本 投稿: 53 |
Re: ご注文手続き画面に新たにラジオボタン項目を追加したい 連絡が遅くなり失礼いたしました。
再び行き詰まってしまったため、ご教授いただけませんでしょうか。 あれからMasterTypeを利用すべく、 ・Customize\Repository\Master\ExampleRepositoryの設置。 ・ExampleテーブルをCustomize\Entity\Master\Exampleに移動し、dtbからmtbに変更。 ・Customize\Form\Type\Master\ExampleTypeの追加。 ・Customize\Form\Extension\Shopping\OrderTypeExtensionの追加。 ・Customize\Entity\OrderTraitにてOrderテーブルにexample_id及びそのセッタとゲッタの設置。 を行いました。 【現状】 ・mtbにテーブルの追加はできている。 ・ご注文手続き、ご注文確認ともにデータの受け渡しはできており、表示もできる。 ・注文確認画面で注文するボタンを押下すると、注文完了画面ではなく購入エラー画面に飛ばされる。 ・購入エラー後にOrderテーブルを見ると、新たに受注が立っており、example_idに選択した値が含まれているが受注一覧には表示されていない。 【試したこと】 ・ShoppingController.phpの以下の348行部分でvar_dumpを行ったところ、追加した値がNullになっている。 注文処理で一度OrderのUpdateが行われる際にNullになっているのではと考えていますが、間違いございませんでしょうか。 ・エラーとしてはShoppingControllerの$form->isValid()がfalseになっていることで、注文処理に入ることすらできていない。(var_dump下のif文の条件が$form->isValid()がtrueでないと入れない。) ShoppingController.php(一部抜粋)
【分からないこと】 1.そもそもこのやり方で大丈夫かどうか。 2.処理として足りていない部分はどこか。 3.注文するボタン押下後、どのような処理が走るか。 以下に関連のあるソースを添付いたしますので、 おかしな点があればご指摘いただけたらありがたいです。 よろしくお願いいたします。 ExampleRepository.php
Example.php
ExampleType.php
OrderTypeExtension.php
OrderTrait.php
|
umebius |
投稿日時: 2019/11/16 22:54
対応状況: −−−
|
神 登録日: 2016/7/22 居住地: 投稿: 2085 |
Re: ご注文手続き画面に新たにラジオボタン項目を追加したい 詳しく確認した訳ではありませんが、
「注文確認画面で注文するボタンを押下すると、注文完了画面ではなく購入エラー画面に飛ばされる。」 「$form->isValid()がfalseになっていることで、注文処理に入ることすらできていない」 ということであれば、OrderTypeExtensionでskip_add_formオプションを考慮していないためではないでしょうか。 ShoppingController.phpnのコメントにあるように 確認画面から注文処理へ遷移する場合は, Orderエンティティで値を引き回すためフォーム項目の定義をスキップする.必要があります。
|
gwkozaki |
投稿日時: 2019/11/18 9:24
対応状況: −−−
|
常連 登録日: 2019/7/30 居住地: 日本 投稿: 53 |
Re: ご注文手続き画面に新たにラジオボタン項目を追加したい お返事が遅くなってしまい、申し訳ございません。
ご助力いただき、非常に助かります。ありがとうございます。 引用: 「注文確認画面で注文するボタンを押下すると、注文完了画面ではなく購入エラー画面に飛ばされる。」 skip_add_formオプションというフォームの定義をスキップするオプションのようなものがあるのですね。確認してみます! |
gwkozaki |
投稿日時: 2019/11/28 10:38
対応状況: −−−
|
常連 登録日: 2019/7/30 居住地: 日本 投稿: 53 |
Re: ご注文手続き画面に新たにラジオボタン項目を追加したい またまたご返答遅くなり申し訳ございません!
skip_add_form周りを調整し、動くようにするのに手間取ってしまいましたが、解決いたしました! ご助力いただいた umebius 様、大変お世話になりました。感謝いたします。 解決方法を以下に記述いたします。 上記のOrderTypeExtensionを以下のように変更することで解決いたしました。 OrderTypeExtension.php
こちら、OrderTypeのbuildFormメソッド内にも記述があったため、OrderTypeを拡張したOrderTypeExtensionには記述の必要はないように思っていましたが、必要なようですね。 問題は解決となりましたが、解決にあたり疑問に思ったことが1点あったため解る方がいらっしゃいましたらご教授いただきたいです。 【質問】 1. TypeのExtensionの拡張の仕組み OrderTypeExtension側でbuildFormを拡張していますが、OrderTypeのbuildForm内にある以下の記述が、OrderTypeExtensionで追加したフォームに適用されなかったということは、Extensionはその拡張しているフォームのTypeとは完全に別物として呼ばれているということなのでしょうか。
|
umebius |
投稿日時: 2019/11/28 10:52
対応状況: −−−
|
神 登録日: 2016/7/22 居住地: 投稿: 2085 |
Re: ご注文手続き画面に新たにラジオボタン項目を追加したい 引用:
1. TypeのExtensionの拡張の仕組み いえ考え方としては逆でして、同じものだから最後のフォームが表示されない注文確認画面では(必須項目の)フォーム要素を追加するとまずいんですね。 確認画面から注文処理へ遷移する場合は、画面にフォームがないのでデータは送られないけど、$form->isValid()である必要があり 項目を追加しないためのオプションとしてskip_add_formを使っています。 Extensionでもその際は追加しないよう対処してやる必要があります |
gwkozaki |
投稿日時: 2019/11/28 16:01
対応状況: −−−
|
常連 登録日: 2019/7/30 居住地: 日本 投稿: 53 |
Re: ご注文手続き画面に新たにラジオボタン項目を追加したい umebius様
早速のご回答ありがとうございます!非常に勉強になります! 引用: いえ考え方としては逆でして、同じものだから最後のフォームが表示されない注文確認画面では(必須項目の)フォーム要素を追加するとまずいんですね。 なるほど、確認画面にFormが表示されてないという見た目に騙されていたということですね。 見た目上表示されていなくとも、確認画面ではフォームが生成されていて、生成されることで入力画面で入力したにも関わらず、真っさらなフォームが作られNullとなると。 そして必須のNullがあることで$form->isValid()がfalseとなり購入エラーになるということですかね。 そこでskip_add_formをオプションとして指定して、確認画面で新たにフォームを作成させないようにするというところでしょうか。 まだ分からないのですが、同じものとして扱われるのであればOrderTypeにさえskip_add_formに関する記述があればExtensionにも反映されそうな気がするのですが、なぜExtensionにも記述が必要なのでしょうか? 理解が遅く申し訳ございませんが、ご教授いただけますと幸いです。 よろしくお願いいたします。 |
umebius |
投稿日時: 2019/11/28 18:59
対応状況: −−−
|
神 登録日: 2016/7/22 居住地: 投稿: 2085 |
Re: ご注文手続き画面に新たにラジオボタン項目を追加したい あくまでイメージですが
OrderTypeのbuildFormメソッドを処理した上で(注文確定の際にはskip_add_formで何もaddされません) ExtensionのbuildFormメソッドが呼ばれ処理されます。 1つでもNotBlankのフォームがaddされてしまうとisValidがfalseになってしまうため、skip_add_formオプションがtrueの時はaddしてはいけないということになります。 |
(1) 2 » |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |