Quiz モジュールと multichoice ノードタイプを使用して多肢選択式の問題集を作成したところ、紙に印刷したものも欲しいと言われて行った操作のメモ。
誰かが Quiz 用の印刷モジュールとか作ってたら北雄ラッキー、と調べるも、既出の同様の質問には、つれない返答が。
http://drupal.org/node/172745
次善の策として、作った multichoice ノードをすべて 1 つのページにまとめて表示できれば、あとはコピペと編集でなんとかなるか、と考えた。
最初、フィルタとしてノードタイプ = multichoice、フィールドとして本文 (body) を指定した View を定義すれば、多肢選択問題を簡単に一括表示できると思っていたが、実際やってみると選択肢のラジオボタンが表示されない。
理由は後で調べるとして、このままでは仕方がないので、選択肢の部分に対応する情報を PHP コードで $node から抽出して別のフィールドとして表示させることにした。Views で表示されるフィールドのカスタマイズには、Views Theme Wizard が使用できる。今回は Druapl6 を使用していたので、Wizard は Views に組み込まれている。
まず、multichoice のノードだけを抽出するフィルタを指定して View を定義する。
次にこの View のフィールドとしてノードの本文を指定する。これで、multichoice ノードの本文として入力したコンテンツは一覧に反映されるが、上述のとおり、なぜか選択肢の部分は反映されない。
続いて、ノード ID をフィールドとして追加する。ラベルは空白にしておく。ここで出力されるノード ID を基にノードデータを読み込み、生成された $node から選択肢の情報を取り出し、適宜タグで整形したものを Theming で置き換えてやるのだ。
Views の編集ページで 「Basic Settings」 の 「Theme」 の横にある 「Information」 をクリックする。その下に表示されるテンプレート候補の一覧から 「Field ノード: Nid (ID: nid)」 をクリックしてデフォルトのテンプレートのコードを確認すると、$output を出力しているだけであることがわかる。
nid のフィールドをカスタマイズするための専用テンプレートとして提示されている views-view-field--nid.tpl.php という名前のファイルをテーマディレクトリ内に作成し、その中に次のコードを記述する。
<ul type="a">
<?php
$node = node_load(array('nid' => $output));
foreach($node->answers as $e) {
print('<li>');
print('<pre>' . $e["answer"] . '</pre>');
print('</li>');
}
?>
</ul>
ノード ID のフィールドなので、当然、テンプレートのコード中 $output には現在処理中のノードのノード ID がセットされることになる。これを利用して node_load() API でノードデータを読み出せば、その中から multichoice 固有のフィールドとして選択肢の一覧データを取り出すことができるはず。
上のコードでは、処理中のノードの選択肢の配列 ($node->answers) から個々の選択肢の内容テキスト (連想配列にキー "answer" を指定) を取り出して、li タグで囲んで出力している。こうすることで、定義した View の nid フィールドには multichoice の選択肢を ul リストに整形したものが埋め込まれることになる。
なお、pre タグで囲んでいるのは、選択肢の内容テキストが複数行に渡るものがあったため。それと、テンプレートファイルを追加した場合は、[Rescan template files] をクリックして Drupal にその存在を認識させる必要があります。
こうして出力されたページを画面上でコピーし、WORD 文書に貼り付け、若干の編集を加えることで、サイト上の問題集データを基にした印刷用 WORD ファイルを作成した。スタイルシートを調整すれば、そのまま印刷できるものも作れそうですが、今回は時間もなかったのでアドホックな対応で。
Druupal6 の Views Theme Wizard は非常に強力。
一度使い方を理解すれば、こんな具合に View のフィールドを簡単にカスタマイズできる。