Záhadný Warning: Illegal offset type v šablonách

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

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

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;
?>
hrach
Člen | 1838
+
0
-

Jo, to bude blbost. Btw, proc to vracelo spatny primarni klic? Ci to byla chyba? Tvoje?

PavelV
Člen | 6
+
0
-

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).

hrach
Člen | 1838
+
0
-

Nevim o nicem, co by melo toto najednou znefunkcnit. Ze to na ConventionalReflection funguje je celkem ocekavane :)

Lweek
Člen | 12
+
0
-

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.