Nov.18, 2015 - 08h53m12s
  • カウンタリスト(晒)
管理側のグラフィックカウンタ選択リスト取得の
ソース。規定のディレクトリにカウンタのイメージを
配置すれば自動取得してリスト化してくれます。


ディレクトリの構成は…
カウンタroot_dir/カウンタdir/img0〜9.ext

…で、カウンタdirは
カウンタイメージの種類の数だけ存在します。

0〜9を指定した順番で並べたり
拡張子は問わないイカした仕様…。

phpソース

getImgCounterListが
メインプログラムに記述するメソッドです。
<?php
class Counter{
    /*
     * $dir_path カウンタroot_dirのパス
     * $cnt_val カウンタの値 例)0123456789
     ********************************************************************/
    public function getImgCounterList($dir_path, $cnt_val){
        //// dir名の取得
        $tmp_dir_arr = scandir($dir_path);
        foreach($tmp_dir_arr as $key=>$val){
            if( substr($val, 0, 1) == '.' ){ // 隠しファイルは除く
                unset($tmp_dir_arr[$key]);
            }
        }
        $dir_arr = array_values($tmp_dir_arr); // 配列の格納し直し
        //// カウンタリストの取得
        foreach($dir_arr as $key=>$val){
            $tmp_arr = array(); // 配列の初期化 ----------(1)
            foreach( $this->getImgCounter($dir_path.$val, $cnt_val)
                as $key2=>$val2 ){ /* 改行無し */
                $tmp_arr[] = $dir_path.$val.'/'.$val2;
            }
            $loop_counter[] = $tmp_arr;
        }
        return $loop_counter;
    }
    /*
     * $dir_path カウンタdirのパス
     * $cnt_val カウンタの値
     ********************************************************************/
    public function getImgCounter($dir_path, $cnt_val){
        $GF = new getFile();
        //// カウンタイメージのファイル名を取得
        $file_arr  = $GF->getFileName($dir_path); // >> to class GetFile
        //// ファイルの拡張子を取得
        foreach($file_arr as $key => $val){
            $ext_arr[] = $GF->getExtension($val);   // >> to class GetFile
        }
        //// カウンタの値のカウンタイメージのファイル名の作成
        $split_counter = str_split($cnt_val); ----------(2)
        foreach($split_counter as $key => $val){
            $loop_counter[] = $val.'.'.$ext_arr[$val]; --------(3)
        }
        return $loop_counter;
    }
}
?>
(1)getImgCounterで取得した
配列(カウンタdir/img0〜9.ext)をさらに
配列に格納して2次元配列を作成する処理です。
$tmp_arrは取得配列をその都度、
$loop_conterに運ぶだけなのでループする度に
配列を空にしないと正常に動作しません。

(2)引数に与えられたカウンタの値を
1文字ずつ分割して配列に格納する処理。

(3)getExtensionで取得した拡張子と(2)で分割された
数値をつなげてファイル名を作成する処理。
この子のおかげでファイルの拡張子は何でも来い。

ちなみに公開側のカウンタ表示は1次元配列で
事足りるのでgetImgCounterを使用してます。
<?php
class GetFile{
   /*
    * $dir_path カウンタdirのパス
    ********************************************************************/
    public function getFileName($dir_path){
        if( is_dir($dir_path) && $hd=opendir($dir_path) ){
            while( ($file=readdir($hd)) !== false ){
                if(substr($file, 0, 1) !='.'){ // 隠しファイルは除く
                    $path = $path_dir.'/'.$file;
                    if( filetype($path) == 'file' ){ ----------(4)
                        $file_arr[] = $file; 
                    }
                }
            }
        }
        return $file_arr;
    }
   /*
    * $file_path カウンタイメージファイルのパス
    ********************************************************************/
    public function getExtension($file_path){
        $num = strrpos($file_path, '.'); ----------(5)
        $ext = mb_substr($file_path, $num+1);
        return $ext;
    }
}
?>
(4)カウンタdir内の通常ファイルのファイル名を
取得して配列に格納する処理。

(5)ファイル名の後ろから数えて1番目のピリオドの
位置を取得して拡張子を切り取る処理。

HTMLソース

性懲りも無く、くるりんぱ…今回は入れ子ちゃん。
<html>
{foreach from=$loop_counter key=key item=lpA name=lpA}
<ul class='both'>
<li class='float_left'><input type='radio' name='cnt' value='foo' /></li>
    {foreach from=$lpA key=key item=lpB name=lpB}
    <li class='float_left'><img src='{$lpB}' /></li>
    {/foreach}
</ul>
{/foreach}
</html>
もちろんcheckedの処理はしてますが割愛…。

もっとちゃんと
クラス化出来そうだけど
getImgCounterList以外のメソッドも
単独で使用してたりするので、まぁいいか…。
functionの寄せ集めってトコです。

次は何処をカスタムしようかなぁ… … …。