d3forumに行かずにd3コメント統合する

XOOPS2からXOOPS Cube Legacyに載せ替えるにあたり、コメントシステムもXOOPS標準のものからd3forumモジュールに間借りする、いわゆるd3コメント統合という仕組みを使わせていただくことにしました。もともと当サイトの主要コンテンツにはソーシャルボタンもコメントも付いていなかったのでそんなに使用頻度は高くないのですが、この際ということで。

ただ、実際に移行してみると、d3forumモジュールとの間を行ったり来たりするのがどうも煩雑に感じます。そこで、できるだけd3forumに行かずに、かつソースコードに手を加えずに、d3コメント統合の機能を借りる方法を考えました。

  • リッチテキストエディタは使わない。d3forumにはテキストエリアだけのクイック投稿フォームが用意されています。そのフォームの下にd3forumにおける投稿画面へのリンクがあり、こちらではリッチテキストを扱えるエディタを使えます。せっかくですがこのリンクは削除。
  • 1文書1トピック。こう決めることでトピック一覧を見せる必要がなくなります。もともと多くのコメントがあるわけでもないので、これでいいでしょう。

こういった作業は、基本的にリンクを外していくだけなので簡単です。困ったのが返信・編集・削除の機能。結果的には削除を除いて返信と編集はシンプルにできました。

d3forumに飛ばさないで返信を書くためには、返信画面を新しく作らなければなりません。あれこれ考えて、クイック投稿フォームを改造したクイック返信・編集フォームをdocs(pico)文書として用意することを思いつきました。返信フォームはこんな感じ。本文フィルターの「Smarty(XoopsTpl)」をオンにして作ります。

<{archit_getd3forumpost post_id=$smarty.get.p}> ← 返信の対象となる投稿を取得する

<!-- comment reply form -->
<div class="panel panel-default"> ← 返信の対象となる投稿を表示する
  <div class="panel-heading"><{$orgpost.subject}></div>
  <div class="panel-body"><{$orgpost.post_text}></div>
</div>

<form class="form-horizontal" name="postform" id="postform" action="<{$xoops_url}>/modules/forum/index.php?page=post" method="post">
    <input type="hidden" name="mode" id="mode" value="reply">
    <input type="hidden" name="pid" id="pid" value="<{$smarty.get.p}>" />
    <input type="hidden" name="smiley" id="smiley" value="1" />
    <input type="hidden" name="xcode" id="xcode" value="1" />
    <input type="hidden" name="br" id="br" value="1" />
    <input type="hidden" name="number_entity" id="number_entity" value="1" />

  <div class="form-group">
    <label for="com_subject" class="col-xs-2 control-label"><{$smarty.const._MD_D3FORUM_SUBJECT}></label>
    <div class="col-xs-10">
      <input class="form-control" type="text" name="subject" id="com_subject" maxlength="255" value="<{$orgpost.subject|ltrim:'Re: '|string_format:$smarty.const._MD_D3FORUM_FMT_COMMENTSUBJECT|escape}>">
    </div>
  </div>

  <div class="form-group">
    <label for="message" class="col-xs-2 control-label"><{$smarty.const._MD_D3FORUM_TH_BODY}></label>
    <div class="col-xs-10">
      <textarea class="form-control" name="message" cols="50" rows="5"><{$message}></textarea>
    </div>
  </div>

  <div class="form-group">
    <div class="col-xs-10 col-xs-offset-2">
      <input class="btn btn-success" type="submit" name="contents_submit" id="com_submit" value="返信を投稿">
      <a class="btn btn-default" href="#" onclick="history.back(); return false;">キャンセル</a>
    </div>
  </div>

</form>

d3フォーラムの言語定数を読み込むために、そして元投稿の情報を取得するために、小さなSmartyプラグインを書きました。元投稿の記事は返信元から渡してきてもよいのですが、長い文字列をGETで渡すのもなんとなくためらわれたので、この画面で取得し直すことにしました。

<?php
function smarty_function_archit_getd3forumpost( $params , &$smarty )
{
    $root =& XCube_Root::getSingleton();
    $db =& $root->mController->mDB;
    $orgpost = array();

    // Get Language Constant
    require_once XOOPS_TRUST_PATH.'/modules/d3forum/language/ja_utf8/main.php';

    // Get the post
    $sql = 'SELECT * FROM '.$db->prefix('forum_posts').' WHERE post_id='.$params['post_id'];
    if( $ret = $db->query($sql) ) {
        $orgpost = $db->fetchArray($ret);
    } else {
        $errInfo = strip_tags(str_replace('</td>', "\n", $db->logger->dumpQueries()));
        error_log(__FILE__.' '.__LINE__."\n".$errInfo, 1, $root->mContext->mXoopsConfig['adminmail']);
    }

    // Set the title and body
    $smarty->assign('orgpost', $orgpost);
}
?>

編集も似た感じです。削除だけは、ページの描画から切り離して呼べるようになっていないので断念。まあそんなに頻繁に削除するものでもないからよしとします。


友達に伝える
作成: 2013/11/7 by:koji
更新: 2013/11/7 by:koji


$root = XCube_Root::getSingleton(); でよいのか

Tech

Bootstrap 3 on XOOPS X(テンプレート編)

新規ユーザー登録(無料)

  • メールニュース[週刊起-動線]の購読
  • コメントなどの投稿
  • ココロミの利用
  • 一部コンテンツの購読

ログイン

コメント

タグ(キーワード)