Lexer.php:163 を以下のように修正します
if (isset($this->positions[2][$this->position][0]) ) {
$text = rtrim($text);
}
↓
if (isset($this->positions[2][$this->position][0]) && ($this->options['whitespace_trim'] === $this->positions[2][$this->position][0])) {
$text = rtrim($text);
}
新しい年になった時にドロップダウンリストの項目を一つ増やしたいという時があります。 Twigを使用している場合は次のように書くと現在の年までのドロップダウンリストを生成いたします
<select name="y">
<option value="">----</option>
{% set year_start = 2010 %}
{% set year_end = "now"|date("Y") %}
{% for i in year_start..year_end %}
<option value="{{i}}">{{i}}</option>
{% endfor %}
</select>
↓ このように生成されます
<select name="y">
<option value="">----</option>
<option value="2010">2010</option>
<option value="2011">2011</option>
<option value="2012">2012</option>
<option value="2013">2013</option>
<option value="2014">2014</option>
<option value="2015">2015</option>
<option value="2016">2016</option>
<option value="2017">2017</option>
</select>
Twigテンプレートで動的に継承元テンプレートを変更するには次のように一度変数にファイル名を入れて そこから呼び出します。
lang_setting が en の時はファイル「base_english.html」を、それ以外の時はファイル「base_japanese.html」を継承元にするサンプル
{% if lang_setting == 'en' %}{% set base_template = 'base_english.html' %}
{% else %}{% set base_template = 'base_japanese.html' %}
{% endif %}
{% extends base_template %}
Twig/Extensionuser にファイル名 Youbi.php で保存します。
Youbi.php
<?php
class Twig_Extensionuser_Youbi extends \Twig_Extension
{
public function getFilters()
{
return array(
'youbi' => new \Twig_Filter_Method($this, 'youbi', array(
'needs_environment' => true,
'needs_context' => true,
'is_safe' => array(
'evaluate' => true,
),
)),
);
}
public function youbi(\Twig_Environment $environment, $context, $string1)
{
$date = new DateTime($string1);
$w_no = $date->format('w');
$week = array('日', '月', '火', '水', '木', '金', '土');
return $week[$w_no];
}
protected function parseString(\Twig_Environment $environment, $context, $string)
{
$environment->setLoader(new \Twig_Loader_String());
return $environment->render($string, $context);
}
public function getName()
{
return 'youbi';
}
}
{{'2017-08-04' | youbi }}
new Twig_SimpleFilter('getage', array($this, 'getage')) ,
/**
* 誕生日文字列( 例: 1983-12-19)から現在の年齢を返します
*
* @param string $date_name (例: '1983-12-19')
* @return int 現在の年齢
*/
public function getage( $date_name )
{
$birth = date('Ymd', strtotime($date_name));
$now = date("Ymd");
return floor(($now-$birth)/10000);
}
使い方
{{ '1983-12-19' | getage }}歳
Twigのバージョンを表示するには
<p>twigのバージョンは : {{ constant('Twig_Environment::VERSION') }}</p>
とします。
なお Twigのバージョン2 を利用するには PHP7以上が必要です。
Twigテンプレートの変数の中で変数をevalするフィルタがとても便利なので紹介します。
Twig > Extension > Evalute.php で保存
<?php
class Twig_Extension_Evaluate extends \Twig_Extension {
public function getFilters( ) {
return array(
'evaluate' => new \Twig_Filter_Method( $this, 'evaluate', array(
'needs_environment' => true,
'needs_context' => true,
'is_safe' => array(
'evaluate' => true
)
))
);
}
public function evaluate( \Twig_Environment $environment, $context, $string ) {
$loader = $environment->getLoader( );
$parsed = $this->parseString( $environment, $context, $string );
$environment->setLoader( $loader );
return $parsed;
}
protected function parseString( \Twig_Environment $environment, $context, $string ) {
$environment->setLoader( new \Twig_Loader_String( ) );
return $environment->render( $string, $context );
}
public function getName( ) {
return 'evaluate';
}
}
$twig->addExtension( new Twig_Extension_Evaluate() );
{% set var = 'inner variable' %}
{{'this is a string with an {{var}}'|evaluate}}
↓
this is a string with an inner variable
このような書き方もできます(ハッシュのメンバ名が変数の時に展開する)
$data['column_name'] = "data_id";
$data['data_hash']['data_id'] = 999;
{{data_hash[column_name]|evaluate}}
↓
999
引用 : http://goo.gl/Y1LlSz
Twigに自作フィルタを追加するにはフィルタを定義して addFilter するだけでOKです。
$filter = new Twig_SimpleFilter('file_exists', function ($filename) {
// ディレクトリは適宜書き換えること
return file_exists(dirname(__FILE__)."/{$filename}");
});
$twig->addFilter($filter);
使い方(HTML内で以下のように記述)
{% if "test.jpg"|file_exists %}
ファイルが存在します
{% else %}
ファイルは存在しません
{% endif %}
require_once('Smarty/Smarty.class.php');
$smarty = new Smarty();
$smarty->template_dir = './templates/';
$smarty->compile_dir = './templates_c/';
require_once('Twig/Autoloader.php');
Twig_Autoloader::register();
$loader = new Twig_Loader_Filesystem("./templates/");
$twig = new Twig_Environment($loader, array(
'cache' => 'cache_twig',
'debug' => false ,
));
$smarty->assign( array("mydata" => $hoge) );
$twig->addGlobal( "mydata", $hoge );
{assign var="aaa" value="999" }
{% set aaa = '999' %}
{% set aaa %}
<div id="pagination">
...
</div>
{% endset %}
@php($aaa = 999)
または
@php $aaa = 999; @endphp
または
@php
$aaa = 999;
@endphp
$template_file = 'myfile.html';
$smarty->display( $template_file );
$hash = array(
'id' => 999 ,
'name' => 'hoge' ,
);
$template_file = 'myfile.html'
echo $twig->render($template_file, $hash);
{% block content %}
{% endblock %}
@yield('content')
{% extends "layout" %}
{% block content %}
{% endblock %}
@extends('layout')
@extends('layout.blade.php') // ファイル名で記述してもok
@section('content')
@endsection
{section name=i start=0 loop=10}
{$smarty.section.i.index}回目
{/section}
{% for i in 0..10 %}
{{ i }}回目
{% endfor %}
@for ($i = 0; $i < 10; $i++)
{{ $i }}回目
@endfor
{ foreach from=$my_loop key="k" item="v" }
{$v.user_name}
{ /foreach }
{% for k,v in my_loop %}
<h1>{{ loop.index }}番目</h1>
{% if loop.first %}最初の要素です。
{% elseif loop.last %}最後の要素です。
{% else %}{{ v.user_name }}
{% endif %}
{% endfor %}
Twig の loop.index は 1 から始まります。
@foreach ($users as $user)
{{$loop->index}}
@if ($loop->first)
これは最初の要素です
@endif
@if ($loop->last)
これは最後の要素です
@endif
<p>これは {{ $user->id }} ユーザーです。</p>
@endforeach
Laravel Blade の $loop->index は 0 から始まります。
@empty が使用できるのでこちらの方がオススメの記法です
@forelse ($users as $user)
{{$loop->index}}
@if ($loop->first)
これは最初の要素です
@endif
@if ($loop->last)
これは最後の要素です
@endif
<p>これは {{ $user->id }} ユーザーです。</p>
@empty
ユーザーはいません
@endforelse
なお @empty は省略できません。
また、Laravel Blade の $loop->index は 0 から始まります。
{include file="inc/header.html"}
{% include 'inc/header.html' %}
resources/views/user/mypage_sub_menu.blade.php を読み込みます
@include('user.mypage_sub_menu')
{if $flag==1 and hoge == 'myname'}
hogehoge
{else}
fugafuga
{/if}
{% if flag == 1 and hoge == 'myname' %}
hogehoge
{% else %}
fugafuga
{% endif %}
@if ( flag == 1 and hoge == 'myname' )
hogehoge
@elseif ( flag == 2 )
hogehoge2
@else
fugafuga
@endif
{*
ここの間に記述したものはコメントアウトされ表示されません
*}
{#
ここの間に記述したものはコメントアウトされ表示されません
#}
{{--
ここの間に記述したものはコメントアウトされ表示されません
--}}
<a href="{$data|escape:'url'}">クリック</a>
<a href="{{data|escape('url') }}">クリック</a>
<a href="{{data|e('url') }}">クリック</a> {# 【e】 だけでも OK #}
Hello, {!! $name !!}.
{* 2015-07-30 13:04:58 みたいな表示 *}
{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}
{# 2015-07-30 13:04:58 みたいな表示 #}
{{ "now"|date("Y-m-d H:i:s") }}
{# TIMEZONE を指定することもできます #}
{{ "now"|date('d/m/Y H:i', timezone="Europe/Paris") }}
Twig の dateフィルタの 注意
データベースなどから持ってきた日付けを整形する場合はデータが存在するかどうかチェックしてから表示しないと、
データが存在しない場合に 現在の日付が表示されてしまいます
{{ "" | date("Y年m月d日") }} // 現在の日付が表示されます
例1 : if 文で判別する
{% if v.added_date != "" %}{{ v.added_date | date("Y/m/d H:i") }}{% endif %}
例2 : 三項演算子で表示する
{{ v.added_date is empty ? "" : v.added_date | date("Y/m/d") }}
{strip}
<table>
<tr>
<td>
test
</td>
</tr>
</table>
{/strip}
{% spaceless %}
<table>
<tr>
<td>
test
</td>
</tr>
</table>
{% endspaceless %}
<?php $aaa = 999; ?>
{$test_loop|@count}
{{ test_loop |length }}
{"abcdefghijklmnopqrstuvwxyz"|truncate:10}
Twigで truncate を使うには Twig-extensions をインストールします
https://github.com/twigphp/Twig-extensions
からダウンロードして Extensions ディレクトリを Twigディレクトリの下にアップロードし
PHPで $twig->addExtension( new Twig_Extensions_Extension_Text() ); とします。
{{"abcdefghijklmnopqrstuvwxyz"| truncate(20)}}
Twig_Extensions_Extension_Text : http://bit.ly/2jfkzXw
{assign var="new_array" value=","|explode:$str_hoge}
{% set new_array = "one,two,three"|split(',') %}
{{ "my name is hogehoge" | replace({hoge':'fuga'}) }}
{{ '1234'|reverse }}
{# outputs 4321 #}
{{ 123456 | slice(0, 2) }}
{ 'sugoude'|cat:'DJ'|cat:'Master Key'}
{{ 'sugoude' ~ 'DJ' ~ 'Master Key' }}
連結した文字にフィルタをかける場合は、文字列を定義してからフィルタをかけましょう
× NG
{{ $hoge~$fuga|my_filter }}
◯ OK
{%set hogefuga = $hoge~$fuga%}
{{ $hogefuga|my_filter }}
{ $value | string_format:"%02d" }
{{ "%02d" | format(value) }}
{$smarty.template}
{{ _self.getTemplateName().__toString }}
{# テンプレートファイル名 #}
{% if _target.relative %}{% set template_filename = _target.relative %}
{% else %}{% set template_filename = _self.getTemplateName().__toString %}
{% endif %}
{{ url('/') }}
または
{{Request::root()}}
Twig リファレンス : http://git.io/vneJa