バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

プラグイン > 開発について > 4系プラグインのPluginManagerの書き方

開発について

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
h_tanaka
投稿日時: 2019/3/5 18:50
対応状況: 解決済
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
4系プラグインのPluginManagerの書き方
EC-CUBE3系プラグインを4系用に開発し直しています。

サンプルプラグインである商品レビュープラグインを参考にしているのですが、PluginManager.php において、各関数のパラメーターが変わっているようです。
public function enable($config, $app)
 ↓
public function enable(array $meta, ContainerInterface $container)


3系で$appを用いた次のような処理は、4系ではどのように記述すればよいかわかりますでしょうか?
$app['config']['plugin_urlpath']
$app['config']['plugin_html_realdir']
$app['config']['block_realdir']
$app['eccube.repository.block']
$app['eccube.repository.page_layout']
Cache::clear($app, false);
umebius
投稿日時: 2019/3/5 19:02
対応状況: −−−
登録日: 2016/7/22
居住地:
投稿: 2085
Re: 4系プラグインのPluginManagerの書き方

js、cssなどのasset類は自動でコピーしてくれるようになったので
自前で書かなくて良さそうですが
$app['eccube.repository.block']などのレポジトリは$containerを使って、
$repository = $container->get(\Eccube\Repository\BlockRepository::class);
で取得できると思います。


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

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

h_tanaka
投稿日時: 2019/3/6 10:04
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: 4系プラグインのPluginManagerの書き方
umebius さん
ありがとうございます!

js、cssなどは自動でコピーされるのですね!
コピーされるようにしておくよう、特定のパスに配置する必要があるなどの条件はありますか?

プラグイン有効時に行いたいのは、次のとおりです。
これらの方法を4系のときにどう実装すればよいかがわかりません。
・リソースのコピー →自動で行われる?
・WYSIWYGでアップロードされる画像の保存先パスの指定
・ブロックのコピー

参考に、3系プラグインの時のソースを記載しておきます。

    // プラグイン有効時
    public function enable($config, $app)
    {
        // リソースのコピー
        $file = new Filesystem();
        $file->mkdir($app['config']['plugin_html_realdir'] . '/samplepage/save_image', 0775);
        $to_path = $app['config']['plugin_html_realdir'] . '/samplepage/assets';
        $file->mirror(__DIR__.'/Resource/assets', $to_path);

        // jbimagesの画像保存先パスを置換
        $file_path = $to_path . '/js/vendor/tinymce/plugins/jbimages/config.php';
        $configs = file_get_contents($file_path);
        $search = '$config[\'img_path\'] = \'/plugin/samplepage/save_image\';';
        $replace = '$config[\'img_path\'] = \'' . $app['config']['plugin_urlpath'] . '/samplepage/save_image\';';
        $configs = str_replace($search, $replace, $configs);
        file_put_contents($file_path, $configs);

        // ブロックのコピー
        $this->copyBlock($app);
    }

    /**
     * ブロックファイルをブロックディレクトリにコピーしてDBに登録
     *
     * @param $app
     * @throws \Exception
     */
    private function copyBlock($app)
    {
        $file = new Filesystem();
        if (!$file->exists(sprintf("%s/%s.twig", $app['config']['block_realdir'], self::BLOCKFILENAME))) {
            $file->copy($this->Block, sprintf("%s/%s.twig", $app['config']['block_realdir'], self::BLOCKFILENAME));
            $app['orm.em']->getConnection()->beginTransaction();
            try {
                // ブロックの登録
                $Block = $this->registerBlock($app);
                // BlockPositionの登録
                $this->registerBlockPosition($app, $Block);
                $app['orm.em']->getConnection()->commit();
            } catch (\Exception $e) {
                $app['orm.em']->getConnection()->rollback();
                throw $e;
            }
        }
    }

    /**
     * ブロックの登録
     *
     * @return \Eccube\Entity\Block
     */
    private function registerBlock($app)
    {
        $DeviceType = $app['eccube.repository.master.device_type']->find(DeviceType::DEVICE_TYPE_PC);
        /** @var \Eccube\Entity\Block $Block */
        $Block = $app['eccube.repository.block']->findOrCreate(null, $DeviceType);
        $Block->setName(self::BLOCKNAME);
        $Block->setFileName(self::BLOCKFILENAME);
        $Block->setDeletableFlg(Constant::DISABLED);
        $Block->setLogicFlg(1);
        $app['orm.em']->persist($Block);
        $app['orm.em']->flush($Block);
        return $Block;
    }

    /**
     * BlockPositionの登録
     *
     * @param $Block
     */
    private function registerBlockPosition($app, $Block)
    {
        $blockPos = $app['orm.em']->getRepository('Eccube\Entity\BlockPosition')->findOneBy(
            array('page_id' => 1, 'target_id' => PageLayout::TARGET_ID_UNUSED),
            array('block_row' => 'DESC'));
        $BlockPosition = new BlockPosition();
        // ブロックの順序を変更
        if ($blockPos) {
            $blockRow = $blockPos->getBlockRow() + 1;
            $BlockPosition->setBlockRow($blockRow);
        } else {
            // 1番目にセット
            $BlockPosition->setBlockRow(1);
        }
        $PageLayout = $app['eccube.repository.page_layout']->find(1);
        $BlockPosition->setPageLayout($PageLayout);
        $BlockPosition->setPageId($PageLayout->getId());
        $BlockPosition->setTargetId(PageLayout::TARGET_ID_UNUSED);
        $BlockPosition->setBlock($Block);
        $BlockPosition->setBlockId($Block->getId());
        $BlockPosition->setAnywhere(Constant::DISABLED);
        $app['orm.em']->persist($BlockPosition);
        $app['orm.em']->flush($BlockPosition);
    }


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

