Drupal 8からテンプレートエンジンがtwigに変更になりましたので、デザインテーマの作成方法も大きく変わりました。
細かい点ですが「node.html.twig」内で投稿日時を任意のフォーマットに変更する際のメモです。
一番シンプルな方法としては、テンプレート内でフォーマットを指定することができます。
node.html.twig
|
<time class="created">{{ createdtime|date('Y.m.d') }}</time> |
「createdtime」はタイムスタンプですので、「|」を挟んでフォーマットを指定します。
Drupalでは環境設定に日時のフォーマットを登録していて、デフォルトでは「long」「medium」「short」の3種類があります。
この登録済みのフォーマットを指定する場合には「template_preprocess_node」に変数を用意します。
THEMENAME.theme(THEMENAMEは実際のテーマ名になります)
|
function THEMENAME_preprocess_node(&$variables) { $variables['created'] = format_date($variables['node']->getCreatedTime(), 'medium'); } |
「created」という変数(名称は任意で)を設けて、その中に日時のフォーマットを指定した値をいれます。
テンプレート内では次のように記述します。
|
<time class="created">{{ created }}</time> |
後者の方法で日時を指定したほうが、メンテナンス性は高いと思います。
10月1日にDrupal 8のベータ版がリリースされましたので、早速テスト環境にインストールしてみました。
少しさわってみた範囲ですが、Drupal 7からの変更点は次のようなものがあります。
- Symfonyのコンポーネントをコアに組み込み
- SymfonyフレームワークのいくつかのコンポーネントがDrupalコアに組み込まれました。
サイト構築の際に直接影響が出そうなのは、デザインテーマの作成でしょうか。テンプレートエンジンが「Twig」に変更になったので既存テーマに関しては作り替えが必要です。
- Viewsモジュールをコアに組み込み
- Drupalでは必須と言えるViewsモジュールがコアに組み込まれました。使用感としてはDrupal 7の時のView 3とあまり変わりません。
コアに組み込まれたことにより、管理ページの一部もViewsで生成されています。
- スマートフォン、タブレットへの対応
- 標準でレスポンシブデザインを採用されていますので、管理メニューが画面サイズによって変化するようになりました。
デフォルトテーマの「Bartik」も、レスポンシブデザイン仕様になっています。
- CKEditorをコアに組み込み
- 記事作成の際のエディタにCKEditorが組み込まれました。
- インストールが簡単に
- 日本語を含む多言語のインストールがより簡単になりました。あらかじめ「.po」ファイルを用意する必要はなくなりました。
管理メニューを含むフロントページはDrupal 7から大きな変化はないようです。
記事作成の際に標準でCKEditorが使えるようになりました。
Drupal 7から引き続き「Bartik」が標準テーマです。レスポンシブデザイン仕様になっています。
コアに組み込まれたViewsは、Drupal 7の時と同様に便利です。
Drupal 8もベータ版になり、正式版のリリースまでもう少しになりました。
コアにSymfonyのコンポーネントが組み込まれたということで、内部的には大きな変化があったと思います。
Symfony自体は使っていないのですが、同じくSymfonyをベースにしたLaravelを最近使うようになったので、興味深いところもあります。
アルファ版が長かったことを考えると、正式版が出るまでにはかなりの時間を要するかもしれませんが、今後が非常に楽しみです。
Drupal 7でブログやニュースなどの記事一覧で、月別アーカイブを設置することがあります。
Viewsではデフォルトでこの機能が搭載されていて、「contextual filter」の作成年月のフィルターをかけたブロックを作成することで実現できます。
標準の月別アーカイブブロックは、次のように表示されます。
月が始めにくる英語圏に合わせた表記なので、日本語サイトでは違和感があります。
「2014年 8月」のように順番を逆にするには、Views内の設定画面では行えず、Views自体のモジュールを変更する必要があります。
将来的なモジュールのバージョンアップを考えると、モジュール本体に手を加えるのは避けたいところです。
他の方法としては、Viewsで作成されたブロックのテンプレートファイルを修正する方法もあります。
下記はシステムデフォルトのブロックテンプレートファイル(modules/block/block.tpl.php)です。
|
<div id="<?php print $block_html_id; ?>" class="<?php print $classes; ?>"<?php print $attributes; ?>> <?php print render($title_prefix); ?> <?php if ($block->subject): ?> <h2<?php print $title_attributes; ?>><?php print $block->subject ?></h2> <?php endif;?> <?php print render($title_suffix); ?> <div class="content"<?php print $content_attributes; ?>> <?php print $content ?> </div> </div> |
このテンプレートファイルをお使いのテーマディレクトリにコピーして、Viewsの月別アーカイブブロックに合わせてファイル名を書き換えます。
例えば「news」という名称のViewsで「block-1」の場合には「block–views–news-block-1.tpl」というファイル名に変更します。
テンプレートのファイル名を変更することによって、月別アーカイブでのみ使用するブロックとなります。
この中の「<?php print $content ?>」という部分がブロックの本文になります。
今回はブロック本文を正規表現で「8月 2014」を「2014年 8月」に書き換える処理を施します。
|
<?php print $content ?> //次のように変更します <?php print preg_replace('/<a\s(.*?)>(.*?)\s(.*?)<\/a>/', '<a $1>$3年 $2</a>', $content); ?> |
上記の変更により、月別アーカイブの表示が次のようになります。
- 2014年 8月
- 2014年 7月
- 2014年 6月
Drupalのテーマで、古いIE向けに条件コメント付きのJavaScriptの読み込み方法です。
テーマディレクトリ内の「template.php」ファイルにプリプロセスとして次のように記述します。
|
<?php function THEMENAME_preprocess_html(&$variables) { drupal_add_html_head(array( '#tag' => 'script', '#attributes' => array('src' => drupal_get_path('theme', 'THEMENAME').'/js/ie9.js'), '#prefix' => '<!--[if lt IE 9]>', '#suffix' => '</script><![endif]-->' ), 'ie9' ); } ?> |
実際のレンダリングでは次のようになります。
|
<!--[if lt IE 9]> <script src="sites/all/themes/THEMENAME/js/ie9.js" /></script> <![endif]--> |
Drupal7の「page.tpl.php」内に、追加で作成したアカウントのフィールドを表示する際のメモです。
|
<?php global $user; if (user_is_logged_in()) { $user = user_load($user->uid); if ($user->field_name) {//「field_name」というフィールドの場合 print $user->field_name['und'][0]['safe_value']; } } ?> |
上記では管理画面の「アカウントの設定 > フィールドの管理」ページにて、本名として「field_name」というフィールドを作成した場合です。