- 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