バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > フロント機能 > 注文手続きに入力項目追加したが注文完了で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の場合は追加しないように実装することかと思います。


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

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

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


色々方法はあるのですが、説明しにくいのでこれが一番シンプルではないかと思います。


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

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

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>
でとりあえずデータベースに登録されるようになりました。

ありがとうございました
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

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

投稿数ランキング

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.