# Geeklog DataproxyプラグインのAPI

制作者 | mystral-kk - geeklog AT mystral-kk DOT net
バージョン | 2.0.0
公開日 | 2012-06-11

## 1. 概要

Dataproxyプラグインは、Geeklogのコンテンツ取得代行・キャッシュ管理を行うプラグインです（キャッシュ管理機能はまだ実装されていません）。通常、各プラグインが管理するデータを取得するには、それぞれSQLを組み立て、権限チェックを追加するなどの手順を踏む必要がありますが、Dataproxyプラグインを使用すれば、簡単な手順と統一されたインターフェースでコンテンツを取り出すことができます。

ご注意：Dataproxyプラグインはまだ開発初期の段階のため、下記のAPIは変更される可能性があります。

## 2. データソース・カテゴリ・アイテム

Dataproxyプラグインでは、コンテンツを提供する機能・プラグインをデータソースとして位置づけています。現時点でサポートされているデータソースは次の通りです。article, comments, trackbackは常に利用できます。

- article（記事）
- comments（コメント）
- trackback（トラックバック）
- staticpages（静的ページプラグイン）
- calendar（カレンダープラグイン）
- links（リンクプラグイン）
- polls（アンケートプラグイン）
- dokuwiki（DokuWikiプラグイン）
- forum（掲示板プラグイン）
- filemgmt（ファイル管理プラグイン）
- faqman（FAQプラグイン）
- mediagallery（メディアギャラリプラグイン）
- downloads（ダウンロードプラグイン）

また、各データソースは階層的なカテゴリを持っています（staticpagesなどにはありません）。各階層にある具体的なコンテンツをアイテムと呼びます。

## 3. Dataproxyプラグインの利用法

Dataproxyプラグインがインストールされ、有効になっていれば、次の1行を記述するだけでDataproxyプラグインが提供するAPIを利用できます。

$dataproxy = Dataproxy::getInstance($uid);

$uidはデータを取得するユーザーのID($_USER['uid'])です。デフォルト値は1（ゲストユーザーの扱い）です。全データを取得する必要がある場合は、0を指定します。

## 4. Dataproxyクラス

Dataproxyクラスは実際にデータを取得するdpxyDriverクラスの生成・管理を担当します。現在有効になっているプラグインを認識し、必要なdpxyDriverクラスのインスタンスを作成します。

### 4.1 Dataproxyクラス - 公開メソッド(静的メソッド)

getAllSupportedDriverNames()

Dataproxyプラグインでサポートされているデータソース名の配列を返します。

getAllDriverNames()

Dataproxyプラグインで現在有効になっているデータソース名の配列を返します。サポートされているデータソースについては、上記をご覧ください。

escape($str)

文字列をHTMLとして出力できるようエスケープします。

### 4.2 Dataproxyクラス - 公開メンバー

以下のメンバーは、データソースオブジェクト（：dpxyDriverクラス）へのリファレンスになっています。

- article
- comments
- trackback
- staticpages
- calendar
- links
- polls
- dokuwiki
- forum
- filemgmt
- faqman
- mediagallery
- downloads

## 5. dpxyDriverクラス

dpxyDriverクラスは各コンテンツのデータ・メタデータを実際に取り出すデータソースドライバーの親クラスです。Dataproxyクラスが管理しますので、ユーザーがデータソースドライバーをインスタンス化する必要はありません。

### 5.1 dpxyDriverクラス - 公開メソッド

getEntryPoint()

各プラグインのユーザーに見えるトップページのURIを返します。staticpagesプラグインなどのようにトップページがない場合は、FALSEを返します。

getChildCategories($pid = FALSE, $all_langs = FALSE)

親カテゴリ$pidの下にあるすべての子カテゴリのメタデータを配列で返します。配列の要素は以下のようになっています。ルートカテゴリの場合は、$pidにFALSEを指定して呼び出します。多言語機能を有効にしたサイトで$all_langsにTRUEを指定すると、カレントユーザーの言語IDを無視します。Googleサイトマップなどを作成する場合に有効です。

