baserCMS Tips #1 タグやカテゴリーを判定基準にした条件分岐で、ブログ記事にパスワードをかけてみる。
ユーザーズフォーラムのトピック「ブログ機能の任意の記事にパスワードをつける」 で質問のあった内容について、方法をすこし考察してみました。
以下のサンプルでは、JavaScriptの簡易パスワード認証をbc-base.js(外部ファイル)としてtheme/jsフォルダに保存し、タグやカテゴリーを判定基準にしたif構文でそれを呼び出し、簡易にページ(記事)にパスワードをかけるイメージです。
baserCMSのブログプラグインで、ページ(記事)で指定したタグやカテゴリーを判定基準にしたif構文で条件分岐し、特定の処理を実行させたい場合などを想定しています。 JavaScriptの簡易パスワード認証を呼び出す条件にするタグやカテゴリーは、例えばこんな感じであらかじめ指定されているものとします。
上記のブログタグが指定されているページ(記事)のみ、js(JavaScript)を読み込ませて簡易パスワード認証をかけたい場合。
対象ファイル:利用テーマフォルダ/Blog/single.php の末尾に以下のコードを追記。
<?php if (!empty($post['BlogTag'])): ?>
<?php
$tags = $this->Blog->getTag($post, ['link' => false]);
$text = "";
foreach ($tags as $tag) {$text = $text . h($tag['name']) . ' ';}
$result = strpos($text, "members"); //ブログタグ名で条件分岐、jsを読み込ませる
if ($result !== false) {
$this->BcBaser->js('bc-base');
}
?>
<?php endif ?>
上記のカテゴリーが指定されているページ(記事)のみ、js(JavaScript)を読み込ませて簡易パスワード認証をかけたい場合。
対象ファイル:利用テーマフォルダ/Blog/single.php の末尾に以下のコードを追記。
<?php
$category = $this->Blog->getCategory($post, ['link' => false]); //カテゴリタイトルで条件分岐、jsを読み込ませる
if ($category === "会員専用") {
$this->BcBaser->js('bc-base');
}
?>
あるいは、特定のカテゴリーのアーカイブのみ、js(JavaScript)を読み込ませて簡易パスワード認証をかけたい場合。
対象ファイル:利用テーマフォルダ/Blog/archives.php の末尾に以下のコードを追記。
<?php
$params = $this->BcBaser->getParams();
$categoryType = $params['pass'][1]; //カテゴリーの種類で条件分岐、jsを読み込ませる
if ($categoryType === "members"): ?>
<?php $this->BcBaser->js('bc-base'); ?>
<?php endif ?>
といった具合です。最後の例は、if構文の書き方も少し変えてみます。
条件分岐の結果、実行したい命令文もこの方が柔軟に書けるので、簡易パスワードに限らずいろいろと応用もできるかと思います。
最後に、呼び出すbc-base.js(外部ファイル)のサンプル。株式会社Cruwさんのサイトに掲載のコード をサンプルにさせていただきました。
document.body.style.display = 'none';
window.onload = function() {
var UserInput = null;
var cookies = document.cookie;
var cookiesArray = cookies.split(';');
var pass = 'emFxMTIzNDU='; //ex. パスワード:zaq12345 をbase64エンコードしたものです
for(var c of cookiesArray){
var cArray = c.split('=');
if(cArray[0].indexOf('bc-base') > -1){
UserInput = decodeURIComponent(cArray[1]);
}
}
if(!(UserInput && UserInput == window.atob(pass))){
UserInput = prompt("パスワードを入力して下さい:","");
}
if(UserInput == null){
history.back();
}else if(UserInput != window.atob(pass)){
alert("パスワードが違います");
history.back();
}else{
var now = new Date();
// 15分間-cookieの有効期限
now.setMinutes(now.getMinutes() + 15);
document.cookie = "bc-base=" + encodeURIComponent(UserInput) + ";expires=" + now.toUTCString()+"; path=/;";
}
document.body.style.display = null;
};