9 Temmuz 2007 Pazartesi

component pack

dataReader
- SQLDataReader
- ObjectDataReader
- vs.

dataAdapter -
- TableDataAdapter
- SQLDataAdapter
- ObjectDataAdapter

dataAdapter de eventler
- addOnUpdate
- addOnDelete
- addOnInsert

tüm bunlar için bir event interface gerekecek tabii, observer kullanip ekleyebilecegimiz
EventListener
bunu extend eden event classları olacak


class PostBackEvent implements EventListener {
  public function onPostBack($f){

  } 
}

class SQLUpdateEvent implements  EventListener {
  public function onUpdate($f, $rowid, $colname, $newValue, $oldValue=""){
    // guvenlikle ilgili filtre vs. 
    $newValue = addslashes($newValue);
    // 
    call_user_func($f,$rowid,$colname,$newValue,$oldValue);
  } 
}


tabii bunada chain of responsibility kullanip validator eklememiz lazim bence


class SQLUpdateEvent extends EventListener {
  private $_validators;
  
  public function addFilter($validator){
    $this->_validators[] = $validator;
  } 

  public function onUpdate($f, $rowid, $colname, $newValue, $oldValue=""){
    foreach($this->_validators as $validator){
      if (!$validator->validate($newValue){
        return false;
      }
    }
    // 
    call_user_func($f,$rowid,$colname,$newValue,$oldValue);
  } 
}


gerçi bu validatorların clientsidelarıda olmalı, kullanıcıya feedback vermek için, o datagrid classında olacak, neticede, dataAdapterdeki validate clienttan paslarsa bir şekilde update etmeden patlatmak için kullanırız.

buraya default validatorlarda ekleyebiliriz ,
class SQLUpdateEvent extends EventListener {
  public function __construct()[
    $this->_defaultValidators = Application::getDefaultValidators('onsqlupdate');
    //
    foreach($this->_defaultValidators as $validator){
      $this->addValidator($validator);    
    }
  }
}
aslında bu validator classlarını çift yönlüde kullanabiliriz tabii, yani hem clientside validasyonu hem sunucu tarafı için,

interface IClientSide {
  private _controller;
  private _action;
  public function setAction($e);
  public function setController($e);
  public function getResult();
}

interface IServerSide {
  
}

class ValidateUserName extends Validator implements IClientSide,IServerSide {
   
   public function __construct($controller,$action){
     if (!method_exists($controller,$action)){
       // clienta validate sonucu dondurmek icin method tanimli degilse
       throw new Exception('controllerda action tanimli degil'));
     }
   }

   public function validate($e){
        // eger kullanici yoksa true dondurelim 
        return (count(UserPeer::getByEmail($e))>1)?false:true;
   }  
}

bunuda kullanirken controllerde, gibi kullanabiliriz
  
public function executeCheckUserName(){
   $validator = new ValidateUserName($this,'checkUserName');
   $this->render(json_encode(array('result'=>$validator->validate()));
}

public function executeUpdate(){
  $dataAdapter = new SQLDataAdapter();
  $dataAdapter->addValidator(new ValidateUserName($this,'checkUserName'));
  $dataAdapter->executeUpdates($_POST);
  $dataGrid->dataBind();
}  

bütün bunlar şunu döndürmeli, bi çeşit proxy döndürmeli bence,

dataSet -
dataGrid de dataSeti bind edebilmeli,

en sonundada yazacagimiz kod şöyle olacak :)
$this->DataGrid->DataSource=$this->Data;
$this->DataGrid->dataBind();

tabii böylece data-aware componentlerde ilave edebiliriz ilerde,
Repeater
Editable Tree
Editable SelectBox vs. gibi


24 Haziran 2007 Pazar

konular, içindekiler, önsöz

Bu blogdaki dökümanlar, php5 kullanılarak yazılım tasarım motiflerinin uygulanmasını göstermeyi amaçlamaktadır. Henüz küçük bir kısmı tamamlanan yazıların durumlarını göstermek ve tamamlandığı zaman ne durumda olacağını belirtmek için bir index sayfası oluşturmak istedim. Creational PHP 5 Design Patterns (Php5 Obje Yaratım Tasarım Motifleri) Abstract Factory Builder Factory Method Prototype Singleton Structural PHP 5 Design Patterns (PHP 5 Yapısal Tasarım Motifleri) Adapter Bridge Composite Decorator Facade Flyweight Proxy Behavorial PHP 5 Design Patterns (Davranışsal PHP5 Tasarım Motifleri) Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Visitor

Singleton

php5 ve tasarım motifleri (patternleri) üzerine, türkçe kaynak bulamayınca, yoksa kendin yaz diyerek mevzuya giriyoruz. ilk incelenecek pattern/motif singleton olayı, nedir ne işe yarar nasıl kullanılır muhabbetinden önce, direk kodumuza bakalım, sonra üstünde açıklama yazarız. şudur :
class Singleton {
   private static $instance=null;
 
   private function __construct(){
   }
 
   private static init(){
   }
 
   public function getInstance(){
       if (self::$instance==null){
           self::$instance = new Singleton();
       } else {
           return self::$instance;
       }
   }
}