バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

プラグイン > 開発について > プラグインアップデート時のキャッシュ操作

開発について

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
DELIGHT
投稿日時: 2013/11/2 13:37
対応状況: −−−
仙人
登録日: 2010/2/3
居住地: 熊本県・九州・長野県・関東甲信越
投稿: 572
プラグインアップデート時のキャッシュ操作
お世話になっております。DELIGHTです。
プラグイン開発に関する皆様のお知恵をお借りしたく投稿します。

現在プラグインのアップデート処理を作成しています。
このプラグインには管理画面のメニューをtransformする処理が含まれています。
プラグインアップデートによってtransformの内容を変更しようと考えているのですが、下記の現象によって思うようにいきません。

目的:
・プラグインアップデートによって、管理画面メニューのtransform内容を旧版のそれから変更する。

前提:
・EC-CUBEバージョンは2.12.6
・旧版プラグインは有効化されている。
・SMARTY_FORCE_COMPILE_MODEはfalse (EC-CUBEデフォルト値)

現象:
・update処理内でテンプレートキャッシュクリア(SC_Utils_Ex::clearCompliedTemplate();)を行わない場合、以前の旧メニューのまま表示されてしまう。
・update処理内でキャッシュをクリアしてもそのアクセスで表示されるのは旧メニューであり、その内容でキャッシュが作成されるため、結局以前の旧メニューのまま表示されてしまう。
・plugin_update::update()内からページクラスのインスタンスにアクセスできないため、SC_View::$_smarty->force_compileをfalseにできない。
・もちろん定数の再定義はできないため、それによる解決は不可能。

パラメータ設定にてSMARTY_FORCE_COMPILE_MODEをtrueに設定すれば全て解決するのですが、
全ての利用者にそれを実施していただける保証はないので、
なんとかプラグインの範囲内での解決を模索しています。

よい知恵がありましたらご教授いただけると幸甚です。


----------------
+ DAISY inc. -------------------- +
EC-CUBE構築・カスタマイズサービス
EC・WEB構築などお気軽にご相談ください。

デイジー株式会社
http://daisy.link/

snitta
投稿日時: 2013/11/4 23:42
対応状況: −−−
一人前
登録日: 2013/10/3
居住地: 島根県
投稿: 100
Re: プラグインアップデート時のキャッシュ操作
興味がありましたので少し調べてみました。
誤っていましたらご指摘をお願いいたします。

まず原因ですが、旧版のプラグインが読み込まれている状態で
'ownersstore/plugin.tpl' に関連するテンプレートがコンパイルされる点にあるのではないかと思います。

1. SC_Helper_Plugin::load() ←───────── これと、
2. LC_Page_Admin_OwnersStore::updatePlugin() ← これと、
3. SC_Utils::clearCompliedTemplate()
4. LC_Page_Admin::sendResponse() ←────── これが同じリクエスト内で処理される事が原因

プラグイン側の対策として出来る事は
アップデート時にフラグを立て、次回リクエスト時にテンプレートキャッシュのクリアを再実行する、
ぐらいでしょうか…?

# アップデート時にプラグインを無効にしてもらうようにエラーを返す手がありますが、
# 2.13.0 ではエラーを返してもチェックされずにプラグイン情報の更新が行われてしまいます。
# この辺りの挙動は最初から明文化されていないので何とも言えません。
class plugin_update {
    public function update($arrPlugin) {
        if ($arrPlugin['enable'] != 2) {
            $error = '※ アップデートはプラグインを無効にしてから行って下さい。<br/>';
            return $error;
        }
    }
}


この件については自分も皆様のご意見をお伺いしたいです。
よろしくお願いいたします。


----------------
Seiji Nitta
zenith6@gmail.com
https://github.com/zenith6/

DELIGHT
投稿日時: 2013/11/5 11:08
対応状況: −−−
仙人
登録日: 2010/2/3
居住地: 熊本県・九州・長野県・関東甲信越
投稿: 572
Re: プラグインアップデート時のキャッシュ操作
その後社内でも相談してみましたが

    function update($arrPlugin) {
        
        $arrPlugin = self::getOldPlugin($arrPlugin);
        $objPluginPage = new LC_Page_Admin_OwnersStore_Ex();
        $objPluginPage->disablePlugin($arrPlugin);
    }

とすることで、次回有効化の際にキャッシュのクリアが行われます。

ただ利用者の意図しない無効化処理が行われるので、
snitta様の方法とどちらを選ぶかは好みになりますね・・。


----------------
+ DAISY inc. -------------------- +
EC-CUBE構築・カスタマイズサービス
EC・WEB構築などお気軽にご相談ください。

デイジー株式会社
http://daisy.link/

snitta
投稿日時: 2013/11/6 11:22
対応状況: −−−
一人前
登録日: 2013/10/3
居住地: 島根県
投稿: 100
Re: プラグインアップデート時のキャッシュ操作
DELIGHT 様
ご返事ありがとうございます。

自身で無効にしてしまう発想はありませんでした、目からうろこです!
どちらにしても、本体側でもなにかしらの対応が成されると良いですね。


----------------
Seiji Nitta
zenith6@gmail.com
https://github.com/zenith6/

DELIGHT
投稿日時: 2013/11/7 16:41
対応状況: −−−
仙人
登録日: 2010/2/3
居住地: 熊本県・九州・長野県・関東甲信越
投稿: 572
Re: プラグインアップデート時のキャッシュ操作
さる筋からいただいたヒントを元に、解決策を書いてみました。

plugin_update.php

<?php
class plugin_update{

    static function update($arrPlugin) {
        
        //アップデート処理
        
        copy(DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR . 'include.php', PLUGIN_UPLOAD_REALDIR . 'SomePlugin/include.php');
        $arrPluginRow = SC_Plugin_Util_Ex::getPluginByPluginCode('SomePlugin');

        if(isset($arrPluginRow['enable']) && $arrPluginRow['enable'] == PLUGIN_ENABLE_TRUE){
            
            SC_Utils_Ex::clearCompliedTemplate();
            $_SESSION['UniqueKey'] = 'プラグインをアップデートしました。';
            $objDisplay = new SC_Display_Ex();
            $objDisplay->reload();
        }
    }
}


include.php

<?php
if(isset($_SESSION['UniqueKey']) && isset($objPage)){
    
    $objPage->tpl_onload .= sprintf('alert("%s");', $_SESSION['UniqueKey']);
    unset($_SESSION['UniqueKey']);
}


SomePlugin.php

<?php
class SomePlugin{

    function preProcess (LC_Page_EX $objPage) {
        
        //include.phpを読み込まずここで$objPage->tpl_onloadに代入してもOK。
        require_once PLUGIN_UPLOAD_REALDIR . 'SomePlugin/include.php';
    }
}


裏ワザ的なリロードになってしまいますが、
利用者から見たプラグインアップデートのフローを
オリジナルに近い形で再現できているかと存じます。


----------------
+ DAISY inc. -------------------- +
EC-CUBE構築・カスタマイズサービス
EC・WEB構築などお気軽にご相談ください。

デイジー株式会社
http://daisy.link/

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


 



ログイン


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

統計情報

総メンバー数は88,941名です
総投稿数は110,016件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2313
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.