Cubsonベースのモジュール組み込み型モジュールの作成 (3)

本記事は,d3forum のコメント統合機能のように,他のモジュールに埋め込んで使うモジュールの作成方法を解説するものです。

対象は,Cubson でモジュールを作れて,かつ上のようなモジュールの作り方は分からない方

以下の説明では,モジュール名:bookmark,テーブル名:bm というモジュール組込型モジュールの例で説明します。

呼び出し元モジュールのテンプレート

呼び出しもとモジュールのテンプレートの,埋め込みたい位置に smarty を記述します*1

<{bookmark_impl title=$title}>

smarty プラグイン

/class/smarty/plugins/ に,function.bookmark_impl.php を作成し,以下のように記述(ファイルを忘れてきたので,ちょっと違うかも。あとで確認して訂正します)。

<?php
function smarty_function_bookmark_impl($params, &$smarty)
{
XCube_DelegateUtil::call('Module.bookmark.Event.Implement', new XCube_Ref($params))
}
?>

preload ファイル

{Xoops_Module}/bookmark/preload/implement.class.php というファイルを作成し,以下のように記述します。

<?php
/**
 * @file
 * @package bookmark
 * @version $Id$
 */

if (!defined('XOOPS_ROOT_PATH')) exit();

class Bookmark_Implement extends XCube_ActionFilter
{
  /**
   * @public
   */
  function preBlockFilter()
  {
    $root =& XCube_Root::getSingleton();
    $root->mDelegateManager->add('Module.bookmark.Event.Implement',"Bookmark_Implement::implement");
  }
  
  /**
   * @private
   */
  function implement($params)
  {
    //
    // Boot the action frame of the bookmark module directly.
    //
    $root =& XCube_Root::getSingleton();
    $_REQUEST['bm_title'] = $params['bm_title'];

    $root->mController->setupModuleContext('bookmark');
    $root->mLanguageManager->loadModuleMessageCatalog('bookmark');

    require_once XOOPS_MODULE_PATH . "/bookmark/class/Module.class.php";

    $handler =& xoops_gethandler('module');
    $module =& $handler->getByDirname('bookmark');
    if (!is_object($module)) {
      XCube_DelegateUtils::call('Legacy.Event.Exception.XoopsModuleNotFound', $dirname);
      $root->mController->executeRedirect(XOOPS_URL . '/', 1, "You can't access this URL.");
      die();
    }

    $moduleRunner = new Bookmark_Module($module);
    $moduleRunner->setActionName('BmImplement');
    $root->mController->mExecute->add(array(&$moduleRunner, 'execute'));
    $root->mController->_processModule();
    $root->mController->execute();
  }
}
?>

*1:smartyに与えるパラメタはモジュールの要件によって変えてください