dari88's diary

これから趣味にするプログラミング/PHP/javascript/kohana/CMS/web design/

XOOPS(XCL)のお勉強・・・はじめの一歩

ネットの事はネットに聞けと言いますが、CMSContent Management System)の場合は泥沼みたいな感じがします。ろくにマニュアルは無いし、入門に適したサイトも見当たりません。この技術はまさに発展途上で、雨後の筍の如くにいろんなのが開発されているようですが、マニュアルが追いつかないようです。PHP の世界とは大違いです。

CMS と適当なモジュールとお飾りのテンプレートを持ってきて、取り敢えず町内会用の掲示板を新設するみたいな目的なら大変便利だし、さほど勉強する必要もないと思います。しかし、独自にモジュールを作ったり、機能を追加しようと思ったらそうはいきません。勉強を進めて思うのですが、小規模なコミュニティーサイトを作る程度なら自分で全部書いちゃった方が CMS を勉強するより早いんじゃないかと感じています。データベースを使うと言ったって、管理項目はそれ程多くはならないでしょうしね。

さて文句はこれくらいにして、はじめの一歩です。下記の手順でフォルダとファイルを配置します。

<手順>
xoops\modules\mymod\xoops_version.php

<?php
$modversion{'name'} = 'マイモジュール'; // モジュールの表示名
$modversion{'dirname'} = basename(dirname(__FILE__)); // 親ディレクトリ名
$modversion{'hasMain'} = 1 ; // メインメニューにリストする

$modversion{'hasAdmin'} = 1 ; // 管理画面が有ることの宣言

// テンプレートはインストールとアップデート時にコンパイルされ、DBに保管される
$modversion['templates'][0]['file'] = 'mymod_index.html'; // 主ページのテンプレート
$modversion['templates'][1]['file'] = 'mymod_index2.html'; // 2ページ目のテンプレート

$modversion['sub'][0]['name'] = '2ページ目'; // サブメニューに表示される
$modversion['sub'][0]['url'] = 'index2.php'; // リンク

$modversion['blocks'][1] = array(
        'name'          => 'myブロック' , // ブロックの名前
        'file'          => 'mymod_block.php' , // ./blocks/下の実行ファイル
        'description'   => 'mymodのブロックです' , // ブロックの説明
        'class'         => 'MyBlock1' , // ブロッククラスの継承を行うクラス名→./blocks/mymod_block.php
        'template'      => 'mymod_block_template.html' , // ./templates/blocks/下のテンプレート名
        'funk_num'      => 1 
) ;
?>

xoops\modules\mymod\index.php

<?php
// おまじない
require '../../mainfile.php';

// ヘッダーを出力する
$root =& XCube_Root::getSingleton();
$root->mController->executeHeader();

// 表示の準備
$render =& $root->mContext->mModule->getRenderTarget();
$render->setTemplateName('mymod_index.html');
$render->setAttribute('value', '<strong>主ページ:登山は楽しい!!</strong>');

// 表示する
$root->mController->executeView();

?>

xoops\modules\mymod\index2.php

<?php
require '../../mainfile.php';
$root =& XCube_Root::getSingleton();
$root->mController->executeHeader();

$render =& $root->mContext->mModule->getRenderTarget();
$render->setTemplateName('mymod_index2.html');
$render->setAttribute('value', '<strong>2ページ目:山に行こう!!</strong>');

$root->mController->executeView();
?>

xoops\modules\mymod\templates\mymod_index.html

<div>日本が大好き!</div>
<div><{$value}></div>

xoops\modules\mymod\templates\mymod_index2.html

<div>日本が大好き!</div>
<div><{$value}></div>

xoops\modules\mymod\templates\blocks\mymod_block_template.html

<h1><{$blockdata}></h1>

xoops\modules\mymod\blocks\mymod_block.php

<?php
// セキュリティー
if (!defined('XOOPS_ROOT_PATH'))
    exit();

// ブロックの実行ファイル
// Mymod_ の後の MyBlock1 がxoops_version.phpの'class' => 'MyBlock1'に対応する
// ブロックの定義は定型的にこんな感じになる様子
class Mymod_MyBlock1 extends Legacy_BlockProcedure {

    function Mymod_MyBlock1(&$block) {
        parent::Legacy_BlockProcedure($block);
    }

    function execute() {
        $render = & $this->getRenderTarget();
        $render->setTemplateName($this->_mBlock->get('template'));
        $render->setAttribute('mid', $this->_mBlock->get('mid'));
        $render->setAttribute('bid', $this->_mBlock->get('bid'));
        
        // ブロック用テンプレートの<{$blockdata}>に代入される
        $render->setAttribute('blockdata', 'マイブロックだよ');

        $root = & XCube_Root::getSingleton();
        $renderSystem = & $root->getRenderSystem($this->getRenderSystemName());
        $renderSystem->renderBlock($render);
    }
}
?>

xoops\modules\mymod\admin\index.php

<?php
// おまじない
require_once '../../../mainfile.php';

// 管理用の画面では自動的にこのページが実行される
$root =& XCube_Root::getSingleton();
$root->mController->executeHeader();
?>

<div>管理用の画面だよ</div>

<?php
$root->mController->executeView();
?>

xoops\modules\mymod\class\Module.class.php

<?php
// セキュリティー
if (!defined('XOOPS_ROOT_PATH'))
    exit();

// 管理画面用にモジュールクラスを継承する
class Mymod_Module extends Legacy_ModuleAdapter {

    function Mymod_Module(&$xoopsModule) {
        parent::Legacy_ModuleAdapter($xoopsModule);
    }

    function hasAdminIndex() {
        return true;
    }

    function getAdminIndex() {
        return XOOPS_MODULE_URL . '/' . $this->mXoopsModule->get('dirname') . '/admin/index.php';
    }

    function getAdminMenu() {
        if (!$this->_mAdminMenuLoadedFlag) {
            $this->mAdminMenu[] = array(
                'link' => XOOPS_MODULE_URL . '/' . $this->mXoopsModule->get('dirname') . '/admin/index.php',
                'title' => 'メニュー名',
                'keywords' => 'アクションサーチで検索されるキーワード',
                'show' => true
            );
            $this->_mAdminMenuLoadedFlag = true;
        }
        return $this->mAdminMenu;
    }
}

?>

 ここまでで準備は終わりです。

これでモジュールをインストールして、さらにブロックもインストールできます。メインメニューにはマイモジュールがあり、サブメニューには2ページ目があるはずです。管理画面ではマイモジュールの管理もできるはず。

 先ずはこれらのファイルを読んで、何をやっているのか概略を理解しましょう。今回作ったフォルダの名前は XOOPS にとって意味があるのでむやみに変更できません。他のモジュールを見ても同じ名前のフォルダがあります。

全くの入門編ですけど、モジュールの基本構成が見えてきたんじゃないでしょうか。