a-blog cms を使ってみたいけど、なにから始めたらいいの?

a-blog cmsを使ってみたい!でもなにから始めたらいいの?効率的な始め方と基礎的な機能

このコンテンツは、a-blog cms(エーブログ シーエムエス)を使ってみたいけどまずは何をしたらいいかわからない人に向けて、効率の良い学び方や基礎的な機能についてまとめた記事です。くわしい実装方法や使い方などは紹介しているリンク先の記事をご覧ください。

目次

a-blog cms を利用できる環境を用意する

まずは a-blog cms を利用できる環境を用意しましょう。a-blog cms を使うためには、基本的にはご自身のローカル環境や本番環境のサーバーに、a-blog cms をインストールする必要があります。でも、もっと手軽に a-blog cms を利用できる方法も現在2つあります。

  • デモサイト(サンプルサイト)にログインして操作してみる
  • ablogcms.io でお試し利用する(30日間無料でテスト環境を利用できます)

順番に説明していきます。デモサイト(サンプルサイト)では、ブラウザから行える作業(のみ)が体験できます。登録データは、他の方もログインできるため共用となり、定期的にリセットされますのでご注意ください。

デモサイト(サンプルサイト)のログイン情報


サンプルサイトURL https://demo.a-blogcms.jp/
ログインURL https://demo.a-blogcms.jp/login/
ID demo
Password pass

ablogcms.io でお試し利用する

ablogcms.io は、ご自身専用のテスト環境を30日間無料で使えるというサービスです。ブラウザから行える作業以外にもSFTP情報が支給されるため、自由にカスタマイズ可能です。必要なのはメールアドレスだけ。ご自身の専用環境となるため、登録データは共用ではありません。
但しお試し用の環境となりますので、サーバー内のファイルや登録データは登録から30日で削除されてしまいますのでご注意ください。( ablogcms.io で構築したものを、本番環境用にエクスポートすることもできます)


本番環境で運用する場合は、サーバーに a-blog cms をインストールする必要があります。詳しくは以下をご覧ください。「簡単セットアップ」を利用したインストール方法が簡単でおすすめです。



CMSにログインして記事を書く

a-blog cms を自由に触れる環境ができたら、ログインしてみましょう。a-blog cms をインストールしたサイトのURLの末尾に「/login/」とつけてブラウザからアクセスするとログインページが表示されます。

ログインできたら、コンテンツ(記事)を新規で作成するか、既存の記事を編集してみましょう。a-blog cms では記事のことを「エントリー」と呼んでいます。固定ページや投稿ページといった区別はありません。詳しいエントリーの書き方は以下の記事をご覧ください。


テーマとテンプレート

こちらは a-blog cms の公式テーマの詳細や、テーマの設定方法などが学べる記事です。どんなテーマがあるのか目を通しておくといいでしょう。


テーマとテンプレートでは、どこに書いたら意図したものが表示されるのか、実際に確認しながら進めることをおすすめします。

まずは「テーマとテンプレートの構成」の記事で構成をなんとなく把握してください。実践したい場合は「表示テンプレートの確認」の見出しを参考に、テンプレートに実際に何か書いてみることがおすすめです。


公式テーマのHTMLを開いてみると、英語でHTMLのコメントタグのようなものや「@」からはじまるコードがたくさん書かれていますが、この記述が a-blog cms ではプログラムが動作する箇所になります。各記述方法を知りたい場合は以下の記事をご覧ください。


モジュール

a-blog cms に登録したデータを表示する機能がモジュールです。

以下の記事を見ると、モジュールにはたくさんの種類があることがわかります。モジュールの機能でできることが大体把握できると思います。


ビルトインモジュールを使っているうちに、ビルトインモジュールで登録データの条件設定のしかたについて疑問を持つ方が多いですが、その場合にはモジュールIDを作成してください。モジュールIDを作成することで、複数の条件設定が可能になります。

実際にサイトを制作するときには、基本的には毎度モジュールIDを作成して使うことになります。


カスタムフィールド

カスタムフィールドとは、エントリーや、カテゴリー、ブログ、ユーザーに対して独自のデータを追加することができる機能です。まずはこちらの記事をご覧いただくと概要が把握できると思います。


学習の流れとしては、まずは「カスタムフィールドの基本」の記事でだいたいどんなソースコードで構成されているかを把握して、「カスタムフィールドメーカー」でソースコードを作り、次は記述場所を把握するために「ブログのカスタムフィールド」の記事を参考にするのがいいと思います。



前述した通り、a-blog cms にはカスタムフィールドの種類が5つありますが、ブログのカスタムフィールドを作成する方法をここでは紹介しておきます。以下の記事をご覧ください。他の4つのカスタムフィールドを作る際はテンプレートを設置するディレクトリが変わりますので、それぞれの記事をご覧ください。


フォーム

サイトにフォームを作る際は以下の記事を参考にしてください。


たくさんソースコードがあるので、全て覚えるのは大変だと思います。公式テーマでは Blogテーマ以外はお問い合わせフォームの仕組みを持っていますので、ソースコードをコピー&ペーストして要素を追加したり削除して、少しずつデザインに近づけていくことをおすすめします。

なお、フォームはカスタムフィールドと同じソースコードです。カスタムフィールド メーカーを活用して制作してください。

