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さんのサイトに掲載のコード をサンプルにさせていただきました。

Base64にエンコードされたパスワードがjsのコードにそのまま格納されていますので、あくまで「簡易」なパスワードをつけておく程度の用途のものと考えてください。パスワードは、Base64エンコーダーを使って、適宜、作成・変更してください。
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;
};

コメント


コメントする


ZAQcWj