バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

 > プラグイン > ShippingItemType.phpの処理を変更するプラグインが作成したいのですが、お教え頂けないでしょうか?

プラグイン

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
MPV
投稿日時: 2016/12/9 12:26
対応状況: −−−
仙人
登録日: 2011/3/27
居住地:
投稿: 309
ShippingItemType.phpの処理を変更するプラグインが作成したいのですが、お教え頂けないでしょうか?
EC-CUBE 3.0.12-p1
サーバーOS Windows NT 6.2 build 9200
      (Windows 8 Professional Edition) i586
DBサーバー MySQL 10.1.13-MariaDB
WEBサーバー Apache/2.4.17 (Win32) OpenSSL/1.0.2d PHP/5.6.23
PHP 5.6.23 (Core, bcmath, calendar, ctype, date, ereg, filter, ftp, hash, iconv, json, mcrypt, SPL, odbc, pcre, Reflection, session, standard, mysqlnd, tokenizer, zip, zlib, libxml, dom, PDO, bz2, SimpleXML, wddx, xml, xmlreader, xmlwriter, apache2handler, openssl, curl, fileinfo, gd, gettext, mbstring, exif, mysql, mysqli, Phar, pdo_mysql, pdo_pgsql, pdo_sqlite, pgsql, mhash)
HTTPユーザーエージェント Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0

お世話になっております。

当方まだプラグインの作成方法がお恥ずかしい限りですが
よくわかっていないようで、以下の点を大変恐縮ですが
ご教授頂けませんでしょうか。

実現したい内容
〇フォームのShippingItemType.phpにある処理をプラグインで
 置き換えたいです。


    // 配送業者
    // 商品種別に紐づく配送業者を取得
    $delives = $app['eccube.service.shopping']->getDeliveriesOrder($data->getOrder());

    $deliveries = array();
    foreach ($delives as $Delivery) {
        foreach ($data->getShipmentItems() as $item) {
            $productType = $item->getProductClass()->getProductType();
            //変更した処理 ここから
            if ($Delivery->getProductType()->getId() == $productType->getId() && ($Delivery->getId() == 1 || $Delivery->getId() == 2 )) {
            //変更した処理 ここまで
                $deliveries[] = $Delivery;
            }
        }
    }

  ・
  ・
  ・



実際にsrc/Eccube/Form/Type/ShippingItemType.phpに直接処理を追加して、希望の動作をするのは確認しました。
ただ、後々のことを考えるとプラグイン化しておければと思っております。

この場合、どのイベントでひっかけて、処理を置き換えればよろしいのでしょうか?
また、プラグインとして必要なファイルは
〇config.yml
〇PluginManager.php
〇******.php(フォームイベント用のファイル)

だけでしょうか?

それとも商品購入ページのイベントで引っかけるのでしょうか?

プラグインジェネレータにはフォームイベントというのがなく
ネットで調べてはみたのですが、フォームイベントというのを
記載しているところもあったので今一つ理解来ておらず・・・。

基本的な質問かもしれず、大変恐縮なのですが
何卒、ご教授の程よろしくお願いいたします。

<(_ _)>
MPV
投稿日時: 2016/12/9 23:32
対応状況: −−−
仙人
登録日: 2011/3/27
居住地:
投稿: 309
Re: ShippingItemType.phpの処理を変更するプラグインが作成したいのですが、お教え頂けないでしょうか?
自レスで恐縮です。

その後、ネット等でいろいろ調べてやってみているのですが
どうもうまいこと行きません。

ShippingItemType.phpを見ていると
自分が処理を追加したいところのイベントが


 ・
 ・
 ・

/**
 * {@inheritdoc}
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $app = $this->app;

    $builder
        ->addEventListener(FormEvents::PRE_SET_DATA, function ($event) use ($app) {
            /** @var \Eccube\Entity\Shipping $data */
            $data = $event->getData();
            /** @var \Symfony\Component\Form\Form $form */
            $form = $event->getForm();
 ・
 ・
 ・



とあるので、onPreSetDataというのではないかと思い、
githubにありましたSampleFormプラグインをTEST環境に
入れてみたのですが、有効化されるものの
問い合わせページのフォームに項目が追加されず・・・(T_T)

ちなみに以下のコードです。

config.yml


name: SampleForm
code: SampleForm
version: 0.0.1

form:
    onPreSetData:
        SampleForm


SampleForm.php



namespace Plugin\SampleForm;
use Symfony\Component\Form\FormEvent;
class SampleForm
{
    public function onPreSetData(FormEvent $event)
    {
        $form = $event->getForm();
        if ('contact' === $form->getName()) {
            $form->add('sample_form', 'text');
        }
    }
}



当方がどこか認識誤りしているでしょうか?
ご教授頂ければ幸いです。
468
投稿日時: 2016/12/10 15:29
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: ShippingItemType.phpの処理を変更するプラグインが作成したいのですが、お教え頂けないでしょうか?
こんにちは。
ECCUBEのプラグインの仕様では、
デフォルトで存在するTypeクラスの一部のみを差し替えるという事は出来ないのではないかと思います。

今回の例では、ShippingItemType.phpをオーバーライドした新しいTypeクラスをプラグイン内に作り、
個別フックポイントで$builderの中身を差し替えるといった処理をする必要があるように思われます。

実現されたい事は購入画面にて選択できる配送業者の選択肢を条件によって切り替えたいという事かと予想しておりますが、
その場合は、/src/Eccube/Controller/ShoppingController.phpの中で、以下の記述をされているところが7つ見つかると思います。
// form作成
$builder = $app['eccube.service.shopping']->getShippingFormBuilder($Order);


ちょうどその記述の直後に
画面初期表示時の個別フックポイントがあります。
例)購入画面の場合、128行付近
$event = new EventArgs(
        array(
            'builder' => $builder,
            'Order' => $Order,
        ),
        $request
    );
$app['eccube.event.dispatcher']->dispatch(EccubeEvents::FRONT_SHOPPING_INDEX_INITIALIZE, $event);

ここでプラグイン側に$builderを渡していますので、
プラグイン側の処理で$builderを自分の用意したTypeクラスを利用した結果で上書きすれば良いのではないかと思います。

$builderの中身の作り方は/src/Eccube/Service/ShoppingService.phpのgetShippingFormBuilder()の中身を参照すればいいかと思います。
幸い、プラグイン側に$Orderも一緒に渡されているようですので、
同じように記述できると思います。
MPV
投稿日時: 2016/12/11 14:45
対応状況: −−−
仙人
登録日: 2011/3/27
居住地:
投稿: 309
Re: ShippingItemType.phpの処理を変更するプラグインが作成したいのですが、お教え頂けないでしょうか?
468様

丁寧にご回答頂きましてありがとうございます。

プラグインジェネレータでご教授頂きました
FRONT_SHOPPING_INDEX_INITIALIZEのフックポイントで
プラグインのひな型を用意しました。

引用:

今回の例では、ShippingItemType.phpをオーバーライドした新しいTypeクラスをプラグイン内に作り、
個別フックポイントで$builderの中身を差し替えるといった処理をする必要があるように思われます。

$builderの中身の作り方は/src/Eccube/Service/ShoppingService.phpのgetShippingFormBuilder()の中身を参照すればいいかと思います。
幸い、プラグイン側に$Orderも一緒に渡されているようですので、
同じように記述できると思います。


こちらが、仰られている事が当方が理解できていないのですが
以下のどちらの認識が正しいでしょうか?

?プラグイン名を仮にDeliveryListとしていますが
DeliveryListEvent.phpにある以下にフォーム追加の処理を書く


public function onFrontShoppingIndexInitialize(EventArgs $event)
{

    $builder = $event->getArgument('builder');
    $Order = $event->getArgument('Order');

 ・
 ・
 ・



?DeliveryList/Form/Type/内にあるDeliveryListType.phpのtypeクラスに
 ShippingItemTypeをオーバーライドさせて、処理を書く
 (この場合、Form Typeをオーバーライドさせる方法がよくわかっておりません。)

単純にTEST的なフォームを追加するのと、配送方法を判定して取得するのは、?の場合では確認したのですが、既存のフォームを上書きするのと、フォームに設定する'data'を取得する方法がわからず難儀しております。

当方が未熟なので大変恐縮なのですが、もうよろしければ少しご教授頂ければ幸いです。
どうぞよろしくお願いいたします。

468
投稿日時: 2016/12/12 21:45
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: ShippingItemType.phpの処理を変更するプラグインが作成したいのですが、お教え頂けないでしょうか?
実際に動かして確認しているわけではないので、
エラーなどが出た場合は申し訳ございません。

プラグイン用のDeliveryListType.phpのオーバーライドの件ですが、
少しややこしそうですので
ShippingItemType.phpの内容をコピーして、
クラス名を「DeliveryListType」に変更。
function buildFormの内容は改修したソースに変更。
function getNameの返り値は「shipping_item」等他のTypeクラスと被らないように変更。

DeliveryListEvent.phpの記述ですが、
以下の記述でshippingsの設定を変更する事が出来るのではないかと思います。
$builder = $event->getArgument('builder');
$Order = $event->getArgument('Order');

$builder
    ->add('shippings', 'collection', array(
        'type' => 'delivery_list',
        'data' => $Order->getShippings(),
    ));


一度、確認をお願いします。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

総メンバー数は89,075名です
総投稿数は110,023件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2314
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1296
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.