Oznámení
Omlouváme se, provoz fóra byl ukončen
DibiDataSource, DiBiFluent a klonování
Upozornění: Tohle vlákno je hodně staré.
před 9 lety
- semtex.989
- Člen | 76
Toto téma zakládám bych ušetřil čas a nervy všem, co hledají
řešení jako já.
Líbilo se mi DibiDataSource, ale moje požadavky byly:
- Skládání dotazu alá DibiFluent, bez převádění metodami toFluent() a toDataSource()
- funkční klonování objektu DataSource (Dibi používání při skládání dotazu reference u polí, takže jsem se to snažil vyřešit)
- Aby DataSource místo DibiRow vracelo jinou třídu.
- Aby tato třída mohla místo sebe vrátit jinou
- Je mi známa chyba v DibiDataSource, která způsobí, že pokud se zavolá getResult(), tak už nelze dál modifikovat SQL dotaz.
Má to nevýhodu, že je nutné v DibiFluent upravit atribut clauses z private na protected, ale to dá přežít…
- Jinak děkuji Davidovi za perfektní práci odvedenou na Dibi ;-)
Výsledkem je třída DataSource:
<?php
final class DataSource extends DibiFluent implements IDataSource{
private $rowClass = null;
public function __construct(DibiConnection $connection, object $rowClass = null){
parent::__construct($connection);
$this->setRowClass($rowClass);
}
public function setRowClass(object $rowClass = null){
$this->rowClass = $rowClass;
return $this;
}
public function getRowClass(){
return $this->rowClass;
}
public function getResult(){
$rows = $this->fetchAll();
if(count($rows) < 1){
return null;
}
if($this->rowClass !== null){
$return = array();
foreach($rows as $row){
$class = clone $this->rowClass;
$return[] = $class->setData($row); // zde je možnost, že třída vrátí místo sebe jinou třídu
}
if(count($return) == 1){
$return = $return[0];
}
return $return;
}
return $rows;
}
public function getIterator(){
return new ArrayIterator($this->getResult());
}
public function __clone(){
$this->clauses = unserialize(serialize($this->clauses)); // HACK: clones clauses!
}
}
?>
Editoval semtex.989 (25. 8. 2010 8:18)