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

ALAKI株式会社

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

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

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

2016年9月2日

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

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

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

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

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

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

<!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」がページごとに変わるとしたらどうしたらいいでしょうか?

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

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

<!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>

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

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

<?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」としておきます。

<!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ファイルができあがりました。

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

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

<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」を変更してみました。

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

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

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

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

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

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

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

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

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

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

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

<!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」を下記のように記述します

<!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」を下記のように記述します。

{% 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...

  • Laravel5.6でテンプレートエンジン「Twig」を使えるようにしよう!

    27 8月, 2018

  • PHPを使って「404 Not Found」を見つけよう!

    26 1月, 2018

  • Ajax処理を実装しよう!(フロントエンド編)

    11 9月, 2017

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

運営会社

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

弊社サービス

MUGHEN ALAKI クラウド型受発注システム さよなら過去のAR。WebARがイベント集客に革命を起こします。 広報活動の課題を数字で可視化し、出願者数アップをお手伝いします クリエイティブ業務のコミュニケーションを高速化 Webの知識が無くてもWebサイトの品質をチェックできます。

カテゴリー

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

アーカイブ

  • 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

お問い合わせ

お問い合わせ

人気の記事

  • 「SwinIR」で高画質化した画像を pythonを使用して一括で元のサイズに戻す方法
  • Web制作時に高解像度の元画像がない場合にPythonで高画質化する方法
  • 『考える』が楽しくなる!考えを「広げる」・「深める」12の方法
  • macに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株式会社 © 2026. All Rights Reserved.