baserCMS Tips #5 ブログコメント受付機能をオフにしても過去のコメントは表示させたい

baserCMS Tips #5 ブログコメント受付機能をオフにしても過去のコメントは表示させたい

現状のbserCMS(ブログプラグイン)の仕様では、コメント受付機能をオンで運用していたブログをその後の事情(スパムコメントなど)でコメント受付機能をオフにした場合、すでに受け付けたコメントが諸共に非表示になるので、すこし切ないことになってしまいます。
なので、コメント受付機能をオフにしても過去のコメントはそのまま表示させるようにしたいとの要望に対応してみました。そもそも、本来そうなっていてほしい気がするんですが。。。

ただ、コメント入力欄が表示されないのに過去のコメントだけが表示されたままだと、初めてブログを閲覧した人がコメント入力欄を探しまわることになってしまうかもしれず、なので、このような場合に一言「現在、新規のコメント受付は休止しています。」と表示するようにしてみたいと思います。

というわけで、以下がブログコメント欄出力用のエレメントファイル( /theme/利用中のテーマフォルダ/Elements/blog_comments.php) の該当コード。4系(v.4.8.2)のbc_sampleテーマ内のものをサンプルにしました。

<!-- (前略) -->

<?php if (!empty($blogContent['BlogContent']['comment_use'])): ?>
<div class="bs-blog-comment">

    <h4 class="bs-blog-comment__head"><?php echo __('この記事へのコメント') ?></h4>

    <div id="BlogCommentList" class="bs-blog-comment__list">
        <?php if (!empty($post['BlogComment'])): ?>
            <?php foreach ($post['BlogComment'] as $comment): ?>
                <!-- /Elements/blog_comment.php -->
                <?php $this->BcBaser->element('blog_comment', ['dbData' => $comment]) ?>
            <?php endforeach ?>
        <?php else: ?>
        <p>コメントはまだありません。</p>
        <?php endif ?>
    </div>

    <h4 class="bs-blog-comment__head"><?php echo __('コメントを送る') ?></h4>

    <?php echo $this->BcForm->create('BlogComment', [
        'url' => '/blog/blog_comments/add/' . $blogContent['BlogContent']['id'] . '/' . $post['BlogPost']['id'],
        'id' => 'BlogCommentAddForm'
    ]) ?>
    <?php echo $this->BcForm->input('BlogComment.captcha_id', [
        'type' => 'hidden',
        'value' => $captchaId
    ]) ?>

    <table class="bs-blog-comment__form">
        <tr>
            <th><?php echo $this->BcForm->label('BlogComment.name', __('お名前') . ' / ' . __('ニックネーム')) ?><span class="required">必須</span></th>
            <td><?php echo $this->BcForm->input('BlogComment.name', ['type' => 'text', 'required' => false]) ?></td>
        </tr>
        <tr>
            <th><?php echo $this->BcForm->label('BlogComment.email', __('メールアドレス')) ?><span class="required">必須</span></th>
            <td>
                <?php echo $this->BcForm->input('BlogComment.email', ['type' => 'text', 'size' => 30, 'required' => false]) ?>&nbsp;
                <br><small>※ <?php echo __('メールアドレスは公開されません') ?></small>
            </td>
        </tr>
        <tr>
            <th><?php echo $this->BcForm->label('BlogComment.url', 'URL') ?><span class="normal">任意</span></th>
            <td><?php echo $this->BcForm->input('BlogComment.url', ['type' => 'text', 'size' => 30, 'required' => false]) ?></td>
        </tr>
        <tr>
            <th><?php echo $this->BcForm->label('BlogComment.message', __('コメント')) ?><span class="required">必須</span></th>
            <td><?php echo $this->BcForm->input('BlogComment.message', ['type' => 'textarea', 'rows' => 10, 'cols' => 52, 'required' => false]) ?></td>
        </tr>
    </table>

    <?php if ($blogContent['BlogContent']['auth_captcha']): ?>
    <div class="bs-blog-comment__auth-captcha">
        <img src="" alt="<?php echo __('認証画象') ?>" class="auth-captcha-image" id="AuthCaptchaImage" style="display:none">
        <?php $this->BcBaser->img('admin/captcha_loader.gif', [
            'alt' => 'Loading...',
            'class' => 'auth-captcha-image',
            'id' => 'CaptchaLoader'
        ]) ?>
        <?php echo $this->BcForm->text('BlogComment.auth_captcha') ?>
        &nbsp;<?php echo __('画像の文字を入力してください') ?>
    </div>
    <?php endif ?>

    <div class="bs-blog-comment__submit">
        <?php echo $this->BcForm->end(['label' => __('送信する'), 'id' => 'BlogCommentAddButton', 'class' => 'button']) ?>
    </div>

    <div id="ResultMessage" class="message" style="display:none;text-align:center">&nbsp;</div>

