380 likes | 503 Views
Bir ZendFramework Tasarımı Batur Orkun Bilkent Üniversitesi Bilgisayar Merkezi http//baturorkun.com Ozan Hazer Bilkent Üniversitesi Bilgisayar Merkezi http://huysuzadam.com. ZendFlexible. zendflexible.com. ZendFlexible Yüklemeler. http://framework.zend.com/
E N D
Bir ZendFramework Tasarımı Batur Orkun Bilkent Üniversitesi Bilgisayar Merkezi http//baturorkun.com Ozan Hazer Bilkent Üniversitesi Bilgisayar Merkezi http://huysuzadam.com ZendFlexible zendflexible.com
ZendFlexible Yüklemeler • http://framework.zend.com/ adresinden ZendFramework indirilir ve sunucuda bir yere koyulur. Burasının webroot altında bir yer olmasına gerek yoktur. • http://zendflexible.com/download adresinden ZendFlexible çekilir ve webroot altında bir dizine kopyalanır.
ZendFlexible Dizin Yapısı • aplication • config • controllers • _widgets • admin • error • login • panel • … • models • views • helpers • layouts • templates • _widgets • admin • error • login • panel • … • data • fonts • lang • sql • lib • Zf • Auth • Model • Paginator • Router • View • vendor • public • css • flash • images • js • scripts • build • cron • lib
ZendFlexible Dizin Yapısı Detayları application • Kodlarınızı yazacağınız asıl alan burasıdır. Diğer dizinler, genel kütüphaneler, resimler, stiller, script’ler ve tüm varlıkları içerir. • Config altında yer alan config.php; tüm yapının ve ayarların kontrol edildiği parametre değerlerini barındırır. • Controllers dizini; sisteminizdeki servislerin yer aldığı temel bölümdür. Burasını BaseUrl den sonraki kök dizin olarak düşünebilirsiniz. Ekrana yazdırılacak değerler burada kaynağından çekilerek template dosyasına gönderilir. Burada herhangi bir ekrana yazdırma işlemi ve tasarım yer almaz. Eğer ekrana yazdırma işlemi varsa buradaki her php dosyası için “views/templates” dizininde birebir karşılığı olan “phml” dosyasında yapılır. • Models: Burası sistemin class deposudur. Sisteminiz uygun class yapılarına bölünerek burada model olarak tanımlanır. Controllers altındaki php dosyaları bu modelleri kullarak şablonlar için veri hazırlar.
ZendFlexible Dizin Yapısı Detayları application • Views dizini altındaki ”templates” dizini; verilerin ekrana basıldığı tasarım bölümüdür. Bu kısımda daha cok html, css ve javascript kodları yeralır. Buradaki dosyalar “phtml” uzantılı olmalıdır ve “Controllers”dizininden atanan verileri ekrana basarlar. • “Layouts” dizini, Zend_Layout kullanımı içindir. Layout kullanımını congif.php de loadModules bölümünden ayarlayabilirsiniz. • $config['loadModule']['Layout'] = true; • Eğer layout kullanımını kaldırırsanız header-footer yapısına dönmüş olursunuz. Şablon dosyalarına header ve footer dosyalarını el ile yüklemeniz gerekir. Modül aktif iken layouts/defaults.phtml dosyasına stardart tasarımınızı yerleştiriniz. • Views dizini altındaki “helpers” dizini; ZendFramework’un helper yapılarını içerir. Burada işleri kolaylaştıran hazır küçük class yapıları vardır. Örnegin bir tarihi formatlamak için, BreadCrumb oluşturmak için vb… Bunlar doğrudan phtml dosyaları içerisinden çağrılabilirler. Bu dizinde ZendFlexible’ın kendisi için gerekli olan ve çok genel kullanıma sahip yapılar yer almaktadır. Eğer projeye özel bir helper (widget) oluşturcaksanız controllers ve templates altındaki “_widgets “ dizinini kullanmalısınız.
ZendFlexible Dizin Yapısı Detayları data • Burası daha çok tasarım dosyalarının depolandığı kısımdır. Ancak sistemde kullandığınız xml ya da cvs gibi veri dosyalarını da burada saklayabilirsiniz. Buradaki en önemli alt dizin “lang” dizinidir. Eğer dil desteği (Zend_Translation) kullanacaksanız “po” ve “mo” dil dosyaları da burada yer alır. Dil dosyalarının isimleri “config.php” den ayarlanabilir.
ZendFlexible Dizin Yapısı Detayları lib • Hem ZendFilexiable’ın çekirdeğine ait, hem de dışarıdan yükleyerek kullanacağınız kütüphaneler burada yer alır. Projeye özel kullamak istediğiniz kütüphaneleri “vendor” altında dizinlere koyabilirsiniz. Burada yer alan “functions.php” ZendFilexible’e ait ve çok genel kullanıma sahip yararlı fonksiyonları barındırır. Eğer projeye özel fonksiyonlar yazmak isterseniz “functions-extra.php” dosyasına yazınız.
ZendFlexible Dizin Yapısı Detayları public • Bu dizin dışarıdan yani web üzerinde doğrudan erişilebilen tek dizindir. Adından da anlaşılacağı gibi herkese açık olan css, javascript, flash kodları ve tüm resimler burada yer alır. Buraya eklediğiniz ekstra bir dizin olursa ona web üzerinden direk erişim sağlamak için “.htacess” dosyasına küçük bir ekleme yapmak zorundasınız. Çünkü direk erişilebilir tüm dizinler .htacess dosyasında tanımlanmak zorundadır. • RewriteRule (css|js|images|info|flash|dialog|help|work|content)/(.*) public/$1/$2 [L]
ZendFlexible Dizin Yapısı Detayları scripts • Bu dizini sistemin inşası sırasında yazılan veya sistemin sonunda cronjob da otomatik çalışması için yazılan script’leri barındırır. Burası genel olarak konsoldan çalışmak üzere planlanmıştır. Eğer web üzerinden de buraya erişmek isterseniz “.htaccess” dosyasındaki şu satırın başındaki comment işaretini “#” kaldırınız: • #RewriteRule (scripts)/(.*) scripts/$2 [L] • “.htaccess” dosyası; sistemin çalışması için hayati önemli olan dosyadır. Eğer sunucunuzda .htaccess ‘e izin vermek istemiyorsanız. Buradaki komutlari VirtualHost ya da apache.conf dosyalarına yazabilirsiniz.
ZendFlexible Sistem Ayarları (config.php) Sisteme ait tüm genel ayarlar “application/config/config.php” de bulunur. “$config“ isimli dizi şeklinde tek bir Array altında tanımlanırlar. • $config['maintenanceMode'] : false; false / true True değeri aldığında otomatik olarak “error/maintenance” controller ‘a yönlendirilir. Ekrana çıkacak mesaj $config['maintenanceMessage'] parametresi ile belirlenir. • $config['trustedIP'] = array(); Array(ip adresleri) 'maintenanceMode’ , false değerine sahip olsa bile burada belirtilen IP’ler siteye erişebilirler
ZendFlexible Sistem Ayarları (config.php) • $config[bannedIP'] = array(); Array(ip adresleri) Burada belirtilen IP adresleri hiçbir şekilde siteye erişemezler. Ekranda sadece bir mesaj belirtilir ve bu mesaj $config['bannedIpMessage'] parametresi ile tanımlanır. Bir IP’den atak olduğunu tespit ettiğinizde o IP’yi listeye ekleyiniz. $config[‘bannedIP'] = array(‘192.168.1.100’, ‘172.30.10.230’ );
ZendFlexible Sistem Ayarları (config.php) • $config['developer']['emails'] = array(); Array( email adresleri) Sistem “Prod” modda iken bir hata oluşursa, hata ayrıntısı burada tanımlı olan email adreslerine mail atılır. • $config['developer']['notificationMailTitle'] = “string” “Hata Oluştu!” $config['developer']['emails'] parametresinde tanımlanan adreslere atılan epostanın başlık (subject) kısmını tanımlar.
ZendFlexible Sistem Ayarları (config.php) • $config['adminUsers'] = Array(key => value) Array('batur'=>"Batur Orkun", "ozan"=>"Ozan Hazer") “admin” controller ‘ı güvenlik altına almak için düşünülmüştür. Login işlemi gerçekleştirmiş kullanıcılardan Admin yetkisine sahip olanlarını tanımlar. Dizinin “key” değeri “kullanıcı id” , “value” değeri ise değer tanımlamak icin kullanılır. Örneğin; aşağıda 3 adet admin ve onların hakkı olan domain’ler tanımlanmıştır. $config['adminUsers'] = Array( 'batur@bilkent.edu.tr' => Array('bilkent.edu.tr', 'fen.bilkent.edu.tr'), ‘goktas@bilkent.edu.tr' => Array('bilkent.edu.tr'), 'cayfer@bilkent.edu.tr' => '*' );
ZendFlexible Sistem Ayarları (config.php) • $config['translation']['langs'] = Array(); Sitenizde eğer dil desteği olacaksa hangi dilleri desteklediğinizi burada belirtiniz. $config['translation']['langs'] = array( 'tr' => 'Türkçe', 'en' => 'İngilizce', 'nl' => 'Hollandaca (Dutch)' ); • $config['translation']['config'] = Array(); Sitenizde eğer dil desteği olacaksa varsayılan ayarları burada tanımlayınız. $config['translation']['config'] = array( 'adapter' => 'gettext', 'data' => "tr.mo", 'locale' => 'tr', 'options' => array('disableNotices' => true) );
ZendFlexible Sistem Ayarları (config.php) • $config['facebook']['apiKey'] = '***' • $config['facebook']['apiSecret'] = '***' Eğer facebook login kullanacaksanız 'apiKey' ve 'apiSecret' değerlerini buraya giriniz. Bu değerler facebook sitesi üzerinden alınabilir. Facebook login; kullanıcıların sitenize üye olurken facebook üzerinden üye olmasını sağlar. Böylece facebook’a her giriş yaptığında sizin sitenize de giriş yapmış sayılır ve böylece sizin giriş ekranlarınızdan da geçmek zorunda kalmaz.
ZendFlexible Sistem Ayarları (config.php) • $config['loadModule'][…] = true / false Kullanmak istediğiniz modülleri burada seçmelisiniz. • DisableMagicQuotes: php.ini de tanımlı olan magic_quotes_gpc değerinin “on” olmasını programatik olarak “off” yapar. magic_quotes_gpc özelliği “sql injection” ataklarına karşı GET, POST, COOKIE ile gelen bilgilere addslashes() fonksiyonu ile "\" karakterini etkilemektedir. • IeAccessDomainCookiesFix: IFrame içinde yer alan sayfalar Internet Explorer’da tarayıcıya çerez (cookie) gönderemezler. Bunu düzeltmek için değerin TRUE olması gerekir. • Session: Sitenize SESSION kullanımı desteği vermek için deşerinin TRUE olması beklenir. • DbConnection: Eğer bir veritabanı bağlantısı (db connection) yapacaksanız bu değerin TRUE olması gerekir. • Auth: Bu parametre sitenizin tamamının ya da bir kısmının özel bir girişle korumasını sağlar. Bu yapının kullanılması için SESSION desteğinin açık olması gerekir. • Layout: Sitenize Layout desteği vermek kullanılır. Böylece header-footer mantığından kurtulabilirsiniz. Şablonlar otomatik olarak belirtilen content alanına yüklenir.
ZendFlexible Sistem Ayarları (config.php) • $config['auth'][…] = string / number Şifre kontollü giriş için geçerli olan ayarları belirler. • sessionVarNames= Array() : Sitenizde kullacağınız session isimlerini burada tanımlamalısınız. • sessionPrimaryKey=” string” : SESSION değerlerinizden tekil (uqinue) olanıdır. Örneğin bir müşteri kullanıcı yapısında veritabanında müsteri kodu alanı “primary key” olarak tanımlanmıştır. • cookieName=”string” : Beni hatırla (Remember me) servisi için kullanılacak cookie adını belirler. • rememberMeDuration=number : Beni hatırla (Remember me) servisi için geçerli olan süreyi tanımlar. Yani ne kadar süre için hatırlanacağı burada belirlenir. Değer saniye cinsinden verilir. Hesaplama şu şekilde yapılabilir; 60 saniye * 60 dakika = 1 saat 60 saniye * 60 dakika * 24 saat = 1 gün 60 saniye * 60 dakika * 24 saat * 365 gün = 1 yıl • superPassword=”string” : Sisteme bütün kullanıcılar için tek bir şifreyle girmek isterseniz buraya bir süper şifre tanımlayınız.
ZendFlexible Sistem Ayarları (config.php) • $config['locale'][…] = “string” Zend_Locale için gerekli parametrelerdir. • lang=”tr” : Dil kodu • defaultTimezone ='Europe/Istanbul' : Timezone değeridir. Ayrıntılı bilgi için : http://php.net/manual/en/timezones.php • $config['mimemail'][…] Sistemin mail gönderme ayarları bu parametre ile yapılır. Bu ayar sadece mode geliştirme modunda (Development) kullanılır. Bu ihtiyaç localhost gibi mail gönderme yetkisi olmayan bir makine üzerinde kod geliştirenler için önemlidir. Burada tanımladığınız SMTP sunucusu üzerinden mail gönderme fonksiyonları çalışacaktır. Sistem “Prod” modda iken bu ayarlar kullanılmadan doğrudan localhost üzerinden göndermeye çalışacaktır. • $_config['serverType'] = 'prod' / ‘test’ Varsayılan değer: “test” Sistemin çalışma modudur. Hata gösterme, eposta gönderme gibi bazı durumlarda Sistem bu parametreye göre davranır. Eğer bir değer tanımlanmaz ise varsayılan değer “test” olacaktır.
ZendFlexible Sistem Ayarları (config.php) • switch(php_uname('n')) {} : Bu kısım gerek geliştirme sırasında olsun gerekse gerçek sunucularda birden fazla bilgisayar/sunucu desteği sağlamak için önemlidir. Sunucuya göre değişen parametreler bu kısımda yer alır. Her makine bir case olarak tanımlanır. Database bağlantı ayarları, baseUrl değeri ve zend framework ‘ün yeri, geliştiricinin mail adresi gibi bazı parametreler her geliştirici ve sunucuya göre değişiklik gösterebilir. Bu sebeple varsayılan parametreler olarak bunlar alınmıştır. Ayrıca sizin projenize özel değişen parametrelerinizi de bu kısımda tanımlamalısınız. $config['db’][‘params'] = array( 'username' => 'root', 'password' => '*****', 'dbname' => 'dbname' ); Değişen DB ayarları 'dbParams' ile tanımlanır. $config['baseUrl'] = '/zend'; Sitenizin web sunucudaki yoludur: http://localhost/zend Eğer http://www.sitem.com gibi kök dizinden çalışacaksa bu değer verilmez. $config['baseUrl'] = ‘’;
ZendFlexible Sistem Ayarları (config.php) • $config['zfPath'] = 'C:\wamp\apps\zf\library'; // windows • $config['zfPath'] = '/var/www/ZF/library'; // linux Zend Framework’ün yüklü olduğu yeri söyler. Zend ‘in yeri webroot üzerinde olmak zorunda değildir. Disk üzerinde herhangi bir yerde olabilir. • $config['mimemail']['developerEmail'] = 'baturorkun@gmail.com'; Bu case ‘deki makine icin sadece kendinize eposta atmasını istiyorsunuz. Aksi halde sizin test epostalarınız tüm gelişticilere giderek onları rahatsız edecektir. • $config['db’][‘adapter'] = 'Mysqli'; • $config['db][‘adapter'] = 'Pdo_Oci'; Veritabanınızın ne olduğunu söyler. Zend_DB, PearDB gibi Mysql ile mükemmel şekilde çalışmaktadır. PearDB ‘deki herşey fazlasıyla vardır. Ancak Oracle desteğinde OCI8 Extension için aynı şeyi söyleyemeyiz. Bir çok özellik devre dışı kalmaktadır ve bunlar hatırı sayılır özelliklerdir. Bu yüzden Oracle bağlantınızı PDO_OCI Extension ile yapmalısınız. PDO Oracle ile birkaç önemsiz can sıkan şey dışında gayet iyi çalışmaktadır. Desteklenen veritabanları için bakınız: http://files.zend.com/help/Zend-Framework/zend.db.html#zend.db.adapter.adapter-notes.oracle PDO için bakınız: http://www.php.net/manual/tr/book.pdo.php
ZendFlexible Sistem Ayarları (config.php) • $config['session'][….] Session kullanım ayarlarını içerir. • $config['session'][‘prefix'] Aynı domainde birden fazla proje çalıştırma ihtimaline karşı SESSION değerini direk kök dizinde tutmanıza izin vermiyoruz. Kök dizin olarak $_SESSION[sessionPrefixKey] seklinde tanımlanır. Bu değer genelde projenizin ismi olabilir. Kodlarınızda SESSION ‘ları kullanırken 2 seçeğiniz vardır. sessionPrefixKey değerini siz kendiniz elle yazabilir ya da Session helper ‘ını kullanabilirsiniz. Örneğin; Config.php: $config['auth'][ ‘sessionVarNames‘] = Array(‘id’,’name’); $config['auth'][ ‘sessionPrefixKey‘] = “proje_name”; Session Kullanımı: $_SESSION [‘proje_name’][‘id’] ve $_SESSION [‘proje_name’][‘name’] ya da $this->session(‘id’) ve $this->session(‘name’)
ZendFlexible Sistem Ayarları (config.php) • $config['session'][….] • $config['session']['baseUrl'] Cookie ‘lerin baseUrl adresini belirler. • $config['session']['cookieLifeTime'] = 0; Cookie’lerin yaşam ömrünü belirler. 0 -> Tarayıcı kapanana kadar • $config['session']['useSessionHandler'] = true; Eğer bir session handler kullanacaksanız buraya TRUE değeri atamalısınız. Daha sonra diğer ayarları tanımlamalısınız. FALSE ise diğer alttaki ayarların bir önemi yoktur. • $config['session']['pathSessionHandler'] = "Blknt/SessionHandler.php"; SessionHandler class’ın bulunduğu yeri belirtir. • $config['session']['classSessionHandler'] = "Blknt_SessionHandler"; SessionHandler class’ının adıdır. Class 3 tane parametre alır. dbConnection, gcMaxLifeTime, debugSessionHandler • $config['session']['debugSessionHandler'] = false; Debug mode ‘u açıp kapatır. • $config['session']['gcMaxLifeTime'] = null; Session’ların yaşam ömrünü belirler. null -> php.ini dosyasındaki değeri al demektir. ( session.gc_maxlifetime )
ZendFlexible Layout Yapısı • Sistenizin genel layout yapısını iki şekilde tasarlayabilirsiniz. Zend_Layout kullanabilir ya da standart header-footer mantığını kullanabilirsiniz. ZendFlexible’ı indirdiğinizde varsayılan değer olarak Layout modülü aktif gelecektir. $config['loadModule']['Layout'] = true; İsterseniz bunu iptal ederek header-footer mantığına geçebilirsiniz. • Layout’un aktif olması durumunda; application/views/layout/default.phtml şablon dosyasını değiştirerek sitenizin genel tasarımını burada oluşturunuz. Controller şablonlarından gelen veriler aşağıdaki gibi alınır: <?=$this->layout()->content?> • Eğer Layout’ı iptal ederseniz (false), ; application/viewstemplates/_header.phtml ve application/viewstemplates/_footer.phtml şablon dosyalarına tasarımızın header ve footer kısımlarını yerleştiriniz. Daha sonra gereken bütün şablonlarda el ile header ve footer ‘ı yüklemelisiniz. <?=$this->render('_header.phtml');?> .... <div><?=$this->name?></div> ... <?=$this->render('_footer.phtml');?>
ZendFlexibleŞablon Motoru (Template Engine) • Şablon motoru için de yine ZendFrame ‘i kullandık. Bizler Smarty gibi şablon yapılarını çok karışık ve gereksiz buluyoruz. Şablon için bir dil gibi farklı bir notasyon öğrenmek yerine yine PHP ‘nin kendisini kullanmak daha mantıklı geliyor. • Şu sekilde bir yapı geliştirdik: Her işlem grubu için application/controller altında bir controller yani dizin yaratılır. Eğer dizin altında aynı isim de bir php dosyası varsa dizin çağrıldığında bu dosya otomatik yüklenir. Örneğin: http://localhost/proje/login/ Controller sonundaki “/” bunun bir dizin oldugunu belirtir Action dosyası otomatik olarak aynı isimdeki php dosyası olacaktir. Yani yukarıdaki adresin gerçek hali şu şekildedir: • http://localhost/proje/login/login.php Eğer sonuna “/” koymaz iseniz; örneğin; http://localhost/proje/login/register “login” contoller altındaki “register.php” dosyası çağrılmak isteniyor demektir. Contoller altındaki php dosyalarında şablona gönderilecek veriler hazırlanır. Burada bir yazdırma işlemi yapılmaz.
ZendFlexibleŞablon Motoru (Template Engine) • http://localhost/proje/deneme/ application/contoller/deneme/deneme.php : $tpl->assign("pageTitle", "Project - About"); $tpl->assign("fields", Array(‘name’,’surname’,’phone’) ); require_once 'CallsModel.php'; $calls = new CallsModel(); $tpl->assign("callCursor",$calls->getList(50) ); • Her controller için “views/templates” altinda sablon dosyaları yer alır ve bunlar otomatik yüklenir. Controller yapısının aynı dosya/dizin yapısı sadece phtml uzantısi farkıyla “templates” dizini altında yaratılır. application/views/templates/deneme.phtml : • <? echo $this->pageTitle;?> Çıktı: Project - About • <? print_r($this->pageTitle); ?> Çıktı: Array ( [0] => name [1] => surname [2] => phone ) • <?foreach($this->callCursor as $row):?> echo $row[‘rate’] . “ – “ . $row[‘price’] . “<br>”; <?endforeach?> Çıktı: 0.23-45.60<br> 0.35-67.95<br>
ZendFlexibleŞablon Motoru (Template Engine) • Fakat bazen otomatik şablon yüklenmesini istemeyebilirsiniz. Örneğin; ajax ile çağrılan dosyalar ya da sadece kayıt yaparak liste sayfasına dönecek bir “action” için sablon dosyası olmayabilir. Otomatik şablon yüklenmemesi için iki seçeneğiniz var: • Birincisi yöntem; bu tip action ‘lar için dosya isimlerini altçizgi “_” ile başlatabilirsiniz. Altçizgi ile başlayan action için otomatik şablon dosyası yüklenmez. Ancak siz dilerseniz yine elle bir şablon dosyası yükleyebilirsiniz. Böylece dosya adından controller’ın bir şablona sahip olup olmadığını görebilirsiniz. • http://localhost/proje/poll/_save • Elle şablon yüklemek için; _save.php dosyası içerisinden şablon yükleniyor: $this->render("poll/_poll_result.phtml") İkincisi yöntem; Bazı durumlar için otomatik şablun yüklenmesini durdurmak isterseniz, controller dosyası içerisinde “ $__norender = true;” yazarak otomatik şablon yüklenmesini durdurabilirsiniz. $__norender = true
ZendFlexibleŞablon Motoru (Template Engine) • Bu nedenle sablon dosyalarına “header.phtml” ve “footer.phtml” dosyaları otomatik yüklenmedi. Bunları gerekirse elle her phtml dosyasının başına ve sonuna eklemelisiniz. <?=$this->render('_header.phtml');?> ... <?=$this->render('_footer.phtml');?> • Eğer şablon içerisindeki bir noktaya küçük bir şablon daha yüklemek isterseniz “partial” metodu kullanılabilir. • <?=$this->partial("panel/survey/editor/item/__log.phtml", Array('questionType' => 'Tarih', ‘title’ => ‘Log List’ ))?> • Partial’a değerler atamak (assign) için ikinci parametre olarak bir dizi şekinde verilir. panel/survey/editor/item/__log.phtml : <? echo $this->questionType; echo $this->title; ?>
ZendFlexibleModel Yapısı (Models) • Model’ler projenizdeki Class yapılarıdır. Hiç model kullanmayıp bütün kodlarınızı contoller’lar altında yazabilirsiniz. Ancak bir framework kullanmaya ihtiyaç duyduğunuza göre, böle bir şey yapmayacağınızı düşünüyoruz. Projeyi tasarlarken en onemli işlerden birisi Class yapılarını tasarlamaktır. Şifreli giriş için bizim yazdığımız hazır “application/modelsAuthModel.php” modelini inceleyiniz. En basit haliyle bir model: <?php class ExampleModel extends Zf_Model { public function __construct() { parent::__construct(); } } ?> • Örneğin User modeline (UserModel.php) veritabanından id’si verilen kullanıcının bilgilerini getiren bir method ekleyelim. <?php class UserModel { public function __construct() { parent::__construct(); } public function getUser($id) { return $this->_db->fecthRow(‘select * from users where id=?’, $id); } } ?>
ZendFlexibleModel Yapısı (Models) • Dışardan çağrılabilecek şekilde “getUser” method’unu ekledik. Bunun kullanımı şu sekilde olacaktır: • http://localhost/proje/user/info applicaton/controllers/user/info.php <? //require “UserModel.php”; $user = new UserModel(); $tpl->assign(“userRow”, $user->getUser() ); ?> • applicaton/views/templates/user/info.phtml <?=$this->render('_header.phtml');?> <table> <?foreach($this->userRow as $row)?> <tr> <td>Name</td> <td><?=$row[‘name’]?></td> </tr> <tr> <td>Surname</td> <td><?=$row[‘surname’]?></td> </tr> <tr> <td>Surname</td> <td><?=$row[‘surname’]?></td> </tr> <?endforeach?> <?=$this->render('_footer.phtml');?>
ZendFlexibleÖzel Controller Yapıları Application/controllers altında hazır bazı dizin ve dosyalar göreceksiniz. Bunları silmemeniz ve isimlerini değiştirmemenizde fayda var. Aksi durumda sistemdeki bazı özellikleri kaybedebilirsiniz. • “admin”: Bu sitenizin varsa admin modulü için ayrılmıştır. Admin modülünü bu controller altında yapılandırmalısınız. Bu controller sistem tarafından korunmaktadır. Bu controller’e erişim config.php dosyasında yer alan $config['adminUsers'] dizisi ile kontrol altına alınmıştır. • “error”: Sunucudan dönen 404 ve 500 hataları burada karşılanır . Kullanıcı var olmayan bir controller çağırdığında yani adres girdiğinde buraya yonlendirilir. Sitenizi bakımda (maintenance) moduna aldığınız da yine buraya yönlendirilir. • “login”: Eğer config.php den $config['loadModule']['Auth'] değerini FALSE dışında tanımlarsanız login controller’ı otomatik olarak kullanılmaya başlar. Login kontrolu için hazır bir “AuthModel.php” modeli vardır. • “panel”: Sitenizde bir login kontrolu varsa ve kullanıcı bu kontrolden geçerse otomatik olarak “panel” e yönlendirilir. Panel altındaki tüm controller dosya/dizinleri sistem tarafından korunmuştur ve kullanıcılar login işlemi gerçekleşmeden bu alana asla erişemezler.
ZendFlexible Redirection Yöntemi • Bunun için redirect_to() fonksiyonu tasarlanmıştır. redirect_to($url, $mesaj=null); • Controller dosyaları içerisinde herhangi bir yerde kullanıcıyı istediğiniz controller’a yönlendirebilirsiniz. ZendFlexible tarafından, kullanıcının açtığı son 5 adres takip edilmektedir. Eğer kullanıcıyı en son sayfaya yönlendirmek isterseniz url adresi yerine null yazınız. redirect_to(null); • İkinci parametreyi kullanmak zorunda değilsiniz. Ancak eğer yönlendirmeyi bir mesaj ile yapmak istiyorsanız ikinci parametreye mesajı yazınız. redirect_to(null,”Kayıt İşlemi Tamamlandı!”);
ZendFlexibleHelpers ve Widgets • Helpers ve Widgets Sürekli tekrarlanan işleri, hesaplamaları, kod parçalarını ve çıktıları birer helper olarak tanımlayabilirsiniz. Temel faydalarından birisi de tasarımcının PHP kodu yazmasını beklemeden herşeyi tasarımcıya hazır hale getirmektir. Biz sizin için temel bazı işleri yapan helper’lar yazdık. • Avatar • BreadCrumb • CssLink • DateFormat • DatePicker • DatePickerClassic • JsLink • Language • LoadWidget • Photo • Session • Shorten • TimePicker Buradaki Helper’ları siz kullanmıyor olsanız da asla silmeyiniz. Çünkü bazıları ZendFlexible tarafından kullanılmaktadır.
ZendFlexibleHelpers ve Widgets • İki tür Helper yazabilirsiniz. Standart Helper yazmak için “Applicaiton/views/helpers” altında bir dosya da Class tanımlamanız gerekiyor. Dosya adları büyük harfle başlar ve “camelcase” olmalıdır. Örneğin bugünün tarihini getiren bir helper için; TarihGetir • Class’ın adı class “Zend_View_Helper_” ön eki ile başlamalıdır ve dosya adı ile bitmelidir. Class Zend_View_Helper_TarihGetir { public function tarihGetir($format=”Y-m-d”) { return date($format); } } • Class içerisinde dosya adı ile aynı ama baş harfi küçük olan public bir fonksiyon olmalıdır : tarihGetir • Daha sonra bu helper’ı şablon içerisinde şu şekilde kullanabilirsiniz: <? echo $this->tarihGetir(“y.m.D”); ?>
ZendFlexibleHelpers ve Widgets • Bütün bu kurallarla uğraşmadan da helper yazabilirsiniz. Karmaşık ve çıktı içeren Helper’lar yazarken tek bir class içerisinde yazmak cok zor ve karmaşık olacaktır. Bu sebeple LoadWidget helper’ını geliştirdik. Controllers ve Templates altında “_widgets” adında dizinler göreceksiniz. Doğrudan aynen controller/action mantığında olduğu gibi burada “widgets” lar yaratabilirsiniz. • Örneğin veritanından kullanıcı gruplarını bir combobox dan seçtirmek için bir widget gerekiyor olsun: • Application/controllers/_widgets/user-group-select.php <? $db = Zend_Registry::get('db'); $tpl->assign("grpCursor", $db->fetchAll(‘select * user_groups’)); ?> • Application/views/templates/_widgets/user-group-select.phtml • <select name=”<?=$this->name?>”> <?foreach($this->grpCursor as $row):?> <option value=”$row[‘grpid’]”><?=$row[‘title’]?></option> <?endforeach?> </select>
ZendFlexible Dil Desteği (Translate) • Öncelikle dil desteğini açmak için config.php ‘de ilgili parametreye TRUE değeri atanmalıdır. $config['loadModule']['Translations'] = true; Daha sonra dil ve dil dosyalarını tanımlamalısınız: $config['translation']['langs'] = array( 'tr' => 'Türkçe', 'en' => 'İngilizce', 'nl' => 'Hollandaca (Dutch)' ); • “mo” uzantılı dil dosyalarının yeri sabittir. “Data/lang” altında olmalıdır. • Dil desteği ve dil dosyası oluşturmak için projenizdeki tüm metinleri bir php fonksiyonu olan “__()” fonksiyonu kullanarak yazdırmalısınız. Daha sonra POEDIT isimli ücretsiz bir programla dil dosyalarını oluşturup POEDIT üzerinden kolayca çevirebilirsiniz. POEDIT, “__()” fonskiyonu ile tanımlanan tüm metinleri bir dil dosyasında toplayacaktır. • <?=__(‘Metin’)?> • <? • <a href=”test”><?=__(‘Click to Test’)?></a> • ?>
ZendFlexible Dil Desteği (Translate) • Fakat bir çok metin içerisinde değişkenler olabilir. Örneğin ; <? echo “Bu mesaj {$name} tarafından yazılmıştır.”; ?> Yukarıdaki metni doğrudan translete fonksiyonuna alamazsınız, çünkü metin sürekli değişiyor. Bu tür içerisinde değişken olan metinler şu şekilde çevrilir: <? echo __(“Bu mesaj %s tarafından yazılmıştır.”, $name); ?> • “%s” notasyonu orada bir String var anlamına gelir. İkinci parametrede verilen değeri oraya yazar. Eğer birden fazla değişken varsa ikinci parametre dizi (Array) olarak verilmelidir. <? echo “Bu mesaj {$name} tarafından {$date} tarihinde yazılmıştır.”; ?> • Birden fazla değişken için ikinci parametre: Array($name, $date) <? echo __(“Bu mesaj %s tarafından %s tarihinde yazılmıştır.”, Array($name, $date) ) ?>
ZendFlexible Dil Desteği (Translate) • Metindeki sıra ile dizideki sıra aynı olmalıdır. Ancak bazı dillere çevirilerde bu değişkenlerin sırası değişebilir. Bunu garanti etmek için şu şekilde tanımlamak daha garanti olacaktır. <? echo __(“Bu mesaj %(Name)s tarafından %(Date)s tarihinde yazılmıştır.”, Array(‘Name’=> $name, ‘Date’ =>$date) ) ?> Yukarıdaki gibi değişkenlere isim verilebilir. O zaman sıralamanın bir önemi kalmaz. %(isim)s şeklinde “%” ile “s” arasına parentez içerisinde bir isim tanımlanır ve Array’de bu isimler “key” olarak belirtilir.
ZendFlexible Bootstrap • Özelleştirme • Application/ Bootstrap.php Projenin başlaması için gerekli işlemlerin düzenli bir şekilde saklanmasını sağlar. _init ile başlayan metodları class içerisindeki sırasına göre teker teker çağırır.