vnořený foreach = 1× ze dvou reloadu error/warning

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

divná věc se mi stává – mám vnořený foreach – nic neobvyklého :

kod z latte sablony

<tbody n:if="$interprets">
    {foreach $interprets as $interpret}
    <tr n:foreach="$interpret->related('interpret_song') as $interpretSong">
        <td>{$interpret->name}</td>
        <td>{$interpretSong->song->title}</td>
        <td></td>
        <td></td>
    </tr>
    {/foreach}
</tbody>

vyhazuje pri každém druhém !! reloadu warning s hláškou

Illegal offset type

přičemž ladenka chybu zobrazí zde:

<?php if ($interprets): ?>    <tbody>
    <?php $iterations = 0; foreach ($interprets as $interpret): $iterations = 0; foreach ($interpret->related('interpret_song') as $interpretSong): ?>        <tr>
                <td><?php echo Nette\Templating\Helpers::escapeHtml($interpret->name, ENT_NOQUOTES) ?></td>
                <td><?php echo Nette\Templating\Helpers::escapeHtml($interpretSong->song->title, ENT_NOQUOTES) ?></td>
                <td></td>
                <td></td>
            </tr>
    <?php $iterations++; endforeach ;$iterations++; endforeach ?>

připadá mi to zvláštní – že jednou kód projde, ale po reloadu stránky bez jakékoli změny, ne

asi je něco, co nevím… kde mám chybu/blbost?

edit:

další informace: SQL dotazy z ladenky

reload 1 – 3 –5…

reload 2 – 4 – 6…

verze nette poslední

že by to bylo něco mimo nette? špatná verze PHP? chyba v db?

Editoval knedle (24. 2. 2012 11:16)

knedle
Člen | 34
+
0
-

další střípek:

jeden z cache souborů databáze – tj. obsahující serializovaná data

mění s reloadem 2 stavy (pokud ignoruju časové razítko):

stav A:

<?php //netteCache[01]000070a:2:{s:4:"time";s:21:"0.37641100 1330097917";s:10:"serialized";b:1;}?>a:3:{s:12:"interpret_id";b:1;s:7:"song_id";b:1;s:4:"song";b:1;}

stav B:

<?php //netteCache[01]000070a:2:{s:4:"time";s:21:"0.44480300 1330097899";s:10:"serialized";b:1;}?>a:2:{s:12:"interpret_id";b:1;s:7:"song_id";b:1;}

jen nevím zda je to příčina, nebo následek

Jan Tvrdík
Nette guru | 2595
+
0
-

Zkus vypnout cachování Nette\Database a stáhnout si poslední vývojovou verzi Nette.

knedle
Člen | 34
+
0
-

vývojová funguje

knedle
Člen | 34
+
0
-

ještě dotaz – jak se vypne ta cache:

protože tento zápis:

...
	services:
		templateCacheStorage:
			class: Nette\Caching\Storages\DevNullStorage

		cacheStorage:
			class: Nette\Caching\Storages\DevNullStorage

		database: @Nette\Database\Connection

		authenticator: Authenticator( @database::table(users) )

		interprets:
			factory: @database::table(interpret)
		songs:
			factory: @database::table(song)
...

což je dle návodu z
https://doc.nette.org/cs/caching

services:
        templateCacheStorage:
                class: Nette\Caching\Storages\DevNullStorage

        cacheStorage:
                class: Nette\Caching\Storages\DevNullStorage

vyhazuje

Nette\DI\ServiceCreationException

Service ‚nette.cache‘: Multiple services of type Nette\Caching\IStorage found: cacheStorage, templateCacheStorage search

pcs
Člen | 22
+
0
-

Teď jsem vyřešil stejný problém – tabulka s indexy v tomto případě interpret_song musí mít primární klíč. Já bláhový si myslel, že když je to jen odkaz na dvě další tabulky s unikátními hodnotami, tak to primární klíč nepotřebuje. :-)