フィールドコレクションフィールドのテンプレート名について

フィールドコレクションのテンプレートのカスタマイズで、少しハマったので、メモしておきます。

「賃貸物件(forrent)」というコンテンツタイプのノードに、近くの駅を表示する「アクセス(field_access)」というフィールド(フィールドコレクション)があるとします。「アクセス(field_access)」フィールドコレクションのフィールドには、「駅(field_station)」、「徒歩分(field_walk)」、「バス(field_bus)」があります。「駅(field_station)」は路線の中の最寄り駅、「徒歩分(field_walk)」はその駅から物件まで徒歩何分かかるかを示すフィールド、「バス(field_bus)」はその駅からバスで何分かかるかを示すフィールドです。

複数の路線の駅からアクセス出来る場合もあるので、「アクセス」フィールドの値の数は無制限とします。

ノード:賃貸物件(forrent)
  • フィールド:アクセス(field_access)
    • 値1
      • フィールド: 駅(field_station)
      • フィールド: 徒歩分(field_walk)
      • フィールド: バス(field_bus)
    • 値2
      • フィールド: 駅(field_station)
      • フィールド: 徒歩分(field_walk)
      • フィールド: バス(field_bus)
    • ...

ここで「アクセス」フィールド(field_access)のマークアップを '<div>' から '<ul>' に変更しようと、テンプレートの命名規則にのっとって、field--field-access.tpl.php を配置し編集したとします。しかしそうすると field_access だけでなく、フィールドコレクションの中のフィールド(field_station、field_walk、field_bus)全てに適用されてしまいます。

これは、フィールドコレクションのバンドル名と、そのフィールド名が同一なため、フィールドコレクションに付随する各フィールドに field--BUNDLE_NAME.tpl.php が適用されるためです。つまりこの例では、field--field-access.tpl.php というテンプレート名は、アクセスフィールドには field--FIELD_NAME.tpl.php と解釈され、アクセスフィールドの中の各フィールドには、field--BUNDLE_NAME.tpl.php と解釈されるために、それが適用されてしまう、というわけです。(D7 では field--FIELD_NAME.tpl.php よりも field--BUNDLE_NAME.tpl.php が優先されます。これはこのままで良いのか?というのが今議論されています。)

これを回避するには field--field-access.tpl.php の名前にさらにバンドル名を追加します。ここでは「アクセス」フィールドを持つノードのバンドル名は forrent なので、field--field-access--forrent.tpl.php となります。これで、「アクセス」フィールドだけに適用するテンプレートだということを、Drupal に伝えることが出来ます。

オマケ:

上の図はアクセスフィールドの中のフィールド(field_station、field_walk、field_bus)もすべて編集したい場合のテンプレートの分担の例です。field-collection-item.tpl.php も他と区別して編集したい場合は、field-collection-item--BUNDLE_NAME.tpl.php (この例では field-collection-item--field-access.tpl.php)で動作します。

コア: 
Drupal7