drupal-frontend について
drupal-frontendは、Drupal 8から11以降を扱うフロントエンド開発者向けのスキルです。テーマ、Twigテンプレート、前処理、アセット、レスポンシブデザインの指針とひな形を提供します。
主な機能
- 01Drupalテーマの開発とカスタマイズ
- 02Drupal Twigテンプレートの作成
- 03レンダリング用変数の前処理
- 04テンプレート候補とフックの定義
- 05CSS・JavaScriptライブラリーの管理
- 06モバイルファーストのレイアウト構築
活用シーン
- 01カスタムDrupalテーマの作成
- 02コンテンツタイプ別のテンプレート調整
- 03条件に応じたテーマアセットの追加
- 04テンプレートやアセット変更の問題調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ omedia/ drupal-skill --skill drupal-frontendインストール後、Claude Code で/drupal-frontendを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/theme-template/README.mdTHEMENAME.info.ymlTHEMENAME.libraries.ymlTHEMENAME.themeassets/theme-template/css/base/reset.cssassets/theme-template/js/custom.jsassets/theme-template/templates/page.html.twigreferences/theming.md詳細
Drupal フロントエンド開発
概要
Drupal 8、9、10、11 以降に対応した、エキスパートレベルの Drupal フロントエンド開発機能を利用できます。テーマ開発、Twig テンプレート、プリプロセス、レスポンシブデザイン、アセット管理について、包括的なガイダンスを提供します。
このスキルを使う場面
次の作業でこのスキルを呼び出します:
- テーマ開発:Drupal テーマの作成やカスタマイズ
- Twig テンプレート:.twig テンプレートファイルの作成や変更
- プリプロセス:テンプレート用プリプロセス関数の実装
- テンプレート候補:カスタムのテンプレート命名パターンの追加
- CSS/JS ライブラリ:テーマのアセットと依存関係の管理
- レスポンシブデザイン:ブレークポイントやモバイルファーストデザインの実装
- レンダリングシステム:Drupal のレンダリングパイプラインの理解
- テーマフック:テーマ関連フックや変更処理の実装
主な機能
1. テーマ開発
適切な構成で、標準に準拠した Drupal テーマを構築します。
クイックスタートのワークフロー:
assets/theme-template/のテーマテンプレートを出発点として使用しますTHEMENAMEをテーマのマシン名に置き換えますTHEMELABELを人が読みやすい名前に置き換えます- テンプレート、CSS、JS、ライブラリをカスタマイズします
- テーマを有効にし、外観 UI で設定します
テーマの構成要素:
.info.yml- テーマのメタデータと設定.libraries.yml- CSS/JS ライブラリの定義.theme- プリプロセス関数とテーマロジック.breakpoints.yml- レスポンシブデザインのブレークポイントtemplates/- Twig テンプレートファイルcss/- スタイルシートjs/- JavaScript ファイル
参考ドキュメント:
references/theming.md- 例を含むテーマ設定の完全ガイド
2. Twig テンプレートシステム
Twig の構文と Drupal 固有の拡張機能を習得します。
Twig の基本:
{{ variable }}- 変数を出力{% if/for/set %}- 制御構造とロジック{# comment #}- コメントとドキュメント{{ var|filter }}- 変数にフィルターを適用{% extends %}- テンプレートの継承{% block %}- オーバーライド可能なセクションを定義
Drupal 固有の Twig:
{{ 'Text'|t }}- 文字列を翻訳{{ attach_library('theme/library') }}- CSS/JS を読み込み{{ url('route.name') }}- URL を生成{{ path('route.name') }}- パスを生成{{ file_url('public://image.jpg') }}- ファイル URL{{ content|without('field') }}- フィールドを除外
一般的なテンプレート:
page.html.twig- ページレイアウトの構造node.html.twig- ノードの表示block.html.twig- ブロックのレンダリングfield.html.twig- フィールドの出力views-view.html.twig- Views の出力
3. プリプロセス関数
レンダリング前にテンプレート変数を変更します。
プリプロセスのパターン:
function THEMENAME_preprocess_HOOK(&$variables) {
// Add or modify variables
// Access entities, services, configuration
// Prepare data for templates
}
一般的なプリプロセスフック:
hook_preprocess_page()- ページレベルの変数hook_preprocess_node()- ノード固有のデータhook_preprocess_block()- ブロックの変更hook_preprocess_field()- フィールドの変更hook_preprocess_html()- HTML ドキュメント
ベストプラクティス:
- ロジックはプリプロセスに、マークアップはテンプレートに記述します
- 可能な場合は依存性注入を使用します
- キャッシュコンテキストやタグを適切に設定します
- 複雑なプリプロセス処理にはドキュメントを付けます
4. テンプレート候補
コンテキストに応じた特定のテンプレートを用意します。
候補のパターン:
page--front.html.twig # Homepage
page--node--{nid}.html.twig # Specific node
page--node--{type}.html.twig # Content type
node--{type}--{viewmode}.html.twig # Type + view mode
block--{plugin-id}.html.twig # Specific block
field--{entity}--{field}.html.twig # Specific field
候補の追加:
function THEMENAME_theme_suggestions_HOOK_alter(array &$suggestions, array $variables) {
// Add custom suggestions
$suggestions[] = 'custom__suggestion';
}
5. CSS と JavaScript の管理
テーマのアセットを効率よく整理して読み込みます。
ライブラリ定義:
# THEMENAME.libraries.yml
global-styling:
version: 1.0
css:
base:
css/base/reset.css: {}
theme:
css/theme/styles.css: {}
js:
js/custom.js: {}
dependencies:
- core/drupal
ライブラリの読み込み:
- グローバル:
.info.ymlで定義します - 条件付き:テンプレートで
attach_library()を使用します - プリプロセス:プリプロセス関数でアタッチします
ベストプラクティス:
- CSS をレイヤー(ベース、レイアウト、コンポーネント、テーマ)に分けます
- 本番環境では CSS の集約を使用します
- JavaScript の依存関係を最小限にします
- Drupal のアセットライブラリシステムを活用します
6. レスポンシブデザイン
モバイルファーストでアクセシブルなデザインを実装します。
ブレークポイントの定義:
# THEMENAME.breakpoints.yml
THEMENAME.mobile:
label: Mobile
mediaQuery: 'screen and (min-width: 0px)'
weight: 0
THEMENAME.tablet:
label: Tablet
mediaQuery: 'screen and (min-width: 768px)'
weight: 1
THEMENAME.desktop:
label: Desktop
mediaQuery: 'screen and (min-width: 1024px)'
weight: 2
モバイルファーストのアプローチ:
- まず最も小さい画面向けにデザインする
- より大きなビューポート向けに拡張する
- レスポンシブ画像を使用する
- さまざまなデバイスでテストする
- アクセシビリティ基準(WCAG)に従う
開発ワークフロー
新しいテーマの作成
-
テーマをスキャフォールドする:
cp -r assets/theme-template/ /path/to/drupal/themes/custom/mytheme/ cd /path/to/drupal/themes/custom/mytheme/ # Rename files mv THEMENAME.info.yml mytheme.info.yml mv THEMENAME.libraries.yml mytheme.libraries.yml mv THEMENAME.theme mytheme.theme -
テーマ設定を更新する:
mytheme.info.ymlを編集する - 名前、リージョン、ベーステーマを設定しますmytheme.libraries.ymlを編集する - CSS/JS ライブラリを定義しますTHEMENAMEをマシン名に置き換えますTHEMELABELをラベルに置き換えます
-
テーマを有効化する:
ddev drush cr # Enable via UI at /admin/appearance or: ddev drush config:set system.theme default mytheme -y -
Twig デバッグを有効化する:
sites/default/default.services.ymlをsites/default/services.ymlにコピーしますtwig.config.debug: trueを設定しますtwig.config.auto_reload: trueを設定しますtwig.config.cache: falseを設定しますddev drush crを実行します
-
開発と反復:
templates/内のテンプレートを変更しますcss/内の CSS を更新します- 頻繁にキャッシュをクリアします:
ddev drush cr - ブラウザコンソールでエラーを確認します
標準的な開発ワークフロー
- 開発設定を有効化する(Twig デバッグ、CSS/JS 集約の無効化)
- Twig デバッグからの候補を基にテンプレートを作成・変更する
- 複雑なデータ操作のために
.themeファイルで前処理を実装する - ライブラリシステムを通じて CSS/JS を追加する
- さまざまなブラウザとデバイスでテストする
- 変更後にキャッシュをクリアする:
ddev drush cr
テンプレート名の見つけ方
Twig デバッグを有効にした状態で、HTML ソースを検査します:
x は現在有効なテンプレートを示します。それ以外は作成できる候補です。
一般的なパターン
前処理でのカスタム変数の追加
function mytheme_preprocess_page(&$variables) {
// Add site slogan
$variables['site_slogan'] = \Drupal::config('system.site')->get('slogan');
// Add current user
$variables['is_logged_in'] = \Drupal::currentUser()->isAuthenticated();
// Add custom class
$variables['attributes']['class'][] = 'custom-page-class';
}
テンプレートの継承
{# templates/page--article.html.twig #}
{% extends "page.html.twig" %}
{% block content %}
<div class="article-wrapper">
{{ parent() }}
</div>
{% endblock %}
条件付きライブラリの読み込み
function mytheme_preprocess_node(&$variables) {
if ($variables['node']->bundle() == 'article') {
$variables['#attached']['library'][] = 'mytheme/article-styles';
}
}
Twig でのフィールド値へのアクセス
{# Get field value #}
{{ node.field_custom.value }}
{# Check if field has value #}
{% if node.field_image|render %}
{{ content.field_image }}
{% endif %}
{# Loop through multi-value field #}
{% for item in node.field_tags %}
{{ item.entity.label }}
{% endfor %}
ベストプラクティス
テーマ開発
- ベーステーマ: 適切なベースを選択する(Olivero、Claro、またはなし)
- 構造: CSS を論理的に整理する(ベース、レイアウト、コンポーネント、テーマ)
- 命名: BEM または同様の CSS 手法を使用する
- コメント: 複雑な Twig ロジックと前処理を文書化する
- パフォーマンス: 画像を最適化し、CSS/JS を最小化し、可能な場合は遅延読み込みする
Twig テンプレート
- ロジック: 複雑なロジックはテンプレートではなく前処理に保つ
- フィルター: 適切なフィルターを使用する(|t、|clean_class、|safe_join)
- 空白: {% spaceless %} を使用して出力を制御する
- デバッグ: Twig デバッグは開発中のみ有効にする
- 候補: 必要な場合にのみ特定のテンプレートを使用する
前処理
- サービス: テーマのサービスサブスクライバーで依存性注入を使用する
- キャッシュ: 適切なキャッシュコンテキストとタグを追加する
- パフォーマンス: 頻繁に呼び出されるプリプロセッサで重い処理を避ける
- 整理: 関連する前処理を論理的にグループ化する
CSS と JavaScript
- ライブラリ: 関連するアセットを論理的なライブラリにグループ化する
- 依存関係: すべてのライブラリ依存関係を宣言する
- 読み込み: 必要な場合にのみグローバルに読み込む
- 集約: パフォーマンスのために本番環境で有効にする
アクセシビリティ
- セマンティック HTML: 適切な要素を使用する(header、nav、main など)
- ARIA: 必要に応じてラベルとロールを追加する
- キーボード: キーボードナビゲーションが機能することを確認する
- コントラスト: WCAG の色コントラスト要件を満たす
- 代替テキスト: すべての画像に提供する
レスポンシブデザイン
- モバイルファースト: 小さい画面向けにデザインし、大きい画面向けに拡張する
- ブレークポイント: 論理的なブレークポイントを定義する
- 画像: レスポンシブ画像スタイルを使用する
- テスト: さまざまなデバイスと画面サイズでテストする
- パフォーマンス: モバイルネットワーク向けに最適化する
トラブルシューティング
テンプレートの変更が表示されない
- キャッシュをクリアする:
ddev drush cr - ファイルの場所と命名を確認する
- 有効なテンプレートについて Twig デバッグを確認する
- ライブラリが適切に定義されていることを確認する
CSS/JS が読み込まれない
.libraries.ymlのライブラリ定義を確認します- ファイルパスが正しいことを確認します
- ライブラリが(グローバルまたは条件付きで)アタッチされていることを確認します
- キャッシュをクリアし、ブラウザーのコンソールを確認します
テンプレートで変数を使用できない
- プリプロセス関数の命名を確認します
- 変数が正しく設定されていることを確認します
- Twig のデバッグ機能を使用します:
{{ dump() }} - プリプロセスの変更後にキャッシュをクリアします
Twig のデバッグが機能しない
sites/default/services.ymlが存在することを確認しますtwig.config.debug: trueが設定されていることを確認します- キャッシュをクリアします:
ddev drush cr - ファイルのアクセス権を確認します
リソース
リファレンスドキュメント
references/theming.md- 包括的なテーマ設定ガイド- Twig の構文とフィルター
- テンプレート候補
- プリプロセスのパターン
- ライブラリ管理
- レスポンシブデザイン
- ベストプラクティス
アセットテンプレート
assets/theme-template/- 完全なテーマのひな形- リージョンと設定を含む
.info.yml - CSS/JS の例を含む
.libraries.yml - プリプロセスの例を含む
.theme - ページテンプレート
- CSS と JS のスターターファイル
- リージョンと設定を含む
リファレンスの検索
# Find specific Twig filter
grep -r "clean_class" references/
# Find preprocessing examples
grep -r "preprocess_node" references/
# Find library patterns
grep -r "libraries.yml" references/
バージョン互換性
Drupal 8、9、10、11 の比較
- Twig の構文:すべてのバージョンで一貫しています
- ベーステーマ:一部のレガシーテーマは 10 以降で削除されています
- ライブラリ:すべてのバージョンで同じ構造です
- jQuery:Drupal 9 以降では jQuery はデフォルトで読み込まれません
- Claro:9 以降の標準管理テーマです
- Olivero:10 以降の標準フロントエンドテーマです
移行に関する注意事項
- アップグレード時は、非推奨のベーステーマを確認します
- jQuery の依存関係を確認します
- 現行の Twig バージョンでテストします
- 削除されたコアテンプレートがないか確認します
関連項目
- drupal-backend - モジュール開発、フック、API
- drupal-tooling - DDEV と Drush の開発ツール
- Drupal テーマ設定ガイド - 公式ドキュメント
- Twig ドキュメント - Twig 構文のリファレンス