Fatal Error: Unexpected BLOG

主に自分用の備忘録として

【EC-CUBE】商品登録時に詳細メインコメント欄にYouTUBE動画を埋め込めるようにする

商品登録・変更時に詳細メインコメント欄にHTMLを記述したいときってあると思うんですが、デフォルトのままだと禁止タグが設定されていて、結構限定的なものしか使えません。(tableとかdivとか)
通販サイトなら商品の使い方とか料理のレシピとか、訴求効果のある動画などを埋め込みたいと思うはず。

例えばYouTUBE動画を埋め込む場合、最もシンプルな埋め込みコードでもiframeタグが必須です。

「管理画面>システム設定>マスターデータ管理」でも設定できますが、これだとどこで誰が操作してもいても、ログインさえしていれば許可されてしまいます。
動画などの埋め込みコードを許可する場合、iframeやobject、embedなどのタグを許可することになると思いますが、無条件でこれらのタグを許可するのはやはり抵抗があります。

ので、今回は「ログインユーザの権限をチェックして、条件に合えば許可タグを追加する」という方法を取ります。

 

環境は以下の通り。

DBにテーブル追加

許可したいタグが変更になるたびにソースコードをいじるのは嫌なので、許可タグ追加用のテーブルを作っておきます。
許可したいタグが変更になった場合は、こちらのテーブルを変更すればOKですね。

すでにある「mtb_allowed_tag」テーブルを構造のみ複製し、新しくできたテーブルに許可するタグを登録しておきます。
※今回は「mtb_allowed_tag_additional」というテーブルを作成しました。

ソースコード変更

商品登録・変更時にのみ許可タグを追加したいので、以下のファイルを変更します。

/data/class/pages/admin/products/LC_Page_Admin_Products_Product.php

このクラスにプロパティを追加、及びinit()メソッドを変更します。

プロパティ追加

private $login_mem_auth;

init()メソッド変更

    /**
     * Page を初期化する.
     *
     * @return void
     */
    public function init()
    {
        parent::init();
        ...
        
        
        /* INSERT START */
        $this->login_mem_auth = (integer)$_SESSION['authority'];
        /* INSERT END */

        $masterData = new SC_DB_MasterData_Ex();
        $this->arrProductType = $masterData->getMasterData('mtb_product_type');
        ...
        
        $this->arrAllowedTag = $masterData->getMasterData('mtb_allowed_tag');
        /* INSERT START */
        $this->addAllowedTag($this->arrAllowedTag, $this->login_mem_auth);
        /* INSERT END */
    }

64行目あたりにある$this->arrAllowedTagにデフォルトの許可タグが配列で格納されますので、こちらに追加します。

同じクラスに新しいメソッドを追加します。

    /**
     * 管理者権限でログインしている時のみ、許可タグを追加する。
     * @param array   $allowedTag 許可タグリスト
     * @param integer $authority   ログインしているユーザの権限ID
     * @return void
     */
    public function addAllowedTag($allowedTag, $authority) {
        if ($authority === 0) {
            $md = new SC_DB_MasterData_Ex();
            $additional_tags = $md->getMasterData('mtb_allowed_tag_additional');
            if (is_array($additional_tags)) {
                $merged = array_merge($allowedTag, $additional_tags);
                $this->arrAllowedTag = $merged;
            }
        }
    }

現在ログインしているユーザの権限が「システム管理者」の場合、先ほど作成したテーブルから追加の許可タグを取得し、デフォルトの許可タグリストに追加、プロパティを上書きします。

 

厳しく制限したい場合は、アクセス元IPなどで条件を設定するのもいいかもしれません。