Recoverable Error – Object of class DibiRow could not be converted to string

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
toka
Člen | 253
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

DataGrid ti do metody currency() pošle objekt DibiRow a ta metoda s ním pracuje jako se stringem.

toka
Člen | 253
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)