他にも、フォーム機能と連動してGoogleスプレッドシートSlackReCaptcha などの外部機能と連携することができる「拡張アプリ」という機能があります。こちらは基礎的な内容ではありませんが、こういった機能も知っていると提案の幅が広げることができるため、紹介しておきます。


基礎的な機能については以上となります。これまでに紹介した機能で小さなコーポレートサイトなら作ることができますので、まずはこれらの機能を使ってみることがおすすめです。

そのほかの機能

マルチサイトは管理画面から「ブログ管理」のページで子ブログを作成することで作れますし、パスワード制限をかけたサイト(例:会員制サイト)もブログのステータスを「シークレット」にするだけで作れます。

その他にも、レスポンシブWebデザインではなく、PCとスマホのデザインを変更するときにはルールという機能が必要です。


運営者がウェブサイトのレイアウトを自由に変更したいという特殊な要望があれば、レイアウト機能という機能も用意しています。


他にもたくさん機能がある a-blog cms ですが、まずはこの記事に書いてある機能を把握することが第一歩です。たくさん記事を紹介しましたが、ご自身の理解度に合わせて必要な項目をチェックしてみてください。

初心者向けのハンズオンコンテンツ

他にも、静的サイトから動的サイトを作っていくハンズオンコンテンツもあります。初心者の方はこちらを学習すると理解が深まると思います。


わからない時は

記事を読んでもよくわからない。インストールでつまづいてしまい先に進めない…。そんなときは、お気軽にフォーラムで質問してください。

また、定期的に開催している勉強会に参加していただくと、何でもご質問いただけますし、a-blog cms についての理解も深まります。オンラインでも各地でも定期的に開催していますので、是非参加してみてください。(◯◯編 となっていても、初心者の方もいつでもご参加いただけます。)

お急ぎの場合や、より詳細なサポートをご希望の場合は、公式サポートをご検討ください。ベースキャンプ名古屋での対面サポートやオンラインビデオ通話サポートなどを行っております。


第1回:Twig 版チュートリアルをはじめよう


このチュートリアルで学ぶこと

静的HTMLサイトを部分的にCMS化する流れを、Twigテンプレートエンジンを使って体験します。

完成イメージは次のとおりです。

  • トップページ:「お知らせ一覧」が管理画面から更新できる状態になる

  • 詳細ページ:記事ごとにタイトル・本文・日付が動的に切り替わる

  • 一覧ページ:サムネイル画像・ページャーつきのお知らせ一覧が動く

このチュートリアルを終えると、「コーダーが書き上げた静的HTMLを、最小限の変更でCMS管理下に置く」という実務に直結するフローが身につきます。

なぜ Twig なのか

a-blog cms は Ver. 3.2 から、従来の標準テンプレートに加えて、Twig によるテンプレート記述をサポートしています。

標準テンプレートは a-blog cms 独自の記法で設計されており、できることは豊富です。一方で、ループや条件分岐といった制御構文が独自仕様になっているため、シンプルな出力は簡単にできても、少し複雑なカスタマイズをしようとすると途端に覚えることが増えるという側面があります。

Twig は PHP 製のテンプレートエンジンで、Craft CMS・Symfony・Drupal などでも広く採用されています。変数の出力・ループ・条件分岐の書き方が、PHP や JavaScript などの一般的なプログラミング言語に近いため、「Twig の書き方を覚える」というより「すでに知っている書き方がそのまま使える」という感覚で書けます。

たとえば条件分岐なら、標準テンプレートでは a-blog cms 固有の構文を覚える必要がありますが、Twig では次のように書けます。

{% if entry.tags %}
  {% for tag in entry.tags %}
    <span>#{{ tag.name }}</span>
  {% endfor %}
{% endif %}

「タグがあれば一覧を出す」という意図が、コードを読んだだけで伝わります。Twigに慣れたメンバーがいれば、a-blog cmsを知らなくてもテンプレートのロジックを読み解けます。これはチーム開発や長期保守において大きなメリットになります。

どちらの形式でも a-blog cms の機能はすべて利用できます。新規テーマをTwigで書く、あるいは既存テーマをTwig化してメンテナンス性を高める、どちらの用途にも使えます。


1. サンプルのウェブサイトを確認します

ここからは実際に、静的HTML を CMS化する手順を進めていきます。最初に、チュートリアルで使用するサンプルのウェブサイトを確認しましょう。

今回のチュートリアルでは、HTML ファイル 15枚 からなる静的なウェブサイトをサンプルとして使用します。デザインは Tailwind CSS を用いてスタイルを定義しており、メニューなどの動きには Alpine.js を利用しています。

sample_website

実際のサンプルサイトを確認

サイトの構成は以下のようになっています。

├── index.html            # トップページ(メインビジュアル・サービス紹介・お知らせ一覧)
├── news/
│   ├── index.html        # お知らせ一覧ページ
│   ├── page2.html        # お知らせ一覧 2ページ目
│   ├── 20250710.html     # お知らせ詳細(5記事分)
│   ├── ...
│   └── 20250807.html
├── service/
│   ├── index.html        # サービス一覧
│   ├── catering.html
│   ├── cooking-class.html
│   └── private-chef.html
├── contact/
│   ├── index.html        # お問い合わせフォーム
│   ├── confirm.html
│   └── thanks.html
├── css/
│   └── custom.css
└── images/

