あとは、「家賃」フィールドの表示が「75 000円/月」となっているのを「7.5万円」のようにしたり、「敷金」フィールドが「150 000円」となっているのを「2か月分」と表示させたりといった、表示に関する細かいカスタマイズをしていきます。このような細かいところのカスタマイズまで、Drupal は非常に柔軟に対応できます。
手始めに、「共益費/管理費」フィールドの表示が「2 000円/月」となっているのを、「2,000円/月」(桁区切りのスペースをカンマに変更)となるように、フォーマットを変更してみます。賃貸物件の表示管理(「管理」 > 「サイト構築」 > 「コンテンツタイプ」 > 「賃貸物件」 > 「表示管理」)にアクセスしてください。

「共益費/管理費」フィールドの列の、右側の操作ボタンをクリック。

フォーマットの設定フォームが現れます。「千の位の印」セレクトボックスで「コンマ」を選択、すぐ下の更新ボタンをクリック。そのままページ下の「保存」ボタンをクリックし、設定を保存します。

コンテンツにアクセスすると、千の位にカンマが入った状態で表示されました。
「家賃」フィールドの表示が「75 000円/月」となっているのを「7.5万円」のように表示させたいと思います。これはさきほどのフォーマット設定に、位取り(千の位、万の位)と、小数点以下の表示桁数を選択できるよう、フックを使って機能を拡張します。カスタムモジュールに、以下のコードを追加してください。
/**
* Implementation of hook_field_formatter_info()
* カスタムフォーマットを追加します。
*/
function custom_field_formatter_info() {
return array(
'custom_number_yen' => array(
'label' => t('カスタム円'),
'field types' => array('number_integer'),
'settings' => array(
'thousand_separator' => ' ',
'decimal_separator' => '.',
'offset' => 0,
'scale' => 1,
'prefix_suffix' => TRUE,
'prefix' => '',
'suffix' => '',
'zero' => '',
),
),
);
}これは hook_field_formatter_info() という、フィールドの表示フォーマットに関するフックです。家賃等の表示用に「カスタム円」という専用のフォーマットを追加しました。以下、これの設定に関する3つの記述をを追加します。
サムネイル拡大表示部分の作成を実践された方は、既に custom_field_formatter_settings_form() という関数が入ってると思います。その中の switch 文(switch ($display['type']) { })に、以下の case を追加してください。
case 'custom_number_yen':
$options = array(
'' => t('<none>'),
'.' => t('Decimal point'),
',' => t('Comma'),
' ' => t('Space'),
);
$element['thousand_separator'] = array(
'#type' => 'select',
'#title' => t('Thousand marker'),
'#options' => $options,
'#default_value' => $settings['thousand_separator'],
);
$element['decimal_separator'] = array(
'#type' => 'select',
'#title' => t('Decimal marker'),
'#options' => array('.' => t('Decimal point'), ',' => t('Comma')),
'#default_value' => $settings['decimal_separator'],
);
$element['offset'] = array(
'#type' => 'select',
'#title' => t('位取り'),
'#options' => array(0 => '0', 1000 => '千', 10000 => '万'),
'#default_value' => $settings['offset'],
'#description' => t('千単位、万単位で表示したい場合に設定してください。')
);
$element['scale'] = array(
'#type' => 'select',
'#title' => t('Scale'),
'#options' => drupal_map_assoc(range(0, 10)),
'#default_value' => $settings['scale'],
'#description' => t('The number of digits to the right of the decimal.'),
);
$element['prefix_suffix'] = array(
'#type' => 'checkbox',
'#title' => t('Display prefix and suffix.'),
'#default_value' => $settings['prefix_suffix'],
);
$dependent_element_id = 'edit-fields-'. str_replace('_', '-', $field['field_name']) .'-settings-edit-form-settings-cny-prefix-suffix';
$element['prefix'] = array(
'#type' => 'textfield',
'#title' => t('Prefix'),
'#default_value' => $settings['prefix'],
'#size' => 10,
'#description' => t("Define a string that should be prefixed to the value, like '$ ' or '€ '. Leave blank for none. Separate singular and plural values with a pipe ('pound|pounds')."),
'#process' => array('ctools_dependent_process'),
'#dependency' => array($dependent_element_id => array(TRUE)),
);
$element['suffix'] = array(
'#type' => 'textfield',
'#title' => t('Suffix'),
'#default_value' => $settings['suffix'],
'#size' => 10,
'#description' => t("Define a string that should be suffixed to the value, like ' m', ' kb/s'. Leave blank for none. Separate singular and plural values with a pipe ('pound|pounds')."),
'#process' => array('ctools_dependent_process'),
'#dependency' => array($dependent_element_id => array(TRUE)),
);
$element['zero'] = array(
'#type' => 'textfield',
'#title' => t('値が 0 のときの表示'),
'#default_value' => $settings['zero'],
'#size' => 10,
'#description' => t('値が 0 の場合の表示をカスタマイズできます。例: 「 - 」、「無し」等。'),
);
break;同じく「サムネイル拡大表示部分の作成」を実践された方は、既に custom_field_formatter_settings_summary() という関数が入ってると思います。その中の switch 文(switch ($display['type']) { })に、以下の case を追加してください。
case 'custom_number_yen':
$summary[] = number_format(1234.1234567890, $settings['scale'], $settings['decimal_separator'], $settings['thousand_separator']);
$summary[] = t('位取り: @offset', array('@offset' => $settings['offset']));
if ($settings['prefix_suffix']) {
$summary[] = t('Display with prefix and suffix.');
$summary[] = t('接頭語: @prefix, 接尾語: @suffix', array('@prefix' => $settings['prefix'], '@suffix' => $settings['suffix']));
}
$summary[] = t('値が 0 のときの表示: 「@zero」', array('@zero' => $settings['zero']));
break;同じく「サムネイル拡大表示部分の作成」を実践された方は、既に custom_field_formatter_view() という関数が入ってると思います。その中の switch 文(switch ($display['type']) { })に、以下の case を追加してください。
case 'custom_number_yen':
// カスタム円表示フォーマット
foreach ($items as $delta => $item) {
// 万単位の表示、千単位の表示などをするため、
// 位取りの値が 0 でなければ $item['value'] を位取りの値で割ります。
$value = $settings['offset'] ? $item['value'] / $settings['offset'] : $item['value'];
$output = (float) number_format($value, $settings['scale'], $settings['decimal_separator'], $settings['thousand_separator']);
// 「値が 0 のときの表示」を設定している場合は、値が 0 の場合はそれを適用します。
if ($settings['zero'] && $output == 0) {
$output = $settings['zero'];
} else {
if ($settings['prefix_suffix']) {
$prefixes = isset($settings['prefix']) ? array_map('field_filter_xss', explode('|', $settings['prefix'])) : array('');
$suffixes = isset($settings['suffix']) ? array_map('field_filter_xss', explode('|', $settings['suffix'])) : array('');
$prefix = (count($prefixes) > 1) ? format_plural($item['value'], $prefixes[0], $prefixes[1]) : $prefixes[0];
$suffix = (count($suffixes) > 1) ? format_plural($item['value'], $suffixes[0], $suffixes[1]) : $suffixes[0];
$output = $prefix . $output . $suffix;
}
}
$element[$delta] = array('#markup' => $output);
}
break;モジュールの設定を再構築し、すべてのキャッシュをクリアした後、再度、賃貸物件の表示管理(「管理」 > 「サイト構築」 > 「コンテンツタイプ」 > 「賃貸物件」 > 「表示管理」)にアクセスしてください。
「家賃」フィールドのフォーマットのセレクトボックスに、「カスタム円」というオプションが追加されていると思います。それを選択して、右側の操作ボタンをクリックしてください。

