Zırvalama Tahtası symfony, debian, PHP5, SQL ve pek çok ayrıntı

2Feb/090

symfony template cache ve user culture

Eğer bir gün gelirde symfony kullanarak çoklu dil destekli bir uygulama geliştirmeye kalkarsanız cachelediğiniz templatelerin kullanıcı dilini değiştirdiğinde aynı kaldığını göreceksiniz, bunun nedeni cache sistemi içerisinde kullanıcının dili (user->getCulture()) dikkate alınmadan cache edilmesidir.

Bunu önlemek için partial cache sırasında include_partial, include_compotents, include_slot, include_compontent_slot ve cache fonksiyonu bildirimlerinde ikinci parametre olarak verilen arrayin içerisinde sf_cache_key ile kullanıcıya ait dil seçeneğini belirtebilirsiniz.

Ancak bu yöntem bir süre sonra sizi oldukça sıkacaktır, bir sayfada 5 adet include_XXXX methoduna yazacağınız array(’sf_cache_key’ => $sf_user->getCulture()) satırı fazla yormayabilir, ancak bunu pek çok template içerisinde yapmak istediğinizde canınız sıkılabilinir. Ancak kısa bir yol ile bunu çok kolay bir şekilde önleyebilirsiniz.

symfony template cache sistemi için varsayılan olarak sfViewCacheManager sınıfını kullanır, bu sınıfın oluşturulması sırasında iki adet parametre alır, birincisi sfContext nesnesi, diğeri ise view cache için kullanılacak olan cache motoru’nun instance’sı. İlk olarak yapmamız gereken sfViewCacheManager sınıfını extend eden yeni bir cache manager yazmak daha sonra ise symfony’e cache manager olarak bu sınıfı kullanması gerektiğini söylemek.

<?php
// lib/view/myViewCacheManager.class.php
 
class myViewCacheManager extends sfViewCacheManager
{
   public function __construct($context, sfCache $cache)
  {
     $cache->setOption('prefix', $context->getUser()->getCulture());
     parent::initialize($context, $cache);
  }
}

ve apps/AppName/config/factories.yml içerisinde,

view_cache_manager:
   class: myViewCacheManager

Artık cache manager, cache edilecek sayfalarda cache için key üretip bunu cache motoruna verdiğinde cache moturu bu key’in öncesine kullanıcıya ait dil seçeneğinide ekleyecektir. Böylece kullanıcının diline çevirilmiş template daha önce cache edilmiş ise cache motorundan istenecek aksi halde template işlenip cache motoruna saklaması için iletildikten sonra kullanıcıya görüntülenmek üzere gönderecektir.

1Dec/080

ve symfony 1.2 stable

Dün (30 kasım pazar 2007) akşam saat 1:30 sıralarında symfony 1.2 stable sürümü duyuruldu, bununla beraber artık symfony içerisinde plugin olarak yer alan Propel’in 1.3 versiyonuna geçildi, bu güncelleme ile performans üzerinde bir artış olacağından kuşkunuz olmasın. Symfony 1.2 ile gelen yenilikler aslında 1.1 ile duyurulmuştu bunlardan en önemlileri, framework’ü oluşturan alt sistemlerin parçalanması ile ortaya çıkan bağımsız parçalar, task, form, routing ve test sistemi arasında yapılan yeni iyileştirmeler. özellikle task sisteminde yeni eklenen ask ve askConfirmation ile kendi yazacağımız task’lar için kullanıcıdan interaktif veri alabileceğiz.

Symfony 1.2′nin neler getirdiğine ilişkin daha detaylı bilgiyi What’s new sayfasından alabilirsiniz. mevcut uygulamalarınızı güncellemek için ise bu adresi kontrol etmenizde fayda var, ardından yararlı bilgiler sayfasına bir göz atın.

22Nov/08Off

symfony 1.2RC1

