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