Drupalのテーマや、モジュールを作成するときなどに、よく使う関数を、備忘録的にまとめました。
Drupalのバージョンは、D7で確認をしていますが、D6や、D8の方もリンクを参照いただけると、それぞれのコードを参照することもできます。
目次
Drupalのテーマ作成で、よく使う関数です。最低でもこれくらいは覚えておくと良いかもしれません。
特に重要なのはtemplate.php内に記述する、「template_preprocess_page」と、テーマファイル命名規則と、読み込まれる順番です。
「Webサイトからお問い合わせが来ない…」とお悩みの方必見!
当サイトのノウハウを詰め込んだ『Web集客の無料ガイド』をご提供
リクエストURI
-
CMSログインユーザー情報
-
テーマ作成に役立つ関数
- フロントページチェック
- 特定のフィールドを取得
- 文字列を翻訳対象にする
- 要素のレンダリング
- カスタムフォームの呼び出し
- メッセージ出力
- 配列の構造情報出力
- テーマのディレクトリ情報取得
- テーマファイル命名規則について
- ページ送りカスタマイズ
- Viewsから出力した日付をUnixtimeに変換
- 「public://」を「/stes/default/files」に変換
- hook_theme()
-
template_preprocess_page
-
データベース関数
- select
- update
-
その他
- キャッシュクリア
リクエストURIなど
$GLOBALS['base_url'] => http://example.com/drupal
base_path() => /drupal/
request_uri() => /drupal/documentation?page=1
request_path() => documentation
current_path() => node/26419
arg(0) . arg(1) => node/1
https://api.drupal.org/api/drupal/includes%21bootstrap.inc/function/request_uri/7
※ arg()は、内部で処理されているURIを返す。
https://api.drupal.org/api/drupal/includes%21bootstrap.inc/function/arg/7
ユーザー
- ログインしているかどうか。
user_is_logged_in()
https://api.drupal.org/api/drupal/modules%21user%21user.module/function/user_is_logged_in/7
- ユーザー情報取得
global $user
https://api.drupal.org/api/drupal/developer!globals.php/global/user/7e.g)
global $user;
print $user->name;
テーマ作成に役立つ関数
- フロントページチェック
drupal_is_front_page()
https://api.drupal.org/api/drupal/includes!path.inc/function/drupal_is_front_page/7
- 特定のフィールドを取得
nodeテンプレートなどで、特定のフィールドを表示するのに「render($content[FIELD_NAME])」と記述したことは無いでしょうか。この書き方をしないでくださいと公式サイトで書かれています。(参照:function field_view_field)その代わりに下記コードを使うことで、特定のフィールドを出力することができます。下記コードはbodyを出力
print render(field_view_field('node', $node, 'body'));
上記コードはレンダリングするには良いですが、特定のフィールドだけを取得したい場合は下記コードで取得できます。
field_get_items('node', $node, 'field_name');
- 文字列を翻訳対象にする
Drupalは基本、t($string, array $args = array(), array $options = array())にて、出力する文字列を指定します。
print '<p>'.t($content).'</p>';
https://api.drupal.org/api/drupal/includes%21bootstrap.inc/function/t/7
- 要素のレンダリング(画面出力)
print render($content);
https://api.drupal.org/api/drupal/includes%21common.inc/function/render/7
- カスタムフォームの呼び出し
Drupalは、簡単にカスタムフォームを作成することができます。一度作成したフォームはテーマからAPIを通して呼び出すことができます。
drupal_get_form()
https://api.drupal.org/api/drupal/includes%21form.inc/function/drupal_get_form/7e.g)
print render(drupal_get_form('my_add_form'));
- メッセージ出力
例えば、ページ更新した際などのメッセージを出力するとき
drupal_set_message()
https://api.drupal.org/api/drupal/includes%21bootstrap.inc/function/drup...e.g)
drupal_set_message(t('記事を登録しました'));
- 配列の構造情報出力
$contentや、$nodeが、どのように構成されいるかテーマを作成するときに、必要となります。
Drupalに慣れていない方などは、print_r(phpの関数)を使って、構成を確かめる方もいるかもしれません。Drupalの場合ですと、Develモジュールをインストールし下記コードにより、確認することができます。
dsm($content);https://api.drupal.org/api/devel/devel.module/function/dsm/7
赤枠で囲った箇所を使用することで、自身で配列名を記述することなく、値を取得することができます。
- テーマのディレクトリ情報取得
drupal_get_path('theme', 'THEME_NAME');
https://api.drupal.org/api/drupal/includes%21common.inc/function/drupal_get_path/7
- テーマファイルについて(変更方法)
Drupalのテーマ用ファイル名は一定のルールで決められています。
例えば、「node/1/edit」の場合は、下記のようにファイル名が決められています。この中では、6が最優先されるテンプレートファイルです。1. page.tpl.php
2. page--node.tpl.php
3. page--node--%.tpl.php
4. page--node--1.tpl.php
5. page--node--edit.tpl.php
6. page--front.tpl.php (もしnode/1/edit がフロントページだった場合)命名規則についてはこちらを参照ください
https://www.drupal.org/node/1089656これらの命名規則以外に、テーマファイル名を付けたい場合は、下記のコードで変更することができます。
function bootstrap_subtheme_preprocess_page(&$variables, $hook) { //Add multiple suggestions for pages based on Node if(isset($vars['node']->type)) { //なんらかの条件 $variables['theme_hook_suggestions'][] = 'page__mytemplate'; } }
テーマファイルは、下記となります。
page--mytemplate.tpl.php - ページ送りカスタマイズ
ページ送りの出力は、何パターンかありますが今回は代表的なDrupalのシステムで出力されるページ送りと、Viewsで出力されるページ送りのカスタマイズ方法を紹介します。(参照:DrupalのPagerをオーバーライドしてカスタマイズ)
システムページ送りカスタマイズは「function theme_pager」を追加カスタマイズを行います。
// template.php function THEMENAME_pager($variables) { //Code Here コードは上記リンク「function theme_page」を確認ください }
Viewsで出力されるページ送りは「function theme_views_mini_pager($vars) {」を追加カスタマイズします。
1.「/sites/all/modules/views/theme」を開きます。
2.「theme_views_mini_pager」関数をコピーし、template.phpにペーストします。
// template.php function THEMENAME_views_pager($vars){ //Code Here }
e.g.)
$li_previous = theme('pager_previous', (isset($tags[1]) ? $tags[1] : t('«')), $limit, $element, 1, $parameters);
to
$li_previous = theme('pager_previous', (isset($tags[1]) ? $tags[1] : t('前へ')), $limit, $element, 1, $parameters);
- Views から出力した日付をUnixtimeに変換
Viewsの出力を、「2015/07/31 23:00:00 JST」にて出力します。
「/admin/config/regional/date-time/formats」にアクセスし、日付の書式をセットアップします。書式:Y-m-d G:i:s
Viewsのテンプレートで受け取ったデータを下記のPHP関数でUnixtameに変換します。
// JSTをunixtimeに変換する
$unixtime = strtotime($row['field_jst_date']); - 「public://」ファイルパスを「/sites/default/files」に変換
$file_path = file_create_url('public://img.png');
- hook_theme
htmlレンダリング用API// .moduleファイルに追加
function THEMENAME_theme($existing, $type, $theme, $path) { return array( 'your_theme_key' => array( 'variables' => array('nid' => NULL,'title' => NULL, 'hoge'=> $path), 'template' => 'your_template_filename', 'path' => 'sites/all/modules/custom/cpi/t' ) ); }
// テンプレート用ファイル
// your_template_filename.tpl.php<div id="node-<?php print $nid; ?>"> <h3><?php print l($title, "node/{$nid}"); ?></h3> <?php print $hoge; ?> </div>
// テーマ呼び出し
$variables = array( 'nid' => '3', 'title' => 'ほげほげ' ); $output = theme('your_theme_key', $variables); print $output;
template_preprocess_page
Drupalのテーマをより強力にカスタマイズするために、template_preprocess_page関数が用意されています。
page.tpl.phpの処理前に、template_preprocess_pageを使い、page.tpl.phpに変数を渡したり、条件によってテンプレートファイルを変更したり、することができます。
上記であげた、テンプレートファイルを変更するのも、preprocess_pageを使い処理をしています。その他にもnode.tpl.phpの前に処理をする、template_preprocess_nodeや、template_preprocess()など、様々な関数が用意されています。
preprocess_pageは、template.phpに記述を行います。
- 簡単なサンプル
template.php
<?php // $Id: $ function THEMENAME_preprocess_page(&$vars) { //どんな値が入っているのか確認したい場合 dsm($vars); //nodeのbodyを取得し、page.tpl.phpに渡す $vars['body_content'] = field_view_field('node', $vars['node'], 'body') // 内容をpage.tpl.phpに渡す $vars['my_content'] = '<p>ほげほげテスト</p>'; }
page.tpl.php
<?php print render($my_content); ?>
- 各ブッロックデータの受け渡し
// template.php // footerブロックにセットされたブロックデータをhtml.tpl.phpに渡す function THEMENAME_preprocess_html(&$variables) { $variables['footer'] = block_get_blocks_by_region('footer'); } //html.tpl.php print render('footer');
データベース関数
- Select
https://api.drupal.org/api/drupal/includes!database!database.inc/function/db_select/7
e.g)
$result = db_select('node', 'n') ->fields('n') ->condition('id', $useruid, '=') ->execute() ->fetchAssoc(); print $result;
e.g) 複数レコード
$query = db_select('node', 'nid'); $query->fields('nid'); $result = $query->execute(); while($record = $result->fetchAssoc()) { $r_node[] = $record; }
- Update
https://api.drupal.org/api/drupal/includes!database!database.inc/function/db_update/7
e.g) db_update('node') ->fields(array( 'uid' => 5, )) ->condition('uid', 1, '=') ->execute();
その他
- Drupalのキャッシュクリア
drupal_flush_all_caches()
https://api.drupal.org/api/drupal/includes%21common.inc/function/drupal_flush_all_caches/7