Trying to get property of non-object
- JarekSt
- Člen | 39
Nekdy se mi stane, ze mi u stranky (ktera v 99% pripadu nebehne bez
problemu) vyskoci hlaska „Trying to get property of non-object“.
File: …\vendor\nette\nette\Nette\Database\Table\ActiveRow.php:312
public function __unset($key)
303: {
304: throw new Nette\DeprecatedException('ActiveRow is read-only.');
305: }
306:
307:
308: protected function accessColumn($key, $selectColumn = TRUE)
309: {
310: $this->table->accessColumn($key, $selectColumn);
311: if ($this->table->getDataRefreshed() && !$this->dataRefreshed) {
312: $this->data = $this->table[$this->getSignature()]->data;
313: $this->dataRefreshed = TRUE;
314: }
315: }
Zajimave je, ze mi staci obnovit stejnou stranku (F5) a vse nebehne bez problemu (neudelam nic vic, nezmeni se data ani nic jineho). Co by to mohlo byt?
- JarekSt
- Člen | 39
matej21 napsal(a):
verze nette? kod, ktery to dela?…
nette verze: 2.1.0 (ale delalo to i na jinych verzich – 2.1.4 a
2.2.1).
nevim, co vsechno chces videt, ale treba takhle vypada sablona (zobrazuji se
data z tabulky, ktera ma seznam nejakych temat („stromova struktura“)
‚idecko‘, ‚nazev‘, ‚idecko nadrizeneho uzlu‘ + nejake dalsi
atributy):
{block content}
<div class="col-md-12 column">
<h1>Administrace témat</h1>
{snippet temata}
{foreach $temata as $tema}
{? $selection = $tema->related('temata','id_parent')->order('poradi ASC')}
<p>
<h3>
<a class="btn btn-default btn-xs ajax" n:href="blokTema! $tema->id_tema,$tema->pristupne"><span n:class="$tema->pristupne=='A' ? 'glyphicon glyphicon-ok' : 'glyphicon glyphicon-lock'"></span></a>
<a n:if="!$iterator->first" class="btn btn-primary btn-xs ajax" n:href="posunTema! up,$tema->id_parent,$tema->poradi"><span class="glyphicon glyphicon-arrow-up"></span></a>
<a n:if="!$iterator->last" class="btn btn-primary btn-xs ajax" n:href="posunTema! down,$tema->id_parent,$tema->poradi"><span class="glyphicon glyphicon-arrow-down"></span></a>
{$tema->nazev_tema} <a class="btn btn-default btn-xs pull-right" n:href="AdminTemata:editovatTema $tema->id_tema"><span class="glyphicon glyphicon-edit"></span> změnit</a>
<a n:if="$selection->count()==0" class="btn btn-danger btn-xs ajax pull-right" n:href="deleteTema! $tema->id_tema"><span class="glyphicon glyphicon-remove"></span> smazat</a>
</h3>
</p>
{if $selection->count()>0}
<ul>
{foreach $selection as $polozka}
<li n:class="$iterator->odd ? odd:even">
<a class="btn btn-default btn-xs ajax" n:href="blokTema! $polozka->id_tema,$polozka->pristupne"><span n:class="$polozka->pristupne=='A' ? 'glyphicon glyphicon-ok' : 'glyphicon glyphicon-lock'"></span></a>
<a n:if="!$iterator->first" class="btn btn-primary btn-xs ajax" n:href="posunTema! up,$polozka->id_parent,$polozka->poradi"><span class="glyphicon glyphicon-arrow-up"></span></a>
<a n:if="!$iterator->last" class="btn btn-primary btn-xs ajax" n:href="posunTema! down,$polozka->id_parent,$polozka->poradi"><span class="glyphicon glyphicon-arrow-down"></span></a>
{$polozka->nazev_tema}
<a class="btn btn-default btn-xs pull-right" n:href="AdminTemata:editovatTema $polozka->id_tema"><span class="glyphicon glyphicon-edit"></span> změnit</a>
<a class="btn btn-danger btn-xs ajax pull-right" n:href="deleteTema! $polozka->id_tema"><span class="glyphicon glyphicon-remove"></span> smazat</a>
</li>
{/foreach}
<li><a class="btn btn-success btn-xs" n:href="AdminTemata:pridatTema $polozka->id_parent"><span class="glyphicon glyphicon-plus"></span> přidat nové podtéma</a></li>
</ul>
{else}
<ul>
<li><a class="btn btn-success btn-xs" n:href="AdminTemata:pridatTema $tema->id_tema"><span class="glyphicon glyphicon-plus"></span> přidat nové podtéma</a></li>
</ul>
{/if}
{/foreach}
{/snippet}
<p><a class="btn btn-success btn-xs" n:href="AdminTemata:pridatTema 0"><span class="glyphicon glyphicon-plus"></span> přidat nové téma</a></p>
</div><!--col-md-12 column-->
{/block}
- JarekSt
- Člen | 39
struktura tabulky:
CREATE TABLE temata
(
id_tema
int(10) unsigned NOT NULL AUTO_INCREMENT,
id_parent
int(10) unsigned NOT NULL,
nazev_tema
varchar(200) COLLATE utf8_czech_ci DEFAULT NULL,
popis_tema
text COLLATE utf8_czech_ci,
pristupne
char(1) COLLATE utf8_czech_ci DEFAULT NULL,
poradi
smallint(6) DEFAULT NULL,
PRIMARY KEY (id_tema
),
UNIQUE KEY id_parent,poradi
(id_parent
,poradi
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci
- hranicka
- Člen | 23
Stává se nám to také. Když se smaže cache, poté se provede request na
nějakou stránku (Nette\Database si vytvoří cache) a pak přejdeme na další
stránku, Nette\Database\Table\Selection někdy pozlobí, což se projeví jak
píše JarekSt.
Když je vypnutý debug mode, tak ani F5 nepomůže.
Možné provizorní řešení:
- upravit Nette\Database\Table\Selection::offsetGet
public function offsetGet($key)
{
$this->execute();
// solves strange cache bug
$rows = ($this->rows) ? : $this->data;
return $rows[$key];
}
Nebo je možný také jiný hack (i když předchozí řešení považuji za „lepší“):
- upravit Nette\Database\Table\ActiveRow::accessColumn
protected function accessColumn($key, $selectColumn = TRUE)
{
$this->table->accessColumn($key, $selectColumn);
if ($this->table->getDataRefreshed() && !$this->dataRefreshed) {
$row = ($this->table[$this->getSignature()]) ? : $this->table->get($this->getSignature());
$this->data = $row->data;
$this->dataRefreshed = TRUE;
}
}
Issue:
https://github.com/…se/issues/15
Chybu nedokážu zatím reprodukovat cíleně, do té doby nemůžu dopsat testy a pullnout opravu :(
Editoval hranicka (3. 7. 2014 7:37)
- hranicka
- Člen | 23
@JanEndel Zatím to sem dávám jako návrh (příčina bude možná jinde), problém je, že tu chybu nedokážu spolehlivě reprodukovat. Až se mi to povede, dopíšu testy a pošlu pull, zatím nemůžu :(
Snad se ozve ještě někdo komu se to stává. Pokusím se ještě vypozorovat kdy přesně k tomu problému dojde, najít řešení a pullnout. Ale může to chvilku trvat.
- oskarmaniak
- Člen | 29
Po přechodu z nette 2 na 2.2.1, 2.2.2 bojuji nejspíše s obdobným cachovacím problémem, který má za následek Trying to get property of non-object chybovou hlášku.
/temp/cache/latte hlásí problém při vyčítání proměnné poslanou do šablony z presenteru
<?php echo Latte\Runtime\Filters::escapeHtml($eventdetail->tag->label, ENT_NOQUOTES) ?>
Pokud nahodím zálohu nette 2 tak se data vyčítají, údaje v DB tedy existuje.
Dostal jsem se ke kroku vypnout latte cachování v tu chvíli se chybová hláška změní na:
Trying to get property of non-object
File: ..\libs\Nette\Latte\Engine.php(154) : eval()'d code:82
A na tom jsem se zasekl…
PHP 5.4.19
Apache/2.4.4 (Win32) OpenSSL/0.9.8y PHP/5.4.19
Tracy 2.2.2
Nette Framework 2.2.2 (released on 2014-06-26)
Editoval oskarmaniak (1. 7. 2014 16:58)