[php + js]読み終えたページによって登場人物紹介ページの内容を変える

質問サイト見てたら面白いネタを発見!

私は今、長編小説をHPに公開しようと思っています。
キャラクター紹介のページを作ろうと思っているのですが、
読んだ読者さんによって表示される内容を変えたいのです。
例えば第一章で登場するAとBというキャラがいたとします。
読者さんが第一章を読んだらキャラ紹介のページにAとBのキャラクターの紹介が加わる。
という形にしたくて、cookieを使用しようと思うのですが、
なにぶんこのような操作ははじめてでしてどうしたらよいのかわかりません。
各章の最後のページにクッキーを食べさせるjavascriptを書いて、
キャラ紹介のページでクッキーを読み込み、キャラの説明文を表示したいです。

物語が進むにつれて、他キャラが増えたり、説明文に追記が加わるようにするにはどうしたら良いでしょう。
cookie使用があまりなく、調べましたがよくわかりませんでしたので詳しく教えていただけましたら幸いです。

独自CGI作ってもよさげな発想だと思ったんだけど、PHPとJavaScript使えば比較的簡単に出来るので、
デモとサンプルソース晒しときます。

ページ構成と概要

  • index.html
    小説のトップページ(つまり1ページ目 or 第一章)
  • 2.html
    2ページ目 or 第二章(以降、ページまたは章と同じファイル名で連番にする)
  • cast.php(cast.html)
    キャラクター紹介ページ
  • mychar.js
    クッキー発行スクリプトファイル

トップは1.htmlでもindex.htmでも何でもいいですが、
2ページ目より後のページを 番号+拡張子 にします。

サンプルはこちら

PHP版

PHPだとソースを見てもネタバレしないものの、PHPが使えるサーバー環境が必要です。
FC2ホームページとかプロパイダのサーバースペースでは使用出来ない事の方が多いので、
PHPが使用できない環境である場合はJavaScript版を御覧下さい。

PHP版:外部スクリプトファイルの作成と設定

新しいテキストファイルに下記ソースをコピペして、mychar.jsという名前で保存する。
文字コードは小説ページと同じものがいいと思います。

function myCharacters(n){
var DD=new Date();
var newday = new Date(DD.getFullYear(),DD.getMonth()+1,DD.getDate());
var URI = location.href.match(/\/([\d]*)(.\w{3,4}?)$/i);
var val = (URI&&URI[1])? URI[1]:1;
var tmp = n+"="+val+"; "+"expires="+newday.toString()+"; ";
document.cookie = tmp;
}

ファイルを作ったら、各小説ページのヘッダにscriptタグを入れて、mychar.jsを読み込ませる。

<script type="text/javascript" src="js/mychar.js"></script>

その下に関数を実行するソースを書きます。

<script type="text/javascript">
//<!&#91;CDATA&#91;
myCharacters("作品を判別する半角英数キーワード");
//&#93;&#93;>
</script>

デモは「吾輩は猫である」の抜粋なので、 myCharacters("wagahai") としました。
これが全部同じだと、別の作品を表示した場合に読んでもないのに紹介ページが全部表示されてる…みたいな事になるので、作品ごとに被らないキーにしといてください。

PHP版:登場人物紹介ページの作成

発行されるCookieには作品ごとのキーワードと、ファイル名と同じ番号が保存されるので
それにあわせて条件を分岐させ、紹介文を書きます。

