Oznámení
DibiDataSource a detectTypes()
před 10 lety
- Petr Motejlek
- Člen | 293
Ahoj,
DibiResult má metodu detectTypes(), která je poměrně důležitá, když
používám klasickou kombinaci pomoci dibi::query() (tj. $res->dibi::query,
$res->detectTypes(), $res->fetch()), automaticky se mi u vrácených
hodnot nastaví správné PHP datové typy, a co je asi nejdůležitější —
u PostgreSQL když mezi sloupci je něco typu BYTEA (dibi::BINARY), dojde
k zavolání pg_unescape_bytea(), což odstraní escapování, které dibi
automaticky udělá, když do takového sloupce něco vložím. Problém je, že
unescape se provede jen, když zavolám před samotným fetchem detectTypes()
nad instancí DibiResult.
Moje otázka zní, jak správně postupovat, když chci využít mocnosti (hezké slovo, že? ;) DibiDataSource, ať už se bavíme o applyLimit, řazení, nebo dalším dofiltrování, rád bych mu nějak vnutil, aby vždycky, když bude vracet DibiResult, nad tím DibiResultem automaticky zavolal detectTypes(). Něco takového jako dibi::dataSource(‚SELECT * FROM [myTable]‘)->autoDetectTypes();, nebo ještě hezčí a praktičtější: DibiDataSource::$autoDetectTypes = true ;).
Jestli jsem něco přehlédl a je to lepší dělat úplně jinak, než kam mířím, klidně mě střelte :D. Díky, Petr.
před 10 lety
- kravčo
- Člen | 723
Dědictví aneb…
class MyDibiDataSource extends DibiDataSource
{
public function getResult()
{
$result = parent::getResult();
$result->detectTypes();
return $result;
}
}
Editoval kravčo (23. 8. 2009 16:34)
před 10 lety
- Petr Motejlek
- Člen | 293
Tohle řešení je jasný; ani mě nenapadlo, že je sem někdo bude psát — má ale tu vadu, že dibi třídy, který dataSource vrací, vrací pořád DibiDataSource a ne MyDataSource, což je takové blbé, protože bych musel přepsat víc věcí, proto jsem hledal jiný způsob.
před 10 lety
- kravčo
- Člen | 723
Petr Motejlek napsal(a):
Tohle řešení je jasný; ani mě nenapadlo, že je sem někdo bude psát — má ale tu vadu, že dibi třídy, který dataSource vrací, vrací pořád DibiDataSource a ne MyDataSource, což je takové blbé, protože bych musel přepsat víc věcí, proto jsem hledal jiný způsob.
Ono je takové blbé napísať ďalších pár riadkov naviac sám?
class mydibi extends dibi
{
public static function myDataSource($args)
{
$args = func_get_args();
return self::getConnection()->myDataSource($args);
}
}
function DibiConnection_prototype_myDataSource()
{
$args = func_get_args();
$connection = array_shift($args);
$translator = new DibiTranslator($connection->driver);
return new MyDataSource($translator->translate($args), $connection);
}
DibiConnection::extensionMethod(
'DibiConnection::myDataSource',
'DibiConnection_prototype_myDataSource'
);
class MyDibiDataSource extends DibiDataSource
{
public function getResult()
{
$result = parent::getResult();
$result->detectTypes();
return $result;
}
}
před 10 lety
- Petr Motejlek
- Člen | 293
Nechci, abys' sem psal kód, jak se to dá udělat pomocí napsání vlastních tříd. Tenhle směr zavrhuju; takhle už to mám, a proto jsem napsal tenhle topic — zajímá mě, jestli se to dá udělat nějak jinak ;).
před 10 lety
- kravčo
- Člen | 723
Petr Motejlek napsal(a):
Nechci, abys' sem psal kód, jak se to dá udělat pomocí napsání vlastních tříd. Tenhle směr zavrhuju; takhle už to mám, a proto jsem napsal tenhle topic — zajímá mě, jestli se to dá udělat nějak jinak ;).
Z tvojho prvého príspevku to nebolo patrné. Vyznelo to, ako by si nevedel, ako to máš urobiť, nie tak, že to chceš urobiť inak, ako to už spravené máš…
Vzhľadom na to, že cestu štandardného rozširovana zavrhuješ, zostáva
ti ešte pripísať si do dibi/DibiDataSource.php
podporu pre
detectTypes()
(cca 1–2 riadky), to je ale zásah do dibi,
bude sa ti ťažko udržiavať a updatovať a neodporúčam to.
před 10 lety
- Petr Motejlek
- Člen | 293
Jj, souhlasím s tím, že zasahovat do Dibi je větší fuj, než rozšiřovat je pomocí vlastních tříd ;).