symfony projesinden bir son dakika gelişmesi, 1.2RC1 sürümü duyuruldu, elbette şu an için production içerisinde kullanmak için henüz yeterli olgunlunluğa ulaşabilmiş değil ancak bu hızla ilerlerse sanırım yılbaşı için güzel bir hediye alacağız, 1.2 stable ;) symfony 1.2′deki en büyük değişiklik yeni propel sürümü 1.3 kullanımı, Creole db abstraction layer yerine phpnin native PDO arayüzü ile daha hızlı çalışan bir propel kütüphanesi, Request nesnesi içerisindeki GET, POST constantlarının integer değerlerinin değiştirilmesi, (integer yerine artık uppercase method adı geliyor (string GET)), eğer benim gibi 1.1 ile geliştirmekte olduğunuz bir projeniz var ise 1.2 sürümüne yükseltmekte fazla acele etmeyiniz, ama yinede http://www.symfony-project.org/installation/1_2/upgrade adresine göz atmanızda fayda var,
Bol eğlenceler,

5Nov/080

Yahoo! ve symfony

Yahoo!’nun yakın zamanda kimi uygulamarını symfony ile yeniden yazdığını symfony ile ilgilenen herkez duymuştur sanırım, yahoo! şimdide geliştirme sırasında kendi içerisinde geliştirdiği bazı pluginleri symfony kullanıcılarına açtı, ysfR3Plugin ve ysfDimensionsPlugin yakın zamanda symfony’nin yahoo! gibi diğer şirketler tarafından desteklendiğinin görürsek şaşırmayacağım.

plugin’lerden bahsetmek gerekirse ysfDimensionsPlugin uygulamanızın çeşitli kullanıcı/çevresel değişkenlerinden etkilenerek şekillenebilmesi, örneğin pek çok firma logo’larının altına hizmet verdiği kullanıcının ülkesi için bir metin ekliyor (Google türkiye gibi) veya kullanıcın dil seçimine göre uygulamanın template’inin değiştirilmesi gibi işlemler için kullanılan bir plugin.

ysfR3Plugin ise yine yahoo! tarafından geliştirilen ve http://developer.yahoo.com/r3/ adresinden detaylı bilgi alabileceğiniz gibi bir yerelleştirme ve çeviri api’si olan r3′ü kullanarak uygulamanızın yerelleştirme ve çeviri işlerini yürüten bir eklenti.

31Oct/080

hadi symfony’yi pear paketi yapalım

Symfony’nin her hangi bir sürümünü internet bağlantısı olmayan bir makineye kurmamız gerekebilir, özellikle hor görülmüş, geliştirilmesi durmuş olan projeler için eski symfony sürümlerine ihtiyaç duyulabilinir veya kendi symfony sürümümüzü (patchler, yeni libraryler) kullanmış olabilirsiniz. . Bu durumda ihtiyacımız olan şey kurulum yapılacak olan makinede php5-pear bileşeni ile internet erişimi olan bir makine olacaktır. Yapılması gereken ise istenilen her hangi bir symfony sürümünü pear için paketlemektir.

İşlemler oldukça basit olmasına karşın nasıl yapılacağını bilmiyorsanız karnınızı ağrıtabiliyor. Size pake adındaki ağrı kesiciyi tavsiye edebilirim.

Pake symfony’nin yaratıcılarından Fabien’nin hazırladığı bir kütüphaneve araç, temel olarak Ruby’de bulunan ve make benzeri uygulama inşası için kullanılan rake’in PHP karşılığı.

Eh önce ilacımızı bulmamız sonrada elimize almamız gerekiyor.

#### ilacımızı bulalım ####

# pear channel-discover pear.symfony-project.com

#### ilacımızı alalım ####

# pear install symfony/pake

Artık ilaç elimizde olduğuna göre bardağımıza biraz su almamız iyi olacaktır ilacı yutmak kolay olsun diye.

$ svn co http://svn.symfony-project.org/tags/${VERSION_NAME} ./symfony-custom
$ cd ./symfony-custom

Şu anda bir elimizde içi su dolu bir bardak, diğer elimizde ise ilacımız var, hadi karnımızın ağrısını dindirelim artık.

$ pake relase symfony-custom-version.no alpha/beta/stable

Artık elimizde symfony-custom-version.no.tgz isimli bir pear paketi var, yapmamız gereken tek şey bu paketi istediğimiz makineye taşımak ve kurulumu gerçekleştirmek.

# pear install ./symfony-custom-version.no.tgz

Gördüğünüz gibi karın ağrısı hiç kalmadı.

4Oct/080

symfony 1.1.4 sürümü duyuruldu

Dün yayınlanan yeni sürümde çok önemli bir güvenlik açığı kapatıldı, bu güvenlik açığı kullanılan form widgetları içerisinde bulunan hata mesajlarında kullanılan kullanıcının girdiği verilerin kullanılmasından kaynaklanıyordu, escape edilmeden kullanılan bu veriler ile sisteminizde xss açığı oluşturmakta idi.

En kısa zamanda yeni gerçek ortamda bulunan sistemlerinizi yeni sürüme update etmenizi tavsiye ederim.

8Aug/080

Bu sıralar

Orada olmayı çok istiyorum

30Jun/080

Ve beklenen an

Symfony 1.1 kararlı sürüm bu gün itibari ile duyuruldu,
yeni yapısı, sfForm sınıfı, routing sınıfı üzerinde cache desteği, yeni görev sistemi, ve yml parser’i ile göz dolduran yeni symfony 1.1 hepimize hayırlı uğurlu olsun.

(Yazar): Sevgili günlük..
(Günlük): Sevgili yazar..
(Yazar): Symfony 1.1 için açılış yapacam nerede lan bunun kırmızı kurdelesi?
(Günlük): Gözüne bağladılar abi…

29Jun/080

sfForm ile çalışmak

sfForm symfony framework‘ü içerisinde geliştirilen ve yeni versiyonu ile gelecek olan yeni bir
form tasarım ve otomasyon aracıdır. Kolay kullanımı ve özelliştirilebilmesi yetenekleri ile göze çarpan bu
yeni aracı biraz daha yakından tanımak için bir çalışma içeriside çıkan notlarımı aşağıda bulabilirsiniz.
sfForm sınıfı

sfForm sınıfı ArrayAccess interface’ini impletemte eden bir sınıftır böylece sınıf
içerisindeki özelliklere tıpkı bir arrayin elemanlarına erişebilir gibi kullanabiliriz. Hazırladığımız formlar eğer veri tabanı ile direk iletişim kurmayacak ise sfForm sınıfından türetilmeli aksi halde bir abstract sınıf olan sfPropelForm sınıfından türetilmelidir.

sfform ile form oluşturmak için formumuza uygun bir sınıf ismi vererek sfForm sınıfından türetmeliyiz,
örnek:

class projectNameRegister extends sfForm
{
 
}

Form nesnemiz şu anda oldukça kullanışsız bir nesnedir, kullanışlı hale getirmek için sfForm sınıfını içerisinde çağırılan configure methodunu tanımlayıp içerisinde formumuza ait input elemanlarını yerleştirmemiz gerekiyor. Bunun için ise form input alanlarını taşıyan sfWidgetFormSchema nesnesinden faydalanıyoruz, bu nesnenin ilk parametresi bir array olup içerisindeki elamanlar birer sfWidgetFormInput nesnesi taşırlar.

class projectNameRegister extends sfForm
{
  public function configure()
  {
    $formWidgetSchema = new sfWidgetFormSchema(
      array(
        'username' => new sfWidgetFormInput();
      )
    );
 
    $this->setWidgetSchema($formWidgetSchema);
  }
}

sfWidgetFormInput nesnesi 2 adet array parametre almaktadır. ilk parametre input alanına ait seçenekler diğeri ise input etiketine eklemek istediğimiz öznitelikler,

class projectNameRegister extends sfForm
{
  public function configure()
  {
    $formWidgetSchema = new sfWidgetFormSchema(
      array(
        'username' => new sfWidgetFormInput(array(), array('id'=>'register_username'));
      )
    );
 
    $this->setWidgetSchema($formWidgetSchema);
  }
}

Artık formumuzu view katmanında kullanabiliriz,

tek yapmamız gereken action içerisinde formunuza ait yeni bir instance oluşturmak ve view katmanında bu instance’ı render etmesini sağlamak bunun için sfForm nesnesine ait __toString
methodundan yardım alabileceğimiz gibi dahada özelleştirmek için her form elemanına tek tek erişerek her elemanı form içerisinde istediğimiz yerde görüntüleyebiliriz.

action:

public function executeRegister($request)
{
  $registerForm = new projectNameRegister();
  if($request->isMethod('post'))
  {
    $registerForm->bind(array(
      'username' => $request->getParameter('username')
    ));
  }
 
  $this->registerForm = $registerForm;
}

view:

