質問 > フロント機能 > 注文手続きに入力項目追加したが注文完了でNULLになる |
フロント機能
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
akadota |
投稿日時: 2020/10/9 11:13
対応状況: 開発中
|
半人前 登録日: 2020/8/11 居住地: 投稿: 24 |
注文手続きに入力項目追加したが注文完了でNULLになる 注文手続き画面に入力項目を追加したのですが、注文完了でカラムがNULLになります。
1)下記のエンティティーを追加しました。 /home/kurakagroup/diamond-pizza.com/public_html/ec-test/app/Customize/Entity/OrderTrait.php 【OrderTrait.php】 <?php namespace Customize\Entity; use Doctrine\ORM\Mapping as ORM; use Eccube\Annotation\EntityExtension; /** * @EntityExtension("Eccube\Entity\Order") */ trait OrderTrait { /** * @var string|null * @ORM\Column(type="string", length=14, nullable=true) * @Eccube\Annotation\FormAppend( * auto_render=false, * type="\Symfony\Component\Form\Extension\Core\Type\TextType", * options={ * "required": false, * "label": "受付担当者", * "attr": {"placeholder": "例:山田太郎"} * }) */ private $staff_name; /** * @return string|null */ public function getStaffName() { return $this->staff_name; } /** * @param string|null $staff_name * @return OrderTrait */ public function setStaffName($staff_name) { $this->staff_name = $staff_name; return $this; } } 2)コマンドでProxyクラスの生成と、データベースへのカラム追加を行いました。 $ php bin/console eccube:generate:proxies $ php bin/console cache:clear --no-warmup $ php bin/console eccube:schema:update --force --dump-sql 3)注文手続き画面に項目追加しました app/template/default/Shopping/index.twig <div class="ec-orderStaff"> <div class="ec-rectHeading"> <h2>{{ form_label(form.staff_name,'受付担当者')}}</h2> </div> <div class="ec-input">{{ form_widget(form.staff_name, {'attr': {'placeholder': '山田太郎'|trans, 'rows': '1'}}) }}{{ form_errors(form.staff_name) }}</div> </div> 4)同様に注文確認画面と完了画面にも項目追加し、試したのですが、完了画面でデータが消えます。dtb_orderテーブルのstaff_nameカラムにも注文確認までは無事登録されているのですが、注文完了と同時にNULLになります。 5)/src/Eccube/Controller/ShoppingController.phpで データの中身を調べましたが下記の部分でデータがNULLになります。 /** * 注文処理を行う. * * 決済プラグインによる決済処理および注文の確定処理を行います. * * @Route("/shopping/checkout", name="shopping_checkout", methods={"POST"}) * @Template("Shopping/confirm.twig") */ public function checkout(Request $request) { // ログイン状態のチェック. if ($this->orderHelper->isLoginRequired()) { log_info('[注文処理] 未ログインもしくはRememberMeログインのため, ログイン画面に遷移します.'); return $this->redirectToRoute('shopping_login'); } // 受注の存在チェック $preOrderId = $this->cartService->getPreOrderId(); $Order = $this->orderHelper->getPurchaseProcessingOrder($preOrderId); if (!$Order) { log_info('[注文処理] 購入処理中の受注が存在しません.', [$preOrderId]); return $this->redirectToRoute('shopping_error'); } //データチェック1(データあり) //var_dump($Order->getStaffName());exit; // フォームの生成. $form = $this->createForm(OrderType::class, $Order, [ // 確認画面から注文処理へ遷移する場合は, Orderエンティティで値を引き回すためフォーム項目の定義をスキップする. 'skip_add_form' => true, ]); //データチェック2(データあり) var_dump($Order->getStaffName());exit; $form->handleRequest($request); //データチェック3(データNULL!!!) var_dump($Order->getStaffName());exit; if ($form->isSubmitted() && $form->isValid()) { log_info('[注文処理] 注文処理を開始します.', [$Order->getId()]); いまいち仕組みがわからず、どこをどう直したら良いかわかりません。 ご教授いただけないでしょうか? |
umebius |
投稿日時: 2020/10/9 12:07
対応状況: −−−
|
神 登録日: 2016/7/22 居住地: 投稿: 2085 |
Re: 注文手続きに入力項目追加したが注文完了でNULLになる ご記載いただいているフォームにskip_add_formというオプションがあります。
これは注文の最終確認画面にはフォームが表示されないため、フォームオブジェクトに対して要素を追加しないためのものです。 一方、@Eccube\Annotation\FormAppendで追加したフォームはスキップされず最終確認画面でも追加されてしまいます。 フォーム要素が追加されるにも関わらず、画面にフォームがなく、つまりデータが送信されないのでNULLが登録されます。 対処方法としてはFormAppendではなくFormExtensionで要素を追加し、FormExtensionでもskip_add_formオプションがtrueの場合は追加しないように実装することかと思います。
|
akadota |
投稿日時: 2020/10/9 14:09
対応状況: −−−
|
半人前 登録日: 2020/8/11 居住地: 投稿: 24 |
Re: 注文手続きに入力項目追加したが注文完了でNULLになる ご教授ありがとうございます。
複雑なんですね。。 無知で良くわからないので教えていただきたいです。 『対処方法としてはFormAppendではなくFormExtensionで要素を追加し』 というのは、『OrderTrait.php』の @Eccube\Annotation\FormAppend⇒@Eccube\Annotation\FormExtension にかえるということでしょうか? また、『FormExtensionでもskip_add_formオプションがtrueの場合は追加しないように実装する』のFormExtensionファイルは、 /vendor/symfony/twig-bridge/Extension/FormExtension.php のことでしょうか?他にみつかりません。。。 |
umebius |
投稿日時: 2020/10/9 14:14
対応状況: −−−
|
神 登録日: 2016/7/22 居住地: 投稿: 2085 |
Re: 注文手続きに入力項目追加したが注文完了でNULLになる FormExtension を使った方法はこちらで紹介されていますが、これでEccube\Form\Type\Shopping\OrderTypeを拡張してやることになります。 https://doc4.ec-cube.net/customize_formtype 色々方法はあるのですが、説明しにくいのでこれが一番シンプルではないかと思います。
|
akadota |
投稿日時: 2020/10/9 16:05
対応状況: −−−
|
半人前 登録日: 2020/8/11 居住地: 投稿: 24 |
Re: 注文手続きに入力項目追加したが注文完了でNULLになる ありがとうございます。
OrderTypeの拡張をやってみましたが、うまくいかずにNULLになります。 何がまちがっているのでしょうか? 【OrderTraitエンティティ】 <?php namespace Customize\Entity; use Doctrine\ORM\Mapping as ORM; use Eccube\Annotation\EntityExtension; /** * @EntityExtension("Eccube\Entity\Order") */ trait OrderTrait { /** * @var string|null * @ORM\Column(type="string", length=14, nullable=true) * @Eccube\Annotation\FormAppend( * auto_render=false, * type="\Symfony\Component\Form\Extension\Core\Type\TextType", * options={ * "required": false, * "label": "受付担当者", * "attr": {"placeholder": "例:山田太郎"} * }) */ private $staff_name; /** * @return string|null */ public function getStaffName() { return $this->staff_name; } /** * @param string|null $staff_name * @return OrderTrait */ public function setStaffName($staff_name) { $this->staff_name = $staff_name; return $this; } } 【OrderType拡張してみた】 <?php namespace Customize\Form\Extension; use Eccube\Entity\Order; use Eccube\Form\Type\Shopping\OrderType; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Validator\Constraints as Assert; class OrderExtension extends AbstractTypeExtension { /** * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { if ($options['skip_add_form']) { return; } $builder->add( 'staff_name',TextareaType::class, [ 'required' => true, 'constraints' => [ new Assert\NotBlank(), ], ] ); } /** * {@inheritdoc} */ public function getExtendedType() { return OrderType::class; } } 間違いだらけだったらすいません; |
akadota |
投稿日時: 2020/10/10 14:42
対応状況: 解決済
|
半人前 登録日: 2020/8/11 居住地: 投稿: 24 |
Re: 注文手続きに入力項目追加したが注文完了でNULLになる 結局FormExtensionはうまくいかず。。。
一度すべて元に戻し、 1)phpMyadminで手動でカラム追加 2)/src/Eccube/Form/Type/Shopping/OrderType.phpに直書き $builder->add('staff_name', TextareaType::class, [ 'required' => true, 'constraints' => [ new Length(['min' => 0, 'max' => 100]), ], 3)/src/Eccube/Entity/Order.phpに直書き /** * @var string|null * * @ORM\Column(name="staff_name", type="string", length=100, nullable=true) */ private $staff_name; ****下の方に**** /** * Set staff_name. * * @param string|null $staff_name * * @return Order */ public function setStaffName($staff_name = null) { $this->staff_name = $staff_name; return $this; } /** * Get staff_name. * * @return string|null */ public function getStaffName() { return $this->staff_name; } 4)後はtwingに <div class="ec-input"> {{ form_widget(form.staff_name, {'attr': {'placeholder': '山田太郎'|trans, 'rows': '1'}}) }} </div> でとりあえずデータベースに登録されるようになりました。 ありがとうございました |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |