Twig Nedir? Nasıl Kullanılır?
Web template sistemleri (engine olarak da ifade edebiliriz) ile ilgili 3. yazı ile devam ediyorum.
Bu yazı öncesinde JavaScript dili ile yazılmış Handlebars.js ve Mustache.js'e değinmiştim. Şimdi sırada Grav teması yazarken ihtiyaç duyacağımız, oldukça geniş bir kullanıma sahip PHP tabanlı bir şablon (template) sistemi olan Twig var. Template yapıları ve işlemleri JavaScript dışından değerlendirildiğinde elbette çok daha farklı çözümler ve diller karşımıza çıkacaktır. Smarty, Blade ve yine Mustache en bilinen örneklerden birkaçı.
Tüm alternatiflerden bahsetmek elbette mümkün değil, en azından benim hedeflediğim noktayı göz önünde bulundurmam gerekirse. Tema hazırlama süreçlerinde Ghost, Grav ve WordPress üzerinden ilerlemek istediğim için template sistemlerini de bu uygulamalarla sınırlandırdım. Örneğin, bu uygulamalar arasında yer almayan ancak daha evvel bahsi geçmiş olan PrestaShop Smarty şablon moturunu kullanmakta1. Ancak, ilerleyen zaman içerisinde, öncelikle ele almak istediğim konular arasında PrestaShop olmadığı için Smarty ile ilgili yazı yayınlamayacağım. Her neyse! Konumuza dönelim ve Twig şablon (template) sistemi motorunun ne olduğuna ve nasıl işlediğine yakından bakalım.
Twig Template Engine
Symfony framework2'un yaratıcılarından Fabien Potencier3 tarafından geliştirilmiştir. Sözdizimi Jinja4 ve Django5 yapılarını temel almaktadır. Süslü parantezler elbette Mustache‘i de hatırlatmaktadır. Symfony2 ile birlikte framework ön tanımlı şablon motoru olarak Twig6'i kullanmaktadır.
Twig Kurulumu
JavaScript temelli templane engine’lerden farklı olarak Twig kurulumu için birkaç farklı işlem uygulamamız gerekir. Elbette, kodların çalıştırılabilmesi için de Apache ve PHP desteği. macOS X Üzerinde Kurulumsuz PHP Çalıştırmak başlıklı yazımda macOS işletim sisteminin halihazırda PHP kodlarını kurulum gerektirmeksizin çalıştırabildiğine değinmiştim. O halde, sırada temel bir kurulum işleminin gerçekleştirilmesi var7.
Twig kurulumu için template engine’in Github sayfasında, release edilmiş son sürümü kullanabiliriz8. İlgili arşiv pakedini sunucuya çıkararak composer yardımıyla kurulum sürecini yürütelim.
composer require twig/twig:~2.7.4
Kısa bir beklemenin vendor klasörümüz oluşturulacaktır. Şimdi lib, src, test ve vendor klasörlerinin olduğu ana dizinimizde içeriği aşağıdaki şekilde olan bir index.php
dosyası oluşturalım.
<?php
require 'vendor/autoload.php';
?>
Bu işlemle birlikte aslında Twig
kurulum sürecimiz de sonlanmış oluyor. Ancak, ilgili kurulumu görüntülemek istediğimizde elbette karşımıza bir çıktı dökülmeyecektir. O halde işlemlerimizi biraz daha devam ettirelim ve bir örnek sayfa oluşturalım.
Twig Kullanımı
Twig yer tutucu olarak {{...}}
kullanmakta. İlgili yer tutucu bir değişkenin içeriğini veya bir işlemin sonucunu barındırabilir. Ek olarak, {#...#}
ifadelerine rastlayabilirsiniz. Bu ifadeler şablonlara yorum eklemek için kullanılırlar ve render edilen sayfaya aktarılmazlar. Son olarak, {%...%}
ifadelerinden bahsedebiliriz. Bu ifade ise döngüler ve if ifadelerini çalıştırmak için kullanılır. Örneğin; {% set myArray = [1, 2] %}
.
Bu örnek için bir tema klasörü oluşturmamız gerekmekte. Ana dizinde themes
adında bir klasör oluşturacağım.
mkdir themes
themes
klasörü bizim kullanacağımız temalar için bir kapsayıcı alan. Aslında işlemlerimiz bu kapsayıcı dizin içerisinde oluşturacağımız alt klasörlerle sağlanacak. WordPress tema yönetimine aşina iseniz themes
altındaki her klasörün birbirinden bağımsız temalar olduklarını anımsayabilirsiniz. Biz de bu mantıkla ilerleyelim ve default
adında themes
klasörü içerisinde yer alan ilk temamızı oluşturmaya başlayalım.
mkdir default
Hatırlarsanız ana dizin içerisinde bir index.php
dosyası oluşturmuştuk. Şimdi bu dosyayı tekrar açıp oluşturduğumuz tema yolunu eklemeliyiz.
$loader = new Twig_Loader_Filesystem('themes/default');
Eklediğimiz satırlarla ilgili daha detaylı anlatımlarım olacak. Şimdilik, özet bir şekilde değinmek gerekirse; themes/default
yolunu ilettiğimiz Twig_Loader_Filesystem
metotu iki adet parametre üzerinden işlem gerçekleştirir. İlk parametre tema dosyaları, ikinci parametre ise temaların yer aldığı ana dizini alıyor. Şimdilik ilk temamızın adı default
. Ancak, farklı bir tema daha oluşturmak istersek (örneğin ilk temaya ulaşamadığında gidilecek bir başka tema olsun) bu temanın adını da ilgili metot içerisinde ifade ederiz. Örnek olarak default
ve project
temalarımızı ifade etmiş olalım ve ilgili kodumuzu güncelleyelim:
$loader = new Twig_Loader_Filesystem(['default','project'], 'themes');
Temalarımızın tanımlanması yeterli değil elbette. Temaları tanımladığımız metotun çağırmadığımız sürece bir işlem gerçekleştirilmeyecektir. Dolayısıyla index.php
dosyasına şu satırı eklemeli ve $loader
‘ı işleme almalıyız.
$twig = new Twig_Environment($loader);
$twig
temaların bulunduğu dizini ve temaları kapsayan Twig_Environment()
‘ı oluşturmakta. Bu metot da 2 parametre almakta. İlk parametre tema detaylarını, ikinci parametre ise cache klasörü detaylarını almakta. Aşağıdaki örnekte $loader
sonrasında çağırlılan $config
değişkenini ve bu değişkenin bir üst satırda aldığı değerleri görmektesiniz.
$config = ["cache" => "cache_folder", "charset => "UTF-8"];
$twig = new Twig_Environment($loader, $config);
Bu işlemleri basit bir şekilde sürdürmek istediğim için çok detaya girmeyecek ve hemen tema dosyasının yapılandırılacağı adıma geçeceğim. Az önce themes
klasörü içerisinde default
adında bir alt klasör yani tema oluşturmuştuk. Bu klasörün içeriğine geçip who.html
adında bir HTML dosyası oluşturalım.
nano /themes/default/who.html
who.html
içeriğine şimdilik klasik bir örnek olarak Hello World! yazdırmamız yeterli olacaktır. Bu işlem için who.html
dosyamızı açıp şu satırı eklememiz yeterli.
<h1>{{whoami}}</h1>
Dosyamızı kayıt edip kapattıktan sonra, yine ana dizinde oluşturduğumuz index.php
dosyasını açmalı ve who.html
dosyasındaki yer tutucuya gönderilecek veriyi ifade etmeliyiz.
echo $twig->render('who.html', ["whoami" => "Hayden Mcguire"]);
index.php
dosyamızın içeriği son durumda şu şekilde olacaktır:
<?php
require 'vendor/autoload.php';
$loader = new Twig_Loader_Filesystem(['default'], 'themes'); // birden fazla tema tanımında ['default', 'project', ...] şeklinde genişletilebilir.
$twig = new Twig_Environment($loader);
echo $twig->render('who.html', ["whoami" => "Hayden Mcguire"]);
?>
Ya da şu kullanımı da tercih edebilirsiniz.
<?php
require 'vendor/autoload.php';
$loader = new \Twig\Loader\FilesystemLoader(['default'], 'themes');
$twig = new \Twig\Environment($loader);
echo $twig->render('who.html', ['whoami' => 'Hayden Mcguire']);
?>
who.html
dosyamızın içeriği ise h1
etiketi içerisindeki {{whoami}}
yer tutucudan ibaret.
<h1>{{whoami}}</h1>
İlgili URL’i açtığımızda karşımıza Hayden Mcguire
ifadesi çıkacaktır9. Evet, şimdilik işlemlerimiz bu kadar. Web şablon sistemleri ile ilgili bir dizi yazının ardından umuyorumki tema geliştirme adımlarına da hızlıca geçebileceğiz. Amacım template engine karşılaştırması yapmak olmadığı ve temel olarak WordPress, Grav ve Ghost tema hazırlama süreçlerini hedef aldığım için avantajlar ve dezavantajlardan bahsetmedim. Ancak, farklı ihtiyaçlar çerçevesinde template engine araştırması yapıyorsanız, aşağıdaki yazılara göz atabilirsiniz.
İleri Okumalar
- Templates. PrestaShop Developer Documentation ↩
- Symfony. PHP framework for web projects ↩
- Fabien Potencier. GitHub ↩
- Jinja. A modern and designer-friendly templating language for Python ↩
- Templates. Django Documentation ↩
- Twig. A modern template engine for PHP ↩
- Twig. A modern template engine for PHP ↩
- Releases. twigphp/Twig. GitHub ↩
- Twig for Template Designers. Symfony ↩