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