狠狠撸

狠狠撸Share a Scribd company logo
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/favicon1.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/

More Related Content

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

  • 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 機能 ? まとめ
  • 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. モジュール = building block ? Drupal の機能を拡張するソフトウェア(プログラム) ? 次の3つに分類される: – Core モジュール ? Drupal 本体に含まれる標準機能モジュール ? 追加コンポーネントのダウンロードやコピー不要で最初から使用できる – 有効にするか無効にするかは設定で指定できる – Contributed モジュール ? drupa.org のダウンロード セクションから入手できる拡張機能モジュール ? Views、Panels、Rules、Feeds などなど、膨大な資産がある – カスタム モジュール ? 独自に開発する拡張機能モジュール ? 上記2つと同様にインストール、有効化して使用できる
  • 11. エンティティとタイプ ? エンティティとは? – Drupal のデータベースに保管される構造化データを一般化したもの ? コア標準の管理 UI でフィールド設計を定義できる ? エンティティ タイプ – エンティティはその用途?目的に応じたタイプに分かれる – Drupal コアの標準エンティティ タイプ ? ノード :独立したページとして表示できるコンテンツ ? コメント :ノードに付随して存在するコンテンツ ? ファイル :サーバーにアップロードされるファイルの情報 ? タクソノミー (分類用語) – ボキャブラリ :特定の目的に基づく用語の集合に関する情報 – ターム :ボキャブラリに属する個々の用語 ? ユーザー :サイトのユーザーアカウント情報
  • 12. バンドル(bundle) ? バンドル – エンティティ タイプにフィールドを関連付けた実装のこと – 標準の UI でフィールド設計の定義や編集ができる ページ Body フィールド ??? ノード エンティティ タイプ バンドル
  • 13. フィールド ? フィールドとは – 再利用可能なデータ断片 – データの用途?目的に応じたタイプ(型)を持つ – ウィジェットを持つ ? 値の編集機能を提供する ? 値の表示機能を提供する
  • 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 ? Drupal 7 ベースの 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
  • 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; // 整列条件
  • 24. その他の設定オプション ? ディスプレイ – Views の出力先を指定する(ブロック、ページ、フィード、???) ? フォーマット – 出力の形式を指定する ? HTML List (ul)、グリッド、テーブル、フォーマットされていないリスト (div) ? フィールドの詳細オプション – 表示から除外 – 结果の書き換え – CSS クラスの指定 ? 行(出力される各レコード)に class 属性を付加する ? Views の出力全体のコンテナに class 属性を付加する まだまだ他にも たくさん???
  • 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/favicon1.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
  • 42. コアのデフォルト リージョン (3) ? 主要リージョンの解説 – page_top、page_bottom ? サイトが正常に動作するために必要な必須リージョン ? ブロック設定の UI には表示されない非表示リージョン(後述) – highlighted ? 旧バージョンの Site Mission に対応する – Site Mission とはサイトの目的や短い説明文を出力するもの – 従来の設計では、フロントページに限定される等の制約が多かったため、 Drupal 7 から専用のリージョンに出力する設計に変更された。 – help ? エラーやステータスメッセージ用のリージョン – "システム ヘルプ" ブロックとして出力され、その出力先として用意されている。 – content ? "メインページ コンテンツ" ブロックを出力するためのリージョン – このブロックは特別扱いされ、ブロックの管理 UI で無効にしても必ず表示される
  • 43. (参考)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
  • 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、テンプレートファイル
  • 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) キャッシュ(テーマレジストリ)をクリアする
  • 53. 拡張/contributed モジュール ? コア API に基づいて作られるアドオン機能 ? コアにない機能を追加する ? コアの動作を再定義する ? さまざまな機能を組み込める 膨大な数の資産があります
  • 54. 例)Panels モジュール ? ページ内のレイアウトを自在に定義 ? コンテキストに応じてレイアウトを変更
  • 56. 例)Rules モジュール ? イベント、条件、アクションを定義 ? サイト上で発生するイベントに基づき さまざまなサイト挙動を実現する
  • 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 要素を 紹介文(本文)にマップ
  • 62. 最新の Drupal リリース ? 2015年11月にリリースされた Drupal の最新版 – https://www.drupal.org/8 ? 特徴 – インプレース編集 – 構成情報をコンテンツデータベースと分離 – 多言語機能の強化 – Views モジュールがコアに – Symfony2 ベースとなりオブジェクト指向型の API に – コアの REST サポート ? Restful service in core
  • 63. 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
  • 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 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 ベーシック認証プロバイダを提供する
  • 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 の構成管理ができる
  • 70. HTTP メソッド?データ形式?認証 ? HTTP メソッド – GET:リソースの取得 – POST:リソースの新規追加 – DELETE:リソースの削除 – PATCH:リソースの更新 ? データ形式 – HAL-JSON(Hyper Application Language:JSON拡張) – JSON – XML ? 認証 – Basic 認証、Cookie 認証
  • 71. 各メソッドのリクエスト仕様 ? 参照 – 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 送信
  • 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 8 Restful servivce endpoint endpoint endpoint endpoint JSON GET PUT POST DELETE
  • 76. まとめ ? Drupal のデータ管理 – 構造データをエンティティとして一般化 ? コンテンツに限らない種々の構造化データを統一された API で扱える ? Views = クエリビルダ – コーディング不要で高度なデータクエリを UI で対話的に作成できる – サイト内/外の様々な出力先を指定できる ? ページ、ブロック、フィード??? ? ブロックシステムとテーマ – テーマのリージョンとブロックシステムで基本的なレイアウト機構を提供 – テーマ関数を利用するとコアの出力を部分的に再定義できる ? Drupal 8 – REST in core と Headless Drupal

Editor's Notes

  1. 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
  2. Twig/D8 について http://twig.sensiolabs.org/ https://drupal.org/node/2008464
  3. https://drupal.org/node/171194