「位取り」に「万」を選択、尺度は「1」、接尾語に「 万円/月」と入力して、すぐ下の「更新」ボタンをクリック、そのままページ下の「保存」ボタンをクリックします。

コンテンツにアクセスすると、家賃が「7.5万円」と、万単位で表示されるようになりました。小数点以下は第1位までと設定したので、そのように表示されています。
敷金、礼金等は、「○○万円」と表示するのではなく、(家賃の)「○ヶ月分」と表示するほうがしっくり来るでしょう。いちおうその前に、家賃で割り切れないような価格設定の場合も想定して、「カスタム円」の設定をしておきます。賃貸物件の表示管理(「管理」 > 「サイト構築」 > 「コンテンツタイプ」 > 「賃貸物件」 > 「表示管理」)にアクセスし、「家賃」フィールドのフォーマットのセレクトボックスに、「カスタム円」を選択、右側の操作ボタンをクリックします。

「位取り」に「万」、尺度に「1」を選択、接尾語に「 万円/月」、「値が 0 のときの表示」に「無し」と入力して、すぐ下の「更新」ボタンをクリック、そのままページ下の「保存」ボタンをクリックします。

敷金が「15 万円」と表示されるようになりました。値の 0 の場合は、ここで「無し」と表示されます。礼金、更新料についても、同様に設定してください。
次にこれを(家賃の)「○ヶ月分」と表示させる設定をします。カスタムモジュールに以下の記述を追加してください。
/**
* Implementation of template_preprocess_field()
*/
function custom_preprocess_field(&$variables) {
$element = $variables['element'];
// フィールド別の表示調整
switch ($element['#field_name']) {
case 'field_deposit':
case 'field_reward':
case 'field_renewal_fee':
// 敷金、礼金、更新料の表示をカスタマイズ。「(家賃の)~ヶ月分」と表せる場合は、そのように表示する。
$field_rent = field_get_items('node', $element['#object'], 'field_rent');
$rent = $field_rent[0]['value'];
if (isset($element['#items'][0]['value']) && $element['#items'][0]['value'] > 0) {
$months = $element['#items'][0]['value'] / $rent;
if (is_int($months) && $months > 0) {
$variables['items'][0]['#markup'] = $months .'ヶ月';
}
}
break;
}
}これはフィールド用のテンプレート前処理関数です(※1)。ノードがノードテンプレートによって表示されているのと同様に、各フィールドもまた、フィールドテンプレートによって表示されています。template_preprocess_field() はそれぞれフィールドテンプレートに変数を渡す前のタイミングでコールされるので、ここで変数を操作しました。

