XCL専用モジュールでのブロックの書き方
あちこちにあるサンプル、わかりにくすぎます。
そんなわけで正しい書き方
まずはsampleモジュールのxoops_version.php
$modversion['blocks'][1]['name'] = 'sampleblock'; $modversion['blocks'][1]['file'] = 'sampleblock.php'; $modversion['blocks'][1]['class'] = 'SampleBlock'; $modversion['blocks'][1]['template'] = 'sampleblock_template.html'; $modversion['blocks'][1]['func_num'] = 1; $modversion['blocks'][1]['options'] = "1|2|3";
'class'にクラス名を記述…するわけですが本物のクラス名を書くわけではないです。実装クラスの名前は"Sample_SampleBlock"つまり(モジュール名_xoops_versionに書いたクラス名)。これを"class SampleBlock"と書いたり"class SampleClass"と書いたり"class SampleBlockClass"と書いたり"class Sample_SampleClass"と書いても動きません。
<?php class Sample_SampleBlock extends Legacy_BlockProcedure{ function __construct(&$block) { echo "dddd"; parent::__construct($block); } function Sample_ExampleBlock(&$block){ echo "aaaa"; parent::Legacy_BlockProcedure($block); } function execute(){ echo "bbbb"; // いったんレンダー側に値を預けます。 $render =& $this->getRenderTarget(); $render->setTemplateName($this->_mBlock->get('template')); $render->setAttribute('mid', $this->_mBlock->get('mid')); $render->setAttribute('bid', $this->_mBlock->get('bid')); echo "cccc"; /* ここにやりたいことを書く */ $render->setAttribute("value","スケルトンBLOCK"); // 預けた値をレンダーシステムが取得します。 $root =& XCube_Root::getSingleton(); $renderSystem =& $root->getRenderSystem($this->getRenderSystemName()); $renderSystem->renderBlock($render); echo "eeee"; } // これがXOOPS2時代の['edit_func']に該当するもの public function getOptionForm() { $options = explode('|', $this->_mBlock->get('options')); $options[0] = (int) $options[0]; // 戻り値はオプションフォームのHTML // Legacyのレンダーシステムでレンダリングした結果を返すなり、 // XOOPS2風にHTMLをべた書きで返すなり自由にどうぞ。 $result = ''; return $result; } } ?>
コンストラクタ2つ書いてますが深い意味はないです。PHP5だから専用コンストラクタ使うのか?呼ばれないのか?とか色々悩んだ末の残骸です。