Drupal 7

Drupal のモジュール構成パターンあれこれ

今回は CMS の Drupal を使った開発に関する少しマニアックなお話です。

Drupal を使ったサイト開発において、「カスタムモジュールをどのように分割するか」というのはサイトの中長期的なメンテナンス性に大きく影響する重要なポイントです。

A というひとつの機能を実現する場合でもそのアプローチ方法は無数にあり、例えば、すべてを実装するひとつの大きなモジュールで実現することもできれば、小さく小分けにした多くのモジュールで実現することもできます。 粒度を小さくする最も極端なパターンは「 1 プラグイン実装 = 1 モジュール」「 1 フック実装 = 1 モジュール」とすることですが、これをするとモジュール数がやたらと増えてしまうので、小分けにする場合でもほどほどにするのがよいでしょう。

Drupal 7 で theme.inc で発生する Fatal error の対処方法

Drupal 7 で次のようなエラーに遭遇することがあります。

Fatal error: Unsupported operand types in /PATH/TO/DRUPAL_ROOT/includes/theme.inc on line 637

原因

問題の原因は関数 _theme_process_registry() の中で連想配列とその他の何か(たいてい NULL )の加算が行なわれていることです。 そしてそれが起こるのは hook_theme() の戻り値が正しく指定されていないことが原因です。

次のような hook_theme() を書いていると発生します。

Drupal 7 の .info ファイルの files[] とは

今回は Drupal 7 の .info ファイルの files[] についてのお話です( Drupal に興味のない方にはおもしろくないちょっとマニアックなお話です・・・)。

Drupal で開発を行う際に必ず必要となるもののひとつが .info ファイルです。 その中に記述可能な項目のひとつに files[] というものがあります。

例えば Entity モジュールの .info ファイルは以下のような内容になっています(一部抜粋)。

Drupal 7 の DrupalWebTestCase のメソッドまとめ

Drupal 7 には仮想ブラウザを使った自動テストのための DrupalWebTestCase というテストクラスがデフォルトで用意されています。

ただ、 DrupalWebTestCase には驚くほどたくさんの便利機能が備わってはいるのですが、主な利用者がコアコントリビュータの人たちにかぎられるためか、(英語で検索しても)わかりやすく解説している資料があまり見つかりません。 英語でその状況なのでいわんや日本語は・・・

せめて日本語で書かれたメソッド一覧などが手元にあると作業の捗り具合が違ってくるような気がするので、この度 DrupalWebTestCase のメソッド一覧表をかんたんに翻訳してみました。

原文はこちらです。

Drupal 7 でファイルアップロード後にノードを保存しなかった場合のファイルのゆくえ

Drupal 7 でファイルフィールドからファイルをアップロードした後にノードそのものを保存しなかった場合。

ファイルは確かに一度アップロードされるのですが、ファイル参照がないのでその後 Drupal からは取得できなくなります。 じゃあそのファイルは、どこに行くのか、なのですが・・・結論としては以下のようになります。

Drupal 7 の EntityFieldQuery でオリジナルの条件指定メソッドを利用する方法

今回は Drupal 7 の開発のマニアックなお話です。

$pq = new PackageQuery();
$result = $pq->random()->range(0, 1)->execute();
$random_package_id = key($result['node']);

Drupal 7 で開発を行っていると EntityFieldQuery でオリジナルの条件指定メソッドを作成したくなることがあります。 オリジナルの条件を指定するには基本的には addTag() メソッドを利用すれば OK です。 ただこれだとコードがいかにも手続き的な感じになりわかりづらくなるので、ドメインモデルに忠実なサブクラスを作成してそこでメソッドを作成すると吉です。

Drupal 7 で特定のモジュールの cron 処理が他のモジュールのものよりも後に実行されるようにする方法

Drupal でモジュールの cron 処理の順序を指定する方法について。

Drupal のモジュールの hook の実行順序はデフォルトではアルファベット順ですが、 weight を変更することで任意の順序で処理を実行する事が可能です。

次のコードでは、 mymodule というモジュールの処理を another_module という名前のモジュールよりも後に実行することを保証するための処理です。 次回の cron 実行からこの順序が反映される形になります。

ページ