- 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
Hiç yorum yok:
Yorum Gönder