Výpis z tabulky v databázi
- Sveet
- Člen | 55
Dobrý den,
mám jeden stejný kód jako ten druhý, ovšem jeden z nich nefunguje, tedy
přesněji řečeno hází chybu pouze v cache, cache jsem promazal, ale tohle
nepomohlo po vymazání na mě vyjede stejná chyba. Neví někdo z Vás kde by
mohl být problém?
Notice
Undefined variable: klobasy
Kód vypadá takto, má dvě části KlobasyModel.php vypadá takto:
<?php
namespace App\Model;
use Nette,
Nette\Utils\Strings;
class KlobasyModel extends \Nette\Object {
private $database;
public function __construct(Nette\Database\Context $database) {
$this->database = $database;
}
public function findAll() {
return $this->database->table('klobasy');
}
public function findById($id) {
return $this->findAll()->get($id);
}
public function getPageBySlug($slug) {
return $this->findAll()->where("slug", $slug)->fetch();
}
public function insert($values) {
return $this->findAll()->insert($values);
}
public function updated($values) {
return $this->findAll()->where($id)->update($values);
}
}
A KlobasyPresenter.php vypadá takto:
<?php
namespace App\FrontModule\Presenters;
use Nette,
App\Model;
class KlobasyPresenter extends HomepagePresenter {
protected $page;
public function actionDefault($slug) {
$data = $this->page->getPageBySlug($slug);
$this->template->pages = $data;
}
}
Který vypisuji takto:
<div class="col-sm-12 col-md-3 seznam-vin">
<ul>
<li n:foreach="$klobasy as $v"><a n:href="klobasy:default, $v->img">{$v->nazev}</a></li>
</ul>
</div>
<div class="col-sx-12 col-sm-12 col-md-9 brands">
{foreach $klobasy as $v}
{foreach $c->related('soubory') as $s}
<div class="col-sm-4"><a n:href="klobasy:default, $v->slug"><img style="height: 150px;" src="{$basePath}/{$s->cesta}" alt="img"></a></div>
{/foreach}
{/foreach}
</div>
- David Matějka
- Moderator | 6445
no vidim, ze do sablony nastavujes pouze „pages“ tak tam nemuzou bejt
„klobasy“…
a tohle neni chyba v cache. to je proste neexistujici promenna…
Editoval matej21 (26. 8. 2014 20:10)
- Sveet
- Člen | 55
matej21 napsal(a):
no vidim, ze do sablony nastavujes pouze „pages“ tak tam nemuzou bejt „klobasy“…
a tohle neni chyba v cache. to je proste neexistujici promenna…
Tohle je stejný kód který ovšem funguje, tak nevím proč kód v prvním příspěvku nefunguje
<?php
namespace App\FrontModule\Presenters;
use Nette,
App\Model;
class CaruselPresenter extends HomepagePresenter {
protected $page;
public function actionDefault($slug) {
$data = $this->page->getPageBySlug($slug);
$this->template->pages = $data;
}
}
<?php
namespace App\Model;
use Nette,
Nette\Utils\Strings;
class CarouselModel extends \Nette\Object {
/** @var Nette\Database\Context */
private $database;
public function __construct(Nette\Database\Context $database) {
$this->database = $database;
}
/** @return Nette\Database\Table\Selection */
public function findAll() {
return $this->database->table('carousel');
}
/** @return Nette\Database\Table\ActiveRow */
public function findById($id) {
return $this->findAll()->get($id);
}
/** @return Nette\Database\Table\ActiveRow */
public function getPageBySlug($slug) {
return $this->findAll()->where("slug", $slug)->fetch();
}
/** @return Nette\Database\Table\ActiveRow */
public function insert($values) {
return $this->findAll()->insert($values);
}
/** $return Nette\Database\Table\ActioveRow */
public function updated($values) {
return $this->findAll()->where($id)->update($values);
}
}
Taky jej podobně vypisuji:
<div class="col-sm-12 col-md-3 seznam-vin">
<ul>
<li n:foreach="$carousel as $v"><a n:href="Carusel:default, $v->slug">{$v->nazev}</a></li>
</ul>
</div>
<div class="col-sx-12 col-sm-12 col-md-9 brands">
{foreach $carousel as $c}
{foreach $c->related('soubory') as $s}
<div class="col-sm-4"><a n:href="Carusel:default, $v->slug"><img style="height: 150px;" src="{$basePath}/{$s->cesta}" alt="img"></a></div>
{/foreach}
{/foreach}
</div>
- David Kudera
- Člen | 455
Což znamená jedině to, že ta proměnná se šabloně předává někde jinde, než v kódech, které jsi sem poslal. $carousel se tam sám objevit nemohl.. Co třeba nějaký base presenter?
Edit: trošku zvláštní dědit od home presenteru. Vlastně to vidím poprvé
Editoval David Kudera (26. 8. 2014 20:46)
- Sveet
- Člen | 55
David Kudera napsal(a):
Což znamená jedině to, že ta proměnná se šabloně předává někde jinde, než v kódech, které jsi sem poslal. $carousel se tam sám objevit nemohl.. Co třeba nějaký base presenter?
Edit: trošku zvláštní dědit od home presenteru. Vlastně to vidím poprvé
V BasePresenter je jen formulář, který jsem řešil v předchozí otázce. Jinak typoval bych to spíš na HomepagePresenter jelikož v HomepagePresenter je zápis
protected $carousel;
Tak jsem udělal i ten stejný zápis do presnteru, a nepomohlo
jenicek napsal(a):
Proc opakujes v tech modelech ten samej kod?
Protože funguje
Editoval Sveet (27. 8. 2014 8:12)
- David Kudera
- Člen | 455
To ale vytvoří jen protected proměnnou v presenteru. Do šablony se musí předat
$this->template->carousel = $this->carousel;
a k opakujícímu se kódu. Stejně tak jako existuje base presenter pro společné věci všech presenterů, kteří od něj dědí, tak stejně tak můžeš vytvořit nějaký base model, který obsahuje společné věci všech ostatních tříd modelu. Pokud jich budeš mít třeba 30 a budeš nějakou věc chtít změnit, budeš to muset udělat všude ručně. A nebo jen jednou…
- Sveet
- Člen | 55
David Kudera napsal(a):
To ale vytvoří jen protected proměnnou v presenteru. Do šablony se musí předat
$this->template->carousel = $this->carousel;
a k opakujícímu se kódu. Stejně tak jako existuje base presenter pro společné věci všech presenterů, kteří od něj dědí, tak stejně tak můžeš vytvořit nějaký base model, který obsahuje společné věci všech ostatních tříd modelu. Pokud jich budeš mít třeba 30 a budeš nějakou věc chtít změnit, budeš to muset udělat všude ručně. A nebo jen jednou…
A jak tedy danou situaci mohu napravit? Jen prosím ne kompletně přepsat.
Už to mám stačilo do Presenteru přidat tento řádek, který si napsal, díky
$this->template->klobasy = $this->klobasy->findAll();
Jen se nevypíše vůbec nic z tabulky, i když v tabulce je několik záznamu, ale chybu už to nehlásí, o krok v přes. Kde by mohla být chyba?
Editoval Sveet (27. 8. 2014 8:54)
- David Kudera
- Člen | 455
Sveet napsal(a):
Jen se nevypíše vůbec nic z tabulky, i když v tabulce je několik záznamu, ale chybu už to nehlásí, o krok v přes. Kde by mohla být chyba?
no tak to je zajímavý. Nějak nemůžu přijít na kód, kterým by se tohle mohlo stát. Zkus dát to toho presenteru jen ze zajímavosti třeba tohle:
dump($this->klobasy->findAll()->count());
mělo by to vypsat počet záznamů. I když to počítám s tím, že to ukáže > 0, když říkáš, že data tam jsou. Kdyby jsi v presenteru neinjectoval model klobasy, tak by to zase vyhodilo chybu...... hmm…
co třeba šablona? Možná hloupá otázka, ale jsi ve správné šabloně? Na tom místě, kde se ty klobasy mají vypsat, když tam něco napíšeš ručně, tak se to vypíše?
- Sveet
- Člen | 55
David Kudera napsal(a):
Sveet napsal(a):
Jen se nevypíše vůbec nic z tabulky, i když v tabulce je několik záznamu, ale chybu už to nehlásí, o krok v přes. Kde by mohla být chyba?
no tak to je zajímavý. Nějak nemůžu přijít na kód, kterým by se tohle mohlo stát. Zkus dát to toho presenteru jen ze zajímavosti třeba tohle:
dump($this->klobasy->findAll()->count());
mělo by to vypsat počet záznamů. I když to počítám s tím, že to ukáže > 0, když říkáš, že data tam jsou. Kdyby jsi v presenteru neinjectoval model klobasy, tak by to zase vyhodilo chybu...... hmm…
co třeba šablona? Možná hloupá otázka, ale jsi ve správné šabloně? Na tom místě, kde se ty klobasy mají vypsat, když tam něco napíšeš ručně, tak se to vypíše?
Když do kódu napíšu něco ručně tak se samozřejmě vypíše to co jsem napsal, a ten dump vypsal
Closure #5eb6
file => "C:\xampp\htdocs\Alkoteka\vendor\nette\database\src\Database\Table\Selection.php" (79)
line => 426
variables => array ()
parameters => "$column" (7)
Editoval Sveet (27. 8. 2014 10:17)
- Sveet
- Člen | 55
Takže když do HomepagePresenter hodím tento dump
dump($this->template->klobasy = $this->klobasy->findAll()->count());
Tak mi vypíše chybu
Warning
Invalid argument supplied for foreach()
A když to udělám přesně jak je napsáno, tedy takto:
dump($this->klobasy->findAll()->count());
Tak vypíše zase
Notice
Undefined variable: klobasy
A po skrytí chybové hlášky vypíše nulu, přitom záznamy v db jsou
Editoval Sveet (27. 8. 2014 10:27)
- David Kudera
- Člen | 455
no to poslední je kvůli tomu, že přiřazuješ výsledek z metody count do šablony do proměnné klobasy, která se prochází v cyklu. Aspoň tak ale víme, že ten foreach v šabloně asi funguje..
zkus ten cyklus upravit takle:
{dump $klobasy}
<li n:foreach="$klobasy as $v">
{dump $v}
<a n:href="klobasy:default, $v->img">{$v->nazev}</a>
</li>
jen jsem přidal na zkoušku dumpy. Ale zase, jen tak střílím, protože ten kód by měl takhle fungovat a kdyby ne, tak vyhodit chybu. Místo toho ale nedělá nic..
- David Kudera
- Člen | 455
aháááá.. už asi vím po editaci příspěvku od tebe. Možná.. Pošli celý ten presenter prosím. Nejspíš tam vůbec neinjectuješ ten model asi.. Třeba
- Sveet
- Člen | 55
David Kudera napsal(a):
no to poslední je kvůli tomu, že přiřazuješ výsledek z metody count do šablony do proměnné klobasy, která se prochází v cyklu. Aspoň tak ale víme, že ten foreach v šabloně asi funguje..
zkus ten cyklus upravit takle:
{dump $klobasy} <li n:foreach="$klobasy as $v"> {dump $v} <a n:href="klobasy:default, $v->img">{$v->nazev}</a> </li>
jen jsem přidal na zkoušku dumpy. Ale zase, jen tak střílím, protože ten kód by měl takhle fungovat a kdyby ne, tak vyhodit chybu. Místo toho ale nedělá nic..
Stále stejná chybová hláška
Notice
Undefined variable: klobasy
Celý HomepagePresenter vypadá takto:
<?php
namespace App\FrontModule\Presenters;
use Nette,
App\Model;
class HomepagePresenter extends BasePresenter {
/**
* @autowire
* @var \App\Model\YoutubeModel
*
protected $youtube;
*
*
* @autowire
* @var \App\Model\CarouselModel
*/
protected $carousel;
/**
* @autowire
* @var \App\Model\StrankyModel
*
protected $stranky;
*
* @autowire
* @var \App\Model\StrankyModel
*/
protected $klobasy;
/**
* @autowire
* @var \App\Model\SlideshowModel
*
protected $slider;
*
*
* @autowire
* @var \App\Model\TextModel
*/
protected $text;
public function renderDefault() {
/*
$this->template->yt = $this->youtube->findAll();
$this->template->stranky = $this->stranky->findAll();
dump($this->template->klobasy = $this->klobasy->findAll());
*/
dump($this->klobasy->findAll()->count());
/*
$this->template->slide = $this->slider->findAll();
*/
$this->template->carousel = $this->carousel->findAll();
$this->template->text = $this->text->findAll()->where('pozice', '2');
$this->template->text = $this->text->findAll()->where('pozice', '1');
$this->template->texts = $this->text->findAll()->where('pozice', '0');
}
}
Editoval Sveet (27. 8. 2014 10:34)
- David Kudera
- Člen | 455
no tak teď ti tam zase teda ale chybí
$this->template->klobasy = $this->klobasy->findAll()
tím ty záznamy z db předáš do šablony, aby se mohli vypsat
- iguana007
- Člen | 970
Já tam vidím jediný problém a to, že před proměnnou protected $stranky; ti chybí lomítko ukončující komentář a nad proměnnou $klobasy mas @var \App\Model\StrankyModel, tam by imho melo byt: @var \App\Model\KlobasyModel
EDIT: těch lomítek ti tam chybí víc – však se podívej, jak ti to tu fórum obarvuje, tj. že tam máš více těch proměnných „zašedlých“
Editoval iguana007 (27. 8. 2014 10:54)
- Sveet
- Člen | 55
iguana007 napsal(a):
Já tam vidím jediný problém a to, že před proměnnou protected $stranky; ti chybí lomítko ukončující komentář a nad proměnnou $klobasy mas @var \App\Model\StrankyModel, tam by imho melo byt: @var \App\Model\KlobasyModel
EDIT: těch lomítek ti tam chybí víc – však se podívej, jak ti to tu fórum obarvuje, tj. že tam máš více těch proměnných „zašedlých“
Tohle ovšem nijak nesouvisí s mým dotazem, jelikož je to zakomentované
- Sveet
- Člen | 55
Takže ještě jednou od prvního kroku jelikož netuším kde se stala chyba když na mě vyskakuji po pár změnách samé chyby.
HomepagePresenter.php
<?php
namespace App\FrontModule\Presenters;
use Nette,
App\Model;
class HomepagePresenter extends BasePresenter {
/**
* @autowire
* @var \App\Model\YoutubeModel
*
protected $youtube;
*
*
* @autowire
* @var \App\Model\CarouselModel
*/
protected $carousel;
/**
* @autowire
* @var \App\Model\StrankyModel
*
protected $stranky;
*
* @autowire
* @var \App\Model\KlobasyModel
*/
protected $klobasy;
/**
* @autowire
* @var \App\Model\SlideshowModel
*
protected $slider;
*
*
* @autowire
* @var \App\Model\TextModel
*/
protected $text;
public function renderDefault() {
/*
$this->template->yt = $this->youtube->findAll();
$this->template->stranky = $this->stranky->findAll();
*/
$this->template->klobasy = $this->klobasy->findAll();
/**
dump($this->klobasy->findAll()->count());
$this->template->slide = $this->slider->findAll();
$this->template->klobasy = $this->klobasy->findAll();
*/
$this->template->carousel = $this->carousel->findAll();
$this->template->textr = $this->text->findAll()->where('pozice', '2');
$this->template->text = $this->text->findAll()->where('pozice', '1');
$this->template->texts = $this->text->findAll()->where('pozice', '0');
}
}
KlobasyModel.php
<?php
namespace App\Model;
use Nette,
Nette\Utils\Strings;
class KlobasyModel extends \Nette\Object {
/** @var Nette\Database\Context */
private $database;
public function __construct(Nette\Database\Context $database) {
$this->database = $database;
}
/** @return Nette\Database\Table\Selection */
public function findAll() {
return $this->database->table('klobasy');
}
/** @return Nette\Database\Table\ActiveRow */
public function findById($id) {
return $this->findAll()->get($id);
}
/** @return Nette\Database\Table\ActiveRow */
public function getPageBySlug($slug) {
return $this->findAll()->where("slug", $slug)->fetch();
}
/** @return Nette\Database\Table\ActiveRow */
public function insert($values) {
return $this->findAll()->insert($values);
}
/** $return Nette\Database\Table\ActioveRow */
public function updated($values) {
return $this->findAll()->where($id)->update($values);
}
}
KlobasyPresenter.php
<?php
namespace App\FrontModule\Presenters;
use Nette,
App\Model;
class KlobasyPresenter extends HomepagePresenter {
/**
* @autowire
* @var \App\Model\CarouselModel
*/
protected $page;
public function actionDefault($slug) {
$data = $this->page->getPageBySlug($slug);
$this->template->pages = $data;
}
}
default.latte
<div class="col-sm-12 col-md-3 seznam-vin">
<ul>
<li n:foreach="$klobasy as $v"><a n:href="klobasy:default, $v->slug">{$v->nazev}</a></li>
</ul>
</div>
<div class="col-sx-12 col-sm-12 col-md-9 brands">
{foreach $klobasy as $v}
{foreach $c->related('soubory') as $s}
<div class="col-sm-4"><a n:href="klobasy:default, $v->slug"><img style="height: 150px;" src="{$basePath}/{$s->cesta}" alt="img"></a></div>
{/foreach}
{/foreach}
</div>
Chyba:
Notice
Undefined variable: c
Kde se ta chyba může schovávat?
- iguana007
- Člen | 970
Sepiš je u všech proměnných tak, jak to popisuje Filip v tomto vlákně: https://forum.nette.org/…a-steroidech
Tj. aby byly ve formátu:
/**
* @autowire
* @var \App\Model\YoutubeModel
*/
protected $youtube;
/**
* @autowire
* @var \App\Model\CarouselModel
*/
protected $carousel;
/**
* @autowire
* @var \App\Model\StrankyModel
*/
protected $stranky;
/**
* @autowire
* @var \App\Model\KlobasyModel
*/
protected $klobasy;
/**
* @autowire
* @var \App\Model\SlideshowModel
*/
protected $slider;
/**
* @autowire
* @var \App\Model\TextModel
*/
protected $text;
- iguana007
- Člen | 970
Další věc je, v šabloně se snažíš přistupovat k proměnné $c, ale v žádném z těch souborů, co si tady hodil nevídím předávání té proměnné do šablony – tj.:
$this->template->c = .....;
Neuklepnul ses jenom a nechceš tam volat $v->related – tj. zavolat to related nad aktuálně vypisovanou klobásou $v?
Editoval iguana007 (27. 8. 2014 11:32)
- Sveet
- Člen | 55
iguana007 napsal(a):
Další věc je, v šabloně se snažíš přistupovat k proměnné $c, ale v žádném z těch souborů, co si tady hodil nevídím předávání té proměnné do šablony – tj.:
$this->template->c = .....;
Neuklepnul ses jenom a nechceš tam volat $v->related – tj. zavolat to related nad aktuálně vypisovanou klobásou $v?
Když dám $v tak vypisuje chybu na obrázky, to $c slouží pro img
Nette\Database\Reflection\MissingReferenceException
No reference found for $klobasy->related(soubory).
Je to postaveno na systému v nette
- iguana007
- Člen | 970
Nette Database jsem zatím nepoužil, ale podle té chyby bych předpokládal, že bude chybět nějaká vazba/klíč mezi tabulkami, ze kterých se data snažíš tahat (tipnul bych si že se bude jednat o tabulky klobasy a soubory) – třeba bude vědět někdo jiný, kdo Nette Database používá, ale ty si to zatím můžeš ověřit :)
- David Matějka
- Moderator | 6445
ano, muzou za to chybejici FK. V tabulce „soubory“ by mel byt FK na „klobasy“. ukaz strukturu databaze
Editoval matej21 (27. 8. 2014 12:24)
- Sveet
- Člen | 55
Struktůra tabulky soubory
CREATE TABLE IF NOT EXISTS `soubory` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`foto_id` int(11) DEFAULT NULL,
`carousel_id` int(11) DEFAULT NULL,
`slideshow_id` int(11) DEFAULT NULL,
`klobasy` int(11) DEFAULT NULL,
`cesta` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `carousel_id` (`carousel_id`),
KEY `slideshow_id` (`slideshow_id`),
KEY `foto_id` (`foto_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=35 ;
Struktůra tabulek ovšem neřeší tento problém
Editoval Sveet (27. 8. 2014 13:05)
- iguana007
- Člen | 970
OT: Docela mě baví, jak hned víš v čem určitě problém není, přičemž ti tady několik lidí tvrdí, že to je úplně naopak :D
V tom co si poslal žádný cizí klíč nevidím, takže se nedivím, že ti to nefunguje. V tom SQL dumpu by si měl mít něco jako:
CONSTRAINT `soubory_ibfk_1` FOREIGN KEY (`klobasy_id`) REFERENCES `klobasy` (`id`)
Editoval iguana007 (27. 8. 2014 13:18)
- iguana007
- Člen | 970
Problém bude v tom, že by sis měl ten můj poslední příspěvek
přečíst ještě jednou – nikdo ti tady nic o přejmenování nepsal, měl
si vytvořit FOREIGN KEY, to je trošku rozdíl.
Pokud ti to není jasné, tak bych tě odkázal nejdříve tady: http://www.linuxsoft.cz/article.php?… Až si to (celý ten
seriál) přečteš, tak se vrať tady a dořešíme zbytek.
- wicked
- Člen | 290
Sveet napsal(a):
Omlouvám se, v klasickém PHP bych to zvládl, ale mám již z dřívějška napsaný systém v nette frameworku a ten je alespoň pro mě složitější než klasické PHP, a velká část systému je již hotová, a celý systém se mi přepisovat nechce. V nette jsem začátečník
Tohle nemá nic společného ani s php, tady se jedná o vytvoření FK v tabulce soubory a směřovat ho na záznam v tabulce klobasy
- David Matějka
- Moderator | 6445
pridal si foreign key ze sloupecku „klobasy“ v tabulce „soubory“ na tabulku „klobasy“ a sloupecek „id“?