SlideShare una empresa de Scribd logo
1 de 77
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/

Más contenido relacionado

La actualidad más candente

世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計増田 亨
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかKoichiro Matsuoka
 
Javaバイトコード入門
Javaバイトコード入門Javaバイトコード入門
Javaバイトコード入門Kota Mizushima
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門増田 亨
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」Masahito Zembutsu
 
DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念Masahito Zembutsu
 
PHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニックPHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニックYoshio Hanawa
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルMasahito Zembutsu
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 Hiroshi Ito
 
Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Masahito Zembutsu
 
さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)Takanori Sejima
 
新人研修資料 向き合うエンジニア
新人研修資料 向き合うエンジニア新人研修資料 向き合うエンジニア
新人研修資料 向き合うエンジニアakira6592
 
CloudFoundryをつかってみよう
CloudFoundryをつかってみようCloudFoundryをつかってみよう
CloudFoundryをつかってみようKazuto Kusama
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?naoki koyama
 
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Yasutaka Kawamoto
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 

La actualidad más candente (20)

世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
Javaバイトコード入門
Javaバイトコード入門Javaバイトコード入門
Javaバイトコード入門
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
ServiceとRepository
ServiceとRepositoryServiceとRepository
ServiceとRepository
 
Nginx lua
Nginx luaNginx lua
Nginx lua
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念
 
PHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニックPHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニック
 
オンプレML基盤on Kubernetes パネルディスカッション
オンプレML基盤on Kubernetes パネルディスカッションオンプレML基盤on Kubernetes パネルディスカッション
オンプレML基盤on Kubernetes パネルディスカッション
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
 
Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解Docker道場オンライン#1 Docker基礎概念と用語の理解
Docker道場オンライン#1 Docker基礎概念と用語の理解
 
さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)
 
新人研修資料 向き合うエンジニア
新人研修資料 向き合うエンジニア新人研修資料 向き合うエンジニア
新人研修資料 向き合うエンジニア
 
CloudFoundryをつかってみよう
CloudFoundryをつかってみようCloudFoundryをつかってみよう
CloudFoundryをつかってみよう
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
 
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 

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

CMSMix Sapporo vol.3 (Drupal の回)
CMSMix Sapporo vol.3 (Drupal の回)CMSMix Sapporo vol.3 (Drupal の回)
CMSMix Sapporo vol.3 (Drupal の回)Kenji Shirane
 
eZ Publish 2012年8月勉強会 - テンプレートオーバーライド
eZ Publish 2012年8月勉強会 - テンプレートオーバーライドeZ Publish 2012年8月勉強会 - テンプレートオーバーライド
eZ Publish 2012年8月勉強会 - テンプレートオーバーライドericsagnes
 
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」ericsagnes
 
Drupalテーマとthemingの基礎
Drupalテーマとthemingの基礎Drupalテーマとthemingの基礎
Drupalテーマとthemingの基礎Kenji Shirane
 
2005 07 30_xwj_customizinig
2005 07 30_xwj_customizinig2005 07 30_xwj_customizinig
2005 07 30_xwj_customizinigTom Hayakawa
 
D8でコンテンツをレイアウトする手法について
D8でコンテンツをレイアウトする手法についてD8でコンテンツをレイアウトする手法について
D8でコンテンツをレイアウトする手法についてKenji Shirane
 
第2回 Magento cafe plus 〜新・Magentoカスタマイズ入門
第2回 Magento cafe plus 〜新・Magentoカスタマイズ入門第2回 Magento cafe plus 〜新・Magentoカスタマイズ入門
第2回 Magento cafe plus 〜新・Magentoカスタマイズ入門Hirokazu Nishi
 
20141101 handson
20141101 handson20141101 handson
20141101 handsonSix Apart
 
PHP基礎勉強会
PHP基礎勉強会PHP基礎勉強会
PHP基礎勉強会Yuji Otani
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶShumpei Shiraishi
 
【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜Fumiyasu Sumiya
 
JAWS-UG Santo 2014-07-05 Drupal on PaaS Cloud
JAWS-UG Santo 2014-07-05 Drupal on PaaS CloudJAWS-UG Santo 2014-07-05 Drupal on PaaS Cloud
JAWS-UG Santo 2014-07-05 Drupal on PaaS CloudANNAI_LLC
 
Contao Open Source CMS / 3.3と、その向こう
Contao Open Source CMS / 3.3と、その向こうContao Open Source CMS / 3.3と、その向こう
Contao Open Source CMS / 3.3と、その向こうTakahiro Kambe
 