<h2>吾輩は猫である - 夏目漱石</h2>
		<h3>登場人物紹介</h3>
		<p>一を表示した後は「おさん」まで、二を表示した後は「迷亭」まで、三を表示した後は「八木独仙」まで表示される。</p>
		<h4>吾輩(主人公の猫)</h4>
		<p>珍野家で飼われている猫。本編の語り手で、名前は未だない。人間の生態を鋭く観察したり、猫ながら古今東西の文芸に通じており哲学的な思索にふけったりする。人間の内心を読むこともできる。自分のことを吾輩といっている。三毛子に恋心を抱いている。</p>
		<h4>珍野苦沙弥(ちんの くしゃみ)</h4>
		<p>猫の飼い主で中学の英語教師。妻と3人の娘がいる。偏屈な性格で胃が弱くノイローゼ気味である(漱石自身がモデルとされる)。</p>
		<h4>おさん</h4>
		<p>珍野家の下女。名は清という。主人公の猫を好いていない。</p>
		<?php if(isset($_COOKIE&#91;"wagahai"&#93;) && $_COOKIE&#91;"wagahai"&#93; >= 2):?>
		<h4>三毛子</h4>
		<p>隣宅に住む二絃琴の御師匠さんの家の雌猫。主人公の事を「先生」と呼ぶ。主人公に好かれていることに気付いていない。</p>
		<h4>車屋の黒</h4>
		<p>大柄な雄の黒猫。べらんめい調で教養がなく、大変な乱暴者なので主人公は恐れている。</p>
		<h4>迷亭(めいてい)</h4>
		<p>苦沙弥の友人の美学者。ホラ話で人をかついで楽しむのが趣味の粋人(美学者大塚保治がモデルともいわれるが漱石は否定したという。また、漱石の妻鏡子の著書『漱石の思ひ出』には、漱石自身が自らの洒落好きな性格を一人歩きさせたのではないかとする内容の記述がある)。</p>
		<?php endif; ?>
		<?php if(isset($_COOKIE&#91;"wagahai"&#93;) && $_COOKIE&#91;"wagahai"&#93; >= 3):?>
		<h4>水島寒月(みずしま かんげつ)</h4>
		<p>理学者で、苦沙弥の元教え子。なかなかの好男子(寺田寅彦がモデルといわれる)。富子に演奏会で一目惚れする。バイオリンをたしなむ。</p>
		<h4>越智東風(おち とうふう)</h4>
		<p>詩人で、寒月の友人。「おちこち」と自称している。</p>
		<h4>八木独仙(やぎ どくせん)</h4>
		<p>哲学者。ヤギのような髭を生やし意味不明な警句を吐くが、誰も分からない。</p>
		<?php endif; ?>

上記ソースで使用している条件分岐を日本語に翻訳すると

if(isset($_COOKIE["wagahai"]) && $_COOKIE["wagahai"] >= 3)

もし(”wagahai”というクッキーが存在し かつ ”wagahai”というクッキーの値が3と同じか3以上だったら)

という意味になります。

サンプルはこちら

JavaScript版 (初心者向け)

初心者向けの非常に簡易なスクリプトです。基本的なロジックはPHP版と同じです。

CSSのdisplayプロパティによりキャラクターデータの表示・非表示を切り替えるため、
紹介ページのソースを見るとネタバレしてしまいます。
キャラクターデータを完全に隠匿したい場合はMooToolsを使用する上級者向けを参考にしてください。

JavaScript版(easy):外部スクリプトファイルの作成と設定

新しいテキストファイルに下記ソースをコピペして、mychar.jsという名前で保存する。
文字コードは小説ページと同じものがいいと思います。

function myCharacters(n){
var DD=new Date();
var newday = new Date(DD.getFullYear(),DD.getMonth()+1,DD.getDate());
var URI = location.href.match(/\/([\d]*)(.\w{3,4}?)$/i);
var val = (URI&&URI[1])? URI[1]:1;
var tmp = n+"="+val+"; "+"expires="+newday.toString()+"; ";
document.cookie = tmp;
}

function getCookie(key) {
	a = document.cookie;
	b = a.split(";");
	c = [];
	
	for (i = 0; i < b.length ; i++) {
		c = b&#91;i&#93;.match(/(\w+)=(\w+)/i);
		if( c&#91;1&#93; == key ) return c&#91;2&#93;;
	}
}

function showChar(key, id, val){
	var cookie = getCookie(key);
	if(cookie >= val && document.getElementById(id))
		document.getElementById(id).style.display = "block";
}

ファイルを作ったら、各小説ページのヘッダにscriptタグを入れて、mychar.jsを読み込ませる。

<script type="text/javascript" src="js/mychar.js"></script>

その下に関数を実行するソースを書きます。

<script type="text/javascript">
//<!&#91;CDATA&#91;
myCharacters("作品を判別する半角英数キーワード");
//&#93;&#93;>
</script>

作品を判別する半角英数キーワードは作品ごとに被らないキーにしといてください。

PHP版:登場人物紹介ページの作成

Javascript版は章やキャラクターごとにIDを割り当て、最初に非表示にしておく要素をCSSでdisplay:noneにしておきます。

.hide {display:none;}
<h2>吾輩は猫である - 夏目漱石</h2>
		<h3>登場人物紹介</h3>
		<p>一を表示した後は「おさん」まで、二を表示した後は「迷亭」まで、三を表示した後は「八木独仙」まで表示される。</p>
		<h4>吾輩(主人公の猫)</h4>
		<p>珍野家で飼われている猫。本編の語り手で、名前は未だない。人間の生態を鋭く観察したり、猫ながら古今東西の文芸に通じており哲学的な思索にふけったりする。人間の内心を読むこともできる。自分のことを吾輩といっている。三毛子に恋心を抱いている。</p>
		<h4>珍野苦沙弥(ちんの くしゃみ)</h4>
		<p>猫の飼い主で中学の英語教師。妻と3人の娘がいる。偏屈な性格で胃が弱くノイローゼ気味である(漱石自身がモデルとされる)。</p>
		<h4>おさん</h4>
		<p>珍野家の下女。名は清という。主人公の猫を好いていない。</p>
		<div id="section2" class="hide">
		<h4>三毛子</h4>
		<p>隣宅に住む二絃琴の御師匠さんの家の雌猫。主人公の事を「先生」と呼ぶ。主人公に好かれていることに気付いていない。</p>
		<h4>車屋の黒</h4>
		<p>大柄な雄の黒猫。べらんめい調で教養がなく、大変な乱暴者なので主人公は恐れている。</p>
		<h4>迷亭(めいてい)</h4>
		<p>苦沙弥の友人の美学者。ホラ話で人をかついで楽しむのが趣味の粋人(美学者大塚保治がモデルともいわれるが漱石は否定したという。また、漱石の妻鏡子の著書『漱石の思ひ出』には、漱石自身が自らの洒落好きな性格を一人歩きさせたのではないかとする内容の記述がある)。</p>
		</div>
		<div id="section3" class="hide">
		<h4>水島寒月(みずしま かんげつ)</h4>
		<p>理学者で、苦沙弥の元教え子。なかなかの好男子(寺田寅彦がモデルといわれる)。富子に演奏会で一目惚れする。バイオリンをたしなむ。</p>
		<h4>越智東風(おち とうふう)</h4>
		<p>詩人で、寒月の友人。「おちこち」と自称している。</p>
		<h4>八木独仙(やぎ どくせん)</h4>
		<p>哲学者。ヤギのような髭を生やし意味不明な警句を吐くが、誰も分からない。</p>
		</div>

HTMLヘッダもしくはbodyでshowChar()を実行すると
該当するページ番号を表示した場合にだけ指定したIDの要素が表示されます。

<script type="text/javascript">
window.onload=function(){
showChar("wagahai","section2",2);//2ページ目表示した場合のみ#section2を表示
showChar("wagahai","section3",3);//3ページ目を表示した場合のみ#section3を表示
};
</script>

window.onloadが衝突する場合:

<script type="text/javascript">
function myChars(){
showChar("wagahai","section2",2);//myCharacters("wagahai")の2.htmlを表示した場合のみ#section2を表示
showChar("wagahai","section3",3);//myCharacters("wagahai")の3.htmlを表示した場合のみ#section3を表示
};
</script>
<body onload="myChars()">

showChar関数の構文:

showChar("cookieの名前","表示する要素のID",ページ番号);

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください