Recoverable Error – Object of class DibiRow could not be converted to string
- toka
- Člen | 253
Zdravím,
mám takový problém :-) Na localhostu
mi vše funguje skvěle,
ale jakmile aplikaci nahraji na produkční server, mám problém, který,
nevím proč, nejsem schopen vyřešit. Aplikace i databáze na vývojovém
(localhost) a produkčním serveru je identická.
V presenteru pomocí následujícího kódu předávám data do DataGridu:
// ---------------------------------------------------------------------------
public function actionDetail($date, $id_club) {
$this->template->club = $this->model->getClub($id_club);
$this->template->date = $date;
$this['shoppingGrid']->bindDataTable($this->model->getData($date, $id_club));
}
V modelu je něco takového:
// ***************************************************************************
public function getAllIngredientsPerClubAndDate($date, $id_club) {
$date = dibi::date($date);
$r = $this->db->select('...')
->from('..')
->where('...');
$array = $this->dibiResultToArrayQuery($r->fetchAll(), '=%i');
$r = $this->db->select('...')
->from('...')
->where('%or', $array);
$array = $this->dibiResultToArrayQuery($r->fetchAll(), '=%i');
$r = $this->db->select('...')
->from('...')
->where('%or', $array)
->groupBy('...');
return $r->toDataSource();
}
Nevěděl jsem, jak výsledek dotazu vložit do dotazu dalšího jako
modifikátor %or
, takže metoda dibiResultToArrayQuery
funguje následovně:
// ---------------------------------------------------------------------------
public function dibiResultToArrayQuery($r, $expression) {
$array = array();
foreach($r as $key => $value) {
foreach($value as $key => $value) {
$array[] = array($key . $expression, $value);
}
}
return $array;
}
Problém je v tom, že na localhostu funguje vše dle předpokladu, na produkčním serveru však dostávám následující chybu: Recoverable Error – Object of class DibiRow could not be converted to string, které vůbec nerozumím. Nemáte někdo zkušenost, nápad, či jiný způsob řešení. A klidně se nechám poučit jak přímo přes Dibi řešit výsledek dotazu jako náhrada za modifikátor.
Díky.
- BigCharlie
- Člen | 283
Tenhle dotaz zcela jistě nepatří do fóra Nette, ale spíš do dibi fóra. Tam bys po chvíli hledání našel několik vláken (minimálně tohle a tohle), která jsem zplodil já.
Takže problém zřejmě bude v tom, že v těch cyklech na konci nechceš
zřejmě pracovat s $value
, ale s
$value->sloupecXY
. A možná bych se vyhnul tomu, mít i ve
vnořeném foreach opět proměnnou $key. Fungovat to jistě bude, ale na
přehlednosti to asi nepřidá…
- toka
- Člen | 253
Problém byl úplně jinde, teď už jen přijít na to, proč. Nelíbí se tento řádek, v továrničce DataGridu:
$grid['price']->formatCallback[] = 'Helpers::currency';
Takže dotaz rozhodně patří do Nette fóra :-)
Budu tedy muset vyzkoumat, co je špatně na následujícím:
public static function currency($value) {
return "£\xc2\xa0" . str_replace(" ", "\xc2\xa0", number_format($value, 2, ".", ","));
}
- Ondřej Mirtes
- Člen | 1536
DataGrid ti do metody currency() pošle objekt DibiRow a ta metoda s ním pracuje jako se stringem.
- toka
- Člen | 253
Tak nevím, když jsem do BasePresenteru
, od kterého dědí
všechny další presentery vložil:
// ---------------------------------------------------------------------------
public function formatCurrency($value, DibiRow $data) {
return "£\xc2\xa0" . str_replace(" ", "\xc2\xa0", number_format($value, 2, ".", ","));
}
A v DataGridu pak
$grid['price']->formatCallback[] = array($this, 'formatCurrency');
,
tak vše funguje jak má. Helper by se měl jmenovat spíše
„Hellper“ :-)
- BigCharlie
- Člen | 283
Jak píše Ondřej, posíláš DataGridu něco jiného, než si zřejmě
myslíš, tj. místo stringu posíláš object DibiRow. A to IMHO napravíš
tím, co jsem psal ve svém minulém příspěvku. Tedy místo
$value
(což je object DibiRow, zkus si to dumpnout) chceš
$value->pozadovany_sloupec
.
- toka
- Člen | 253
Ondřej Mirtes napsal(a):
DataGrid ti do metody currency() pošle objekt DibiRow a ta metoda s ním pracuje jako se stringem.
Už jsem na to také přišel :-) Jen nechápu, že mi to na localhostu
i tak běhalo. A navíc, v ukázce DataGridu to tak je ExamplePresenter.php
a jediný Helper currency
je v Helpers.php.
Proto jsem v tom vůbec chybu nehledal.
- toka
- Člen | 253
BigCharlie napsal(a):
Jak píše Ondřej, posíláš DataGridu něco jiného, než si zřejmě myslíš, tj. místo stringu posíláš object DibiRow. A to IMHO napravíš tím, co jsem psal ve svém minulém příspěvku. Tedy místo
$value
(což je object DibiRow, zkus si to dumpnout) chceš$value->pozadovany_sloupec
.
DataGridu posílám to, co vyžaduje, tedy DataSource
. Takže
problém je celou dobu pouze v tom formátování obsahu.
Editoval toka (3. 5. 2010 14:19)