モジュールの設定を再構築し、すべてのキャッシュをクリアしたあと、コンテンツにアクセスすると、敷金、礼金が「2ヶ月」、更新料が「1ヶ月」と表示されました。
築年月フィールドが「4月, 2009」と表示されているので、これを「2009年4月」のように表示するようにします。賃貸物件の表示管理(「管理」 > 「サイト構築」 > 「コンテンツタイプ」 > 「賃貸物件」 > 「表示管理」)から、「築年月」フィールドの操作ボタンをクリックします。

しかしこのフォーマットのセレクトボックスには、適当なオプションがありません。ここに適当なオプションを追加するため、日付と時刻の設定ページ(「管理」 > 「環境設定」 > 「日付と時刻」)にアクセスしてください。

ここで日付タイプを追加します。日付タイプを追加する前に、右上の「書式」タブをクリック。

「書式の追加」をクリック。

「書式文字列」テキストフィールドに、「Y年n月」と入力し、「書式を追加」ボタンをクリックして、書式を追加します。これは PHP の date 関数で使用する書式です。書式を追加したら、「タイプ」タブをクリックして、日付と時刻の設定画面に戻ってください。

「データタイプの追加」をクリックします。

「日付型」に「年月」、「システム内部名称」に「ymjp」、「日付の書式」セレクトボックスのオプションに、今設定した書式があるはずですので、それを選択します。「データタイプの追加」ボタンをクリックして日付型を追加したら、先ほどの賃貸物件の表示設定画面(「管理」 > 「サイト構築」 > 「コンテンツタイプ」 > 「賃貸物件」 > 「表示管理」)に戻り、「築年月」フィールドの右側の、操作ボタンをクリックしてください。

セレクトボックスのオプションに、今追加したフォーマットが追加されています。これを選択してすぐ下の「更新」ボタンをクリック、そのあとページ下の「保存」ボタンをクリックして、設定を保存してください。

コンテンツにアクセスすると、築年月フィールドのところに「2009年4月 年月」と表示されています。おしりの「 年月」が余計ですが、これはおそらく Date モジュールのバグでしょう。これについてはあとで修正します。
「入居可能時期」フィールドも「火曜日, 7月 3, 2012」のような、あまり日本語にそぐわない表示になっています。これを「2012年7月上旬」といったような「旬(じゅん)」の表記にしたいと思います。賃貸物件の表示管理(「管理」 > 「サイト構築」 > 「コンテンツタイプ」 > 「賃貸物件」 > 「表示管理」)から、入居可能時期フィールドの操作ボタンをクリックして、「築年月」と同様の設定をしてください。そのあとカスタムモジュールに、以下のコードを追加します。
/**
* Implementation of hook_date_formatter_dates_alter()
*/
function custom_date_formatter_dates_alter(&$dates, &$context) {
// 「2012年7月 年月」となってしまう(日付けのあとに文字列「年月」が入ってしまう)不具合に対応。
// 不具合の原因はいまのところ不明だが、とりあえずこうすることで回避できる。
$dates['value']['formatted_timezone'] = '';
// 入居可能時期は旬表示にする。
if ($context['field']['field_name'] == 'field_availability') {
$now = time();
if ($context['item']['value'] <= $now) {
$dates['value']['formatted'] = $dates['value2']['formatted'] = '即入居可';
} else {
$day = date('j', $context['item']['value']);
if ($day <= 10) {
$jun = '上旬';
} elseif ($day <= 20) {
$jun = '中旬';
} else {
$jun = '下旬';
}
$dates['value']['formatted'] = $dates['value2']['formatted'] .= $jun;
}
}
}これは Date モジュールの hook_date_formatter_dates_alter() というフックです。フックはコアモジュールだけでなく、サードパーティー製モジュールが独自のフックを提供する場合もあります。これは Date モジュールの、やはりフォーマットに関するフックです。ここで「入居可能時期」フィールドに「上旬、中旬、下旬」という表記を追加し、日付が過去の場合は、「即入居可」と表示するようにしました。ついでに先ほどのバグらしきものもここで修正しておきました。

モジュールの設定を再構築し、キャッシュをクリアしてください。コンテンツにアクセスすると、「入居可能日」フィールドのところに「即入居可」と表示されています。この記事の執筆時点では「2012年7月3日」というのは過去の日付なので、このような表示となりました。「築年月」フィールドを見ると、先ほどのバグが修正されています。
※1: テンプレート前処理関数については前々回「サムネイル拡大表示部分の作成」で説明しています。