SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Drupal 9で始めるWebサイト開発入門

DrupalでWebサイトの見た目を整えるテーマ開発を行おう

Drupal 9で始めるWebサイト開発入門 第5回

自分でカスタムテーマを作る

 コントリビュートテーマを利用することで、コードを書くことなくWebサイトのデザインを変更することができました。しかし、実際にウェブサイトを構築する際には、デザインが細かく指定されていることが多く、ありもののテーマでは対応できないことが多くあります。そのような場合に1から自分で作成する「カスタムテーマ」を作成します。「カスタムテーマ」を作るステップは以下の通りです。

  1. テーマ.info.ymlの作成
  2. CSS、JSの追加
  3. テンプレートファイルを作成・編集

 テーマをすべて独自に構築するため、作業負荷は高くなりますが、Drupalがテーマをどのように扱うかを学習するために、この連載で紹介していきます。カスタムテーマの後には、コントリビュートテーマを上書きする形で、独自のテーマを開発する「サブテーマ」についても紹介します。こちらの方が工数は低くなります。

ファイル構成

 Drupalがカスタムテーマを適切なテーマとして認識するためには、テーマ.info.ymlを作成し、適切なディレクトリに配置する必要があります。まずはDrupalのルートディレクトリからthemes/custom(新規に作成)/marucha_custom(新規に作成)へ移動し、中にmarucha_custom.info.ymlファイルを作成します。marucha_custom.info.ymlの中身は以下です。これらがDrupalがテーマを認識するための必須項目です。

name: Marucha Custom
type: theme
description: 'まる茶のためのカスタムテーマ'
core_version_requirement: ^8 || ^9
base theme: classy

 ymlファイルなので、インデントはタブでなくスペース2つで行う必要があるため注意です。

 ymlファイルの保存ができたら、テーマ管理画面を開きます。アンインストール済みテーマに「Marucha Custom」が表示されています。「インストールしてデフォルトに設定」をクリックすることで、1クリックで利用テーマとして設定し、トップページへ戻ります。

 以前設定したコントリビュートテーマのデザインではなく、CSSが適用されていないページが表示されていれば成功です。エラーが出ている場合には、ymlファイルの内容に相違がないか確認してください。

CSS・JSを追加する

 次に、サイトにCSSとJavaScriptを追加します。DrupalではテンプレートにCSSやJSのURLを埋め込むのではなく、アセットライブラリと呼ばれる内部のシステムに登録する形で行われます。これにより、システム内部でDrupalがCSSとJSの圧縮やキャッシュ、ロードする順番を入れ替える処理を行うことができます。

CSS・JSファイルを配置する

 CSSとJSのファイルを作成し、テーマの中に保存します。marucha_customテーマ内にcssフォルダを作成し、styles.cssファイルを設置します。次に同テーマ内にjsフォルダを作成し、script.jsファイルを設置します。各ファイルの内容は以下の通りです。

styles.css
article {
  border: 1px solid #333;
  background-color: #ccc;
}
script.js
console.log('JSが読み込まれました。');

 現状のmarucha_customテーマ内のフォルダ構成は以下となっています。

└── marucha_custom
      ├── css
      │ └── styles.css
      ├── js
      │ └── script.js
      └── marucha_custom.info.yml

ライブラリを定義する

 次に、設置したCSSとJSをテーマに登録し、テーマがインストールされた際にDrupalが読み込めるようにします。marucha_customフォルダ直下にmarucha_custom.libraries.ymlファイルを作成します。ファイルの内容は以下の通りです。

marucha_custom.libraries.yml
global-styling:
  version: 1.x
  css:
    theme:
      css/styles.css: {}
global-scripts:
  version: 1.x
  js:
    js/script.js: {}

 最後に、定義したライブラリをテーマに追加します。

marucha_custom.info.yml
name: 'Marucha Custom'
type: theme
description: 'marucha'
core_version_requirement: ^8 || ^9
base theme: false
libraries:
  - marucha_custom/global-styling
  - marucha_custom/global-scripts

 これで、Marucha CustomテーマへのCSS・JS追加が完了です。管理画面の環境設定>開発>パフォーマンスから「すべてのキャッシュをクリア」ボタンをクリックしてからトップページへ戻ります。

 以下のようにarticleタグにCSSが適用されます。また、ブラウザの開発者ツールのコンソールに「JSが読み込まれました。」という文字列が表示されていれば成功です。

テンプレートファイルを作成する

 次に、テンプレート機能を紹介します。Drupalのテンプレートは命名規則通りのファイル名を付与し、既存のコンポーネントを上書きする形で作成します。下図は簡略化したDrupalのテンプレート構成です。

 html.html.twigファイルの中に、page.html.twigの内容を表示します。その下にはregion.html.twig、block.html.twigファイルがあります。このように、入れ子状にテンプレートファイルが存在するのが1つ目のポイントです。

 また、リージョンテンプレートの1つがregion--content.html.twigになっています。このように、汎用的なテンプレート(この場合、region.html.twig)はより具体的なテンプレート(コンテント・リージョンのテンプレートならregion--content.html.twig)で上書きできることもポイントです。

Twigのデバッグを有効化

 テンプレート開発を行う前に、Twigのデバッグを有効化することをお勧めします。ルートディレクトリからsites/default下にdefault.services.ymlファイルがあります。これをコピーし、名前をservices.ymlに変更します。このファイル内のtwig.config内debugプロパティの値をfalseからtrueに変更します。

 キャッシュをクリアしてからトップページへ戻ります。ブラウザの開発者ツールなどからソースを表示すると、コメントとして各コンポーネントについて、現在使われているテンプレートと上書き可能なテンプレートの命名規則が表示されるようになります。

テンプレートを上書きする

 デバッグ機能により上書きするテンプレートの命名規則が判明したので、実際にテンプレートファイルを作成します。今回はコンテンツの表示部分を担うnode.html.twigを上書きします。marucha_customにtemplatesフォルダを作成します。フォルダの中身はDrupalのルートディレクトリからcore/modules/node/templatesにあるnode.html.twigをそのままコピーし、node--3.html.twigと名前を変更します。次にarticleタグにクラスを追加するために、75行目の<article{{ attributes }}>を<article{{ attributes.addClass('my-class') }}>に変更します。

 キャッシュをクリアしてからトップページのコンテンツ部分のソースを見ると、articleタグにmy-classというクラスが追加されています。

 自分でゼロから作るカスタムテーマの紹介は以上で終了です。Drupalがテーマを認識する条件と、CSS・JSをライブラリとして定義して追加する方法、テンプレートの上書き方法を紹介しました。実際のテーマ開発では、このようにまっさらな状態からスタートするよりも、ベースとなるコントリビュートテーマをカスタマイズするサブテーマを利用することが多いのですが、まずはテーマシステムの基本を理解することが重要です。

次のページ
サブテーマを使う

この記事は参考になりましたか?

Drupal 9で始めるWebサイト開発入門連載記事一覧

もっと読む

この記事の著者

岸 俊兵(キシ シュンペイ)

 カナダ・イエローナイフでウェブ開発者として勤務していた際、エンタープライズ向けオープンソースCMSのDrupalによる開発に従事。帰国後、Drupalのヘビーユーザーであるジョンソン・エンド・ジョンソン株式会社の社内SE等を経て、2019年1月よりアクイアジャパンのソリューションエンジニアとして勤...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/13347 2020/12/24 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー