• ブログTOP
  • AI・ディープラーニング
  • AR
  • VR
  • WEBサイト
  • WEBマーケティング
  • SEO
  • SNS
  • その他
  • お問い合わせ

ALAKI株式会社

COZIKEEいつまでも使えるTech情報発信ブログ

リクルートサイトはこちら >

twig30分クッキング-テンプレート(2)編-

2016年9月2日

  • このエントリーをはてなブックマークに追加

こんばんは、Webプログラマの篠田です。

気がつけば蝉の鳴き声も聞かなくなり、朝の気温もだいぶ下がってきて夏の終わりを感じます。
短い冬までの過ごしやすい季節を堪能したいと思います!

今回はテンプレートエンジンの真骨頂(?)的な部分である「extends(エクステンド:継承)」「block(ブロック)」という考え方についてご紹介していきたいと思います。

この記事の目次

  • 1 こんなとき、どうしたら良いか?
  • 2 ベーステンプレートを作ろう
  • 3 プログラム側でテンプレートを読み込む
  • 4 メインテンプレートからベーステンプレートを読み込む
  • 5 「extends」と「block」の動き
  • 6 まとめ

こんなとき、どうしたら良いか?

下記のようなTwigのテンプレートファイルがアルとします。

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html>
<header>
    <meta charset="UTF-8">
    <meta description=“テストディスクリプション">
    <meta keywords=“test,test2,test3">
    <title>テスト</title>
</header>
<body>
    <h1>Hello {{ message }}!</h1>
</body>
</html>

それほど特殊な内容は書かれていませんね。

問題は、このテンプレートの「description」と「keyword」そして「title」がページごとに変わるとしたらどうしたらいいでしょうか?

「変数にしてしまう」という素敵な回答がひらめいた方は、是非続きを読んでくださいね。

では、変数で作るとどうなるか見てみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html>
<header>
    <meta charset="UTF-8">
    <meta description=“{{ description }}">
    <meta keywords=“{{ keywords }}">
    <title>{{ title }}</title>
</header>
<body>
    <h1>Hello {{ message }}!</h1>
</body>
</html>

なんだか、いい感じのように思いますね。。。

では、このテンプレートを読み込むプログラム側も見てみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
<?php
require_once './vendor/autoload.php';
 
$loader = new Twig_Loader_Filesystem('./views/');
$twig = new Twig_Environment($loader);
 
echo $twig->render('index.twig', array(
'description' => 'テストディスクリプション’,
'keywords' => ’test,test2,test3’,
'title' => 'テスト’,
'message' => 'twig World’
));

もちろん、これでも意図したとおりに動きます。ですが、同じようなテキストをプログラム側で用意して、大量の連想配列として送るというのは面倒ではないでしょうか?

それに、テキストの変更をテンプレートを触れる人に対応してもらいたいと思っても、プログラムファイルに記述されていると、ハードルが高く感じて、結局プログラマが変更するなんていう手間が掛かりそうな予感がします。

では、どうすればプログラマに取って手離れが良いテンプレートになるかを考えてみましょう。

●手離れのいいテンプレート像
(1)システムで管理しなくてもよい部分はプログラマは極力触らない
(2)デザイナーさんに、それなりに気持よく変更してもらいたい
(3)変更ファイルは1ファイル程度で汎用性を維持したい

ようは、ロジック(プログラム側)とビュー(デザイン側)を、ある程度綺麗にして、metaとかのよく変更が発生しそうな部分はビューにまとめておきたいというイメージです。

では、具体的にどのように管理すると比較的、素敵な運用ができるかを見ていきたいと思います

ベーステンプレートを作ろう

ベーステンプレートというのは私が勝手に言っているのですが、ようは全ページで共通して利用しているHTML部分を書きだしたテンプレートファイルという意味合いです。

先ほどの簡単なテンプレートをもとにベーステンプレートを作ってみましょう。
ファイル名は「base.twig」としておきます。

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html><html>
<header>
    <meta charset="UTF-8">
    <meta description=“">
   <meta keywords=“">
    <title></title>
</header>
<body>
 
</body>
</html>

ただのHTMLになってしまいましたが、よく考えてみると全ページで使う部分といわれるとこの内容になりますよね。

もちろん、デザインによってはもう少しbodyの中身が共通として使える場合もありますが、今回はこれをベースとして考えてみたいと思います。

次にbodyの中身を「index.twig」として書き出しておきます。

ここまでで、2つのTwigファイルができあがりました。

プログラム側でテンプレートを読み込む

では、テンプレートを読み込むプログラム側も用意してみてみましょう。

1
2
3
4
5
6
7
8
9
10
11
<html>
<header>
    <meta charset="UTF-8">
    <meta description=“">
   <meta keywords=“">
    <title></title>
</header>
<body>
 
