バージョン選択

フォーラム

メニュー

オンライン状況

68 人のユーザが現在オンラインです。 (58 人のユーザが フォーラム を参照しています。)
登録ユーザ: 2
ゲスト: 66
Ramadan r.ts もっと...

サイト内検索

プラグイン > 開発について > 国情報が保存できない

開発について

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
h_tanaka
投稿日時: 2018/5/7 17:58
対応状況: 解決済
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
国情報が保存できない
EC-CUBE3.0.16

商品購入時にプラグインにて国情報を保存したいと思っています。

会員で購入する場合は問題なく国情報が保存できたのですが、ゲスト購入の場合に $app['orm.em']->flush(); のタイミングで次のようなエラーが発生してしまいます。
このエラーはどうすれば解決できるでしょうか?

■エラー
ORMInvalidArgumentException in ORMInvalidArgumentException.php line 91:
A new entity was found through the relationship 'Eccube\Entity\Order#Country' that was not configured to cascade persist operations for entity: ニューカレドニア. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}).


以下、実装したソースを記載します。

app/Plugin/Test/event.yml
Shopping/nonmember.twig:
    - [onRenderShoppingNonmember, NORMAL]
front.shopping.nonmember.complete:
    - [onFrontShoppingNonmemberComplete, NORMAL]
front.shopping.index.initialize:
    - [onFrontShoppingIndexInitialize, NORMAL]


app/Plugin/Test/TestEvent.php
class TestEvent
{
    private $sessionKey = 'eccube.plugin.test.shopping.nonmember';
    private $app;

    public function __construct($app)
    {
        $this->app = $app;
    }

    /**
     * お客様情報の入力ページに国を表示する.
     */
    public function onRenderShoppingNonmember(TemplateEvent $event)
    {
        $app = $this->app;
        $source = $event->getSource();

        // 国を表示
        $snipet = "<div id="detail_box__country" class="form-group form-inline {% if form.country.vars.errors is not empty %}has-error{% endif %}">{{ form_widget(form.country) }}</div>";
        $search = '<div id="detail_box__zip"';
        $replace = $snipet.$search;
        $source = str_replace($search, $replace, $source);

        $event->setSource($source);
    }

    /**
     * お客様情報の入力ページで国をセッションに登録する.
     */
    public function onFrontShoppingNonmemberComplete(EventArgs $event)
    {
        $app = $this->app;

        $form = $event['form'];
        $Order = $event['Order'];

        $Country = $form->get('country')->getData();
        $nonMember = $app['session']->get($this->sessionKey);
        $nonMember['Customer'] = $app['eccube.service.shopping']->getNonMember('eccube.front.shopping.nonmember');
        $nonMember['Country'] = $Country;
        $app['session']->set($this->sessionKey, $nonMember);
    }

    /**
     * 購入で国を登録する.
     */
    public function onFrontShoppingIndexInitialize(EventArgs $event)
    {
        $app = $this->app;

        $Order = $event['Order'];
        if (!$app->isGranted('IS_AUTHENTICATED_FULLY')) {
            $nonMember = $app['session']->get($this->sessionKey);
            $Customer = $nonMember['Customer'];
            $Customer->setCountry($nonMember['Country']);
        } else {
            $Customer = $app->user();
        }

        // 標準では注文情報に国が設定されない
        $Order->setCountry($Customer->getCountry());
        $app['orm.em']->persist($Order);

        foreach ($Order->getShippings() as $Shipping) {

            // 標準では配送情報に国が設定されない
            $CustomerAddress = $this->app['eccube.repository.customer_address']->findOneBy(
                array('Customer' => $Customer),
                array('id' => 'ASC')
            );
            if ($CustomerAddress) {
                $Shipping->setCountry($CustomerAddress->getCountry());
                $app['orm.em']->persist($Shipping);
            }
        }
        $app['orm.em']->flush();    // ★ ここでエラーが発生する
    }
}


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

umebius
投稿日時: 2018/5/7 20:51
対応状況: −−−
登録日: 2016/7/22
居住地:
投稿: 2085
Re: 国情報が保存できない
エラーはセッションから取り出したCountryエンティティをそのままOrderに登録してflushしているためかと思います。
ここです。
$Order->setCountry($Customer->getCountry());


都道府県(Pref)について見ると、EC-CUBE標準のソースではセッションから取り出したエンティティデータを一度データベースから復元している箇所があります。
これと同じで良いかなと思います。

$Customer = $nonMember['customer']; $Customer->setPref($this->app['eccube.repository.master.pref']->find($nonMember['pref']));


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

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

h_tanaka
投稿日時: 2018/5/8 15:59
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: 国情報が保存できない
umebius 様
ありがとうございます!

ご提示通りの方法でうまくエラーが解決できました。
country はレポジトリに登録されていないようでしたので、エンティティからレポジトリを取得することでうまくいきました。

            $Customer->setCountry($app['orm.em']->getRepository('Eccube\Entity\Master\Country')->find($nonMember['Country']));


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

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


 



ログイン


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

統計情報

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

投稿数ランキング

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.