19.5.バナー管理画面を作る
さて、htmlファイルを直接編集させる上記の仕組みは案の定チームメンバーにすこぶる不評であった。もっと簡単に管理・更新ができるものでなければ使えそうにない。そこでホームページをいくつかのエリアに分割、タイトルエリア、メニューエリア、バナーエリア、テキストエリア、写真エリアと大きく5つのブロックに分け、それぞれをインラインフレームで構成した。タイトルとメニューは基本不変でいじらない。バナーとテキストと写真のエリアはチームで分担して随時更新する。バナー担当はバナーの入れ替えだけに注力すればよい。バナーと聞くだけで昭和の香り漂うイメージだが、チームメンバーはみな昭和世代なんだから仕方ない。
バナーのブロックはバナーだけで構成されるhtmlファイルである。赤字は仮のファイル名だ。
■banner.html
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<a href="http://hoge.hoge" target="_top">
<img src="hoge.jpg" width="200"></a>
<BR><BR>
<a href="fuga.pdf" target="_top">
<img src="fuga.jpg" width="200"></a>
<BR><BR>
<a href="piyo.pdf" target="_top">
<img src="piyo.jpg" width="200"></a>
<BR><BR>
</body>
</html>
3段のバナー専用コラム、3つのJPEGファイルが縦に並ぶ。それぞれのJEPGファイルをクリックすると特定のウェブページにジャンプしたり、PDFファイルを開いたりする。バナーの幅は200pixelとする。
上記のhtmlを少し加工する。ファイル名の前後に改行を入れる。わかりやすく行番号を入れてみた。
0| <!DOCTYPE html><html><head></head><body>
1| <a href="
2| http://hoge.hoge
3| " target="_top"><img src="
4| hoge.jpg
5| " width="200"></a>
6| <BR><BR>
7| <a href="
8| fuga.pdf
9| " target="_top"><img src="
10| fuga.jpg
11| " width="200"></a>
12| <BR><BR>
13| <a href="
14| piyo.pdf
15| " target="_top"><img src="
16| piyo.jpg
17| " width="200"></a>
18| <BR><BR>
19| </body></html>
このhtmlのうち、2行目、4行目、8行目、10行目、14行目、16行目を差し替えるphpファイルを作る。
■edit_banner.php
バナー編集用のコントロールパネル。
・バナー画像選択用のアンカー
・バナーをクリックした時に開くファイル(主にPDFファイル)を選択するアンカー
テキストボックスにURLを記入すると、そこがバナーのリンク先になる。
・2つのテキストボックスをクリアにする[消去]ボタン。
上記3つの部品で1ユニットを構成する。これが3段並ぶ。
<?php
$filename = 'banner.html';
$fp = fopen($filename, 'r');
$row = array();
if ($fp){
while(!feof($fp)){
$row[] = fgets($fp);
}
fclose($fp);
}
?>
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
</head>
<script>
//消去ボタン
$(function () {
$("#clearbtn0").click( function() {
$("#slot0").val("");
$("#slot1").val("");
});
});
$(function () {
$("#clearbtn1").click( function() {
$("#slot2").val("");
$("#slot3").val("");
});
});
$(function () {
$("#clearbtn2").click( function() {
$("#slot4").val("");
$("#slot5").val("");
});
});
// 子窓を開く
function openWindow0() {
window.open('subwindow.php?slot0', 'child', 'width=500,height=800,scrollbars=yes')
}
function openWindow1() {
window.open('subwindow.php?slot1', 'child', 'width=500,height=800,scrollbars=yes')
}
function openWindow2() {
window.open('subwindow.php?slot2', 'child', 'width=500,height=800,scrollbars=yes')
}
function openWindow3() {
window.open('subwindow.php?slot3', 'child', 'width=500,height=800,scrollbars=yes')
}
function openWindow4() {
window.open('subwindow.php?slot4', 'child', 'width=500,height=800,scrollbars=yes')
}
function openWindow5() {
window.open('subwindow.php?slot5', 'child', 'width=500,height=800,scrollbars=yes')
}
</script>
<body>
<form name="form1" action="write_banner.php" method="POST">
<input type="submit" value="保存"><BR>
1段目<BR>
▼バナー画像 <a href="javascript:void(0)" onClick="openWindow0()">リストから選択</a><BR>
<input type="text" id="slot0" name="slot[]" value="<?php echo $row[4]; ?>" style="width:600px;"><BR>
▼リンク先 <a href="javascript:void(0)" onClick="openWindow1()">リストから選択</a><BR>
<input type="text" id="slot1" name="slot[]" value="<?php echo $row[2]; ?>" style="width:600px;"><BR>
<p><input type="button" id="clearbtn0" value="消去"></p>
<hr>
2段目<BR>
▼バナー画像 <a href="javascript:void(0)" onClick="openWindow2()">リストから選択</a><BR>
<input type="text" id="slot2" name="slot[]" value="<?php echo $row[10]; ?>" style="width:600px;"><BR>
▼リンク先 <a href="javascript:void(0)" onClick="openWindow3()">リストから選択</a><BR>
<input type="text" id="slot3" name="slot[]" value="<?php echo $row[8]; ?>" style="width:600px;"><BR>
<p><input type="button" id="clearbtn1" value="消去"></p>
<hr>
3段目<BR>
▼バナー画像 <a href="javascript:void(0)" onClick="openWindow4()">リストから選択</a><BR>
<input type="text" id="slot4" name="slot[]" value="<?php echo $row[16]; ?>" style="width:600px;"><BR>
▼リンク先 <a href="javascript:void(0)" onClick="openWindow5()">リストから選択</a><BR>
<input type="text" id="slot5" name="slot[]" value="<?php echo $row[14]; ?>" style="width:600px;"><BR>
<p><input type="button" id="clearbtn2" value="消去"></p>
<hr>
</form>
</div>
</body>
1~11行目までは前述edit_html.phpと同じ。fopenでhtmlを開いてその中身を配列$rowに代入する。
jQueryを使用するのでGoogleのライブラリを読み込む一文を挿入している。
40~58行目、window.openメソッドでsubwindow.phpを開く。subwindow.php側でクリックした値(ファイル名)を親ウィンドウに戻す。
■subwindow.php
前述のsozai_list.phpと似ているが少し違う。[アップロード]ボタンがない。
<?php
$src_dir = './'; // ex. $src_dir='sozai/'; $src_dir='./';(current_dir)
$src_files = scandir($src_dir , 1);
$exclusions = array("html","HTML","htm","HTM","php","PHP","exe","EXE","");
$extensions = array("jpg","JPG","jpeg","JPEG","png","PNG","gif","GIF");
?>
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<style>
ul {
list-style: none;
margin-left: 0px;
padding-left: 0px;
}
</style>
</head>
<script>
var str = location.search;
var get = str.substring(1,str.length);
$(function(){
$('li').click(function(){
if (!window.opener || window.opener.closed){
window.alert('メインウィンドウが見当たりません。');
}else{
switch(get){
case 'slot0':
window.opener.document.form1.slot0.value = $(this).text();
window.close();
break;
case 'slot1':
window.opener.document.form1.slot1.value = $(this).text();
window.close();
break;
case 'slot2':
window.opener.document.form1.slot2.value = $(this).text();
window.close();
break;
case 'slot3':
window.opener.document.form1.slot3.value = $(this).text();
window.close();
break;
case 'slot4':
window.opener.document.form1.slot4.value = $(this).text();
window.close();
break;
case 'slot5':
window.opener.document.form1.slot5.value = $(this).text();
window.close();
break;
default:
}
}
});
});
</script>
<body>
<h2>素材リスト</h2>
<ul>
<?php
foreach ($src_files as $file){
if ($file){
$ext = pathinfo($file, PATHINFO_EXTENSION);
if(!in_array($ext,$exclusions)){
if(in_array($ext,$extensions)){
echo '<li><img src="'.$src_dir.'thumbs/'.$file.'">';
}else{
echo '<li><div style=" display:inline-block; width:100px; height:100px; background:lightgray;"></div>';
}
echo '<a href="rename.php?name='.$file.'"style="padding:10px;">'.$file.'</a></li>';
echo "<HR>";
}
}
}
?>
</ul>
</body>
</html>
PHPでは<a href="subwindow.php?hoge=huga">でリンクを開き、そのリンク先に$_GET['hoge']変数を送ることができる。javascriptでも似たことを実現できるらしい。window.open('subwindow.php?slot0');でリンクを開く。リンク先には以下のスクリプトを書いておく。
<script>
var str = location.search;
var get = str.substring(1,str.length);
</script>
これで?以降の値が変数getに代入される。
edit_banner.phpでバナー画像を入れ替えたら、write_banner.phpに送って変更内容を確定する。
■write_banner.php
<?php
$filename = 'banner.html';
$fp = fopen($filename, 'r');
$row = array();
if ($fp){
while(!feof($fp)){
$row[] = fgets($fp);
}
}
$slot= $_POST['slot'];
header('X-XSS-Protection: 0');
$fp = fopen($filename, 'w');
if ($fp){
if (flock($fp, LOCK_EX)){ //ファイルロック処理(多重書き込みによる、ファイル破損回避)
fwrite($fp, $row[0]); //<!DOCTYPE html><html><head></head><body>
if($slot[0]){
fwrite($fp, $row[1]); //<a href="
fwrite($fp, $slot[1]."\n"); //http://hoge.hoge
fwrite($fp, "\" target=\"_top\"><img src=\""."\n");
fwrite($fp, $slot[0]."\n"); //hoge.jpg
fwrite($fp, $row[5]); //" width="200"></a>
fwrite($fp, "<BR><BR>"."\n");
}else{
fwrite($fp, $row[1]); //<a href="
fwrite($fp, $slot[1]."\n"); //http://hoge.hoge
fwrite($fp, ""."\n");
fwrite($fp, $slot[0]."\n");
fwrite($fp, $row[5]); //" width="200"></a>
fwrite($fp, ""."\n");
}
if($slot[2]){
fwrite($fp, $row[7]); //<a href="
fwrite($fp, $slot[3]."\n"); //fuga.pdf
fwrite($fp, "\" target=\"_top\"><img src=\""."\n");
fwrite($fp, $slot[2]."\n"); //fuga.jpg
fwrite($fp, $row[11]); //" width="200"></a>
fwrite($fp, "<BR><BR>"."\n");
}else{
fwrite($fp, $row[7]); //<a href="
fwrite($fp, $slot[3]."\n"); //fuga.pdf
fwrite($fp, ""."\n");
fwrite($fp, $slot[2]."\n");
fwrite($fp, $row[11]); //" width="200"></a>
fwrite($fp, ""."\n");
}
if($slot[4]){
fwrite($fp, $row[13]); //<a href="
fwrite($fp, $slot[5]."\n"); //piyo.pdf
fwrite($fp, "\" target=\"_top\"><img src=\""."\n");
fwrite($fp, $slot[4]."\n"); //piyo.jpg
fwrite($fp, $row[17]); //" width="200"></a>
fwrite($fp, "<BR><BR>"."\n");
}else{
fwrite($fp, $row[13]); //<a href="
fwrite($fp, $slot[5]."\n"); //piyo.pdf
fwrite($fp, ""."\n");
fwrite($fp, $slot[4]."\n");
fwrite($fp, $row[17]); //" width="200"></a>
fwrite($fp, ""."\n");
}
fwrite($fp, $row[19]); //</body></html>
flock($fp, LOCK_UN);
}
}
fclose($fp);
?>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>バナー登録されました</h1>
<p><a href="banner.html">確認</a></p>
</body>
</html>
1~11行目までは前述edit_banner.phpと同じ。fopenでhtmlを開いてその中身を配列$rowに代入する。fwrite($fp, $row[])でもって配列$rowの中身を1行ずつ書き戻すのだが、$slot[]の内容いかんによって一部差し換える。
バナーは常に3段なくてもいい。中抜けとなったら自動で詰まるようにしている。バナー画像のあるなしを判別しif構文で処理を変えている。<img src="">を空欄のまま残すとIEやEdgeで不都合な空白が生じるので画像がない時は<img src=タグごと消去するようにしている。
これでボタン操作だけでバナーの入れ替えができるようになった。