FAQ

FAQ -- よくある質問への答え

説明

これは、PEAR general mailing list およびその他のメーリングリストや掲示板での質問をもとにして作られたものです。

Structures_DataGrid FAQ

1. HTML_Table レンダラを使用しています。 同じページ内で複数のグリッドを使用するにはどうしたらいいですか?
2. どのデータソースドライバがお勧めですか?
3. データグリッドに行番号を追加したいのですが、どのようにすればいいですか?
4. Excel レンダラを使用しています。Excel ファイルでユーロ記号 (€) を使用したいのですが、単なる四角形や変な文字になってしまいます。 正しい € を使用するにはどうすればいいですか?
5. ストリーミング機能ってイケてますよね。なぜデフォルトで有効にしないんですか?
6. 以前のバージョンの Structures_DataGrid で $renderer->toHtml(); を使っていたのですが、最近のバージョンではこれは動作しないようです。 どのようにコードを修正したらいいですか?
7. すべての行が 1 ページで表示されてしまいます。 ページ分けするにはどうしたらいいですか?
8. カラム名を大文字にしていると、MDB2 データソースドライバで並べ替え機能が動作しません。 なぜでしょう?

1. HTML_Table レンダラを使用しています。 同じページ内で複数のグリッドを使用するにはどうしたらいいですか?

setRequestPrefix() メソッドを使用しましょう。ページ内の各 DataGrid は、 並べ替えやページ処理用の GET パラメータを処理する際に、 内部的にこのプレフィックスを使用します。例えばこのようにして使用します。
require_once 'Structures/DataGrid.php';

$datagrid1 = new Structures_DataGrid();
$datagrid2 = new Structures_DataGrid();

$datagrid1->setRequestPrefix('trade_');
$datagrid2->setRequestPrefix('stock_');

$datagrid1->bind('SELECT * FROM trade', array('dsn' => DSN));
$datagrid2->bind('SELECT * FROM stock', array('dsn' => DSN));

$datagrid1->render();
$datagrid2->render();

注意 setRequestPrefix() は、 bind() の前にコールする必要があります。

2. どのデータソースドライバがお勧めですか?

現時点では、効率を考慮すると次の 5 つのデータソースドライバがお勧めです。

  • DB_DataObject

  • DB_Table

  • DBQuery

  • MDB2

  • PDO

これら 4 つのドライバは、必要なレコードだけをデータベースから取得します。 例えば、ページあたりの行数を 15 レコードに制限している場合は、 (最大で) 15 レコードまでしか読み込みません。

その他のデータソースドライバも、もちろん使用可能です。 しかしそれらのドライバには、このように不必要なレコードの読み込み (あるいはメモリ内に保持し続ける) のを防ぐ機能は実装されていません (って言うか実装できません)。

3. データグリッドに行番号を追加したいのですが、どのようにすればいいですか?

新しいカラム用の フォーマッタ が必要です。これが行番号を保持します。このフォーマッタ関数への最初のパラメータには、 各ページ内での行番号を表す currRow という値が含まれます。 テーブル全体の中での現在の行番号を計算するには、 getCurrentRecordNumberStart() メソッドを使用するとよいでしょう。

次のコードは、フォーマッタ関数を定義してカラムを追加する方法を示したものです (# をカラムのラベルに指定し、値を右詰めにしています)。
function formatRowNumber($params, $recordNumberStart)
{
    return $params['currRow'] + $recordNumberStart;
}

$datagrid->addColumn(
    new Structures_DataGrid_Column(
        '#',
        null,
        null,
        array('style' => 'text-align: right;'),
        null,
        'formatRowNumber',
        $datagrid->getCurrentRecordNumberStart()
    ));

4. Excel レンダラを使用しています。Excel ファイルでユーロ記号 (€) を使用したいのですが、単なる四角形や変な文字になってしまいます。 正しい € を使用するにはどうすればいいですか?

使用するエンコーディングを、例えば ISO-8859-15 などではなく Windows-1252 にする必要があります。

5. ストリーミング機能ってイケてますよね。なぜデフォルトで有効にしないんですか?

Structures_DataGrid におけるストリーミングのサポートは、 大規模なデータセットで使用することを想定したものです。 しかし、小規模なデータセットでも、効率を悪化させることなく使用可能です。

とはいえ、物事には常に例外がつきものです。 データベースから値を取得するデータソースドライバを使用している場合に、 結果の取得に長い時間のかかるクエリを実行しているのなら、 ストリーミングを使用すべきではありません。 だって、そんな複雑なクエリを何度も繰り返すことになったら、 さらに時間がかかってしまいますよね。

6. 以前のバージョンの Structures_DataGrid で $renderer->toHtml(); を使っていたのですが、最近のバージョンではこれは動作しないようです。 どのようにコードを修正したらいいですか?

単に HTML コードを出力したいだけなら、次のようにします。
$datagrid->render()
出来上がった HTML コードをどこかに取得してテンプレートなどで使用したい場合は、 次のようにします。
$html = $datagrid->getOutput();

7. すべての行が 1 ページで表示されてしまいます。 ページ分けするにはどうしたらいいですか?

コンストラクタに、1 ページあたりの行数を渡してください。
$datagrid =& new Structures_DataGrid(10); // 1 ページあたり最大 10 行まで

8. カラム名を大文字にしていると、MDB2 データソースドライバで並べ替え機能が動作しません。 なぜでしょう?

MDB2 の可搬性に関する設定 がデフォルトで有効となっていることが原因です。 MDB2_PORTABILITY_FIX_CASE の設定が CASE_LOWER となっており、 すべてのカラム名が小文字になってしまいます。 これを無効にするか、あるいは MDB2 の可搬性に関する設定をすべて無効にすると、 Structures_DataGrid における並べ替えの問題は解決します。