h_tanaka
投稿日時: 2019/3/6 16:56
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: 4系プラグインのPluginManagerの書き方
ブロックのコピーは次のような方法で自己解決できました。

$Block = $container->get(\Eccube\Repository\BlockRepository::class)->findOneBy(array('file_name' => self::BLOCKFILENAME));
$Block = $container->get(\Eccube\Repository\BlockRepository::class)->newBlock($DeviceType);
$em->persist($Block);


リソースであるassetsのコピーは自動では行われないようです。
app/Plugin/pluginName/Resource/assets
 ↓
html/plugin/pluginname/assets

引き続き調査します。


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

umebius
投稿日時: 2019/3/6 18:01
対応状況: −−−
登録日: 2016/7/22
居住地:
投稿: 2085
Re: 4系プラグインのPluginManagerの書き方
リソースのコピーはインストール時に下記の処理が走りますね。

EC-CUBE4.0.2のPluginServiceより引用

    /**
     * リソースファイル等をコピー
     * コピー元となるファイルの置き場所は固定であり、
     * [プラグインコード]/Resource/assets
     * 配下に置かれているファイルが所定の位置へコピーされる
     *
     * @param $pluginCode
     */
    public function copyAssets($pluginCode)
    {
        $assetsDir = $this->calcPluginDir($pluginCode).'/Resource/assets';

        // プラグインにリソースファイルがあれば所定の位置へコピー
        if (file_exists($assetsDir)) {
            $file = new Filesystem();
            $file->mirror($assetsDir, $this->eccubeConfig['plugin_html_realdir'].$pluginCode.'/assets');
        }
    }


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

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

h_tanaka
投稿日時: 2019/3/7 12:40
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: 4系プラグインのPluginManagerの書き方
umebius さん
ありがとうございます。

改めてプラグインをアンインストールしてからインストールし直してみたところ、確かに html/plugin 配下に自動でコピーされていました!


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

h_tanaka
投稿日時: 2019/3/7 15:48
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: 4系プラグインのPluginManagerの書き方
プラグインの assets ファイルをTwigで呼び出すにはどうしたらよいでしょうか?

次のような感じになるのだと思うのですが、'admin'の箇所を何にすればよいのかが分かりません。

<link rel="stylesheet" href="{{ asset('assets/css/fileupload/jquery.fileupload.css', 'admin') }}">


呼び出したいファイルは次の場所に配置されています。
html/plugin/tbsCustom/assets/css/fileupload/jquery.fileupload.css


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

h_tanaka
投稿日時: 2019/3/7 16:39
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: 4系プラグインのPluginManagerの書き方
自己解決しました。

次のような書き方でうまくロードできました。
<link rel="stylesheet" href="{{ asset('tbsCustom/assets/css/fileupload/jquery.fileupload.css', 'plugin') }}">


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

h_tanaka
投稿日時: 2019/3/8 11:09
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: 4系プラグインのPluginManagerの書き方
WYSIWYGでアップロードされる画像の保存先パスの指定方法がまだわかっていません。

プロジェクトのインストールディレクトリまでの物理パスは次の前提です。
/Applications/MAMP/htdocs/test/eccube-4.0.2/

管理画面のプラグイン編集ページ(app/Plugin/tbsCustom/Resource/template/admin/edit.twig)では、商品登録ページを参考にして、画像保存先のパスは次のような記述で取得できました。
{{ asset('tbsCustom/save_image/', 'plugin') }}

取得結果は次のとおりです。
/test/eccube-4.0.2/html/plugin/tbsCustom/save_image/

このパスを PluginManager (app/Plugin/tbsCustom/PluginManager.php)の enable() のタイミングで取得したいです。

まず、$eccubeConfig (app/config/eccube/packages/eccube.yaml)から取得しようとしましたが、それらしいパスは定義されていませんでした。
$eccubeConfig['eccube_html_plugin_dir']

上の場合の取得結果は次のとおりです。
/Applications/MAMP/htdocs/test/eccube-4.0.2/html/plugin

それから、twig と同じように assets から取得しようと次のように記述しました。
/** @var \Symfony\Component\Asset\Packages $manager */
$manager = $container->get('assets.packages');
$path = $manager->getUrl('tbsCustom/save_image', 'plugin')


しかし twig と PluginManager のパスが異なるため(?)か、取得できたパスは次のとおりです。
/html/plugin/tbsCustom/save_image/

PluginManager の enable() にて、/test/eccube-4.0.2/html/plugin/tbsCustom/save_image/ のパスを取得するにはどうすればよいでしょうか?

ちなみに3系では $app['config']['plugin_urlpath'] にて取得できていました。


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

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


 



ログイン


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

統計情報

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

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1567
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.