氷川 XOOPS 研究室

モジュール制作、ウェブサービスなどなど

続・モジュールを作ろう!(4)ハンドラでテーブルのデータを取得1 anchor.png

Page Top

こんなときに使います anchor.png

ニュース登録時のカテゴリ一覧など、選択肢として使うようなデータをテーブルから取得するときに使います。

また、ぶら下がっている子データの一覧を取得する場合などにも使います(あるユーザが登録した記事の一覧など)。

操作対象テーブルのデータは Cubson の生成するコードで処理できますので、基本的にはノータッチでいけるのですが、そのテーブルに関連するデータ(カテゴリデータや都道府県データなど)は、そのままでは存在しません*1

そのため、以下のサンプルのようなコードを書いて、テーブルのデータを取得する必要があります。

Page Top

サンプルコード anchor.png

サンプル1:actions/XxxEditForm.class.php

function executeViewInput(&$render)
{
(略)
  $handler =& $this->mAsset->load('handler', "cat");
  $catsArr = $handler->getObjects();
  $render->setAttribute('cats', $catsArr);
}

サンプル2:actions/XxxEditForm.class.php

function executeViewInput(&$render)
{
(略)
  $handler = xoops_getmodulehandler('forumcat', 'myforum');
  $criteria = new CriteriaCompo('1', '1');
  $criteria->add(new Criteria('uid', 
  $this->mRoot->mContext->mXoopsUser->get('uid')));
  $forumcatsArr = $handler->getObjects($criteria);
  $render->setAttribute('forumcats', $forumcatsArr);
}
Page Top

解説 anchor.png

一つ目のサンプルは、同じモジュールの "cat" テーブルの全レコードを取ってきて $catsArr にオブジェクトとして入れて、それを "cats" という名前でレンダーに渡しています。

二つ目のサンプルは、いま操作しているモジュールとは別の "myforum" というモジュールの "forumcat" というテーブルのデータのうち、uid が利用ユーザの uid と同じデータを取得し、"forumcats" という名前でレンダーに渡しています。

別のモジュールのテーブルからデータを取ってくるということはあまりやりませんが、強引にデータを取りたい場合はこう書きます。ただし、そのテーブルが XoopsSimpleObject、XoopsObjectGenericHandler を持っていないとだめです*2

その次の行の CriteriaCompo というのは、テーブルからデータを取得する際の条件を保持するクラスです。この行はこのオブジェクトを生成するお決まりの書き方で、実際の条件は次の行に書かれています。

CriteriaCompo オブジェクトにセットされた条件は、実際には SQL 文の WHERE 節や ORDER BY 句に翻訳されます。その処理が、次の行の getObjects($criteria) で行われ、さらにデータベースに接続して指定されたデータを取得し、 $forumcatsArr にオブジェクトとして格納されます。

レンダーに渡されたデータは、テンプレートファイルの中で以下のようにして使うことができます。

<select name="cat_id" class="inputbox" >
  <{foreach item=child from=$cats}>
    <{if $child->get('cat_id') == $actionForm->get('cat_id')}>
      <option value="<{$child->getVar('cat_id')}>" selected="selected">
        <{$child->getShow('cat_name')}>
      </option>
    <{else}>
      <option value="<{$child->getShow('cat_id')}>">
        <{$child->getShow('cat_name')}>
      </option>
    <{/if}>
  <{/foreach}>
</select>

なお、select のオプションに特化した形では、以下の様に簡潔に書くこともできます。

<select name="cat_id">
  <{xoops_optionsArray label="cat_name" from=$cats 
  value="cat_id" default=$actionForm->get('cat_id'))}>
</select>
Page Top

注意 anchor.png

getObjects() メソッドでとってきたデータは、オブジェクトの配列に格納されるので、テンプレートで利用する場合はその点に注意が必要です。

たとえば、上のサンプルでは、foreach の中で使っているので配列の添え字は要らないのですが、そうではなくいきなり

<{$cats->getShow('cat_name')}>

とやるとエラーになります。正しくは、以下の様に配列の添え字をつけなければなりません。

<{$cats[0]->getShow('cat_name')}>

次回あたりで説明を予定している get() メソッドで取得したデータはこれと反対になるのですが、最初の頃この違いを認識していなくてかなり嵌った記憶が。


*1 本当は Cubson がそこまでやってくれるのですが、いまその機能は死んでいる
*2 Cubson で作ったモジュールなら普通 modules/{moduleName}/class/handler/ 以下に用意されています

トップ   凍結 差分 バックアップ 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS 1.0 最終更新のRSS 2.0 最終更新のRSS Atom
Counter: 3842, today: 1, yesterday: 3
最終更新: 2008-08-29 (金) 19:37:19 (JST) (3192d) by kilica

Powered by XOOPS Cube 2.1© 2001-2006 XOOPS Cube Project - xc-tokai