ランダム表示サンプル
NP_Rimageを使った画像ランダム表示

Nucleusプラグイン作成の容易さを知って欲しいと思い、サンプルプラグインを作成しました。

ソースコード中に日本語の注釈をつけています。初めてプラグインを書く方の参考になれば幸いです。
足りないと感じる機能、不都合等があった際は、是非ご自身で拡張/改修してご利用下さい。

当サンプルの作成にあたり、既存のプラグインやプラグインAPIplugindev [Nucleus CMS Japan Wiki]:を参考にさせて頂いてます。ありがとうございます。

概要

指定した画像候補をランダムに選択し表示します。
アイテム(記事)中でのみ利用可能です。
環境によってはブラウザのキャッシュをクリアしないとランダムに表示されません。

ダウンロード

NP_Rimage EUC版
UTF-8の方はお手数ですが変換してご利用下さい。

NP_Rimageは主にNucleusで初めてプラグインを作成する方を対象として配布してます。
実際に動作するものですが、サンプルであることをご理解の上ご利用下さい。

使い方

3枚の画像候補(それぞれ160x100px)からランダムに表示させたい場合、以下の様に画像ファイル名をカンマ区切りで指定します。


<%Rimage(001.jpg,002.jpg,003.jpg|160|100|代替テキスト)%>

基本的にはNucleus標準の<%image%>と同一フォーマットで記述します。

注意点

  • 画像ファイル名そのものに『,』カンマは利用できません。
  • ランダム表示はブラウザのキャッシュ状態、設定等に左右されます。
  • ランダム表示する画像候補は全て同一サイズ(幅、高さ)にしなければいけません。

ソースコード


<?php
///////////////////////////////////////////////////////////////////////////////////////////////////
//NP_Rimage v0.1
///////////////////////////////////////////////////////////////////////////////////////////////////

class NP_Rimage extends NucleusPlugin {

    //プラグインの名前
    function getName()  {
        return 'Rimage';
    }

    //プラグインの作者
    function getAuthor() {
        return 'Yaibeen';
    }

    //プラグインのサイトURL
    function getURL() {
        return 'http://nucleus.yaibeen.com/';
    }

    //プラグインのバージョン
    function getVersion() {
        return '0.1';
    }

    //プラグインの説明
    function getDescription() {
        return 'アイテム中でランダムに画像を表示させることができます。';
    }

    //Nucleus 2.0以上で利用するためのおまじない
    function supportsFeature ($what) {
        return (int)($what == 'SqlTablePrefix');
    }

    //イベント定義
    //このサンプルではアイテム本文のパース前(解析)にevent_PreItemを呼び出してもらうようにします。
    function getEventList() {
        return array('PreItem');
    }

    /////////////////////////////////////////////////////////////////
    //アイテム本文のパース前(解析)に呼び出される関数
    /////////////////////////////////////////////////////////////////
    function event_PreItem($data) {

        //アイテム(記事)の所有者(member)を保存
        $this->currentAuthorid = $data['item']->authorid;

        //アイテム本文中の『rimage』タグ抽出後、当クラスの『Function _parse_code』を呼び出し
        $data['item']->body = preg_replace_callback("#<\%rimage\((.*?)\)%\>#i", array(&$this, '_parse_code'), $data['item']->body);

        //アイテム続き欄の『rimage』タグ抽出後、当クラスの『Function _parse_code』を呼び出し
        $data['item']->more = preg_replace_callback("#<\%rimage\((.*?)\)%\>#i", array(&$this, '_parse_code'), $data['item']->more);

        //$dataは参照呼出しです。preg_replace_callbackの結果『Function _parse_code』の返却値で<%rimage(*)%>が置き換えられます。
    }





    /////////////////////////////////////////////////////////////////
    // ここからは任意の関数(自分で必要な関数を定義します)
    /////////////////////////////////////////////////////////////////
    
    /////////////////////////////////////////////////////////////////
    //rimageパラメータの解析
    /////////////////////////////////////////////////////////////////
    function _parse_code($args) {

        //アイテム中(記事)に<%rimage(001.jpg}160}100|代替テキスト)%>と記述していると
        //当関数に引き渡される$args[1]は『001.jpg|160|100|代替テキスト』となります。
        //explodeで『|』を区切り文字として分解(配列)にしつつ、list関数で4つの変数に代入します。

        list($tmp_src, $tmp_w, $tmp_h, $tmp_text) = explode('|',$args[1]);

        //変数チェック
        if (is_null($tmp_src)) $tmp_src = "";
        if (is_null($tmp_w)) $tmp_w = 0;
        if (is_null($tmp_h)) $tmp_h = 0;
        if (is_null($tmp_text)) $tmp_text = "";

        if ($tmp_src != "" || !$tmp_w || !$tmp_h) {
            //画像指定がある場合のみ_create_code関数を呼び出します。
            //imgタグの返却
            return  $this->_create_code($tmp_src, $tmp_w, $tmp_h, $tmp_text);
        } else {
            //画像指定が無い場合空白を返却します。
            return "";
        }
    }

    /////////////////////////////////////////////////////////////////
    //imgタグの作成
    /////////////////////////////////////////////////////////////////
    function _create_code($tmp_src, $tmp_w = 0, $tmp_h = 0, $tmp_text = '') {

        //画像ファイル
        $tmp_src = htmlspecialchars($this->_getImgSrc($tmp_src));

        //alt
        $tmp_text = htmlspecialchars($tmp_text);

        //imgタグの返却
        return '<img src="' . $tmp_src . '" width="' . intval($tmp_w) . '" height="' . intval($tmp_h) . '" alt="' . $tmp_text . '" title="' . $tmp_text . '" />';
    }

    /////////////////////////////////////////////////////////////////
    //画像のランダム選択処理
    /////////////////////////////////////////////////////////////////
    function _getImgSrc($tmp_src) {

        //ベースURL指定がある場合は、ランダムにする
        if ($tmp_src != "") {
            //画像ファイル名を『,』で区切って配列に
            $arr_src = explode(',', $tmp_src);

            //マイクロタイムで乱数初期化
            list($msec, $sec) = explode(' ', microtime());
            mt_srand(((float)$msec) * 100000);

            //ランダムで画像ファイル選択
            $arr_idx = mt_rand(0, (count($arr_src) - 1));

            //画像パス作成
            return ($this->_getMediaPath($arr_src[$arr_idx]));
        }
        return "";
    }

    /////////////////////////////////////////////////////////////////
    //画像のパス指定を作成
    /////////////////////////////////////////////////////////////////
    function _getMediaPath($tmp_src) {
        global $CONF;

        $ret = "";

        switch (true) {
            case (substr($tmp_src, 0, 7) == "http://") :
                //画像ファイル名がフルパス(http://)で記述されている場合、そのままの値を利用する
                $ret = $tmp_src;
                break;
            case (strstr($tmp_src,'/') === false) :
                //画像パス中にスラッシュが含まれていない場合『media/メンバーID(アイテムの所有者)/画像ファイル名』となる
                $tmp_src = ($this->currentAuthorid . '/' . $tmp_src);
            default :
                //画像パス中にスラッシュが含まれている場合『media/指定ディレクトリ/画像ファイル名』となる
                $ret = ($CONF['MediaURL'] . $tmp_src);
                break;
        }
        return $ret;
    }

}
?>