Symfony2 Kullanıcıları İçin Twig Eklentisi Geliştirme

Share Button

Bu yazıda Symfony2 ile bundle olarak gelen TWIG template motoru için basitce nasıl eklenti geliştirebileceğimizi inceleyeceğiz.

Eklentiler Ne İşe Yarar ?

TWIG Eklentileri template içerisinde özel olarak geliştirdiğiniz fonksiyonlar, filtreler ve global değişkenleri kullanabilmenize olanak sağlar.

Ne Zaman Eklentiye İhtiyaç Duyulur ?

Eklentiler sıklıkla önyüzde göstermek istediğiniz bilgiler, template context’ ine değişken gönderek yapmak zorunda olduğunuz kontrolleri ve bundan kaynaklanan kod tekrarlarını önlemek için kullanılır. Aşağıda twig eklentisi kullanımına örnek durumlardan biri görülmektedir.

Örnek Durum:

Ekrana fiyat bastırmamız gereken her durumda sistem kurunu çekip önyüzde göstermemiz gerekiyor.

Hatalı Çözüm 1:

Hardcoded olarak kuru template’de belirtir, kur değişiminde tüm templateleri güncelleriz :)

...
{{ product.price }} TL
...

Hatalı Çözüm 2:

İlgili controller aksiyonunda sistem kurunu çeker, template context’ine iletiriz. Ancak bu işlemi fiyat geçen her aksiyonda yapmamız gerekir.
company/CatalogBundle/Controller/ProductController.php:

	<?php
	class ProductController extends Controlller
	{
		//...
		public function detailAction($productId)
		{
			//...
			// $product = ...
			// $configuration = ...
			//..
			$currencySymbol = $configuration->system->currencySymbol;
			return $this->render('CompanyCatalogBundle:Product:detail.html.twig', array(
				'product' => $product,
				'currencySymbol' = $currencySymbol
			));
		}
		//...
	}

company/CatalogBundle/Resources/views/Product/detail.html.twig:

...
{{ product.price }} {{ currencySymbol }}
...

Eklenti Kullanarak Gerçekleştirebileceğiniz Doğru Çözüm:

Aşağıda gördüğünüz üzere kendi geliştirdiğimiz twig eklentisindeki price filtresini kullanarak ekrana “25.00 TL” şeklinde biçimlendirilmiş ve güncel sistem kurunu içeren bir çıktı basmak son derece basit.

...
{{ product.price | price }}
...

TWIG Eklentisi Geliştirmek

TWIG Eklentileri, aşağıdaki arayüzden görebildiğiniz üzere template tarafında kullanabileceğiniz fonksiyonlar, global değişkenler ve filtreler içerebilmektedir.

interface Twig_ExtensionInterface
{
    /**
     * Initializes the runtime environment.
     *
     * This is where you can load some file that contains filter functions for instance.
     *
     * @param Twig_Environment $environment The current Twig_Environment instance
     */
    function initRuntime(Twig_Environment $environment);

    /**
     * Returns the token parser instances to add to the existing list.
     *
     * @return array An array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances
     */
    function getTokenParsers();

    /**
     * Returns the node visitor instances to add to the existing list.
     *
     * @return array An array of Twig_NodeVisitorInterface instances
     */
    function getNodeVisitors();

    /**
     * Returns a list of filters to add to the existing list.
     *
     * @return array An array of filters
     */
    function getFilters();

    /**
     * Returns a list of tests to add to the existing list.
     *
     * @return array An array of tests
     */
    function getTests();

    /**
     * Returns a list of functions to add to the existing list.
     *
     * @return array An array of functions
     */
    function getFunctions();

    /**
     * Returns a list of operators to add to the existing list.
     *
     * @return array An array of operators
     */
    function getOperators();

    /**
     * Returns a list of global variables to add to the existing list.
     *
     * @return array An array of global variables
     */
    function getGlobals();

    /**
     * Returns the name of the extension.
     *
     * @return string The extension name
     */
    function getName();
}

Kullanıcılar tarafından geliştirilecek olan eklentiler, Twig’in bu arayüzü uyarlayan Twig_Extension sınıfını extend eden bir sınıf şeklindedir. Yapılacak geliştirmeye bağlı olarak arayüzdeki ilgili metodlar ezilerek template tarafında kullanacağımız fonksiyon, filtre veya global değişken ile ilgili geliştirmeyi yapabiliriz.

Örnek twig eklentisi sınıfı:

<php
class CatalogExtension extends \Twig_Extension
{
	public function getFilters()
	{
		return array(
			//...
		);
	}
}

Arayüzde görülen her bir metod, filtre, fonksiyon veya global değişkenin adını ve çalıştıracağı callback ile ilgili bilgileri içeren bir dizi dönmelidir.
Company/CatalogBundle/Twig/Extension/CatalogExtension.php:

<php
namespace Company\CatalogBundle\Twig\Extension;

class CatalogExtension extends \Twig_Extension
{
	public function getName()
	{
		return 'catalog_extension';
	}

	public function getFilters()
	{
		return array(
			new \Twig_SimpleFilter('price', array($this, 'priceFilter')),
		);
	}

	public function priceFilter($price)
	{
		//..
		// $configuration = ...
		$currencySymbol = $configuration->system->currencySymbol;
		return sprintf("%s %s"
			number_format($price, 2, ".", ","),
			currencySymbol);
	}
}

Eklentimizi kullanabilmek için servis olarak kaydediyoruz.
Company\CatalogBundle\Resources\config\services.yml:

services:
	comapny.catalog.twig.extension.catalog:
		class: Company\CatalogBundle\Twig\Extension\CatalogExtension
        tags:
            - { name: twig.extension }

Son olarak geliştirdiğimiz eklentideki filtreyi nasıl kullandığımızı tekrar hatırlayalım.

...
{{ product.price | price }}
...

Diğer kullanım şekilleri ile ilgili detaylı bilgi için bu sayfayı ziyaret edebilirsiniz.

Share Button

About İbrahim Gündüz

1983 yılında İstanbul’da doğdu. İlkokul yıllarında cobol ve basic le olan tanışması, yazılıma olan ilgisini arttırdı 2005 yılında. Uludağ Üniversitesi Teknik Bilimler Meslek Yüksek Okulu Elektronik bölümünden mezun olan Gündüz, çeşitli alanlarda faaliyet gösteren kurumlarda yazılım geliştirici olarak görev almıştır. Mesleki ilgi alanları, ölçeklenebilir sistemler, uygulama entegrasyonları ve ödeme sistemleridir. Halen Markafoni back end geliştirici olarak çalışmaktadır.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir