Drupalのコア要素を知る
~構築と運用を支える道具立て~
白根健司(しらねけんじ)
(株)シナジークエスト
CMSMix Sapporo
2016年2月27日
趣旨
Drupal でよく耳にする・・・
• 大規模事例多数(特に海外)
• エンタープライズ指向!
• コンテンツ管理 "フレームワーク"(=CMF not CMS)
・・・本日そういう話はちょっと置いといて、
• Drupal のサイト構築で広く使われている基本機能を、
簡単なサンプルの設定例などを交えてご紹介します。
自己紹介
• 白根健司(しらねけんじ)
– 妻1人、子供2人
– 老眼進行中
– ポンコツ中年
– Drupal 使用歴 9年くらい
• Drupal 4.6 の頃から少しずつ…
– 「Drupal さっぽろ」 事務局&雑用係
• 月例の Drupal 勉強会を札幌と小樽で交互に開催しています
• http://drupalsapporo.net/
– 株式会社シナジークエスト
• 札幌/小樽でIT系の人材教育とサイト構築の仕事をしています
https://www.facebook.com/bkenro
https://twitter.com/bkenro
内容
• 全体構造
• フィールドとエンティティ
– ノード、コメント、タクソノミー、ユーザー、ファイル
• Views モジュール(=クエリビルダ)
• ブロックシステムとテーマ
• contributed モジュールの利用
– 例)Feeds モジュール
• Drupal 8 について
– D8 コアの REST 機能
• まとめ
全体像
Drupal ってどんな CMS ?
Drupal の紹介
• Drupal(ドゥルーパル)とは
– PHP で記述されたオープンソース Web コンテンツ管理ソフトウェア
• GPLv2 ライセンス
• CMS Web サイトの 4.9%(全 Web サイトの 2.2%)が Drupal を使用
– 創始者:Dries Buytaert
• 電子掲示板として書いたソフトウェアが出発点、2001 年に OSS 化
– ユーザーと開発者の巨大コミュニティ
• drupal.org 上で日々活発な議論や情報交換
– アカウント数:1,167,000(2015年3月)
– 開発者アカウント:37,000(〃)
– モジュール数:33,310
– テーマ数:2,258
– ディストリ:1,017
国内のコミュニティ
• 定期的な Meetup
– Drupal Cafe
• https://www.facebook.com/DrupalCafe
– Drupal さっぽろ
• http://drupalsapporo.net/
• 質問を受け付けるフォーラム
– https://groups.drupal.org/japan
• 翻訳を共同で進めるプロジェクト
– https://localize.drupal.org/translate/languages/ja
Drupal のレイヤー構造
1. データ(エンティティ)
– システムの基礎となるデータ
2. モジュール
– 個々の機能を提供するプログラム
3. 出力コンテンツ
– ページ:URLが割り当てられる
– ブロック:ページ内の区画に出力
4. ユーザーとアクセス許可
– ユーザーにロールを割り当て
– ロールに権限を与える
5. テンプレート&テーマ
– 最終的な応答コンテンツを生成する
• HTML、CSS、PHP 変数
出典(図)https://drupal.org/getting-started/before/overview
モジュール = building block
• Drupal の機能を拡張するソフトウェア(プログラム)
• 次の3つに分類される:
– Core モジュール
• Drupal 本体に含まれる標準機能モジュール
• 追加コンポーネントのダウンロードやコピー不要で最初から使用できる
– 有効にするか無効にするかは設定で指定できる
– Contributed モジュール
• drupa.org のダウンロード セクションから入手できる拡張機能モジュール
• Views、Panels、Rules、Feeds などなど、膨大な資産がある
– カスタム モジュール
• 独自に開発する拡張機能モジュール
• 上記2つと同様にインストール、有効化して使用できる
フィールドとエンティティ
システム上で統合的に永続化データを扱うための共通概念
エンティティとタイプ
• エンティティとは?
– Drupal のデータベースに保管される構造化データを一般化したもの
• コア標準の管理 UI でフィールド設計を定義できる
• エンティティ タイプ
– エンティティはその用途・目的に応じたタイプに分かれる
– Drupal コアの標準エンティティ タイプ
• ノード :独立したページとして表示できるコンテンツ
• コメント :ノードに付随して存在するコンテンツ
• ファイル :サーバーにアップロードされるファイルの情報
• タクソノミー (分類用語)
– ボキャブラリ :特定の目的に基づく用語の集合に関する情報
– ターム :ボキャブラリに属する個々の用語
• ユーザー :サイトのユーザーアカウント情報
バンドル(bundle)
• バンドル
– エンティティ タイプにフィールドを関連付けた実装のこと
– 標準の UI でフィールド設計の定義や編集ができる
ページ
Body フィールド
・・・
ノード
エンティティ
タイプ
バンドル
フィールド
• フィールドとは
– 再利用可能なデータ断片
– データの用途・目的に応じたタイプ(型)を持つ
– ウィジェットを持つ
• 値の編集機能を提供する
• 値の表示機能を提供する
ページ
Body フィールド
・・・
ノード
エンティティ
ブログ記事
本文フィールド
写真フィールド
・・・
カテゴリ
用語名
用語説明
・・・
ターム
タグ
用語名
・・・
エンティティタイプ
バンドル
ノードからエンティティへ:flexinode、CCK、field
最初から現在のような構造だったわけではありません。
• flexinode モジュール
– https://www.drupal.org/project/flexinode
– プログラミング不要でノードタイプの定義を可能に(Drupal4.6~)
• CCK (Content Construction Kit) モジュール
– https://www.drupal.org/project/cck
– flexinode の機能を引き継ぎ(Druap 5~6)
• Field モジュール/API
– CMS 上の各種構造化データをエンティティに(Drupal 7~)
多様なフィールド拡張モジュール
さまざまなフィールドのモジュールが提供されている:
– 数値、選択肢、一般のファイル、画像ファイル(コア)
• 画像は 「画像スタイル」 として種々の変換処理を定義することもできる
– リンク
• サイト内/外のパス/URLを保持する
– メディア
• 外部サイトの動画等のURLを保持(+ 再生用のウィジェット)
– エンティティ参照
• Entity Reference
– https://www.drupal.org/project/entityreference
– 別のノードやエンティティへの参照を保持する
参照による関連の定義
• エンティティ参照フィールドで関連を定義できる
– 多重度(1対1、1対多)も指定できる
– 例)ノードからタクソノミータームを参照
• 特定のノードコンテンツが参照先のタームに分類されることを表す
– 多重度 > 1 なら複数のタームを設定できる仕様(例:タグ)
– 多重度 = 1 なら特定のタームにのみ分類される仕様(例:カテゴリ)
ブログ記事
本文フィールド
写真フィールド
ターム参照
タグ
用語名*複数値
エンティティの活用事例:Drupal Commerce
• Drupal 7 ベースの EC サイト構築モジュール
– 商品、注文、顧客、注文明細などの EC エンティティを提供
– 各エンティティは Drupal 共通のフィールド UI でカスタマイズできる
• https://www.drupal.org/project/commerce
• https://commerceguys.com/
サンプル例:「お気に入り動画」 ノードタイプ
• お気に入りの動画を保存するノードのタイプ
– Video Embed Field モジュールを利用して・・・
• https://www.drupal.org/project/video_embed_field
Views モジュール
UI でデータの問合せを定義できるクエリビルダ
View と Views モジュール
• データベース用語の "View"
– ビュー(View)表
• ひとつ以上のテーブルから任意のデータを選択&カスタマイズして表したもの
• 一度定義すれば、同じ条件に基づく結果を簡単に取得できる
• 何に使う?
– Drupal のエンティティに対する "ビュー" を作るための仕組み
• https://www.drupal.org/project/views
– 管理 UI を使用して特定のクエリを定義し、保存できる
• 一度定義した Views はサイトの各部で再利用できる
• 出力先(display)の指定:
– ページ(URLが与えられて独立したコンテンツとして表示できる)
– ブロック(テンプレート内のリージョンに埋め込まれるコンテンツ)
– フィード(URLを与えられ、種々の形式で取り出される)
クエリ(問合せ)の構成要素
SQL 疑似コード例)
SELECT TITLE // 列 → フィールド
FROM BLOG // 表 → エンティティ
WHERE PUBLISH=TRUE // 抽出条件
ORDER BY POSTDATE; // 整列条件
Views モジュールの UI
取得するフィールド
(SELECT)
選択条件(WHERE)
並べ替え条件(ORDER
BY)
その他の設定オプション
• ディスプレイ
– Views の出力先を指定する(ブロック、ページ、フィード、・・・)
• フォーマット
– 出力の形式を指定する
• HTML List (ul)、グリッド、テーブル、フォーマットされていないリスト (div)
• フィールドの詳細オプション
– 表示から除外
– 結果の書き換え
– CSS クラスの指定
• 行(出力される各レコード)に class 属性を付加する
• Views の出力全体のコンテナに class 属性を付加する
まだまだ他にも
たくさん・・・
テーマとブロックシステム
テンプレート内の区画(リージョン)にコンテンツを配置する仕組み
Drupal のレイヤー構造
1. データ(エンティティ)
– システムの基礎となるデータ
2. モジュール
– 個々の機能を提供するプログラム
3. 出力コンテンツ
– ページ:URLが割り当てられる
– ブロック:ページ内の区画に出力
4. ユーザーとアクセス許可
– ユーザーにロールを割り当て
– ロールに権限を与える
5. テンプレート&テーマ
– 最終的な応答コンテンツを生成する
• HTML、CSS、PHP 変数
出典(図)https://drupal.org/getting-started/before/overview
テーマとテーマ エンジン
• テーマとは?
– サイトの外観を定義する、テンプレート、スタイルシート、スクリプト等を
まとめたソフトウェアパッケージのこと
– Drupal サイトに導入できる種々のテーマが開発・公開されている
• テーマ エンジンとは?
– テンプレートのコードを解釈して動的にコンテンツを生成する処理系
– Drupal 7 の標準テーマ エンジンは PHPTemplate
• PHP で書かれた .tpl.php ファイルをそのままテンプレートとして使用する
– その他のテーマエンジン
• https://drupal.org/project/project_theme_engine
• D8 では標準テーマエンジンが Twig になる
テーマの例
• コアに付属するテーマ
– Bartik
• Drupal 7 インストール後の初期デフォルト テーマ
– Garland
• Drupal 5 のコア標準テーマ、Color モジュール対応、fixed/fluid 切替対応
– Seven
• Drupal 7 のデフォルト管理用テーマ
– Stark
• Drupal のデフォルト HTML マークアップをデモする最小構成テーマ
• drupal.org の配布テーマ一覧(contributed themes)
– https://www.drupal.org/project/project_theme
Drupal サイトのテーマを管理する
1. デフォルトテーマの設定
2. 管理用テーマの設定
3. テーマのグローバル設定
– ロゴ
– サイト名とスローガン
– ショートカットアイコン(ファビコン)
– ユーザーのアイコン(アバター)
– コメントにおけるユーザー検証の設定
– メインメニュー、セカンダリメニュー
4. カスタム テーマ設定
5. テーマの追加インストール
Drupal 7 サイトにおける
テーマ管理の操作内容と
設定項目を見ていきます。
下記パスからスタート:
admin/appearance
1. デフォルト テーマの設定
• デフォルトテーマの設定
– 有効にするだけでなくデフォルト テーマにすることで通常表示されるテーマを指定する
• デフォルトテーマとは、一般のサイト訪問者に表示されるテーマ(フロントエンドテーマ)のこと
デフォルトテーマが先頭に
この例では Seven も有効になっている。
[デフォルトに設定] リンクをクリックすると
デフォルトテーマに設定される
2. 管理用テーマの設定
• 管理用テーマ
– サイトの管理に関するパス(URL)に適用されるテーマ
• /admin 配下のパスを持つページ
– コンテンツ編集用のページに適用することもできる
– デフォルトテーマの設定ページの一番下にある UI で指定する
デフォルトテーマまたは
インストール済みテーマの
中から選択・指定する
コンテンツ編集ページに
適用することもできる
3. テーマのグローバル設定 (1)
• 全テーマ共通の環境設定
– インストール済みの全テーマに適用されるデフォルト設定を指定できる
• パス: admin/appearance/settings
• 個別のテーマの設定で再定義できる
3. テーマのグローバル設定 (2)
設定項目 説明
ロゴ ロゴは、デフォルトでテーマディレクトリの直下にある logo.png というファイル
が使われる。別のファイルをアップロードしたり、別のパスを指定することもでき
る。テーマ設定で有効にすると、変数 $logo にロゴのパスを含むコンテンツ
が設定され、テンプレートファイル page.tpl.php で利用できるようになる。
サイト名
スローガン
admin/conifg/system/site-information の UI から指定でき、テー
マ設定で有効にすると、それぞれ変数 $site_name、$site_slogan
としてテンプレートファイル page.tpl.php から利用できるようになる。
ショートカット アイコン デフォルトは misc/favicon.ico のファイルが使用される。ロゴと同様、別
のファイルをアップロードしたり別のパスを指定することもできる。
投稿でのユーザーアバター
コメントでのユーザーアバ
ター
それぞれ、テンプレートファイル page.tpl.php の $user_picture 変
数、テンプレートファイル comment.tpl.php ファイルの $picture 変
数の有効/無効を設定する。有効にするとノードやコメントにアバターが表示
される。
コメントの承認状況 ログインによって検証されたアカウントを使用していない場合、ユーザー名の
横に "(not verified)" と表示するオプション。この表示文字列は関数
template_process_username() で $variables['extra'] と
して定義され、theme_username()で出力される。
3. テーマのグローバル設定 (3)
設定項目 説明
メインメニュー
セカンダリー メニュー
このチェックボックスをオンにすると、テンプレートファイル page.tpl.php で
使用する変数 $main_menu と $secondary_menu にそれぞれ
のメニューのリンクを格納した配列がセットされる。どの定義済みメニューをメ
インとセカンダリに使用するのかは、admin/structure/menu/settings
の設定 UI から指定できる。デフォルトでは次のメニューが設定されている。
メインメニュー
admin/structure/menu/manage/main-menu
セカンダリメニュー
admin/structure/menu/manage/user-menu
いずれも、テンプレートファイル page.tpl.php 内で theme_links()
関数を使用して出力される単純な単一階層メニューだが、高度なナビゲー
ションのデザインが難しいため、これらのメニューを使用する代わりに、メニュー
用のリージョンを用意してブロックとしてメニューを出力するテーマも多い。
4. カスタム テーマ設定
• テーマやモジュールによって提供されるテーマ設定
– 特定のテーマやモジュールによって提供されるテーマ設定もある
• 例)Garland テーマの [コンテンツの幅] 設定
– 固定幅か可変幅(フルード)かを指定する
5. テーマの追加インストール
• テーマのインストール場所:
– themes フォルダ
• コアのテーマのインストール場所
• サイト固有のカスタムテーマはここにインストールしないこと
– インストールするとコアの更新で削除されたり上書きされる恐れがある
– sites/all/themes フォルダ
• Drupal のインストール環境すべてで共用されるテーマはここにインストールする
• 管理画面からテーマをダウンロードした場合もここにインストールされる
– sites/<サイト名>/themes フォルダ
• マルチサイトにおける特定サイト固有のテーマはここにインストールする
– <サイト名> にはサイトのドメインが入る
• テーマインストーラの利用
– UI にテーマの tar.gz ファイルの URL を指定して実行する
• http://example.com/admin/appearance/install
• sites/all/themes の下にインストールされる
Drupal 7 テーマを構成するファイル (1)
出典(図)https://drupal.org/node/171194
リージョン
コンテンツの出力先となる
ページ内の区画領域のこと
Drupal 7 テーマを構成するファイル (2)
• .info ファイル(必須)
– テーマのメタデータ、スタイルシート、JSファイル、リージョン等を定義
– .info ファイルの名前がテーマの内部名を定義する
• テンプレート(.tpl.php)ファイル
– 動的に生成される特定部分のマークアップ コンテンツを定義する
• HTML、RSS (XML)、・・・
– 既定のファイルを独自のバージョンで置き換えることができる
• 既定のファイルと同名ファイルをテーマのディレクトリ配下に配置するとそちらが優先して使用される
• suggestion:テンプレートファイルの適用対象を絞り込む命名規則
• template.php
– ロジックやデータ処理を行うコードを記述するファイル
• 出力前の前処理、テーマ関数(後述)のオーバーライド 等
• その他
– ロゴ、スクリーンショット
– theme-settings.php
リージョンについて
• リージョンとは?
– コンテンツの出力先となる、ページ内の区画領域のこと
• テンプレート内の該当する位置にコンテンツ出力コードを埋め込んで実装する
– HTML マークアップの高レベルの構造定義に用いられる
• リージョンに出力されるひとまとまりのコンテンツをブロックと呼ぶ
– コアの UI を利用してリージョンにブロックを割り当てる
• パス: admin/structure/block
• 出力先のリージョンを変更することで
ブロックの表示位置を自由に変更できる
– テーマとの関係
• リージョンの配置、表示、スタイル等は
テーマによって定義される
コアのデフォルト リージョン (1)
• Drupal コアが定義するリージョン
– プログラムから利用できる9つのデフォルト リージョンが用意されている
• .info ファイルの書式で記述すると次のようになる:
• regions[] の記述がなければ、このデフォルト リージョンが適用される
• regions[] の記述を(1つでも)すると .info に従ってリージョンが設定される
regions[page_top] = Page Top
regions[header] = Header
regions[highlighted] = Highlighted
regions[help] = Help
regions[content] = Content
regions[sidebar_first] = Sidebar First
regions[sidebar_second] = Sidebar Second
regions[footer] = Footer
regions[page_bottom] = Page Bottom
コアのデフォルト リージョン (2)
page_top
page_bottom
footer
header
sidebar_secondsidebar_first
highlighted
content
help
コアのデフォルト リージョン (3)
• 主要リージョンの解説
– page_top、page_bottom
• サイトが正常に動作するために必要な必須リージョン
• ブロック設定の UI には表示されない非表示リージョン(後述)
– highlighted
• 旧バージョンの Site Mission に対応する
– Site Mission とはサイトの目的や短い説明文を出力するもの
– 従来の設計では、フロントページに限定される等の制約が多かったため、
Drupal 7 から専用のリージョンに出力する設計に変更された。
– help
• エラーやステータスメッセージ用のリージョン
– "システム ヘルプ" ブロックとして出力され、その出力先として用意されている。
– content
• "メインページ コンテンツ" ブロックを出力するためのリージョン
– このブロックは特別扱いされ、ブロックの管理 UI で無効にしても必ず表示される
(参考)html.tpl.php の内容
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xml:lang="<?php print $language->language; ?>" version="XHTML+RDFa 1.0"
dir="<?php print $language->dir; ?>"<?php print $rdf_namespaces; ?>>
<head profile="<?php print $grddl_profile; ?>">
<?php print $head; ?>
<title><?php print $head_title; ?></title>
<?php print $styles; ?>
<?php print $scripts; ?>
</head>
<body class="<?php print $classes; ?>" <?php print $attributes;?>>
<div id="skip-link">
<a href="#main-content" class="element-invisible element-focusable"><?php print
t('Skip to main content'); ?></a>
</div>
<?php print $page_top; ?>
<?php print $page; ?>
<?php print $page_bottom; ?>
</body>
</html>
出力されるコンテンツのマークアップ全体構造を定義するテンプレート。
page_top、page_bottom の各非表示リージョンは、hook_system_info_alter() を
使用して宣言されている。詳細については下記を参照:
http://api.drupal.org/api/function/system_system_info_alter/7
リージョンへのコンテンツ割り当て
• ブロック リージョン
– テンプレート内に設けられる、コンテンツの出力先となる区画
• .info における定義構文
– 内部名:処理系が使用する識別名
– 表示名:ブロックの管理 UI に表示される表示名(人間のための識別名)
• この定義がない場合はデフォルトのリージョンが使用される
• リージョンのコンテンツを出力するコードをテンプレートファイルに埋め込む
– リージョンを出力するコードは
– page_top、page_bottom の各リージョンは html.tpl.php テンプレートファイルに
– それ以外のデフォルト/カスタム リージョンは page.tpl.php テンプレートファイルに
regions[<内部名>] = <表示名>
サブテーマ
• サブテーマとは
– 既存のテーマを継承して作成するカスタマイズ版テーマのこと
• 詳細はこちら ⇒ https://drupal.org/node/225125
• サブテーマを作るには
– 新しいテーマを作る
• sites/all/themes 等の下にテーマ名のフォルダを作成する
– .info ファイルを作成して base theme を指定する
• ベーステーマとして使用するテーマの name の値を指定する
– 継承されない要素の設定
• リージョン、coreバージョン、color モジュール関連の設定
– 継承される要素の設定
• スタイルシート、JavaScript、template.php、テンプレートファイル
テーマを利用した出力のカスタマイズについて
• ほとんどそのまま使えるが、一部どうしても変更したい・・・
– という場合にどうするか?
テーマ関数について
• テーマ関数とは?
– モジュールが提供する、オーバーライド可能なコンテンツ生成用の関数
• モジュール内の各部から必要に応じて呼び出されるマークアップ生成処理
– 目的:
• テーマ側でカスタマイズ可能な HTML マークアップ生成処理を実装する
• 本質的にはテンプレートファイルと同じ目的を持つ
– テンプレートとテーマ関数、使い分けの判断基準は?
• 再利用の頻度
• カスタマイズするのはどんな人?(PHPコードをいじれる人かそうでないか)
• パフォーマンス
– テーマ関数として実装した方がテンプレートより若干速度は向上する
• まとまったサブコンテンツか、コンテンツの一部として埋め込みまれる断片か
– 前者はテンプレート、後者はテーマ関数を使用して生成する場合が多い
テーマ関数のオーバーライド
• テーマ関数をオーバーライドする手順
1. 目的のテーマ関数をソースやドキュメントで探して
オリジナルのソースを見つけ出す
2. 入手したソースをテーマの template.php に貼り付ける
3. テーマ関数名の先頭部分の theme_ を <テーマ名>_ に置換する
• 必要に応じて実装の中身をカスタマイズする
4. template.php ファイルを保存してキャッシュをクリアする
5. 再読み込みすると、モジュールのテーマ関数の代わりに
template.php 内の実装を呼び出して出力が行われる
注)template.php ファイルを最初から自作する場合は、
先頭に <?php は書く一方、末尾の閉じタグ(?>)は書かない
(詳しくは、http://drupal.org/node/1424 を参照)
サンプル:サブテーマの作成例
• 例)Bootstrap テーマ
– Bootstrap を利用したテーマの作成用に用意されたベーステーマ
• https://www.drupal.org/project/bootstrap
– サブテーマを作成するためのスターターキット(ひな型)が付属する
– サブテーマ作成手順:
• starterkit サブフォルダの cdn フォルダを theme フォルダにコピーする
• cdnstarterkit というファイルが .info ファイルのひな型になっている
• このファイルを、<作るテーマ名>.info ファイルに変更する
• この .info を適宜編集する
– テーマ名、説明の編集
– スタイルシートの追加/オーバーライド
– JavaScript の追加/オーバーライド
– デモ:hoge テーマの作成例
サンプル:テーマ関数のオーバーライド例
• 要求
– 動画コンテンツタイプの作成者欄にユーザー名が表示される。
– これを先にユーザーに追加した 「ハンドル名」 フィールド」に変えたい・・・
• 対応方法
– ノードの作成者欄のユーザー名出力のテーマ関数を探す
→ theme_username()
– (1) カレントの hoge テーマの template.php ファイルを開き、
(2) theme_username() のソースを丸ごとコピー、
(3) 関数名を hoge_username() に変更して、
(4) 処理に必用な変更を加える。
– (5) キャッシュ(テーマレジストリ)をクリアする
結果
contributed モジュールによる
システム機能の実装
さまざまな機能を提供するモジュールの活用
拡張/contributed モジュール
• コア API に基づいて作られるアドオン機能
• コアにない機能を追加する
• コアの動作を再定義する
• さまざまな機能を組み込める
膨大な数の資産があります
例)Panels モジュール
• ページ内のレイアウトを自在に定義
• コンテキストに応じてレイアウトを変更
例)Context モジュール
• 前後関係に基づく条件に
応じてサイトの要素を
多様に変化させる
例)Rules モジュール
• イベント、条件、アクションを定義
• サイト上で発生するイベントに基づき
さまざまなサイト挙動を実現する
例)Feeds モジュール
• フィードを読み込んでサイトの
データベースに取り込む
– https://www.drupal.org/project/feeds
サンプル:Feeds を使ってみる
• YouTube のフィードを読み込んでみる
– 動画フィードのURL:
• https://www.youtube.com/feeds/videos.xml?channel_id=[チャンネルID]
• https://www.youtube.com/feeds/videos.xml?user=[ユーザ名]
• 追加モジュール
– Feeds XPath Parser
• https://www.drupal.org/project/feeds_xpathparser
• XPath で指定したフィード内の要素を
作成されるノードのフィールドにマッピングするパーサーを提供する
フィードの内容
<feed xmlns:yt="http://www.youtube.com/xml/schemas/2015" xmlns:media="http://search.yahoo.com/mr
ss/"xmlns="http://www.w3.org/2005/Atom">
・・・
<entry>
<id>yt:video:s8i-0o2Vni0</id>
<yt:videoId>s8i-0o2Vni0</yt:videoId>
<yt:channelId>UC9GCvu_7acOTqOAAYpCRmpw</yt:channelId>
<title>被災地の「今」を伝える 全国の中学生が石巻市訪問</title>
<link rel="alternate" href="http://www.youtube.com/watch?v=s8i-0o2Vni0"/>
<author>
<name>最新ニュース</name>
<uri>
http://www.youtube.com/channel/UC9GCvu_7acOTqOAAYpCRmpw
</uri>
</author>
<published>2013-08-16T12:52:37+00:00</published>
<updated>2015-11-05T16:09:01+00:00</updated>
<media:group>
<media:title>被災地の「今」を伝える 全国の中学生が石巻市訪問</media:title>
<media:content url="https://www.youtube.com/v/s8i-0o2Vni0?version=3" type="application/x-
shockwave-flash" width="640"height="390"/>
<media:thumbnail url="https://i4.ytimg.com/vi/s8i-
0o2Vni0/hqdefault.jpg" width="480" height="360"/>
<media:description/>
<media:community>...</media:community>
</media:group>
</entry>
<entry>
・・・
パーサーの設定
entry 要素の下の・・・
id 要素は GUID (一意識別ID)にマップ
title 要素はタイトルにマップ
link 要素の href 属性は
動画フィールドの URL にマップ
media:group/media:descrdiption 要素を
紹介文(本文)にマップ
Drupal 8 について
最新の Drupal リリース
• 2015年11月にリリースされた Drupal の最新版
– https://www.drupal.org/8
• 特徴
– インプレース編集
– 構成情報をコンテンツデータベースと分離
– 多言語機能の強化
– Views モジュールがコアに
– Symfony2 ベースとなりオブジェクト指向型の API に
– コアの REST サポート
• Restful service in core
REST と "Headless Drupal"
• REST (REpresentational State Transfer)
– HTTP をそのまま利用したリソース公開手法
• URL でリソースを識別する
• HTTP メソッドで処理の種類を識別する
– GET、POST、PUT、PATCH、DELETE、・・・
• Content-Type ヘッダーでデータの形式を識別する
• "Headless Drupal"
– クライアントサイド MVC フレームワークから利用できる
サーバー機能としての Drupal
– REST を通じて種々のサービスを提供できる CMS
• 参考
– http://buytaert.net/the-future-of-decoupled-drupal
HTTP メソッド
メソッド
HTTP
説明
1.0 1.1
GET ◎ ◎ URIで指定したリソースを取得する。
HEAD ◎ ◎ GET と同じだがヘッダーのみを取得する。
POST ○ ○ クライアントから名前と値のペアの集合としてデータをサーバーに渡す。
PUT ○ ○ URI で指定したサーバー上のリソースを置き換える。
DELETE ○ ○ URI で指定したサーバー上のリソースを削除する。
PATCH × ○ PUT と同じだがサーバー上のリソースの
CONNECT × ○ プロキシサーバを経由して SSL 通信する際などに使用する。
OPTIONS × ○ サーバがサポートしているメソッドやオプションを調べる際に用いる。
TRACE × ○
HTTP要求がどのプロキシサーバを経由して送信されるかなど、HTTP の動作をト
レースする際に用いる。このメッセージを受け取った最後のサーバは、要求メッセージ
に含まれるエンティティ(通常はヘッダ+メッセージボディ)をそのまま返す。
LINK ○ × 指定した URL とリソースにリンク関係を結ぶ。HTTP/1.1 で廃止。
UNLINK ○ × 指定した URL とリソースの間のリンク関係を解除する。HTTP/1.1 で廃止。
Drupal 7 の REST 実装
• Services モジュール
– https://www.drupal.org/project/services
• Services Views モジュール
– https://www.drupal.org/project/services_views
• RESTful モジュール
– https://www.drupal.org/project/restful
• RESTful Web Services モジュール
– https://www.drupal.org/project/restws
REST in Drupal 8 Core
• RESTful Web Services (rest)
– エンティティやその他のリソースを RESTful API で公開する
• Serialization (serialization)
– JSON/XML ⇔ データ間のシリアライズ/デシリアライズを行う
• Hypertext Application Language (hal)
– HAL を使用してエンティティをシリアライズする
• HAL = Hypertext Application Language
– Web API でやり取りされるリソースを
ハイパーメディアとしても扱えるようにするための仕様
• HTTP Basic Authentication (basic_auth)
– HTTP ベーシック認証プロバイダを提供する
Drupal 8 サイトの REST 構成管理
• Drupal 8 の構成管理
– Configuration Management in Core
• 種々の構成設定を .yml ファイルとしてインポート/エクスポートできる
• [環境設定] > [開発] > [設定の同期]
RESTful サービスの設定をエクスポート
(rest.settings.yml ファイル)した後、
そのファイルを適宜編集してインポートし直す
ことでサイトの REST 構成を変更できる
REST UI モジュール
• REST の構成管理 UI を提供する (not Core)
– https://www.drupal.org/project/restui
– [環境設定] > [ウェブサービス] > [REST]
• できること
– 特定のリソースを有効または無効にする
– 有効なリソースの形式(json/hal_json/xml)を指定する
– 有効な認証の方式(ベーシック認証/Cookie認証)を指定する
YML ファイルの編集(とインポート)をすることなく REST の構成管理ができる
REST リソースの設定
HTTP メソッド・データ形式・認証
• HTTP メソッド
– GET:リソースの取得
– POST:リソースの新規追加
– DELETE:リソースの削除
– PATCH:リソースの更新
• データ形式
– HAL-JSON(Hyper Application Language:JSON拡張)
– JSON
– XML
• 認証
– Basic 認証、Cookie 認証
各メソッドのリクエスト仕様
• 参照
– JavaScript and Drupal 8 RESTful Web Services
• https://www.drupal.org/node/2405657
• 例)
– Retrieve(取得)
• GET: http://localhost/user/1?_format=json
Content-type: *
Accept: application/json
200 - OK
– Create(新規作成)
• POST: http://localhost/entity/node
Content-type: application/hal+json
Accept: application/json
{"type":[{"target_id":"page"}],"title":[{"value":"Hello
world"}],"_links":{"type":{"href":"http://localhost/rest/type/nod
e/page"}}}
• 201 - Created
既存ノードを REST で取得するには
クエリパラメータ _format=json を
指定して GET リクエストを発行
新規追加の場合は
パス /entity/node に hal_json 形
式でノード情報を POST 送信
注意点:CSRF対策と権限設定
• CSRF 対策
– POST/PATCH/DELETE では X-CSRF-Token ヘッダが必要
• X-CSRF-Token:CSRF 攻撃を防ぐために必要
– 下記のパスから得られるトークンをリクエスト ヘッダーに含めないと 403 になる
» http://example.com/rest/session/token
• 権限設定
– アクセスするユーザーの役割に権限設定で
REST 関連のアクセス権を与える必要がある(認可)
• 匿名アクセスを可能にするには ANONYMOUS USER に権限を与える
認証について
• 匿名アクセスでない場合は認証への対応が必要
• 例)Basic 認証の場合
– Authorization リクエストヘッダーが必要
– 値は次のとおり:
• 先頭に "Basic "
• 続けて 「<ユーザー名>:<パスワード>」 形式の文字列の Base64
• 例)Authorization: Basic aG9nZTpmdWdh
– DHC REST/HTTP API Client には
ユーザー名とパスワードを入力して
基本認証のヘッダーを生成する機能がある
» "set authorization" 機能
<ユーザー名>:<パスワード> の形式の
文字列を Base64 エンコードしたもの
コンテンツ一覧を REST で取得するには
• Views の "REST export" ディスプレイ
– フォーマットに "Serializer" を指定
– フィールドの環境設定のエイリアス
• JSON の key 値をカスタマイズできる(必要な場合)
AngularJS と組み合わせたサンプル
Drupal 8 Restful servivce
endpoint
endpoint
endpoint
endpoint
JSON
GET
PUT
POST
DELETE
まとめ
• Drupal のデータ管理
– 構造データをエンティティとして一般化
• コンテンツに限らない種々の構造化データを統一された API で扱える
• Views = クエリビルダ
– コーディング不要で高度なデータクエリを UI で対話的に作成できる
– サイト内/外の様々な出力先を指定できる
• ページ、ブロック、フィード・・・
• ブロックシステムとテーマ
– テーマのリージョンとブロックシステムで基本的なレイアウト機構を提供
– テーマ関数を利用するとコアの出力を部分的に再定義できる
• Drupal 8
– REST in core と Headless Drupal
ありがとうございました
• 興味をお持ちいただけたらぜひ使ってみてください
• 勉強会もやっていますのでお気軽に遊びに来てください
– http://drupalsapporo.net/

Drupal のコア要素を知る ~構築を支える道具立て~

  • 1.
  • 2.
    趣旨 Drupal でよく耳にする・・・ • 大規模事例多数(特に海外) •エンタープライズ指向! • コンテンツ管理 "フレームワーク"(=CMF not CMS) ・・・本日そういう話はちょっと置いといて、 • Drupal のサイト構築で広く使われている基本機能を、 簡単なサンプルの設定例などを交えてご紹介します。
  • 3.
    自己紹介 • 白根健司(しらねけんじ) – 妻1人、子供2人 –老眼進行中 – ポンコツ中年 – Drupal 使用歴 9年くらい • Drupal 4.6 の頃から少しずつ… – 「Drupal さっぽろ」 事務局&雑用係 • 月例の Drupal 勉強会を札幌と小樽で交互に開催しています • http://drupalsapporo.net/ – 株式会社シナジークエスト • 札幌/小樽でIT系の人材教育とサイト構築の仕事をしています https://www.facebook.com/bkenro https://twitter.com/bkenro
  • 4.
    内容 • 全体構造 • フィールドとエンティティ –ノード、コメント、タクソノミー、ユーザー、ファイル • Views モジュール(=クエリビルダ) • ブロックシステムとテーマ • contributed モジュールの利用 – 例)Feeds モジュール • Drupal 8 について – D8 コアの REST 機能 • まとめ
  • 5.
  • 6.
    Drupal の紹介 • Drupal(ドゥルーパル)とは –PHP で記述されたオープンソース Web コンテンツ管理ソフトウェア • GPLv2 ライセンス • CMS Web サイトの 4.9%(全 Web サイトの 2.2%)が Drupal を使用 – 創始者:Dries Buytaert • 電子掲示板として書いたソフトウェアが出発点、2001 年に OSS 化 – ユーザーと開発者の巨大コミュニティ • drupal.org 上で日々活発な議論や情報交換 – アカウント数:1,167,000(2015年3月) – 開発者アカウント:37,000(〃) – モジュール数:33,310 – テーマ数:2,258 – ディストリ:1,017
  • 7.
    国内のコミュニティ • 定期的な Meetup –Drupal Cafe • https://www.facebook.com/DrupalCafe – Drupal さっぽろ • http://drupalsapporo.net/ • 質問を受け付けるフォーラム – https://groups.drupal.org/japan • 翻訳を共同で進めるプロジェクト – https://localize.drupal.org/translate/languages/ja
  • 8.
    Drupal のレイヤー構造 1. データ(エンティティ) –システムの基礎となるデータ 2. モジュール – 個々の機能を提供するプログラム 3. 出力コンテンツ – ページ:URLが割り当てられる – ブロック:ページ内の区画に出力 4. ユーザーとアクセス許可 – ユーザーにロールを割り当て – ロールに権限を与える 5. テンプレート&テーマ – 最終的な応答コンテンツを生成する • HTML、CSS、PHP 変数 出典(図)https://drupal.org/getting-started/before/overview
  • 9.
    モジュール = buildingblock • Drupal の機能を拡張するソフトウェア(プログラム) • 次の3つに分類される: – Core モジュール • Drupal 本体に含まれる標準機能モジュール • 追加コンポーネントのダウンロードやコピー不要で最初から使用できる – 有効にするか無効にするかは設定で指定できる – Contributed モジュール • drupa.org のダウンロード セクションから入手できる拡張機能モジュール • Views、Panels、Rules、Feeds などなど、膨大な資産がある – カスタム モジュール • 独自に開発する拡張機能モジュール • 上記2つと同様にインストール、有効化して使用できる
  • 10.
  • 11.
    エンティティとタイプ • エンティティとは? – Drupalのデータベースに保管される構造化データを一般化したもの • コア標準の管理 UI でフィールド設計を定義できる • エンティティ タイプ – エンティティはその用途・目的に応じたタイプに分かれる – Drupal コアの標準エンティティ タイプ • ノード :独立したページとして表示できるコンテンツ • コメント :ノードに付随して存在するコンテンツ • ファイル :サーバーにアップロードされるファイルの情報 • タクソノミー (分類用語) – ボキャブラリ :特定の目的に基づく用語の集合に関する情報 – ターム :ボキャブラリに属する個々の用語 • ユーザー :サイトのユーザーアカウント情報
  • 12.
    バンドル(bundle) • バンドル – エンティティタイプにフィールドを関連付けた実装のこと – 標準の UI でフィールド設計の定義や編集ができる ページ Body フィールド ・・・ ノード エンティティ タイプ バンドル
  • 13.
    フィールド • フィールドとは – 再利用可能なデータ断片 –データの用途・目的に応じたタイプ(型)を持つ – ウィジェットを持つ • 値の編集機能を提供する • 値の表示機能を提供する
  • 14.
  • 15.
    ノードからエンティティへ:flexinode、CCK、field 最初から現在のような構造だったわけではありません。 • flexinode モジュール –https://www.drupal.org/project/flexinode – プログラミング不要でノードタイプの定義を可能に(Drupal4.6~) • CCK (Content Construction Kit) モジュール – https://www.drupal.org/project/cck – flexinode の機能を引き継ぎ(Druap 5~6) • Field モジュール/API – CMS 上の各種構造化データをエンティティに(Drupal 7~)
  • 16.
    多様なフィールド拡張モジュール さまざまなフィールドのモジュールが提供されている: – 数値、選択肢、一般のファイル、画像ファイル(コア) • 画像は「画像スタイル」 として種々の変換処理を定義することもできる – リンク • サイト内/外のパス/URLを保持する – メディア • 外部サイトの動画等のURLを保持(+ 再生用のウィジェット) – エンティティ参照 • Entity Reference – https://www.drupal.org/project/entityreference – 別のノードやエンティティへの参照を保持する
  • 17.
    参照による関連の定義 • エンティティ参照フィールドで関連を定義できる – 多重度(1対1、1対多)も指定できる –例)ノードからタクソノミータームを参照 • 特定のノードコンテンツが参照先のタームに分類されることを表す – 多重度 > 1 なら複数のタームを設定できる仕様(例:タグ) – 多重度 = 1 なら特定のタームにのみ分類される仕様(例:カテゴリ) ブログ記事 本文フィールド 写真フィールド ターム参照 タグ 用語名*複数値
  • 18.
    エンティティの活用事例:Drupal Commerce • Drupal7 ベースの EC サイト構築モジュール – 商品、注文、顧客、注文明細などの EC エンティティを提供 – 各エンティティは Drupal 共通のフィールド UI でカスタマイズできる • https://www.drupal.org/project/commerce • https://commerceguys.com/
  • 19.
    サンプル例:「お気に入り動画」 ノードタイプ • お気に入りの動画を保存するノードのタイプ –Video Embed Field モジュールを利用して・・・ • https://www.drupal.org/project/video_embed_field
  • 20.
  • 21.
    View と Viewsモジュール • データベース用語の "View" – ビュー(View)表 • ひとつ以上のテーブルから任意のデータを選択&カスタマイズして表したもの • 一度定義すれば、同じ条件に基づく結果を簡単に取得できる • 何に使う? – Drupal のエンティティに対する "ビュー" を作るための仕組み • https://www.drupal.org/project/views – 管理 UI を使用して特定のクエリを定義し、保存できる • 一度定義した Views はサイトの各部で再利用できる • 出力先(display)の指定: – ページ(URLが与えられて独立したコンテンツとして表示できる) – ブロック(テンプレート内のリージョンに埋め込まれるコンテンツ) – フィード(URLを与えられ、種々の形式で取り出される)
  • 22.
    クエリ(問合せ)の構成要素 SQL 疑似コード例) SELECT TITLE// 列 → フィールド FROM BLOG // 表 → エンティティ WHERE PUBLISH=TRUE // 抽出条件 ORDER BY POSTDATE; // 整列条件
  • 23.
  • 24.
    その他の設定オプション • ディスプレイ – Viewsの出力先を指定する(ブロック、ページ、フィード、・・・) • フォーマット – 出力の形式を指定する • HTML List (ul)、グリッド、テーブル、フォーマットされていないリスト (div) • フィールドの詳細オプション – 表示から除外 – 結果の書き換え – CSS クラスの指定 • 行(出力される各レコード)に class 属性を付加する • Views の出力全体のコンテナに class 属性を付加する まだまだ他にも たくさん・・・
  • 25.
  • 26.
    Drupal のレイヤー構造 1. データ(エンティティ) –システムの基礎となるデータ 2. モジュール – 個々の機能を提供するプログラム 3. 出力コンテンツ – ページ:URLが割り当てられる – ブロック:ページ内の区画に出力 4. ユーザーとアクセス許可 – ユーザーにロールを割り当て – ロールに権限を与える 5. テンプレート&テーマ – 最終的な応答コンテンツを生成する • HTML、CSS、PHP 変数 出典(図)https://drupal.org/getting-started/before/overview
  • 27.
    テーマとテーマ エンジン • テーマとは? –サイトの外観を定義する、テンプレート、スタイルシート、スクリプト等を まとめたソフトウェアパッケージのこと – Drupal サイトに導入できる種々のテーマが開発・公開されている • テーマ エンジンとは? – テンプレートのコードを解釈して動的にコンテンツを生成する処理系 – Drupal 7 の標準テーマ エンジンは PHPTemplate • PHP で書かれた .tpl.php ファイルをそのままテンプレートとして使用する – その他のテーマエンジン • https://drupal.org/project/project_theme_engine • D8 では標準テーマエンジンが Twig になる
  • 28.
    テーマの例 • コアに付属するテーマ – Bartik •Drupal 7 インストール後の初期デフォルト テーマ – Garland • Drupal 5 のコア標準テーマ、Color モジュール対応、fixed/fluid 切替対応 – Seven • Drupal 7 のデフォルト管理用テーマ – Stark • Drupal のデフォルト HTML マークアップをデモする最小構成テーマ • drupal.org の配布テーマ一覧(contributed themes) – https://www.drupal.org/project/project_theme
  • 29.
    Drupal サイトのテーマを管理する 1. デフォルトテーマの設定 2.管理用テーマの設定 3. テーマのグローバル設定 – ロゴ – サイト名とスローガン – ショートカットアイコン(ファビコン) – ユーザーのアイコン(アバター) – コメントにおけるユーザー検証の設定 – メインメニュー、セカンダリメニュー 4. カスタム テーマ設定 5. テーマの追加インストール Drupal 7 サイトにおける テーマ管理の操作内容と 設定項目を見ていきます。 下記パスからスタート: admin/appearance
  • 30.
    1. デフォルト テーマの設定 •デフォルトテーマの設定 – 有効にするだけでなくデフォルト テーマにすることで通常表示されるテーマを指定する • デフォルトテーマとは、一般のサイト訪問者に表示されるテーマ(フロントエンドテーマ)のこと デフォルトテーマが先頭に この例では Seven も有効になっている。 [デフォルトに設定] リンクをクリックすると デフォルトテーマに設定される
  • 31.
    2. 管理用テーマの設定 • 管理用テーマ –サイトの管理に関するパス(URL)に適用されるテーマ • /admin 配下のパスを持つページ – コンテンツ編集用のページに適用することもできる – デフォルトテーマの設定ページの一番下にある UI で指定する デフォルトテーマまたは インストール済みテーマの 中から選択・指定する コンテンツ編集ページに 適用することもできる
  • 32.
    3. テーマのグローバル設定 (1) •全テーマ共通の環境設定 – インストール済みの全テーマに適用されるデフォルト設定を指定できる • パス: admin/appearance/settings • 個別のテーマの設定で再定義できる
  • 33.
    3. テーマのグローバル設定 (2) 設定項目説明 ロゴ ロゴは、デフォルトでテーマディレクトリの直下にある logo.png というファイル が使われる。別のファイルをアップロードしたり、別のパスを指定することもでき る。テーマ設定で有効にすると、変数 $logo にロゴのパスを含むコンテンツ が設定され、テンプレートファイル page.tpl.php で利用できるようになる。 サイト名 スローガン admin/conifg/system/site-information の UI から指定でき、テー マ設定で有効にすると、それぞれ変数 $site_name、$site_slogan としてテンプレートファイル page.tpl.php から利用できるようになる。 ショートカット アイコン デフォルトは misc/favicon.ico のファイルが使用される。ロゴと同様、別 のファイルをアップロードしたり別のパスを指定することもできる。 投稿でのユーザーアバター コメントでのユーザーアバ ター それぞれ、テンプレートファイル page.tpl.php の $user_picture 変 数、テンプレートファイル comment.tpl.php ファイルの $picture 変 数の有効/無効を設定する。有効にするとノードやコメントにアバターが表示 される。 コメントの承認状況 ログインによって検証されたアカウントを使用していない場合、ユーザー名の 横に "(not verified)" と表示するオプション。この表示文字列は関数 template_process_username() で $variables['extra'] と して定義され、theme_username()で出力される。
  • 34.
    3. テーマのグローバル設定 (3) 設定項目説明 メインメニュー セカンダリー メニュー このチェックボックスをオンにすると、テンプレートファイル page.tpl.php で 使用する変数 $main_menu と $secondary_menu にそれぞれ のメニューのリンクを格納した配列がセットされる。どの定義済みメニューをメ インとセカンダリに使用するのかは、admin/structure/menu/settings の設定 UI から指定できる。デフォルトでは次のメニューが設定されている。 メインメニュー admin/structure/menu/manage/main-menu セカンダリメニュー admin/structure/menu/manage/user-menu いずれも、テンプレートファイル page.tpl.php 内で theme_links() 関数を使用して出力される単純な単一階層メニューだが、高度なナビゲー ションのデザインが難しいため、これらのメニューを使用する代わりに、メニュー 用のリージョンを用意してブロックとしてメニューを出力するテーマも多い。
  • 35.
    4. カスタム テーマ設定 •テーマやモジュールによって提供されるテーマ設定 – 特定のテーマやモジュールによって提供されるテーマ設定もある • 例)Garland テーマの [コンテンツの幅] 設定 – 固定幅か可変幅(フルード)かを指定する
  • 36.
    5. テーマの追加インストール • テーマのインストール場所: –themes フォルダ • コアのテーマのインストール場所 • サイト固有のカスタムテーマはここにインストールしないこと – インストールするとコアの更新で削除されたり上書きされる恐れがある – sites/all/themes フォルダ • Drupal のインストール環境すべてで共用されるテーマはここにインストールする • 管理画面からテーマをダウンロードした場合もここにインストールされる – sites/<サイト名>/themes フォルダ • マルチサイトにおける特定サイト固有のテーマはここにインストールする – <サイト名> にはサイトのドメインが入る • テーマインストーラの利用 – UI にテーマの tar.gz ファイルの URL を指定して実行する • http://example.com/admin/appearance/install • sites/all/themes の下にインストールされる
  • 37.
    Drupal 7 テーマを構成するファイル(1) 出典(図)https://drupal.org/node/171194 リージョン コンテンツの出力先となる ページ内の区画領域のこと
  • 38.
    Drupal 7 テーマを構成するファイル(2) • .info ファイル(必須) – テーマのメタデータ、スタイルシート、JSファイル、リージョン等を定義 – .info ファイルの名前がテーマの内部名を定義する • テンプレート(.tpl.php)ファイル – 動的に生成される特定部分のマークアップ コンテンツを定義する • HTML、RSS (XML)、・・・ – 既定のファイルを独自のバージョンで置き換えることができる • 既定のファイルと同名ファイルをテーマのディレクトリ配下に配置するとそちらが優先して使用される • suggestion:テンプレートファイルの適用対象を絞り込む命名規則 • template.php – ロジックやデータ処理を行うコードを記述するファイル • 出力前の前処理、テーマ関数(後述)のオーバーライド 等 • その他 – ロゴ、スクリーンショット – theme-settings.php
  • 39.
    リージョンについて • リージョンとは? – コンテンツの出力先となる、ページ内の区画領域のこと •テンプレート内の該当する位置にコンテンツ出力コードを埋め込んで実装する – HTML マークアップの高レベルの構造定義に用いられる • リージョンに出力されるひとまとまりのコンテンツをブロックと呼ぶ – コアの UI を利用してリージョンにブロックを割り当てる • パス: admin/structure/block • 出力先のリージョンを変更することで ブロックの表示位置を自由に変更できる – テーマとの関係 • リージョンの配置、表示、スタイル等は テーマによって定義される
  • 40.
    コアのデフォルト リージョン (1) •Drupal コアが定義するリージョン – プログラムから利用できる9つのデフォルト リージョンが用意されている • .info ファイルの書式で記述すると次のようになる: • regions[] の記述がなければ、このデフォルト リージョンが適用される • regions[] の記述を(1つでも)すると .info に従ってリージョンが設定される regions[page_top] = Page Top regions[header] = Header regions[highlighted] = Highlighted regions[help] = Help regions[content] = Content regions[sidebar_first] = Sidebar First regions[sidebar_second] = Sidebar Second regions[footer] = Footer regions[page_bottom] = Page Bottom
  • 41.
  • 42.
    コアのデフォルト リージョン (3) •主要リージョンの解説 – page_top、page_bottom • サイトが正常に動作するために必要な必須リージョン • ブロック設定の UI には表示されない非表示リージョン(後述) – highlighted • 旧バージョンの Site Mission に対応する – Site Mission とはサイトの目的や短い説明文を出力するもの – 従来の設計では、フロントページに限定される等の制約が多かったため、 Drupal 7 から専用のリージョンに出力する設計に変更された。 – help • エラーやステータスメッセージ用のリージョン – "システム ヘルプ" ブロックとして出力され、その出力先として用意されている。 – content • "メインページ コンテンツ" ブロックを出力するためのリージョン – このブロックは特別扱いされ、ブロックの管理 UI で無効にしても必ず表示される
  • 43.
    (参考)html.tpl.php の内容 <!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php print $language->language; ?>" version="XHTML+RDFa 1.0" dir="<?php print $language->dir; ?>"<?php print $rdf_namespaces; ?>> <head profile="<?php print $grddl_profile; ?>"> <?php print $head; ?> <title><?php print $head_title; ?></title> <?php print $styles; ?> <?php print $scripts; ?> </head> <body class="<?php print $classes; ?>" <?php print $attributes;?>> <div id="skip-link"> <a href="#main-content" class="element-invisible element-focusable"><?php print t('Skip to main content'); ?></a> </div> <?php print $page_top; ?> <?php print $page; ?> <?php print $page_bottom; ?> </body> </html> 出力されるコンテンツのマークアップ全体構造を定義するテンプレート。 page_top、page_bottom の各非表示リージョンは、hook_system_info_alter() を 使用して宣言されている。詳細については下記を参照: http://api.drupal.org/api/function/system_system_info_alter/7
  • 44.
    リージョンへのコンテンツ割り当て • ブロック リージョン –テンプレート内に設けられる、コンテンツの出力先となる区画 • .info における定義構文 – 内部名:処理系が使用する識別名 – 表示名:ブロックの管理 UI に表示される表示名(人間のための識別名) • この定義がない場合はデフォルトのリージョンが使用される • リージョンのコンテンツを出力するコードをテンプレートファイルに埋め込む – リージョンを出力するコードは – page_top、page_bottom の各リージョンは html.tpl.php テンプレートファイルに – それ以外のデフォルト/カスタム リージョンは page.tpl.php テンプレートファイルに regions[<内部名>] = <表示名>
  • 45.
    サブテーマ • サブテーマとは – 既存のテーマを継承して作成するカスタマイズ版テーマのこと •詳細はこちら ⇒ https://drupal.org/node/225125 • サブテーマを作るには – 新しいテーマを作る • sites/all/themes 等の下にテーマ名のフォルダを作成する – .info ファイルを作成して base theme を指定する • ベーステーマとして使用するテーマの name の値を指定する – 継承されない要素の設定 • リージョン、coreバージョン、color モジュール関連の設定 – 継承される要素の設定 • スタイルシート、JavaScript、template.php、テンプレートファイル
  • 46.
  • 47.
    テーマ関数について • テーマ関数とは? – モジュールが提供する、オーバーライド可能なコンテンツ生成用の関数 •モジュール内の各部から必要に応じて呼び出されるマークアップ生成処理 – 目的: • テーマ側でカスタマイズ可能な HTML マークアップ生成処理を実装する • 本質的にはテンプレートファイルと同じ目的を持つ – テンプレートとテーマ関数、使い分けの判断基準は? • 再利用の頻度 • カスタマイズするのはどんな人?(PHPコードをいじれる人かそうでないか) • パフォーマンス – テーマ関数として実装した方がテンプレートより若干速度は向上する • まとまったサブコンテンツか、コンテンツの一部として埋め込みまれる断片か – 前者はテンプレート、後者はテーマ関数を使用して生成する場合が多い
  • 48.
    テーマ関数のオーバーライド • テーマ関数をオーバーライドする手順 1. 目的のテーマ関数をソースやドキュメントで探して オリジナルのソースを見つけ出す 2.入手したソースをテーマの template.php に貼り付ける 3. テーマ関数名の先頭部分の theme_ を <テーマ名>_ に置換する • 必要に応じて実装の中身をカスタマイズする 4. template.php ファイルを保存してキャッシュをクリアする 5. 再読み込みすると、モジュールのテーマ関数の代わりに template.php 内の実装を呼び出して出力が行われる 注)template.php ファイルを最初から自作する場合は、 先頭に <?php は書く一方、末尾の閉じタグ(?>)は書かない (詳しくは、http://drupal.org/node/1424 を参照)
  • 49.
    サンプル:サブテーマの作成例 • 例)Bootstrap テーマ –Bootstrap を利用したテーマの作成用に用意されたベーステーマ • https://www.drupal.org/project/bootstrap – サブテーマを作成するためのスターターキット(ひな型)が付属する – サブテーマ作成手順: • starterkit サブフォルダの cdn フォルダを theme フォルダにコピーする • cdnstarterkit というファイルが .info ファイルのひな型になっている • このファイルを、<作るテーマ名>.info ファイルに変更する • この .info を適宜編集する – テーマ名、説明の編集 – スタイルシートの追加/オーバーライド – JavaScript の追加/オーバーライド – デモ:hoge テーマの作成例
  • 50.
    サンプル:テーマ関数のオーバーライド例 • 要求 – 動画コンテンツタイプの作成者欄にユーザー名が表示される。 –これを先にユーザーに追加した 「ハンドル名」 フィールド」に変えたい・・・ • 対応方法 – ノードの作成者欄のユーザー名出力のテーマ関数を探す → theme_username() – (1) カレントの hoge テーマの template.php ファイルを開き、 (2) theme_username() のソースを丸ごとコピー、 (3) 関数名を hoge_username() に変更して、 (4) 処理に必用な変更を加える。 – (5) キャッシュ(テーマレジストリ)をクリアする
  • 51.
  • 52.
  • 53.
    拡張/contributed モジュール • コアAPI に基づいて作られるアドオン機能 • コアにない機能を追加する • コアの動作を再定義する • さまざまな機能を組み込める 膨大な数の資産があります
  • 54.
  • 55.
  • 56.
    例)Rules モジュール • イベント、条件、アクションを定義 •サイト上で発生するイベントに基づき さまざまなサイト挙動を実現する
  • 57.
  • 58.
    サンプル:Feeds を使ってみる • YouTubeのフィードを読み込んでみる – 動画フィードのURL: • https://www.youtube.com/feeds/videos.xml?channel_id=[チャンネルID] • https://www.youtube.com/feeds/videos.xml?user=[ユーザ名] • 追加モジュール – Feeds XPath Parser • https://www.drupal.org/project/feeds_xpathparser • XPath で指定したフィード内の要素を 作成されるノードのフィールドにマッピングするパーサーを提供する
  • 59.
    フィードの内容 <feed xmlns:yt="http://www.youtube.com/xml/schemas/2015" xmlns:media="http://search.yahoo.com/mr ss/"xmlns="http://www.w3.org/2005/Atom"> ・・・ <entry> <id>yt:video:s8i-0o2Vni0</id> <yt:videoId>s8i-0o2Vni0</yt:videoId> <yt:channelId>UC9GCvu_7acOTqOAAYpCRmpw</yt:channelId> <title>被災地の「今」を伝える全国の中学生が石巻市訪問</title> <link rel="alternate" href="http://www.youtube.com/watch?v=s8i-0o2Vni0"/> <author> <name>最新ニュース</name> <uri> http://www.youtube.com/channel/UC9GCvu_7acOTqOAAYpCRmpw </uri> </author> <published>2013-08-16T12:52:37+00:00</published> <updated>2015-11-05T16:09:01+00:00</updated> <media:group> <media:title>被災地の「今」を伝える 全国の中学生が石巻市訪問</media:title> <media:content url="https://www.youtube.com/v/s8i-0o2Vni0?version=3" type="application/x- shockwave-flash" width="640"height="390"/> <media:thumbnail url="https://i4.ytimg.com/vi/s8i- 0o2Vni0/hqdefault.jpg" width="480" height="360"/> <media:description/> <media:community>...</media:community> </media:group> </entry> <entry> ・・・
  • 60.
    パーサーの設定 entry 要素の下の・・・ id 要素はGUID (一意識別ID)にマップ title 要素はタイトルにマップ link 要素の href 属性は 動画フィールドの URL にマップ media:group/media:descrdiption 要素を 紹介文(本文)にマップ
  • 61.
  • 62.
    最新の Drupal リリース •2015年11月にリリースされた Drupal の最新版 – https://www.drupal.org/8 • 特徴 – インプレース編集 – 構成情報をコンテンツデータベースと分離 – 多言語機能の強化 – Views モジュールがコアに – Symfony2 ベースとなりオブジェクト指向型の API に – コアの REST サポート • Restful service in core
  • 63.
    REST と "HeadlessDrupal" • REST (REpresentational State Transfer) – HTTP をそのまま利用したリソース公開手法 • URL でリソースを識別する • HTTP メソッドで処理の種類を識別する – GET、POST、PUT、PATCH、DELETE、・・・ • Content-Type ヘッダーでデータの形式を識別する • "Headless Drupal" – クライアントサイド MVC フレームワークから利用できる サーバー機能としての Drupal – REST を通じて種々のサービスを提供できる CMS • 参考 – http://buytaert.net/the-future-of-decoupled-drupal
  • 64.
    HTTP メソッド メソッド HTTP 説明 1.0 1.1 GET◎ ◎ URIで指定したリソースを取得する。 HEAD ◎ ◎ GET と同じだがヘッダーのみを取得する。 POST ○ ○ クライアントから名前と値のペアの集合としてデータをサーバーに渡す。 PUT ○ ○ URI で指定したサーバー上のリソースを置き換える。 DELETE ○ ○ URI で指定したサーバー上のリソースを削除する。 PATCH × ○ PUT と同じだがサーバー上のリソースの CONNECT × ○ プロキシサーバを経由して SSL 通信する際などに使用する。 OPTIONS × ○ サーバがサポートしているメソッドやオプションを調べる際に用いる。 TRACE × ○ HTTP要求がどのプロキシサーバを経由して送信されるかなど、HTTP の動作をト レースする際に用いる。このメッセージを受け取った最後のサーバは、要求メッセージ に含まれるエンティティ(通常はヘッダ+メッセージボディ)をそのまま返す。 LINK ○ × 指定した URL とリソースにリンク関係を結ぶ。HTTP/1.1 で廃止。 UNLINK ○ × 指定した URL とリソースの間のリンク関係を解除する。HTTP/1.1 で廃止。
  • 65.
    Drupal 7 のREST 実装 • Services モジュール – https://www.drupal.org/project/services • Services Views モジュール – https://www.drupal.org/project/services_views • RESTful モジュール – https://www.drupal.org/project/restful • RESTful Web Services モジュール – https://www.drupal.org/project/restws
  • 66.
    REST in Drupal8 Core • RESTful Web Services (rest) – エンティティやその他のリソースを RESTful API で公開する • Serialization (serialization) – JSON/XML ⇔ データ間のシリアライズ/デシリアライズを行う • Hypertext Application Language (hal) – HAL を使用してエンティティをシリアライズする • HAL = Hypertext Application Language – Web API でやり取りされるリソースを ハイパーメディアとしても扱えるようにするための仕様 • HTTP Basic Authentication (basic_auth) – HTTP ベーシック認証プロバイダを提供する
  • 67.
    Drupal 8 サイトのREST 構成管理 • Drupal 8 の構成管理 – Configuration Management in Core • 種々の構成設定を .yml ファイルとしてインポート/エクスポートできる • [環境設定] > [開発] > [設定の同期] RESTful サービスの設定をエクスポート (rest.settings.yml ファイル)した後、 そのファイルを適宜編集してインポートし直す ことでサイトの REST 構成を変更できる
  • 68.
    REST UI モジュール •REST の構成管理 UI を提供する (not Core) – https://www.drupal.org/project/restui – [環境設定] > [ウェブサービス] > [REST] • できること – 特定のリソースを有効または無効にする – 有効なリソースの形式(json/hal_json/xml)を指定する – 有効な認証の方式(ベーシック認証/Cookie認証)を指定する YML ファイルの編集(とインポート)をすることなく REST の構成管理ができる
  • 69.
  • 70.
    HTTP メソッド・データ形式・認証 • HTTPメソッド – GET:リソースの取得 – POST:リソースの新規追加 – DELETE:リソースの削除 – PATCH:リソースの更新 • データ形式 – HAL-JSON(Hyper Application Language:JSON拡張) – JSON – XML • 認証 – Basic 認証、Cookie 認証
  • 71.
    各メソッドのリクエスト仕様 • 参照 – JavaScriptand Drupal 8 RESTful Web Services • https://www.drupal.org/node/2405657 • 例) – Retrieve(取得) • GET: http://localhost/user/1?_format=json Content-type: * Accept: application/json 200 - OK – Create(新規作成) • POST: http://localhost/entity/node Content-type: application/hal+json Accept: application/json {"type":[{"target_id":"page"}],"title":[{"value":"Hello world"}],"_links":{"type":{"href":"http://localhost/rest/type/nod e/page"}}} • 201 - Created 既存ノードを REST で取得するには クエリパラメータ _format=json を 指定して GET リクエストを発行 新規追加の場合は パス /entity/node に hal_json 形 式でノード情報を POST 送信
  • 72.
    注意点:CSRF対策と権限設定 • CSRF 対策 –POST/PATCH/DELETE では X-CSRF-Token ヘッダが必要 • X-CSRF-Token:CSRF 攻撃を防ぐために必要 – 下記のパスから得られるトークンをリクエスト ヘッダーに含めないと 403 になる » http://example.com/rest/session/token • 権限設定 – アクセスするユーザーの役割に権限設定で REST 関連のアクセス権を与える必要がある(認可) • 匿名アクセスを可能にするには ANONYMOUS USER に権限を与える
  • 73.
    認証について • 匿名アクセスでない場合は認証への対応が必要 • 例)Basic認証の場合 – Authorization リクエストヘッダーが必要 – 値は次のとおり: • 先頭に "Basic " • 続けて 「<ユーザー名>:<パスワード>」 形式の文字列の Base64 • 例)Authorization: Basic aG9nZTpmdWdh – DHC REST/HTTP API Client には ユーザー名とパスワードを入力して 基本認証のヘッダーを生成する機能がある » "set authorization" 機能 <ユーザー名>:<パスワード> の形式の 文字列を Base64 エンコードしたもの
  • 74.
    コンテンツ一覧を REST で取得するには •Views の "REST export" ディスプレイ – フォーマットに "Serializer" を指定 – フィールドの環境設定のエイリアス • JSON の key 値をカスタマイズできる(必要な場合)
  • 75.
    AngularJS と組み合わせたサンプル Drupal 8Restful servivce endpoint endpoint endpoint endpoint JSON GET PUT POST DELETE
  • 76.
    まとめ • Drupal のデータ管理 –構造データをエンティティとして一般化 • コンテンツに限らない種々の構造化データを統一された API で扱える • Views = クエリビルダ – コーディング不要で高度なデータクエリを UI で対話的に作成できる – サイト内/外の様々な出力先を指定できる • ページ、ブロック、フィード・・・ • ブロックシステムとテーマ – テーマのリージョンとブロックシステムで基本的なレイアウト機構を提供 – テーマ関数を利用するとコアの出力を部分的に再定義できる • Drupal 8 – REST in core と Headless Drupal
  • 77.

Editor's Notes

  • #7 Dries Buytaert の読みは「ドリース ベイテヒト」「ドリース バイテルト」 http://www.domisodo.com/drupal/trivia/pronunciation-dries-buytaert http://wisdommingle.com/what-is-the-pronunciation-of-dries-buytaert-who-is-the-founder-of-drupal-in-japanese/#footnote_0_1398
  • #28 Twig/D8 について http://twig.sensiolabs.org/ https://drupal.org/node/2008464
  • #38 https://drupal.org/node/171194