</body>
</html>

これでOKです。

「あれ?base.twigは?」という声が聞こえたり、聞こえなかったり。。。

このままでは、「base.twig」は誰も読んでいないのでmetaを含まない結果が表示されてしまいます。

ですが、決してプログラム側で「base.twig」を呼んではいけません。
それでは、メインコンテンツである「index.twig」が表示されなくなってしまいます

メインテンプレートからベーステンプレートを読み込む

メインテンプレートである「index.twig」とベーステンプレートである「base.twig」をどうやって1つのファイルとして扱うのか。。。

前回お話しした「include」を使うとどうなるでしょうか?

下記のように「index.twig」を変更してみました。

1
2
{% include 'base.twig' %}
<h1>Hello {{ message }}!</h1>

実行してみると、残念がらhtmlの後にh1タグが表示されるという事態になると思います。

では、どうすればよいかというと、ここで使うのが冒頭で出てきました「extends(エクステンド:継承)」と「block」です。

「継承」とか言われると難しい印象をもたれる方もいると思いますが、今回はざっくりとしたイメージとして「include」の上位版とでも思ってもらうと分かりやすいかもしれません。
※逆に分かりにくくなったらすみませんm(_ _)m

では、「extends」と「block」を使うとどうなるかというのを見てみましょう。

1
2
3
4
{% extends 'base.twig' %}
{% block content %}
<h1>Hello {{ message }}!</h1>
{% endblock %}

こんな感じになります。「base.twig」が「index.twig」と同階層にあるという状況で作っています

これを実行すると今度は「真っ白」になると思います。

ただ、ソースを開けて見てみると「base.twig」が読み込まれていることがわかると思います。

では、「block」で囲まれた部分はどこへ行ってしまったのか。。。

それを解決するために「base.twig」を少し書き換えてみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html>
<header>
    <meta charset="UTF-8">
    <meta description=“">
    <meta keywords=“">
    <title></title>
</header>
<body>
    {% block content %}{% endblock %}
</body>
</html>

これでOKです。

この「{% block content %}{% endblock %}」というのが
「index.twig」で用意した「{% block content %}{% endblock %}」と対になる部分になります。

これで、再度実行してみましょう。

文字が表示されたのではないでしょうか?

ではどのように動いているのかを簡単に解説していきましょう。

「extends」と「block」の動き

ざっくりとですが、「extends」と「block」は下記のような流れで動いているイメージです。

(1)「index.twig」が「base.twig」を継承する
(2)「base.twig」が読み込まれる
(3)「base.twig」内にある「{% block ●● %}{% endblock %}」に対になる内容が「index.twig」にあるかを探す
(4)対になる「{% block ●● %}{% endblock %}」があれば「base.twig」にある「{% block ●● %}{% endblock %}」が「index.twig」の内容に置き換わる
(5)表示完了

「●●」の部分は任意なので好きな名前をつけることができます。
先ほどの「content」も私が勝手につけています。

これをもとにmetaをテンプレートごとに書き換える仕様でテンプレートを用意してみます。

まずは「base.twig」を下記のように記述します

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html>
<header>
    <meta charset="UTF-8">
    <meta description=“{% block description %} {% endblock %}">
    <meta keywords=“{% block keywords %}{% endblock %}">
    <title>{% block title %}{% endblock %}</title>
</header>
<body>
    {% block content %}{% endblock %}
</body>
</html>

次に「index.twig」を下記のように記述します。

1
2
3
4
5
6
7
{% extends 'base.twig' %}
{% block description %}テストディスクリプション{% endblock %}
{% block keywords %}test,test2,test3{% endblock %}
{% block title %}テスト{% endblock %}
{% block content %}
<h1>Hello {{ message }}!</h1>
{% endblock %}

これを実行すると綺麗に「base.twig」と「index.twig」が1つになりました。

まとめ

Twigの「extends」と「block」をうまく使うことで共通化を行い、拡張性を上げることができます。

プログラマは、できるだけデザイナーさんに使ってもらえるテンプレートファイルを作っていきたいですね。

では、またー!

  • ツイート
  • このエントリーをはてなブックマークに追加

You may also like...

  • 13993703_xxl

    PHPで配列をテキストに結合する方法

    13 1月, 2017

  • 14800708_xl

    コーダーさんにフィーバータイムを与えてくれる(かも知れない)formタグの属性のお話

    30 9月, 2016

  • PAK_PHPS9V9A6862_TP_V

    LaravelとTwigでアクティブページの判定をしよう!

    7 11月, 2018

プログラマー募集
  • Next story Twitterに投稿する画像の適切なサイズとは?パソコン、スマートフォン両方でキレイに表示させるための画像サイズをご紹介!
  • Previous story SNSを導入する前に考えるべき3つのこと

弊社サービス

MONJI+ MUGHEN ALAKI クラウド型受発注システム さよなら過去のAR。WebARがイベント集客に革命を起こします。

運営会社

ALAKI株式会社 ALAKI株式会社採用サイト

人気の記事

  • alaki1462_A_businessman_who_works_logically_1da80a2e-c297-4911-bdd6-feba0ebf1357

    仕事術

    【書籍要約】数学的な仕事術大全

    4 11月, 2024

  • fv-main-img-min

    空間コンピューティング

    世界初!「空間コンピューティング」を専用端末不要、スマホのWebブラウザのみで実現する『Web XR Site』を公開しました

    22 6月, 2023

  • Virtual reality players isometric vector illustration. VR UI and navigation. Futuristic digital technology. Virtual screen. Mixed reality 3d concept. Person in VR headset. Web banner idea

    AR

    Appleから新世代MRグラス「Vision Pro」の登場 – デジタルと現実世界が融合する新時代へ

    6 6月, 2023

  • AWE

    未分類

    ARアプリ『MUGHEN』が世界最大のAR/VRアワード「AWE」のファイナリストに選出されました!

    26 5月, 2023

  • python-logo-master-v3-TM

    pyhotn / 業務効率化

    「SwinIR」で高画質化した画像を pythonを使用して一括で元のサイズに戻す方法

    2 2月, 2023

カテゴリー

  • AI・ディープラーニング
  • AR
  • BtoB
  • CMS
  • Git
  • Google AdWords
  • gulp
  • Javascript
  • Laravel
  • Photoshop
  • Pug
  • pyhotn
  • Sass
  • SEO
  • SNS
  • Twitter広告
  • VR
  • Web3.0
  • WEBサイト
  • WEBマーケティング
  • YouTube
  • コーディング
  • システム開発
  • スマートフォンサイト
  • セキュリティ
  • セミナー
  • その他
  • ツール
  • デザイン
  • ベトナムレポート
  • 仕事術
  • 未分類
  • 業務効率化
  • 空間コンピューティング
  • 色

アーカイブ

  • 2024年11月
  • 2023年6月
  • 2023年5月
  • 2023年2月
  • 2023年1月
  • 2022年12月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年2月
  • 2021年12月
  • 2021年9月
  • 2021年7月
  • 2021年6月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年6月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年11月
  • 2018年9月
  • 2018年8月
  • 2018年7月
  • 2018年6月
  • 2018年5月
  • 2018年4月
  • 2018年3月
  • 2018年2月
  • 2018年1月
  • 2017年12月
  • 2017年11月
  • 2017年10月
  • 2017年9月
  • 2017年8月
  • 2017年7月
  • 2017年6月
  • 2017年4月
  • 2017年3月
  • 2017年2月
  • 2017年1月
  • 2016年12月
  • 2016年11月
  • 2016年10月
  • 2016年9月
  • 2016年8月
  • 2016年7月
  • 2016年6月
  • 2016年5月
  • 2016年4月
  • 2016年3月
  • 2016年2月
  • 2016年1月
  • 2015年12月
  • 2015年11月
  • 2015年10月
  • 2015年9月
  • 2015年7月
  • 2015年3月
  • 2015年2月
  • 2015年1月
  • 2014年12月
  • 2014年11月
  • 2014年10月
  • 2014年9月
  • 2014年8月
  • 2014年7月
  • 2014年6月
  • 2013年10月
  • 2013年9月

Facebook

お問い合わせ

お問い合わせ

人気の記事

  • 【書籍要約】数学的な仕事術大全
  • 世界初!「空間コンピューティング」を専用端末不要、スマホのWebブラウザのみで実現する『Web XR Site』を公開しました
  • Appleから新世代MRグラス「Vision Pro」の登場 – デジタルと現実世界が融合する新時代へ
  • ARアプリ『MUGHEN』が世界最大のAR/VRアワード「AWE」のファイナリストに選出されました!
  • 「SwinIR」で高画質化した画像を pythonを使用して一括で元のサイズに戻す方法

カテゴリー

  • AI・ディープラーニング
  • AR
  • BtoB
  • CMS
  • Git
  • Google AdWords
  • gulp
  • Javascript
  • Laravel
  • Photoshop
  • Pug
  • pyhotn
  • Sass
  • SEO
  • SNS
  • Twitter広告
  • VR
  • Web3.0
  • WEBサイト
  • WEBマーケティング
  • YouTube
  • コーディング
  • システム開発
  • スマートフォンサイト
  • セキュリティ
  • セミナー
  • その他
  • ツール
  • デザイン
  • ベトナムレポート
  • 仕事術
  • 未分類
  • 業務効率化
  • 空間コンピューティング
  • 色

検索

ALAKI株式会社 © 2025. All Rights Reserved.