By Hüseyin Bora
Doğrulayıcı(Validator) sınıfları durağan(static) metotları kullanan sınıflardır. işlerinizi kolaylaştırması ve yazılımın bütünleşik parçalar halinde kolektif bir yapıda çalışmasına olanak sağlar.
Bir doğrulama metodunun tanımlaması aşağıdaki gibidir
static function required(Component $c,Component $m,$message,$success)
Birinci parametre “Component $c” doğrulama işleminin yapıldığı bileşen
İkinci parametre “Component $m” mesajların yazdırılacağı bileşen
Üçüncü parametre uyarı mesajı
Dördüncü parametre doğrulama mesajı
Örneğin yeni üye kaydı için bir üye kayıt formumuzun olduğunu ve aynı ismi taşıyabilecek sadece bir üye olduğunu düşünelim.
Bunun için Uyekontrol adında bir sınıf oluşturup varmi ismini taşıyan bir doğrulama metodu ekliyorum
class uyekontrol
{
static function varmi(Component $c,Component $m,$message,$success)
{
$sorgu = EntityManager::getInstance()->createQuery("select u from uyeler u where uye.adi =:uyead");
$sorgu->bindParam("uyeadi", $c->getText);
$sorgu->execute();
$sonuc =$sorgu->getSingle();
if($sonuc!=null){
$m->setText($message);
return >true;
}
$m->setText($success);
return >true;
}
}
Şimdi oluşturduğumuz doğrulama sınıfını view (görünüm) içerisinde kullanalım
<faces>
<@import prefix="f" taglib="phpf.ui.*"/>
<f:form method="post" name="uyeform">
Uye adi :<f:textbox
name="uyeadi"
validator="uyekontrol"
rule="varmi"
success="Uye adi doğrulandı "
message=" Daha önce bu isimde bir üye kayıt olmuş farklı bir isim deneyin! "
messagefor="msgbox"
/>
<f:message id="msgbox"/>
<f:button name="kaydet" text="Gönder" onclick="actionevent" forname="uyeform"/>
</f:form>
</faces>
Validador sınıfımızı controller içerisinde import ediyoruz
import("phpf.controllers.facete");
import("dbf.persistence");
import("dogrulayicilar.uyekontrol",true);
class Controller extends Facete{
function Controller(){
parent::Facete();
$this->render("uyekayit.phpf");
}
function kaydetClicked($evt){
$uye = new uye();
$uye->adi = $this->uyeadi->text;
$uye->save();
}
}
By Hüseyin Bora
Niteliklere erişiken nesne adı -> nitelik adı şeklindendir. örneğim bir textbox birde button bileşenimiz olsun buttona tıklandığında textbox un rengini değiştirelim. faces view tanımlaması aşağıdaki gibidir.
<faces>
<@import taglib="phpf.ui.*" prefix="face"/>
<face:textbox name ="yazi" text ="Merhaba"/>
<face:textbox name ="button" text ="Rengi Değiştir"/>
</faces>
class Controller extends Facete{
function Controller(){
parent::FacesController();
$this->render("view.html");
}
function buttonClicked($evt){
$this->yazi->setProperty("style", "background:blue");
}
}
Örneğimizde textbox bileşenin style niteliğine background:blue değerini artardık ve rengini değiştirmiş olduk.
Bir niteliği değiştirmek istediğinizde
$this->bilesenadi->nitelik=”deger”;
Ya da
$this->yazi->setProperty(”nitelik”, “değer”);
İki kullanımda gecerlidir.
Şimdi örneğimizi biraz daha geliştirelim bir combobox bileşeninde renkler olsun ve seçilen rengi ajax kullanarak textbox nesnesine uygulayalım.
Örneğimiz için view aşağıdaki şekildedir.
<faces>
<@import prefix="face" taglib="phpf.ui.*"/>
<face:textbox name ="textbox" text ="Merhaba"/>
Rengi değiştir
<face:combobox name="colors"
bind="array(Aqua,Blue,AliceBlue,Beige,Black,Brown ,Navy,Pink,Red,Orange,Yellow ,White,Green)"
onchange="ajaxevent">
</face:combobox>
</faces>
import("phpf.controllers.facete");
class Style extends Facete
{
function Style()
{
parent::Facete();
$this->render("view.phpf");
}
protected function colorsChanged($evt)
{
$color = $this->colors->getSelected();
$this->textbox->setProperty("style","background:$color");
$this->AjaxResponse();
}
}
İşte Uygulamamızın Çalışır hali.
By Hüseyin Bora
Facet FacesController u genişleten ve C# VB Delphi dekine benzer bir şekilde event handler (olay yakalama) mekanizmasına izin veren bir controller biçimidir.
Olay yakalama için sadece metot yazmanız kafidir. metot isimleri bileşenadı olayadı şeklindedir.
örnek olarak aşağıdaki gibi bir faces view tanımlamamız olsun
<pre> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>The Button</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<faces>
<@import prefix="f" taglib="phpf.ui.button"/>
<f:button name="deneme" onclick=ajaxevent" text="Click me"/>
</faces>
</body>
</html></pre>
deneme buttonuna tıklama olayını yakalayabilmemiz için denemeClicked($evt) mettodunu yazıyoruz.
Örnek facete
<?php
import("phpf.controllers.facete");
class Facetetest extends Facete
{
function Facetetest()
{
parent::Facete();
$this->render("view.phpf");
}
protected function denemeClicked($evt)
{
$evt->getComponent()->setText("You Cliked");
$this->AjaxResponse();
}
}
?>
olayları yakalayacak üye metotların protected ya da public olaması gereklidir. private üyeler erişilemeyeceği için çalışmazlar.
facete ile birlikte kullanabileceğiniz olay yakalama metotları şunlardır ve metot isimlerinin başına bileşen ismini eklemeyi unutmayın.
- Clicked
- Changed
- dbClick
- mouseUp
- mouseOver
- mouseOut
- mouseDown
By Hüseyin Bora
PHP Faces ile geliştirdiğim çevrim içi Ajax hesap makinası örneği
PHP Faces in olay mekanizması içeresinde üç önemli kavramı anlamanızda yarar vardır. PHP Faces olay yakalama kalıpları Java tarzındadır. eğer java swing ile daha önce uygulama geliştirmişseniz bu tanımlar size yabancı gelmeyecektir.
- Listener : Dinleyiciler
- Event: Olaylar
- Component : bileşennler
Listener bir arayuz interface tanımlar Controller sınıfıda dinlemeye alacağınız bu aryüzleri uygularsınız.
Eventlar gerçekleşen olay ile ilgili nesnelerdir. bunlar framework tarfından oluşturulur ve olay ile ilgili metot parametrelerine gecirilir.
Component genellikle olaylar bir bileşen tarfından tektiklenir.
PHP Faces da şuan bulunan listenerlar
- ActionListener : tıklama olayı için kullanılır
- MouseListener : mouse olayları için kullanılır
- ValueChangedListener : değerler değiştiğinde kullanılır
<?php
interface ActionListener extends FacesListener
{
public function actionPerformed(ActionEvent $event);
}
?>
PHP Faces da şuan bulunan olaylar
- ActionEvent : bir tıklama olayı gerçekleştiğinde
- MoueseEvent : bir mouse olayı gerçekleştiğinde
- ValueChangedEvent : değişim olayı gerçekleştiğinde
controler sınıfımız listener ile ilgigili metodunu çağırır ve listener uygulayan sınıfı olay için kayıt eder.
PHP faces olaylar için temel iki post yöntemi kullanır ilk yöntem post back ve ikinci yöntem ajaxtır.
olayların gerçekleşmesi için view(görünüm) tarfında bileşen tanımlamaları yapılırken bildirilmesi gerekir.
bileşenin post back yapmasını istiyorsanız bileşen tanımında ilgili olay nitelğine “actionevent”
bileşenin bir ajax çağrısı yapmasını istiyorsanız bileşen tanımında ilgili olay nitelğine “ajaxevent” değerlerinden birini verirsiniz.
Örnek bir bileşen ve olay tanımlaması
<faces>
<@import prefix="face" taglib="phpf.ui.button" />
<face:button name="button1" text="Tıkla" onclick="actionevent"/>
</faces>
Yukarıdaki satırlar ile bir button sınıfından button1 adında yeni bir örneğini oluşturduk. button1 nesnesine controller içinden erişebiliriz
yukarıdaki view ımız için örnek controller
import("phpf.controllers.facescontroller");
import("phpf.events.actionevent");
import("phpf.listeners.actionlistener");
class Sample extends FacesController implements ActionListener
{
function Sample()
{
parent::FacesController();
$this->addActionListener($this);
$this->render("view.phpf");
}
public function actionPerformed(ActionEvent $evt)
{
$this->button1->setText("Bana tıkladın");
}
}
Yukarıdaki satırları özetlemek gerekirse
class Sample extends FacesController implements ActionListener
ActionListener dinleyicisi uygulanıyor.
$this->addActionListener($this);
dinleyici nesne kayıtediliyor.
$this->render(”view.phpf”);
view dosyamız render ediliyor.
İstemci tarayıcı tarafında oluşturduğumuz buttona tıklandığında ActionEvent olayı meydana geliyor ve actionPerformed metodu çalıştırılıyor.
public function actionPerformed(ActionEvent $evt){
$this->button1->setText(”Bana tıkladın”);
button nesnesinin text niteliği bana tıkladın olarak değiştiriliyor.
}
işte actionevent ile çevrim içi bir örnek
Aşağıdaki butona tıklayın
Kaynak kodları phpfaces indirdiğnizde applications/demo dizininde görebilirsiniz
By Hüseyin Bora
Faces Controllerın Üye Metoları
- render ( Bu metor renderer a bir faces dosyasını yorumlamasını söyler)
- append (view a bir parametre gönderir)
- load (parametre olarak verilen string ifadenden sınıf adından yeni bir nesne çevirir)
- interrupt (render işlemini keser)
- addListener($name,FacesListener $listener)
- addActionListener ( bir listener arayuzunu(interface) ActionEvent olayı için kayıteder parametresi ActionListener dır)
- addMouseListener (bir listener arayuzunu mouse events olayları içinkayıt eder Parametresi MouseListener)
- addValueChangedListener(bir listener arayuzunu ValueChangedEvent olayı için kayıt eder. Parametresi ValueChangedListener)
- getComponents (contoller ile ilişkili tüm bileşenleri verir)
- AjaxResponse (render işlemini askıya alır ve istemci tarafına json verisi gönderir)
Render metodu
Bu metot C ontroller ın faces renderer üye nesnesine çağrıda bulunur. ve parametre olarak verilen dosya render işlemine tabi tutulur.
Örnek
<?php
import("phpf.controllers.facescontroller");
class Rendertest extends FacesController {
function Rendertest(){
parent::FacesControler();
$this->render("header.phpf");
$this->render("single.phpf");
$this->render("footer.phpf");
}
}
?>
Append metodu
append metodunun iki parametresi vardır ilk parametre aktarılacak değerin ismi, ikincisi ise aktarılan değerdir.
Aşağıdaki gibi bir view imiz olsun.
<faces>
Merhaba <b>#{$isim} #{$soyisim}</b>
</faces>
Şimdi isim ve soyisim değişkenlerinin view e aktaran kontrolcü sınıfımızı yazalım
<pre><?php
import("phpf.controllers.facescontroller");
class Appendtest extends FacesController {
function Appendtest(){
parent::FacesControler();
$this->append("isim","hüseyin bora");
$soyisim="ABACI";
$this->append("soyisim",$soyisim);
$this->render("view.phpf");
}
}
?>
Bu arada şunu unutmayın public ve protecdet üyeleriniz için append kulanmanız gerekmemektedir.
Load metodu
Bu metot kendisine string olarak verilen yol ve sinif adında yeni bir nesne oluşturur.
Örnek .../phpfaces/server/session.php
/phpfaces/io/uri.php
<?php
import("phpf.controllers.facescontroller");
class Test extends FacesController {
function Test(){
parent::FacesControler();
$this->load("server.session");
$this->session->get("name");
$this->load("io.uri");
$this->uri->get(0);
}
?>