Záhadný Warning: Illegal offset type v šablonách
- PavelV
- Člen | 6
Zdravím,
aplikace mi při aktualizaci Nette z 2.0-dev na 2.0.3 začala náhodně střílet Warning: Illegal offset type při výpisu v template. Všechno to končí na https://github.com/…ctiveRow.php#L278, kde se $id najde jako $this->data, což je pole a následně se pokusí toto použít jako index jiného pole, proti čemuž PHP protestuje uvedeným Warningem.
Nedaří se mi tu chybu reprodukovat – někdy se neobjeví ani po 100 zobrazení stránky, někdy desetkrát za sebou. Nereaguje na mazání cache (ani vypnutí).
Warning se objevuje na různých místech s železnou nepravidelností.
Nette 2.0.3, PHP 5.3.x, stejná chyba se objevuje na Ubuntu, Debianu, Fedoře i Win7 (wamp)
Nechápu, kde může být chyba – snad kromě Nette samotného. Ten kód je ale poměrně hojně využívaný a jsem na pochybách, že jsem jediný, kdo se s tím kdy zlobil.
Edit: napadlo mě, že by to mohlo souviset s tím, že vybírám data z views, které primary key nemají a tudíž to takhle hapruje
Díky za nápady,
Pavel
Editoval PavelV (11. 5. 2012 11:59)
- PavelV
- Člen | 6
Update:
Chyba se vyřešila změnou Reflection tak, aby se vždy nalezl správný PK tabulky. Tím se eliminoval problém s !isset(data[pk]), pořád ale nechápu, proč se v případě nenalezení defaultuje do pole $this->data a to se následně používá jako klíč jiného pole.
<?php
$id = (isset($this->data[$this->table->getPrimary()]) ? $this->data[$this->table->getPrimary()] : $this->data);
$this->data = $this->table[$id]->data;
?>
- PavelV
- Člen | 6
Zřejmě moje – MySQL views nemají vlastní PK a DiscoveredReflection ho nedokázala najít.
Mimochodem, až do aktualizace na 2.0.3 to vše fungovalo. Defaultní Reflection se měnila? S ConventionalReflection to funguje spolehlivě (až na nějaké další nestandardní tabulky, které si řeším sám jinak).
- Lweek
- Člen | 12
Mám podobný problém ale s tím že data tahám z normální tabulky kde je PK nastaven. Když zavolám getPrimary() v Selection tak mi to vrátí korektní název sloupce. Iterovat nejde ani v presenteru. Jediné co mě napadlo je problém s iterováním sloupce typu DATE, ale v jiném Presenteru mi to funguje i když občas náhodně to tu chybu vyhodí taky.