</div>
<?php endif ?>

このコードは、ブログコメント欄の

  1. 「この記事へのコメント」見出し+コメントリスト表示部分
  2. 「コメントを送る」見出し+入力フォーム部分
  3. 認証画像および認証コード入力部分
  4. コメント送信ボタン部分

の大きく4つのブロックで構成されていて、それらをbs-blog-commentクラス属性の<div>要素に括り、cssでトップにマージンを加えている格好です。 それぞれのブロックおよびbs-blog-commentクラス属性の<div>要素は、いくつかの条件分岐処理によって出力を制御しています。

詳細

さて、上記コードをサンプルにして、以下のような考え方で改修します。

<?php if (!empty($post['BlogComment'])): ?>の条件分岐がtrueの場合に以下を出力する。
1.「この記事へのコメント」見出し+コメントリスト表示部分

<?php if (empty($blogContent['BlogContent']['comment_use'])): ?>の条件分岐がtrueの場合
1.「この記事へのコメント」見出しの後に「(現在、新規のコメント受付は休止しています。)」のコメントを出力する。

<?php if (!empty($blogContent['BlogContent']['comment_use'])): ?>の条件分岐がtrueの場合に以下を出力する。
2.「コメントを送る」見出し+入力フォーム部分
3.認証画像および認証コード入力部分
4.コメント送信ボタン部分

上記の分岐処理を加えて改変したサンプルコードは、以下。

<!-- (前略) -->

<?php if (!empty($post['BlogComment'])): ?>
<div class="bs-blog-comment">

    <h4 class="bs-blog-comment__head"><?php echo __('この記事へのコメント') ?>
        <?php if (empty($blogContent['BlogContent']['comment_use'])): ?>
            <span style="font-weight:normal;font-size:0.875rem;"><?php echo '(現在、新規のコメント受付は休止しています。)' ?></span>
        <?php endif ?>
    </h4>

    <div id="BlogCommentList" class="bs-blog-comment__list">
        <?php foreach ($post['BlogComment'] as $comment): ?>
            <!-- /Elements/blog_comment.php -->
            <?php $this->BcBaser->element('blog_comment', ['dbData' => $comment]) ?>
        <?php endforeach ?>
    </div>

</div>
<?php endif ?>