<form action="<?php echo url_for('/register') ?>">
  <?php echo $registerForm; ?>
</form>

yada

1
2
3
4
 
<form action="<?php echo url_for('/register') ?>">
  <div class="field-container"><?php echo $registerForm['username']->render(); ?></div>
</form>

Formumuzun post edilmesi halinde ise formumuza ait input elemanlarının veri doğrulamasını yine form nesnemiz içerisinde gerçekleştiriyoruz. Bu işlemide tıpkı sfWidgetFormSchema nesnesi gibi bir başka nesneyi sfValidatorSchema nesnesini kullanarak gerçekleştiriyoruz.
sfValidatorSchema nesnesi bir array parametre almakta ve bu array’in elemanları formumuzun input alanlarına ait doğrulama nesnelerini taşımaktadır.

sfValidatorXXXXX nesneleri iki adet array parametre almaktadır, her validator sınıfının kendi parametreleri vardır, ancak her sınıf içerisinde required, trim ve empty_values isimli parametreler varsayılan olarak gelmektedir, ayrıca hata mesajları için
invalid ve required isimli iki hata mesajı öntanımlıdır. ilk parametre doğrulama işlemlerinin neler olduğunu tanımlarken ikinci parametre ise her doğrulama işleminin başarısızlık durumunda kullanıcıya verilecek bilgi mesajlarını içermektedir.

class projectNameRegister extends sfForm
{
  public function configure()
  {
    $formWidgetSchema = new sfWidgetFormSchema(
      array(
        'username' => new sfWidgetFormInput(array(), array('id'=>'register_username'));
      )
    );
 
    $validationSchema = new sfValidatorSchema(array(
      'username' => new sfValidatorString(array(
          // parametre   // değeri
          'min_lenght' => 3
        ),
        array(
          // parametre doğrulaması başarısız ise kullanıcıya verilecek mesaj
          'min_lenght' => 'your username too short, min 3 char'
        ))
    ));
 
    $this->setWidgetSchema($formWidgetSchema);
 
    $this->setValidatorSchema($validationSchema);
  }
}

Artık doğrulama niteliğini kullanmak için action içerisinde bir iki ufak değişiklik yapmamız gerekmektedir.

action:

public function executeRegister($request)
{
  $registerForm = new projectNameRegister();
  if($request->isMethod('post'))
  {
    $registerForm->bind(array(
      'username' => $request->getParameter('username')
    ));
 
    if($registerForm->isValid())
    {
      // form verileri doğru ise yapılacak işlemler.
      // eğer formumuz bir sfPropelForm nesnesi ise ->save() methodunu kullanarak
      // yeni veya güncellenmiş verileri database üzerinde saklayabiliriz.
    }
  }
 
  $this->registerForm = $registerForm;
}

Eğer formumuzu özelleştirmek istersen bunun iki adet farklı yolu bulunmaktadır,
birincisi yeni bir form formatter nesnesi hazırlama, diğeri ise form nesnesi içerisindeki elemanlara erişerek html içerisine gömmek, ilk yol daha kolay gibi dursada şu an için bazı kısıtlayıcı durumu bulunmakdatır, bunların en önemlisi form alanlarındaki doğrulama hatası durumunda doğrulama hatasını taşıyan html etiketine form-error-username gibi bir id verilemiyor oluşudur. buna rağmen bu durum sizi rahatsız etmeyebilir, o halde yeni bir formatter sınıf hazırlamak oldukça kolaydır. sfForm sınıfına ait iki adet formatter sınıf mevcuttur birincisi formlarımızı table olarak görüntülerken diğeri liste elemanları olarak görüntülemektedir ve varsayılan formatter aracı table’dır. yeni bir form formatter sınıfı hazırladıktan sonra tek yapmamız gereken formumuz içerisinde bu formatter sınıfını kullanmak istediğimizi belirtmektir.

class projectNameRegister extends sfForm
{
  public function configure()
  {
    $formWidgetSchema = new sfWidgetFormSchema(
      array(
        'username' => new sfWidgetFormInput(array(), array('id'=>'register_username'));
      )
    );
 
    $validationSchema = new sfValidatorSchema(array(
      'username' => new sfValidatorString(array(
          // parametre   // değeri
          'min_lenght' => 3
        ),
        array(
          // parametre doğrulaması başarısız ise kullanıcıya verilecek mesaj
          'min_lenght' => 'your username too short, min 3 char'
        ))
    ));
 
    $this->setWidgetSchema($formWidgetSchema);
 
    $this->setValidatorSchema($validationSchema);
    // hey yeni bir formatter hazırladık bunu kullan ay sfForm aracı.
    $this->getWidgetSchema()->setFormFormatterName('Register');
  }
}

Form formatter sınıfı mutlak olarak sfWidgetFormSchemaFormatter abstract sınıfından extend etmelidir. yeni hazırlanan formatter sınıfı içerisinde sfWidgetFormSchemaFormatter da bulunan öz nitelikleri değiştirmemiz yeterlidir.

class sfWidgetFormSchemaFormatterRegister extends sfWidgetFormSchemaFormatter
{
    $rowFormat       = "<div class='form-field-container'>n %label%n  %field%n %help%n %error%n %hidden_fields%</div>n",
    $errorRowFormat  = "<div class='form-error'>n%errors%</div>n",
    $helpFormat      = "<span class='form-help'>%help%</span>",
    $decodatorFormat = '';
}

sfForm label metinlerini form input alanlarını taşıyan array içerisindeki eleman isimlerinden alır, ancak kimi durumda bunu değiştirmemiz gerekir bunun için yapılacak en kısa ve kolay yok form nesnemiz içerisinde
widgetSchema nesnesine ait setLabels methodunu kullanmak olacaktır.

class projectNameRegister extends sfForm
{
  public function configure()
  {
    $formWidgetSchema = new sfWidgetFormSchema(
      array(
        'username' => new sfWidgetFormInput(array(), array('id'=>'register_username'));
      )
    );
 
    $validationSchema = new sfValidatorSchema(array(
      'username' => new sfValidatorString(array(
          // parametre   // değeri
          'min_lenght' => 3
        ),
        array(
          // parametre doğrulaması başarısız ise kullanıcıya verilecek mesaj
          'min_lenght' => 'your username too short, min 3 char'
        ))
    ));
 
    // username alanına ait label text değerini değiştir.
    $formWidgetSchema->setLabels(array(
      'username' => 'Choose your username'
    ));
 
    $this->setWidgetSchema($formWidgetSchema);
 
    $this->setValidatorSchema($validationSchema);
    // hey yeni bir formatter hazırladık bunu kullan ay sfForm aracı.
    $this->getWidgetSchema()->setFormFormatterName('Register');
  }
}

sfForm aracına ait edindiğim bilgileri en kısa zamanda tekrar burada bulabilirsiniz.

22Jan/080

Yeni yılda yeni symfony sürümü (1.0.11)

2008'in ilk symfony sürümü bu gün 1.0.11 ile duyuruldu, her yeni sürümde olduğu gibi bu
sürümde bugfix içeriyor, yeni özellikler için (sfForm ve yeni validation sistemi gibi)
1.1 versiyonunu bekleyemeye devam edeceğiz. 1.0.11 sürümünde bulunan bugfixlerden bazıları ise şöyle,

  • r6765, r6766: getPresentationFor() methodu içerisindeki hata mesajları düzeltildi (hata #1527)
  • r6764: sfPager class'ı içerisinde bulunan haveToPaginate() methodundaki mantık hatası düzeltildi (hata #1512)
  • r6768, r6769: sfWebRequest içerisinde mime type caching eklendi (hata #1811, #1846)
  • r6761, r6762: text olmayan içerikler için karakter seti gönderilmesi engellendi (ie'nin kafası karışıyordu :) ) (hata #1811, #1968)
  • r6743: dökümantasyon içerisinde bulunan yazım hataları (hata #2580, #2596, #2518)
  • r6740, r6741: creole içerisinde bulunan postgreSQL için sequence listesindeki hata düzeltildi (propel-build-schema) (hata #2584)
  • r6987, r6988: sfWebresponse.class.php içerisinde bulunan caching-Bug'ı düzeltildi (hata #2764)
  • r6649: 'Content-Type' HTTP başlık değerinin tekrar edilmesi düzeltildi (hata #1756, #2557, #2402, #2398)

Her geçen gün daha güçlü ve daha stabil bir framework sahibi oluyoruz ;)