チュートリアルでは、このうち トップページの「お知らせ一覧」 と お知らせの詳細ページ(news フォルダ内の HTML) を題材に、静的 HTML を CMS 管理に置き換える流れを学びます。 まずは 「お知らせ部分を CMS化する」 ことで、手軽に「できた!」という達成感を体験しましょう。

相対パスとルート相対パスについて

HTML を CMS のテーマとして利用する際、画像や CSS へのパス指定方法によっては、表示が崩れることがあります。ここでは、相対パスとルート相対パスの違いを確認しておきましょう。

サンプルファイルには、相対パス版のファイルとルート相対パスの両方が同梱されています。

相対パス

現在のファイルを基準にして、そこから見た相対的な位置を指定する方法です。

<link rel="stylesheet" href="../css/custom.css">
<img src="./images/logo.png">
  • ../ は「1つ上の階層」を意味します。

  • ページの階層が深くなると、../../ のように複雑になりやすい。

  • パソコンでファイルを直接閲覧可能です。

ルート相対パス

サイトのルート(ドメイン直下 /)を基準にして指定する方法です。

<link rel="stylesheet" href="/css/custom.css">
<img src="/images/logo.png">
  • どのディレクトリにあるページからでも同じ指定が使える。

  • CMS 化したときに、テンプレートの場所に関わらず一貫して参照できる のでおすすめ。

  • ウェブサーバーのドキュメントルートにアップロードして閲覧が可能になります。

既存の静的 HTML サイトを CMS 化する場合、すでに用意されている HTML は 相対パス で書かれているケースが多いと思われます。
a-blog cms では相対パスでも動作しますので、どちらを使っても問題ありません。

ただし、これから新しくコーディングを行うサイトであれば、担当者には 「ルート相対パスでお願いします」 と伝えておくことをおすすめします。

ルート相対パスを使うことで、テンプレートの階層や呼び出し場所に依存せず、どのページからも一貫して正しく参照できる だけでなく、後からファイル構成を整理して階層を移動した場合でもパスが変わってしまう心配が少なくなり、のちのち実装が楽になります。


2. 動作環境を用意します

このチュートリアルでは、a-blog cms Ver. 3.2.x の環境で、Develop テーマを新規インストールしたところから始める 前提で説明しています。

本文中の例では https://ablogcms-tutorial.ddev.site/での利用を想定していますが、2-2 の ablogcms.io(無料お試し環境) を利用する場合でも問題ありません。その際は、以下のフォームで利用する URL を設定し、(変更する)ボタン をクリックしてください。

このドキュメントページ内のリンクが https://ablogcms-tutorial.ddev.site/ から指定した URL に書き換わり、クリックするとその環境に対応したページを開けるようになります。

2-1. ローカル環境に新規にインストールする

a-blog cms は動的な Web アプリケーションです。静的な HTML ファイルをただ置くだけでは動かず、動作するためにいくつかのソフトウェアが必要です。

  • Web サーバー — ブラウザからのリクエストを受け取り、処理結果をレスポンスとして返すソフトウェアです(Apache や Nginx など)

  • PHP インタープリター — a-blog cms 本体は PHP で書かれています。PHP のコードを解釈・実行するプログラムが必要です

  • データベース — 記事やユーザーなどのデータを保存・取得するための仕組みです(MySQL など)

これら3つを自分のパソコン上に個別にインストール・設定するのは手間がかかります。DDEV を使うと、これらをまとめてコンテナとして動かすことができ、バージョン管理や設定の手間を大幅に省けます。

DDEV とは

DDEV は、Web 開発用のローカル環境を素早く、確実に立ち上げるためのツールです。内部的には Docker を使ってサーバーを動かしていますが、複雑な Docker の設定を自分で書く必要はありません。コマンド数行で PHP・MySQL・Web サーバーが揃った環境が手に入ります。

すでに Docker を直接使ったことがある方なら、docker-compose.yml を手書きする代わりに、DDEV がその作業を引き受けてくれるイメージです。

なぜ DDEV を使うのか

MAMP は GUI で操作できるシンプルさが魅力ですが、チーム開発や複数プロジェクトの管理が複雑になりがちです。Docker を直接使う方法は柔軟性が高い反面、設定ファイルの記述に慣れが必要です。

DDEV はその中間にあたる選択肢で、以下のようなメリットがあります。

  • macOS・Windows・Linux すべてで同じように動く

  • プロジェクトごとに PHP バージョンを切り替えられる

  • ddev start ひとつで起動、ddev stop で停止とシンプル

  • チームで設定ファイルを共有すれば全員が同じ環境を再現できる

セットアップ手順

1. Docker をインストールする

DDEV は内部で Docker を使うため、先に Docker のインストールが必要です。お使いの OS に合わせて DDEV 公式ドキュメントを参照してインストールしてください。

Docker のインストール(公式ドキュメント)

複数のDocker provider がありますが、Docker 公式が提供する Docker Desktop の利用を推奨します。

2. DDEV をインストールする

次に DDEV 本体をインストールします。お使いの OS に合わせて DDEV の公式ドキュメントを参照してください。

DDEV のインストール(公式ドキュメント)

インストール後、以下のコマンドを実行してバージョンが表示されれば、正しくインストールされています。

ddev -v
3. プロジェクトフォルダを作成する

任意の作業ディレクトリに、プロジェクト用のフォルダを作成します。

mkdir ablogcms-tutorial
cd ablogcms-tutorial
4. a-blog cms のファイルを配置する

ダウンロードページから a-blog cms のパッケージをダウンロードし、展開してください。展開後、ablogcms ディレクトリの中身をプロジェクトフォルダ直下の web/ ディレクトリに配置してください。

ablogcms-tutorial/
└── web/          ← a-blog cms のファイルをここに展開する
5. DDEV プロジェクトを設定する

以下のコマンドで DDEV の設定ファイルを生成します。

ddev config --project-type=php --docroot=web --php-version=8.4 --database=mysql:8.4

PHP バージョンは動作条件を確認して、必要に応じて変更してください。

6. DDEV を起動する
ddev start

起動が完了すると、アクセス用の URL(例: https:/ablogcms-tutorial.ddev.site)が表示され、以下のます。

7. a-blog cms をインストールする

ブラウザで表示された URL にアクセスするとインストール画面が開きます。

データベースの接続設定は以下のように入力してください。

項目

データベースホスト

db

データベース名

db

ユーザー名

db

パスワード

db

db は DDEV が自動的に用意するデータベースコンテナのサービス名です。localhost や 127.0.0.1 では接続できませんのでご注意ください。

よく使うコマンド

コマンド

説明

ddev start

プロジェクトを起動する

ddev stop

プロジェクトを停止する(データは保持される)

ddev restart

プロジェクトを再起動する

ddev describe

プロジェクトの接続情報を表示する

ddev sequelace

Sequel Ace でデータベースを開く

ddev delete

プロジェクトとデータベースを削除する

ddev poweroff

すべてのプロジェクトとコンテナを停止する

その他のコマンドについては DDEV 公式ドキュメント(Commands) を参照してください。

あとは画面の指示に従って進め、必要な情報を入力しながらインストールを完了してください。途中で テーマの選択画面 が表示されますので、必ず 「Develop」 を選択してください。

2-2. 無料のお試しサーバー ablogcms.io を利用する

CMS を試しに触れる際に一番のハードルになるのは、動作環境の準備 です。この点をクリアするために、開発元では 30日間限定の無料お試しサーバー環境 を用意しています。

  • SFTP 接続が可能 : テーマファイルを編集してカスタマイズできます。

  • PHP のアップロードは不可 : カスタマイズはテーマファイルに限られます。

  • メール送信には注意 : フォームなどからのメール送信を行う場合は、SMTP 設定が必要です。

  • 完全無料 : お試し後に課金されることはありません。

  • 30日で環境は自動削除 : 期限が過ぎると利用できなくなります。

  • 繰り返し利用可能 : 必要であれば新しい環境を再度申し込むことができます。

インストール作業を省略して、すぐに a-blog cms を試したい方におすすめの方法 です。

https://www.ablogcms.io/

SCR-20250826-jssc

まとめ

この章でやったことのおさらいです。

  • サンプルサイトの構成と、このチュートリアルで扱う範囲を確認した

  • Twig と標準テンプレートの記法の違いを概観した

  • a-blog cms の動作環境を用意した

第2回では、Twigテンプレートの基本構文を学びます。実際にコードを書き始める前に、変数・ループ・条件分岐の3パターンを最小サンプルで確認しておきましょう。

管理画面からログイン画面にリダイレクトしない


デフォルトでは、ログインしていない状態で /bid/1/admin/top/ でURLを表示すると、ログインURLにリダイレクトされてしまいます。

利便性的には上記の挙動が望ましいですが、セキュリティを重視する場合、未認証ユーザーが直接管理画面にアクセスしようとする場合でも、ログインページへの強制リダイレクトが発生しないようにしたい場合があります。

対策

コンフィグ > ログイン設定 > 現在のURLでログイン を無効にしていただくことで、未認証ユーザーが管理画面へアクセスしたときにログインURLにリダイレクトされなくなります。

DDEV を利用したローカル環境構築


このドキュメントでは、a-blog cms を動かすためのローカル環境を DDEV を使って構築します。

DDEV とは

DDEV は、Web 開発用のローカル環境を素早く、確実に立ち上げるためのツールです。内部的には Docker を使ってサーバーを動かしていますが、複雑な Docker の設定を自分で書く必要はありません。コマンド数行で PHP・MySQL・Web サーバーが揃った環境が手に入ります。

すでに Docker を直接使ったことがある方なら、docker-compose.yml を手書きする代わりに、DDEV がその作業を引き受けてくれるイメージです。

a-blog cms を動かすために必要なもの

a-blog cms は動的な Web アプリケーションです。静的な HTML ファイルをただ置くだけでは動かず、動作するためにいくつかのソフトウェアが必要です。

  • Web サーバー — ブラウザからのリクエストを受け取り、処理結果をレスポンスとして返すソフトウェアです(Apache や Nginx など)

  • PHP インタープリター — a-blog cms 本体は PHP で書かれています。PHP のコードを解釈・実行するプログラムが必要です

  • データベース — 記事やユーザーなどのデータを保存・取得するための仕組みです(MySQL など)

これら3つを自分のパソコン上に個別にインストール・設定するのは手間がかかります。DDEV を使うと、これらをまとめてコンテナとして動かすことができ、バージョン管理や設定の手間を大幅に省けます。

なぜ DDEV を使うのか

MAMP は GUI で操作できるシンプルさが魅力ですが、チーム開発や複数プロジェクトの管理が複雑になりがちです。Docker を直接使う方法は柔軟性が高い反面、設定ファイルの記述に慣れが必要です。

DDEV はその中間にあたる選択肢で、以下のようなメリットがあります。

  • macOS・Windows・Linux すべてで同じように動く

  • プロジェクトごとに PHP バージョンを切り替えられる

  • ddev start ひとつで起動、ddev stop で停止とシンプル

  • チームで設定ファイルを共有すれば全員が同じ環境を再現できる

セットアップ手順

1. Docker をインストールする

DDEV は内部で Docker を使うため、先に Docker のインストールが必要です。お使いの OS に合わせて DDEV 公式ドキュメントを参照してインストールしてください。

Docker のインストール(公式ドキュメント)

複数のDocker provider がありますが、Docker 公式が提供する Docker Desktop の利用を推奨します。

2. DDEV をインストールする

次に DDEV 本体をインストールします。お使いの OS に合わせて DDEV の公式ドキュメントを参照してください。

DDEV のインストール(公式ドキュメント)

インストール後、以下のコマンドを実行してバージョンが表示されれば、正しくインストールされています。

ddev -v

3. プロジェクトフォルダを作成する

任意の作業ディレクトリに、プロジェクト用のフォルダを作成します。

mkdir my-acms-project
cd my-acms-project

4. a-blog cms のファイルを配置する

ダウンロードページから a-blog cms のパッケージをダウンロードし、展開してください。展開後、ablogcms ディレクトリの中身をプロジェクトフォルダ直下の web/ ディレクトリに配置してください。

my-acms-project/
└── web/          ← a-blog cms のファイルをここに展開する

5. DDEV プロジェクトを設定する

以下のコマンドで DDEV の設定ファイルを生成します。

ddev config --project-type=php --docroot=web --php-version=8.4 --database=mysql:8.4

PHP バージョンは動作条件を確認して、必要に応じて変更してください。

6. DDEV を起動する

ddev start

起動が完了すると、アクセス用の URL(例: https://my-acms-project.ddev.site)が表示されます。

7. a-blog cms をインストールする

ブラウザで表示された URL にアクセスするとインストール画面が開きます。

データベースの接続設定は以下のように入力してください。

項目

データベースホスト

db

データベース名

db

ユーザー名

db

パスワード

db

db は DDEV が自動的に用意するデータベースコンテナのサービス名です。localhost127.0.0.1 では接続できませんのでご注意ください。

よく使うコマンド

コマンド

説明

ddev start

プロジェクトを起動する

ddev stop

プロジェクトを停止する(データは保持される)

ddev restart

プロジェクトを再起動する

ddev describe

プロジェクトの接続情報を表示する

ddev sequelace

Sequel Ace でデータベースを開く

ddev mailpit

Mailpit をブラウザで開く

ddev delete

プロジェクトとデータベースを削除する

ddev poweroff

すべてのプロジェクトとコンテナを停止する

その他のコマンドについては DDEV 公式ドキュメント(Commands) を参照してください。

メール送信のテスト(Mailpit)

DDEV には Mailpit というメールキャプチャツールが組み込まれています。

ローカル環境から送信したメールは実際には送信されず、Mailpit の画面で確認できます。

お問い合わせフォームの送信確認や、会員登録メールのデバッグなどに活用できます。

Mailpit の画面は以下の URL でアクセスできます。

https://<プロジェクト名>.ddev.site:8026

または、次のコマンドでブラウザを直接開くこともできます。

ddev mailpit

a-blog cms 側でのメール設定は、管理画面の コンフィグ > メール設定 から行えます。

DDEV 環境では SMTP の設定は不要で、そのままメールの送受信テストができます。

よくある質問

Q. ブラウザでローカル環境にアクセスできない

  • Docker が起動しているか確認してください

  • ddev start が正常に完了しているか確認してください(エラーが出ていないか)

  • MAMP など他のローカルサーバーが起動している場合は停止してください

Q. PHP のバージョンを変更したい

.ddev/config.yamlphp_version を変更して ddev restart を実行してください。または以下のコマンドで変更できます。

ddev config --php-version=8.2
ddev restart

Q. ddev stopddev delete の違いがわからない

ddev stop はプロジェクトを一時停止するだけで、データベースの中身やファイルはそのまま保持されます。ddev start で再起動すれば元の状態に戻ります。

ddev delete はデータベースを含むプロジェクトのすべてのデータを削除します。コードファイル(web/ 以下)は削除されませんが、データベースの中身は消えてしまうため、必要な場合は先に ddev export-db でバックアップを取ってください。

Q. 複数のプロジェクトを同時に起動できますか

できます。DDEV はプロジェクトごとに独立したコンテナで動くため、複数プロジェクトを同時に起動しても競合しません。MAMP のようにポート番号を手動で切り替える必要もありません。

Q. プロジェクトを削除したい

プロジェクトディレクトリで以下のコマンドを実行してください。データベースが削除されます。コードファイルを合わせて削除したい場合は、コマンド実行後にフォルダごと削除してください。

ddev delete

第2回:Twig テンプレートの基本


この章では Twig テンプレートエンジンについて学びます。すでに Twig テンプレートエンジンについて知っている方は飛ばしていただいて構いません。


この章でやること

  • Twig の3種類の構文(出力・制御・コメント)を理解する

  • 変数・条件分岐・ループをTwig Playgroundで実際に動かして体験する

  • a-blog cms 独自の要素(モジュール・グローバル変数・フィルター)との関係を把握する

なぜ Twig なのか

a-blog cms は Ver. 3.2 から、従来の標準テンプレートに加えて、Twig によるテンプレート記述をサポートしています。

標準テンプレートは a-blog cms 独自の記法で設計されており、できることは豊富です。一方で、ループや条件分岐といった制御構文が独自仕様になっているため、シンプルな出力は簡単にできても、少し複雑なカスタマイズをしようとすると途端に覚えることが増えるという側面があります。

Twig は PHP 製のテンプレートエンジンで、Craft CMS・Symfony・Drupal などでも広く採用されています。変数の出力・ループ・条件分岐の書き方が、PHP や JavaScript などの一般的なプログラミング言語に近いため、「Twig の書き方を覚える」というより「すでに知っている書き方がそのまま使える」という感覚で書けます。

たとえば条件分岐なら、標準テンプレートでは a-blog cms 固有の構文を覚える必要がありますが、Twig では次のように書けます。

{% if entry.tags %}
  {% for tag in entry.tags %}
    <span>#{{ tag.name }}</span>
  {% endfor %}
{% endif %}

「タグがあれば一覧を出す」という意図が、コードを読んだだけで伝わります。Twigに慣れたメンバーがいれば、a-blog cmsを知らなくてもテンプレートのロジックを読み解けます。これはチーム開発や長期保守において大きなメリットになります。

どちらの形式でも a-blog cms の機能はすべて利用できます。新規テーマをTwigで書く、あるいは既存テーマをTwig化してメンテナンス性を高める、どちらの用途にも使えます。

まず動かしてみよう — Twig Playground

a-blog cms の環境がなくても、Twig Playground を使えばブラウザ上でTwigの構文をすぐに試せます。

この章では各サンプルコードをそのまま貼り付けて実行できます。環境構築を待たずに、まず「書いて動かす」体験から始めましょう。

エディターにシンタックスハイライトを設定する

.twig ファイルを素のまま開くと、{{ }}{% %} が通常のテキストと同じ色で表示されてしまい、構造が非常に読みづらくなります。コードを書き始める前に、シンタックスハイライトの拡張機能を入れておきましょう。

VS Code を使っている場合は、拡張機能マーケットプレイスで 「Twig Language 2」を検索してインストールしてください。

インストール後、VS Code の再起動(または「ウィンドウの再読み込み」)が必要になることがあります。

シンタックスハイライトがあると、{{ }}{% %}{# #} の3種類がそれぞれ異なる色で表示され、HTMLとTwig構文の境界が一目でわかるようになります。コード量が増えるほどその効果を実感できます。

1. Twig の3種類の構文

Twig には HTML の中に埋め込む構文が3種類あります。これだけ覚えれば、基本的なテンプレートは読み書きできます。

構文

用途

{{ }}

変数や式を出力する

{{ title }}

{% %}

タグ。ループ・条件分岐などの制御を書く

{% for item in list %}

{# #}

コメント(HTML出力には含まれない)

{# ここはメモ #}

これら3種類のデリミタさえ区別できれば、Twig のテンプレートファイルは読めるようになります。


2. 変数の出力

{{ }} で変数を出力します。

{{ title }}
{{ entry.id }}

Twig Playground で試す:

{% set name = "a-blog cms" %}
<p>{{ name }} へようこそ!</p>

変数が持つプロパティには .(ドット)でアクセスします。

Twig Playground で試す:

{% set entry = {
  title: "新しい季節限定メニューが登場しました",
  date: "2025-08-07",
  category: {
    name: "新商品"
  }
} %}

<h1>{{ entry.title }}</h1>
<p>{{ entry.date }}</p>
<span>{{ entry.category.name }}</span>

entry.category.name のように、オブジェクトのネストも . をつなぐだけでアクセスできます。

グローバル変数も同じ記法

標準テンプレートでは %{ENTRY_TITLE} のようにグローバル変数だけ別の記法がありましたが、Twig ではグローバル変数も {{ }} で書けます。記法を使い分ける必要がありません。

{# 標準テンプレートのグローバル変数に相当 #}
<title>{{ ENTRY_TITLE }}</title>
<p>現在のカテゴリーコード:{{ CCD }}</p>

3. 変数の定義

{% set %} でテンプレート内に変数を定義できます。

Twig Playground で試す:

{% set greeting = "こんにちは" %}
{% set name = "山田" %}

<p>{{ greeting }}、{{ name }}さん!</p>

文字列の連結には ~(チルダ)演算子を使います。

Twig Playground で試す:

{% set fullName = "山田" ~ " " ~ "太郎" %}
<p>{{ fullName }}</p>

4. 条件分岐(if)

{% if %} / {% endif %} で条件分岐を書きます。PHP や JavaScript の if と同じ感覚で書けます。

Twig Playground で試す:

{% set isLoggedIn = true %}

{% if isLoggedIn %}
  <p>ログイン中です。</p>
{% else %}
  <p>ログインしてください。</p>
{% endif %}

条件式の記述例

比較演算子

  • ==(等しい)

  • !=(等しくない)

  • >(大きい)

  • <(小さい)

  • >=(以上)

  • <=(以下)

Twig Playground で試す:

{% set age = 18 %}

{% if age >= 18 %}
  <p>成人です。</p>
{% else %}
  <p>未成年です</p>
{% endif %}

論理演算子

  • and(かつ)

  • or(または)

  • not(否定)

Twig Playground で試す:

{% set isLogin = true %}
{% set isAdmin = true %}

{% if isLogin and isAdmin %}
    <p>ログイン済みの管理者です。</p>
{% endif %}

{% if not isLogin %}
    <p>ログインしてください。</p>
{% endif %}

is 演算子

  • empty: 空かどうか

  • defined: 定義されているかどうか

  • null: nullであるかどうか

  • even/odd: 偶数か奇数か

  • divisible by: 指定した数で割り切れるか

Twig Playground で試す:

{% set name = '山田' %}
{% set list = [] %}
{% set number = 6 %}

{% if name is defined %}
    <p>名前: {{ name }}</p>
{% endif %}

{% if list is empty %}
    <p>リストは空です。</p>
{% endif %}

{% if number is even %}
<p>
  {{ number }}は偶数です。
</p>
{% endif %}

{% if number is divisible by(2) %}
  <p>{{ number }}は2で割り切れます。</p>
{% elseif number is divisible by(3) %}
  <p>{{ number }}は3で割り切れます。</p>
{% else %}
  <p>{{ number }}は2でも3でも割り切れません。</p>
{% endif %}

in 演算子

Twig Playground で試す:

{% set colors = ["red", "blue", "green"] %}

{% if "blue" in colors %}
    <p>青色が含まれています。</p>
{% endif %}

他のプログラミング言語と同様に、括弧を使って条件式の優先度を制御できます。



5. ループ(for)

{% for %} / {% endfor %} でリストを繰り返し処理します。

Twig Playground で試す:

{% set fruits = ['Apple', 'Banana', 'Cherry'] %}

<ul>
  {% for fruit in fruits %}
    <li>{{ fruit }}</li>
  {% endfor %}
</ul>

loop — ループ内の特殊変数

ループの中では loop という特殊変数が使えます。「最後の要素以外にセパレーターを入れる」などの処理が、標準テンプレートで使っていた <!-- BEGIN glue --> より直感的に書くことができます。

Twig Playground で試す:

{% set tags = ["新商品", "季節限定", "夏メニュー"] %}

<div>
  {% for tag in tags %}
    #{{ tag }}{% if not loop.last %}、{% endif %}
  {% endfor %}
</div>

よく使う loop 変数をまとめます。

変数

内容

loop.index

現在のインデックス(1始まり)

loop.index0

現在のインデックス(0始まり)

loop.first

最初の要素なら true

loop.last

最後の要素なら true

loop.length

要素の総数


6. 階層データのツリー表示

カテゴリーやメニューなど、親子関係のあるデータを表示する場面はよくあります。親の中に子がネストしたHTML構造を作るには、macro(マクロ)を使った再帰呼び出しが有効です。階層の深さに関係なく同じテンプレートで処理できます。

Twig Playground で試す:

{% set categoryTree = {
  name: "ドリンク",
  children: [
    { name: "コーヒー", children: [] },
    { name: "ティー", children: [] }
  ]
} %}

{% macro renderTree(node) %}
  <li>
    {{ node.name }}
    {% if node.children is not empty %}
      <ul>
        {% for child in node.children %}
          {{ _self.renderTree(child) }}
        {% endfor %}
      </ul>
    {% endif %}
  </li>
{% endmacro %}

<ul>
  {{ _self.renderTree(categoryTree) }}
</ul>

macro(マクロ)について

macro(マクロ)は、HTML を出力する再利用可能な関数です。同じテンプレート内で似たような HTML を何度も書く場合に便利で、include ほど大げさにしたくないときの選択肢になります。

マクロの定義と呼び出し

{% macro 名前(引数) %} ... {% endmacro %} で定義し、同じファイル内では {{ _self.名前(引数) }} で呼び出します。

Twig Playground で試す:

{% macro navItem(label, path) %}
  <li class="nav-item"><a href="{{ path }}">{{ label }}</a></li>
{% endmacro %}

<nav>
  <ul>
    {{ _self.navItem('ホーム', '/') }}
    {{ _self.navItem('お知らせ', '/news') }}
    {{ _self.navItem('お問い合わせ', '/contact') }}
  </ul>
</nav>

同じ <li> の構造を3回書く代わりに、マクロ1つでまとめています。

再帰呼び出し

再帰とは、関数が自分自身を呼び出すことです。マクロも再帰できます。

ツリー構造のデータでは、どのノードも「名前を表示する」「子があれば子をループする」という同じ処理になります。階層が何段になっても同じロジックで扱えるため、再帰が向いています。

処理の流れ:

  1. renderTree(categoryTree) が呼ばれる(ルート「ドリンク」)

  2. 「ドリンク」を <li> で出力し、children が空でなければループ開始

  3. 子「コーヒー」に対して _self.renderTree(child) を呼ぶ

  4. 「コーヒー」を出力。children が空なので再帰せず終了

  5. 子「ティー」に対して同様に _self.renderTree(child) を呼ぶ

  6. 以下、子がなくなるまで繰り返し

終了条件が重要です。{% if node.children is not empty %} で子があるときだけ再帰するため、葉(子のいないノード)に到達すると再帰が止まります。この条件がなければ無限ループになります。

孫やひ孫がいる場合も、同じマクロが「自分の名前を出して、子がいれば子ごとに自分を呼ぶ」を繰り返すだけなので、階層の深さを意識せずに書けます。

別テンプレートのマクロを使う

他のテンプレートで定義したマクロを使うには、import タグで読み込みます。

{% import '_macros.twig' as macros %}
{{ macros.navItem('ホーム', '/') }}

7. フィルター(| パイプ)

値を変換・加工するには |(パイプ)でフィルターをつなぎます。

{# 日付フォーマット #}
{{ entry.date | date('Y年m月d日') }}

{# 文字数で切り詰め(a-blog cms 独自フィルター) #}
{{ entry.summary | trim(200, '...') }}

{# 画像リサイズ(a-blog cms 独自フィルター) #}
{{ entry.path | resizeImg(600) }}

| はいくつでもつなげられます。

{# 先頭から200文字を取り出してから小文字に #}
{{ text | slice(0, 200) | lower }}

Twig Playground で試す:

{% set date = "now" | date('Y年m月d日') %}
<p>今日は {{ date }} です。</p>

7. コメント

{# #} でコメントを書きます。コメントはHTMLとして出力されません。

{# ここはコメントです。HTML出力には含まれません #}
{# TODO: このモジュールのカテゴリーを後で確認する #}

HTML コメント(<!-- -->)はそのままソースに出力されますが、Twig コメントは出力されません。テンプレートへの作業メモにはTwigコメントを使いましょう。


8. インクルード

テンプレートの共通部分(ヘッダー・フッター・カードのHTML断片など)を別ファイルに切り出して再利用するには、include() 関数を使います。

たとえばカードコンポーネントを _card.twig として用意するとします。

{# _card.twig #}
<div class="card">
  <h2>{{ entry.title }}</h2>
  <p>{{ entry.summary | trim(100, '...') }}</p>
</div>

これを別のテンプレートから読み込むには次のように書きます。

{{ include('_card.twig') }}

変数を渡したい場合は第2引数にハッシュで指定します。

{{ include('_card.twig', { entry: featuredEntry }) }}

a-blog cms では、管理ボックスや管理UIのパーツもインクルードで読み込みます。

{# エントリー編集ボックスの読み込み #}
{{ include('admin/entry/action.twig', { entry }) }}

{# モジュール設定ボタンの読み込み #}
{{ include('/admin/module/setting.twig', { moduleInfo: entrySummary.moduleInfo }) }}

これらのファイルはa-blog cms本体が提供しているため、自分で作成する必要はありません。テンプレートの決まった位置に書くだけで管理UIが有効になります。

9. a-blog cms との組み合わせイメージ

Twig の基本構文を把握したところで、a-blog cms のモジュールと組み合わせると次のようになります。実際の実装は次章以降で進めますが、全体のイメージとして確認しておきましょう。

{% set entrySummary = module('V2_Entry_Summary', 'モジュールID名', { bid: BID, cid: CID }) %}
<div>
  <div class="acms-cssgrid acms-g-cols-1 acms-g-cols-md-3">
    {% for entry in entrySummary.items %}
    <div>
      {% if entry.mainImage.path %}
      <img
        src="{{ entry.mainImage.path|resizeImg(360) }}"
        alt="{{ entry.mainImage.alt }}"
        class="acms-img-responsive"
        width="{{ entry.mainImage.width }}"
        height="{{ entry.mainImage.height}}"
        loading="lazy"
        decoding="async"
      >
      {% endif %}
      <h3>{{ entry.title }}</h3>
      <p>{{ entry.summary }}</p>
      <p><a href="{{ entry.url }}" class="acms-btn">詳細をみる</a></p>
    </div>
    {% endfor %}
  </div>
</div>

module は a-blog cms 独自の関数ですが、その中身は完全なTwig構文で書けます。a-blog cms 固有の概念は少し覚えるだけで、制御構文は一般的なTwigの知識がそのまま使えるという構成です。


まとめ

この章でおさえたこと:

  • {{ }} で変数を出力し、{% %} で制御構文を書き、{# #} でコメントを書く

  • グローバル変数も通常の変数と同じ {{ }} 記法で書ける

  • {% if %} / {% for %} は一般的なプログラミング言語と同じ感覚で書ける

  • is empty / is defined / loop.last などの便利な記法がある

  • | フィルターで値を加工する(date()trim()resizeImg() など)

  • {{ include('ファイル名') }} で共通パーツを再利用する

  • Twig Playground で環境なしに構文を試せる

また、チュートリアルでは詳しく扱いませんが、発展情報として以下の内容も参考にしてください

次の章では、サンプルHTMLをa-blog cmsのTwigテーマとして設定します。まだCMS化はしませんが、「既存のHTMLがa-blog cmsを経由して表示される」状態を作ることが最初のゴールです。