- id - カテゴリID(string)
- pid - 親カテゴリのID(string)
- title - カテゴリのタイトル(string)
- uri - カテゴリのURI(string)
- date - カテゴリの作成（更新）日(int: Unix timestamp, ない場合はFALSE)
- image_uri - カテゴリの画像のURI(string, ない場合はFALSE)

getAllCategories($all_langs = FALSE)

データソースが持つすべてのカテゴリのメタデータを配列で返します。配列の要素は、getChildCategories()と同じです。多言語機能を有効にしたサイトで$all_langsにTRUEを指定すると、カレントユーザーの言語IDを無視します。Googleサイトマップなどを作成する場合に有効です。

getItems($category, $all_langs = FALSE)

親カテゴリ$pidの下にあるすべてのアイテムのメタデータを配列で返します。配列の要素は以下のようになっています。ルートカテゴリの場合は、$pidにFALSEを指定して呼び出します。多言語機能を有効にしたサイトで$all_langsにTRUEを指定すると、カレントユーザーの言語IDを無視します。Googleサイトマップなどを作成する場合に有効です。

- id - アイテムID(string)
- pid - 親カテゴリのID(string)
- title - アイテムのタイトル(string)
- uri - アイテムのURI(string)
- date - アイテムの作成（更新）日(int: Unix timestamp, ない場合はFALSE)
- image_uri - アイテムの画像のURI(string, ない場合はFALSE)

getItemById($id, $all_langs = FALSE)

$idで指定されたIDを持つアイテム1個分のメタデータと生データを配列で返します。配列の要素は以下のようになっています。

- id - アイテムID(string)
- pid - 親カテゴリのID(string)
- title - アイテムのタイトル(string)
- uri - アイテムのURI(string)
- date - アイテムの作成（更新）日(int: Unix timestamp, ない場合はFALSE)
- image_uri - カテゴリの画像のURI(string, ない場合はFALSE)
- raw_data - データベースから取り出した生のデータ（ただし、stripslashes()は適用済み）

getAllItems($all_langs = FALSE)

データソースが持つすべてのアイテムのメタデータを配列で返します。配列の要素は、getItems()と同じです。多言語機能を有効にしたサイトで$all_langsにTRUEを指定すると、カレントユーザーの言語IDを無視します。Googleサイトマップなどを作成する場合に有効です。

escape($str)

文字列をHTMLとして出力できるようエスケープします。

toUtf8($str)

$strをUTF-8に変換します。

cleanUrl($url)

与えられたURIからXSSの可能性のあるコードを取り除きます。

## 6. Dataproxyプラグイン利用のコーディング例

例1. 記事のメタデータを全て（カレントユーザーの言語のみ）取り出す

$dataproxy = Dataproxy::getInstance();
$item_metadata = $dataproxy->article->getAllItems();

例1. 記事のメタデータを全て（すべての言語）取り出す。

$dataproxy = Dataproxy::getInstance();
$item_metadata = $dataproxy->article->getAllItems(TRUE);

例2. 静的ページのメタデータを全て取り出す

$dataproxy = Dataproxy::getInstance();
$item_metadata = $dataproxy->staticpages->getAllItems();

例3. 'foo'カテゴリの記事のメタデータを全て取り出す

$dataproxy = Dataproxy::getInstance();
$item_metadata = $dataproxy->article->getItems('foo');

例4. 記事IDが'bar'の記事のデータを取り出す

$dataproxy = Dataproxy::getInstance();
$item = $dataproxy->article->getItem('bar');

例5. 全データソースのアイテムのメタデータを全て取り出す

$items = array();
$dataproxy = Dataproxy::getInstance();
foreach (Dataproxy::getAllDriverNames() as $driver) {
$items[] = $dataproxy->$driver->getAllItems();
}

## 7. APIの変更履歴

バージョン | 公開日 | 変更点
--- | --- | ---
2.0.0 | 2012-06-11 | Singletonパターンを用いて、Dataproxyクラスを書き直しました。
1.0.3 | 2007-12-26 | getChildCategories(), getAllCategories(), getAllCategoriesAsLinks(), getItemById(), getItems(), getItemsAsLinks), getAllItems()で、$all_langsパラメーター（オプション）を追加しました。
1.0.0 | 2007-11-04 | 初期バージョン