<?php if ($blogContent['BlogContent']['comment_use']): ?>
    <h4 class="bs-blog-comment__head"><?php echo __('コメントを送る') ?></h4>

    <?php echo $this->BcForm->create('BlogComment', [
        'url' => '/blog/blog_comments/add/' . $blogContent['BlogContent']['id'] . '/' . $post['BlogPost']['id'],
        'id' => 'BlogCommentAddForm'
    ]) ?>
    <?php echo $this->BcForm->input('BlogComment.captcha_id', [
        'type' => 'hidden',
        'value' => $captchaId
    ]) ?>

    <table class="bs-blog-comment__form">
        <tr>
            <th><?php echo $this->BcForm->label('BlogComment.name', __('お名前') . ' / ' . __('ニックネーム')) ?><span class="required">必須</span></th>
            <td><?php echo $this->BcForm->input('BlogComment.name', ['type' => 'text', 'required' => false]) ?></td>
        </tr>
        <tr>
            <th><?php echo $this->BcForm->label('BlogComment.email', __('メールアドレス')) ?><span class="required">必須</span></th>
            <td>
                <?php echo $this->BcForm->input('BlogComment.email', ['type' => 'text', 'size' => 30, 'required' => false]) ?>&nbsp;
                <br><small>※ <?php echo __('メールアドレスは公開されません') ?></small>
            </td>
        </tr>
        <tr>
            <th><?php echo $this->BcForm->label('BlogComment.url', 'URL') ?><span class="normal">任意</span></th>
            <td><?php echo $this->BcForm->input('BlogComment.url', ['type' => 'text', 'size' => 30, 'required' => false]) ?></td>
        </tr>
        <tr>
            <th><?php echo $this->BcForm->label('BlogComment.message', __('コメント')) ?><span class="required">必須</span></th>
            <td><?php echo $this->BcForm->input('BlogComment.message', ['type' => 'textarea', 'rows' => 10, 'cols' => 52, 'required' => false]) ?></td>
        </tr>
    </table>

    <?php if ($blogContent['BlogContent']['auth_captcha']): ?>
    <div class="bs-blog-comment__auth-captcha">
        <img src="" alt="<?php echo __('認証画象') ?>" class="auth-captcha-image" id="AuthCaptchaImage" style="display:none">
        <?php $this->BcBaser->img('admin/captcha_loader.gif', [
            'alt' => 'Loading...',
            'class' => 'auth-captcha-image',
            'id' => 'CaptchaLoader'
        ]) ?>
        <?php echo $this->BcForm->text('BlogComment.auth_captcha') ?>
        &nbsp;<?php echo __('画像の文字を入力してください') ?>
    </div>
    <?php endif ?>

    <div class="bs-blog-comment__submit">
        <?php echo $this->BcForm->end(['label' => __('送信する'), 'id' => 'BlogCommentAddButton', 'class' => 'button']) ?>
    </div>

    <div id="ResultMessage" class="message" style="display:none;text-align:center">&nbsp;</div>
<?php endif ?>


ちなみに5系(以下のコード)では、blog_comments.phpの呼び出し直後にif (!$blogContent->comment_use) return;で制御されているので、そこをコメントアウトして、その後のHTML部分で同様の条件分岐処理を加えれば良いと思います。

<?php

// (中略)

// if (!$blogContent->comment_use) return;
$captchaId = mt_rand(0, 99999999);
$this->BcBaser->i18nScript([
  'alertMessageName' => __d('baser_core', 'お名前を入力してください'),
  'alertMessageEmail' => __d('baser_core', 'メールアドレスを入力してください'),
  'alertMessageComment' => __d('baser_core', 'コメントを入力してください'),
  'alertMessageAuthImage' => __d('baser_core', '画像の文字を入力してください'),
  'alertMessageAuthComplete' => __d('baser_core', '送信が完了しました。送信された内容は確認後公開させて頂きます。'),
  'alertMessageError' => __d('baser_core', 'コメントの送信に失敗しました。入力内容を見なおしてください。'),
]);
$this->BcBaser->js('BcBlog.blog_comment.bundle.js', true, [
  'defer' => 'defer',
  'id' => 'BlogCommentsScripts',
  'data-captchaId' => $captchaId,
  'data-commentApprove' => $blogContent->comment_approve,
  'data-authCaptcha' => $blogContent->auth_captcha,
  'data-authCaptchaImageBaseUrl' => $this->BcBaser->getUrl([
    'plugin' => 'BcBlog',
    'controller' => 'Blog',
    'action' => 'captcha'
  ])
]);
?>

<!-- (後略) -->

コメント


コメントする


M8ZFVz