20100324 勉強会資料(ドメイン駆動)
20100324 勉強会資料(ドメイン駆動)20100324 勉強会資料(ドメイン駆動)
20100324 勉強会資料(ドメイン駆動)Masayuki Kanou
 
20141206 handson
20141206 handson20141206 handson
20141206 handsonSix Apart
 
20140924 mt cloud_handson_seminar
20140924 mt cloud_handson_seminar20140924 mt cloud_handson_seminar
20140924 mt cloud_handson_seminarSix Apart
 
Mizuno buddypress-plugin
Mizuno buddypress-pluginMizuno buddypress-plugin
Mizuno buddypress-pluginIkuko Kanada
 
Mizuno buddypress-plugin
Mizuno buddypress-pluginMizuno buddypress-plugin
Mizuno buddypress-pluginFumito Mizuno
 
愛と涙のWordPress無理やりカスタマイズ事例集
愛と涙のWordPress無理やりカスタマイズ事例集愛と涙のWordPress無理やりカスタマイズ事例集
愛と涙のWordPress無理やりカスタマイズ事例集Hidekazu Ishikawa
 

Similar a Drupal のコア要素を知る ~構築を支える道具立て~ (20)

CMSMix Sapporo vol.3 (Drupal の回)
CMSMix Sapporo vol.3 (Drupal の回)CMSMix Sapporo vol.3 (Drupal の回)
CMSMix Sapporo vol.3 (Drupal の回)
 
eZ Publish 2012年8月勉強会 - テンプレートオーバーライド
eZ Publish 2012年8月勉強会 - テンプレートオーバーライドeZ Publish 2012年8月勉強会 - テンプレートオーバーライド
eZ Publish 2012年8月勉強会 - テンプレートオーバーライド
 
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
 
Drupalテーマとthemingの基礎
Drupalテーマとthemingの基礎Drupalテーマとthemingの基礎
Drupalテーマとthemingの基礎
 
2005 07 30_xwj_customizinig
2005 07 30_xwj_customizinig2005 07 30_xwj_customizinig
2005 07 30_xwj_customizinig
 
D8でコンテンツをレイアウトする手法について
D8でコンテンツをレイアウトする手法についてD8でコンテンツをレイアウトする手法について
D8でコンテンツをレイアウトする手法について
 
第2回 Magento cafe plus 〜新・Magentoカスタマイズ入門
第2回 Magento cafe plus 〜新・Magentoカスタマイズ入門第2回 Magento cafe plus 〜新・Magentoカスタマイズ入門
第2回 Magento cafe plus 〜新・Magentoカスタマイズ入門
 
20141101 handson
20141101 handson20141101 handson
20141101 handson
 
PHP基礎勉強会
PHP基礎勉強会PHP基礎勉強会
PHP基礎勉強会
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
 
【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
 
JAWS-UG Santo 2014-07-05 Drupal on PaaS Cloud
JAWS-UG Santo 2014-07-05 Drupal on PaaS CloudJAWS-UG Santo 2014-07-05 Drupal on PaaS Cloud
JAWS-UG Santo 2014-07-05 Drupal on PaaS Cloud
 
Contao Open Source CMS / 3.3と、その向こう
Contao Open Source CMS / 3.3と、その向こうContao Open Source CMS / 3.3と、その向こう
Contao Open Source CMS / 3.3と、その向こう
 
20100324 勉強会資料(ドメイン駆動)
20100324 勉強会資料(ドメイン駆動)20100324 勉強会資料(ドメイン駆動)
20100324 勉強会資料(ドメイン駆動)
 
20141206 handson
20141206 handson20141206 handson
20141206 handson
 
20140924 mt cloud_handson_seminar
20140924 mt cloud_handson_seminar20140924 mt cloud_handson_seminar
20140924 mt cloud_handson_seminar
 
Djangoのススメ
DjangoのススメDjangoのススメ
Djangoのススメ
 
Mizuno buddypress-plugin
Mizuno buddypress-pluginMizuno buddypress-plugin
Mizuno buddypress-plugin
 
Mizuno buddypress-plugin
Mizuno buddypress-pluginMizuno buddypress-plugin
Mizuno buddypress-plugin
 
愛と涙のWordPress無理やりカスタマイズ事例集
愛と涙のWordPress無理やりカスタマイズ事例集愛と涙のWordPress無理やりカスタマイズ事例集
愛と涙のWordPress無理やりカスタマイズ事例集
 

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/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
  • 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

Notas del editor

  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