バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > 管理機能 > ProductやCustomerに追加したオリジナル項目をOderにセットしたい

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
kumaan
投稿日時: 2023/9/19 17:27
対応状況: −−−
新米
登録日: 2023/9/11
居住地:
投稿: 9
ProductやCustomerに追加したオリジナル項目をOderにセットしたい
お世話になっております。
EC-CUBE4.2をカスタムしております。2つ教えてください。


Prodcutにいくつかのオリジナルの項目を追加しました。

例)

//取引区分
->add('transact_kbn', TextType::class, [
'required' => false,
'data' => '0',
]);

これを、Oderにも反映させたいため、OderTraitとOderTypeEctensionに追記し、template>admin>Oder>edit(受注一覧の詳細ページ)に

800行目付近<商品名、価格と並んだテーブルの1項目目に入れたい>

<!-- 取引区分 -->
                     <td class="align-middle">
                       <div class="col-12 col-xl-8">
                             {{ OrderItem.transact_kbn }}                                       
                                                </div>
                                            </td>



と追記しましたが、下記のようなエラーが出ました。

Neither the property "transact_kbn" nor one of the methods "transact_kbn()", "gettransact_kbn()"/"istransact_kbn()"/"hastransact_kbn()" or "__call()" exist and have public access in class "Eccube\Entity\OrderItem".

DBのdtb_Oderにはテーブルはあります。
データベースと管理画面側にフォームを用意すれば、追加したProdcutの値を引き継いでくれるのかと思ったのですが、そういうわけではないのでしょうか?

Customerの項目についてはこの方法で引き継いでくれています。



また、 {{ OrderItem.class_category_name1 }}の管理名 backend_nameも呼び出したいのですが、

{{ OrderItem.backend_name }}

{{ OrderItem.class_category_name1 | backend_name }}

では読み込めませんでした。
こちらはどう記載すると管理名をオーダー商品の一覧に表示することができますか?

よろしくお願いいたします。
kumaan
投稿日時: 2023/9/19 17:38
対応状況: −−−
新米
登録日: 2023/9/11
居住地:
投稿: 9
Re: ProductやCustomerに追加したオリジナル項目をOderにセットしたい
あああ。。
わたくしがすっとぼけておりました。

OderItemではなく、Oderのdtbに追加したのでOder.transact_kbnが正しい表記ですね。
1つ目は自己解決いたしました。
h_tanaka
投稿日時: 2023/9/19 17:38
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1682
Re: ProductやCustomerに追加したオリジナル項目をOderにセットしたい
OrderItem.transact_kbn
なので、 Order ではなく OrderItem に拡張する必要があります。

Product の値を OrderItem に保存するには、 Processor をカスタマイズして保存処理を実装する必要があります。

backend_name についても同様に、 Processor での保存処理が必要です。

https://doc4.ec-cube.net/customize_service


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

kumaan
投稿日時: 2023/9/20 12:18
対応状況: −−−
新米
登録日: 2023/9/11
居住地:
投稿: 9
Re: ProductやCustomerに追加したオリジナル項目をOderにセットしたい
ありがとうございます!
ご指摘頂いた通りProcessorを下記のように作りました。

■OderItemTypeEctension

class OrderItemTypeExtension extends AbstractTypeExtension
{

    public static function getExtendedTypes(): iterable
    {
        yield OrderItemType::class;
    }
    

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            //取引区分
            ->add('transact_kbn', TextType::class, [
                'required' => false,
                'data' => '0',
              ])     
            //単位区分(規格管理コード)
            ->add('backend_name', TextType::class, [
                'required' => false,
              ]);                                 

    }

}



■CustomOrderItemProcessor

/**
 * @CartFlow
 * @ShoppingFlow
 * @OrderFlow
 * OrderItemのカスタマイズ.
 */
class CustomOrderItemProcessor extends AbstractPurchaseProcessor
{
    /**
     * @var EccubeConfig
     */
    private $eccubeConfig;

    /**
     * @var OrderRepository
     */
    private $orderRepository;

    /**
     * OrderNoProcessor constructor.
     *
     * @param EccubeConfig $eccubeConfig
     * @param OrderRepository $orderRepository
     */
    public function __construct(EccubeConfig $eccubeConfig, OrderRepository $orderRepository)
    {
        $this->eccubeConfig = $eccubeConfig;
        $this->orderRepository = $orderRepository;
    }
	
	/**
     * {@inheritdoc}
     */
    public function prepare(ItemHolderInterface $itemHolder, PurchaseContext $context)
    {
        // Order以外の場合は何もしない
        if (!$itemHolder instanceof Order) {
            return;
        }

        foreach ($itemHolder->getProductOrderItems() as $item) {
            $Product = $item->getProduct();
			if( empty($Product) ) continue;
			
			// 追加した項目の再セット
			$item->setTransactKbn($Product->getTransactKbn());
        }

        // Order以外の場合は何もしない
        if (!$itemHolder instanceof Order) {
            return;
        }        	
        foreach ($itemHolder->getProductOrderItems() as $item) {
            $Product = $item->getClassCategoryName1();
			if( empty($ClassCategory) ) continue;
			
			// 追加した項目の再セット
			$item->setBackendName($ClassCategory->getBackendName());
        }
    }

}



これで、取引区分はデータベースにも入るようになったのですが、BackendNameは入りません。



管理画面の受注登録からテストをする際、商品を追加して保存する前の画面では、区分と単位コードが一瞬消えてしまいます。
その後、保存されたら取引区分だけが反映され、単位コードはnullになるという状態でした。(単位コードは元々0が入るように'data' => '0',があるので、後で戻ってきてる?のかなと思います)

一瞬消える間にデータの継承が切れていることは分かるのですが、どの部分を直せばいいのでしょうか?

よろしくお願いいたします。
h_tanaka
投稿日時: 2023/9/20 12:35
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1682
Re: ProductやCustomerに追加したオリジナル項目をOderにセットしたい
つっこみどころがたくさんありますね。。
とりあえず、 setBackendName() で引数に指定している $ClassCategory という変数がどこにも定義されていません。


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

総メンバー数は90,117名です
総投稿数は110,319件です

投稿数ランキング

1
seasoft
7369
2
468
3217
3
AMUAMU
2712
4
nanasess
2314
5
umebius
2085
6
yuh
1819
7
h_tanaka
1682
8
red
1571
9
mcontact
1351
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
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.