おれおれGyazo用にギャラリーページを作ったのでその解説っぽいのを。
PHPは素人なので、まだ無駄がある筈だけど、動いているから気にしないスタイル。
機能としては、ざっくりと以下。
- 画像の更新日時で降順にソート
- 画像以外は処理しない
- 画像の一部を表示してサムネイル(のように)表示
- ページング処理
- サムネ風画像をクリックでlightbox表示
という事でギャラリーのソースをどーん。
解説部分は主にソース内のコメント。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>gallery</title> <link rel="stylesheet" href="css/gallery.css" type="text/css" /> <link rel="stylesheet" href="lightbox/css/lightbox.css" type="text/css" media="screen" /> <script type="text/javascript" src="js/jquery-2.1.1.min.js"></script> <script type="text/javascript" src="lightbox/js/lightbox.min.js"></script> <script type="text/javascript" src="js/gallery.js"></script> </head> <body> <h1 class="ttl">Gyazo 一覧</h1> <div class="canvas"> <?php // 画像のディレクトリ指定 $imgdir = opendir("./images"); // 画像の置いてあるパス while(false!==($file = readdir($imgdir))) { // 面倒なので画像ファイル名にパスをくっつけておく if ( is_file ( "./images/$file" ) ) { $files[] = "./images/$file"; } } // ソート用 $sortWork = array() ; $i = 0 ; foreach ( $files as $name ) { //$sortWork[N] の [0]にファイル名、[1]にファイル更新日 $sortWork[$i][0] = $name ; // ファイルの更新日時を取得 $sortWork[$i][1] = date("Y/m/d H:i", filemtime( $name )) ; $i++ ; } // $sortWork をファイルの更新日時でソート usort($sortWork, "usrt") ; // ファイルの数をカウントしておく $cnt = count($sortWork); $nowPage = $page = empty($_GET["p"]) ? 1 : $_GET["p"]; // 現在ページ判定 $viewCnt = 20; // 1ページの最大画像数 $maxPage = ceil($cnt/$viewCnt); // 総画像数からページ数を求める $start = ($nowPage - 1) * $viewCnt; // 画像カウンタの開始位置 // 画像出力 if ( $cnt != 0 && $nowPage <= $maxPage ) { print "<ul id='gallery'>"; for ( $i = $start; ($i < $start+$viewCnt) ; $i ++ ) { if ( $i >= $cnt ) { break; } // 画像かどうかを調べて画像以外はスキップ if( exif_imagetype ( $sortWork[$i][0] ) != false ) { print "<li class='thumb'><a href='".$sortWork[$i][0]."' data-lightbox='g'><img src='".$sortWork[$i][0]."' /></a><span class='uploadDate'>".$sortWork[$i][1]."</span></li>\n"; } } print "</ul>\n"; // ページャ $limit = 10; print '<div id="pagerContainer" class="clearfix"><ul class="pager">'."\n"; // 最初のページ if ( $nowPage > ( $limit / 2 ) ) { print '<li><a href="?p=1">New</a></li>'."\n"; print '<li>|</li>'."\n"; } // 途中。表示ページ数は 10 として、それを超える場合は前後を…表示として省略 for ( $pc = $nowPage - ( $limit / 2 ) < 1 ? 1 : $nowPage - ( $limit / 2 ) ; $pc < $nowPage; $pc ++ ) { print '<li><a href="?p='.$pc.'">'.$pc.'</a></li>'."\n"; } print '<li><span>'.$nowPage.'</span></li>'; for ( $pc = $nowPage + 1; $pc < $nowPage + ( $limit / 2 ) && $pc <= $maxPage; $pc ++ ) { print '<li><a href="?p='.$pc.'">'.$pc.'</a></li>'."\n"; } // 最後のページ if ( $nowPage <= $maxPage - ( $limit / 2 ) ) { print '<li>|</li>'."\n"; print '<li><a href="?p='.$maxPage.'">Old</a></li>'."\n"; } print "</ul></div>\n"; } else { print '<p>画像データがありません!</p><a href="?p=1">ギャラリートップ</a>'; } print "<hr >"; ?> </div> </body> </html> <?php // ============================================================== // functionName usrt // 引数 $a,$b共に二次元配列 // 処理 USORT用 ソートは 配列の[N][1] で実施する // ============================================================== function usrt( $a, $b ) { if ( strtotime( $a[1]) > strtotime($b[1]) ) { return -1; } else if ( strtotime($a[1]) < strtotime($b[1] ) ) { return 1; } else { return 0; } } ?>
初めてjQueryを使用したので、そのリンクも入れています。
プラグインでlightbox2を使用しています。
自前のjQueryは、画像へのマウスホバーで更新日時を表示する箇所。
もうちょっとマシなコードが掛けるようになったら書き直すかもしれないけど、当面は私的利用のみなのでこのまま突っ切るつもりではある。