Undefined variable: posts
- Sveet
- Člen | 55
Dobrý den.
Mám takový menší problém, chci udělat obyčejný výpis produktů
z databáze, bohužel se mi tohle nijak nedaří, již pár měsíců s tímto
problémem bojuji. Byl by někdo tak ochotný a dokázal poradit?
V Homepagepresenter.php mám následující kód
class HomepagePresenter extends BasePresenter
{
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function renderDefault()
{
$this->template->posts = $this->database->table('posts')
->order('created_at DESC');
}
public function renderBefore()
{
$this->template->posts = $this->database->table('posts')
->order('created_at DESC');
}
}
V šabloně pak chci vypsat data pomoci tohoto zápisu:
<div n:foreach="$posts as $post" class="product_box">
<img class="product_photo" src="link: Post:show $post -> photo">
<p>
<a n:href="'link: Post:show $post -> id'">{$post -> name}</a>
</p>
</div>
Už se zdálo být vše v pořádku, když v tom najednou na mě vyjela hláška pomoci Laděnky, chybu mi vypisuje soubor v cache, ale nepomáhá ani smazání cache složky, po smazání složky cache na mě vyjede úplně stejná chyba.
Notice
Undefined variable: posts
- Sveet
- Člen | 55
besanek napsal(a):
Každopádně jsou špatně ty odkazy, mělo by být:
src="{link Post:show $post -> photo}" n:href="Post:show $post -> id"
A teď k té chybě. Vše se zdá být v pohodě, v jakém cache souboru? A jak se jmenuje a kde je uložen a šablona? Kterou URL voláš?
Když to udělám tak jak jsi napsal, respektive takto:
<div n:foreach="$posts as $post" class="product_box">
<img class="product_photo" src="{link: Post:show $post -> photo}">
<p>
<a n:href="link: Post:show $post -> id">{$post -> name}</a>
</p>
</div>
Tak na mě vyjíždí úplně jiná chyba, která zní takto:
syntax error, unexpected ':', expecting ')'
Před úpravou na mě vyjížděla chyba v cache pro tento soubor:
File: ...\administer\temp\cache\_Nette.FileTemplate\_Admin.produkty.latte-56c5fbe18d917aa253bc86d3cacd5390.php
URL je:
<a n:href="Admin:produkty">Správa produktů</a>
Jaká šablona? Co s tím má společného?
Editoval Sveet (10. 6. 2014 7:31)
- Sveet
- Člen | 55
Tabetha napsal(a):
zmen to n:src naspäť za ten link
Mám to takhle:
<img class="product_photo" src="{link: Post:show $post -> photo}">
A píše mi to chybu kterou jsem napsal, respektive:
syntax error, unexpected ':', expecting ')'
Chyba je vyznačená přímo na řádku se zápisem obrázku
- Sveet
- Člen | 55
Zax napsal(a):
Bez dvojtečky za link..
<img class="product_photo" src="{link Post:show $post -> photo}">
(BTW před a za „->“ bych nedával mezeru, přijde mi to hůř čitelné a určitě nejsem jediný)
Tak jsem zápis img udělal přesně jak je napsáno v příspěvku, tedy tento:
<img class="product_photo" src="{link Post:show $post ->photo}">
Mám to samé udělat i pro odkaz, respektive tohle?
<a n:href="link Post:show $post -> id">{$post -> name}</a>
Nebo tohle?
<a n:href="link: Post:show $post -> id">{$post -> name}</a>
besanek napsal(a):
A k původní chybě, zobrazuješ presenter
Admin
s akcí produkty, ale v prvním postu ukazuješ presenterHomepage
který má akcedefault
abefore
. Existuje iAdminPresenter
a přiřazuje tu proměnnou do šablony?
Ano existuje AdminPresenter, a v něm je jen tohle:
use Nette\Application\UI;
/**
* Admin presenter.
*/
class AdminPresenter extends BasePresenter {
public function startup() {
parent::startup();
if(!$this->getUser()->isLoggedIn()) {
$this->flashMessage('Nejdříve se musíte přihlásit.', 'error');
$this->redirect("Login:default");
}
}
public function handleLogOut() {
$this->getUser()->logout();
$this->flashMessage('Byl jste úspěšně odhlášen.', 'success');
$this->redirect('Login:default');
}
}
Jinak chybová hláška po úpravě dvojtečky vypadá takto, a to i když odstraním dvojtečku za link u odkazu.
Parse Error
syntax error, unexpected ':', expecting ')'
Editoval Sveet (10. 6. 2014 9:24)
- echo
- Člen | 134
Doporučuju přečíst si https://latte.nette.org/cs/tags. Je to tam krásně popsáno i s ukázkami.
Správné možnosti:
<img class="product_photo" src="{link Post:show $post->photo}">
<a n:href="Post:show $post->id">{$post->name}</a> nebo <a href="{link Post:show $post->id}">{$post->name}</a>
Všimni si, že když použiješ n:href, tak už dále neuvádíš ‚link‘, protože by to bylo bezpředmětné.
Editoval echo (10. 6. 2014 9:34)
- Sveet
- Člen | 55
Děkuji za upozornění makro a n:makra. Nicméně stále mi to píše chybu kterou jsem uvedl, tedy chybu se zněním níže. Jak by jste tento problém řešili vy? Včera jsem se na stejný dotaz bavil s kolegou, a ten mi řekl, že chyba v tom co jsem napsal není, a že je to divné. Zároveň mi napsal, že by produkty měli mít svůj vlastní presenter. V čem je lepší vlastní presenter, než to co je do teď?
Notice
Undefined variable: posts
- Sveet
- Člen | 55
besanek napsal(a):
Však v tom
AdminPresenter
u bys měl mít něco jako:public function renderProdukty() { $this->template->posts = $this->database->table('posts') ->order('created_at DESC'); }
Tak jsem upravil AdminPresenter.php do následující podoby:
use Nette\Application\UI;
/**
* Admin presenter.
*/
class AdminPresenter extends BasePresenter {
public function startup() {
parent::startup();
if(!$this->getUser()->isLoggedIn()) {
$this->flashMessage('Nejdříve se musíte přihlásit.', 'error');
$this->redirect("Login:default");
}
}
public function handleLogOut() {
$this->getUser()->logout();
$this->flashMessage('Byl jste úspěšně odhlášen.', 'success');
$this->redirect('Login:default');
}
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function renderProdukty()
{
$this->template->posts = $this->database->table('posts')
->order('created_at DESC');
}
}
A píše mi to:
Nette\DI\ServiceCreationException
No service of type Nette\Database\Context found. Make sure the type hint in Method AdminPresenter::__construct() is written correctly and service of this type is registered.
- Sveet
- Člen | 55
besanek napsal(a):
Jakou používáš verzi Nette a jak vytváříš databázi v konfiguraci?
Verze nette by měla být 2.0.14, ale nevím to jistě protože na začátku všeho tedy už asi dva měsíce co jsem si nechal napsat přihlášení do administrace na zakázku. Od té doby pokračuji v psaní kódu sám.
- Sveet
- Člen | 55
besanek napsal(a):
V
2.0.*
ještěDatabase\Context
není, mělo by stačit dát místo něj v konstruktoruNette\Database\Connection
Paráda už jsme se posunuli k další chybové hlášce, ve znění
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'shopsys.posts' doesn't exist
A chyba:
$this->template->posts = $this->database->table('posts')
->order('created_at DESC');
- Michal Vyšinský
- Člen | 608
Zkus číst hlášky a přemýšlet místo toho, abys okamžitě každou chybu dával sem…
- Zax
- Člen | 370
Ne, zrovna na tom nezáleží. Záleží na tom, co cpeš do metody table().
$this->template->jakakolivPromennaCoSiZvolis = $this->database->table('produkty') // <-- produkty musí sedět, logicky...
->order('created_at DESC');
{foreach $jakakolivPromennaCoSiZvolis as $produkt}
EDIT: to jsou základy PHP, měl bys být schopen se je naučit aniž bychom tě tu vodili za ručičku ;-)
Editoval Zax (10. 6. 2014 10:54)
- Michal Vyšinský
- Člen | 608
Když nemá tabulku posts
tak proč načítáš posts? Na názvu
proměnné nezáleží, ale záleží na parametru volání metody
table
, takže tam místo posts
dej produkty
- Sveet
- Člen | 55
Tak už jsem to vyřešil zkrácením zápisu z:
public function renderProdukty()
{
$this->template->posts = $this->database->table('product')
->order('created_at DESC');
}
Na:
public function renderProdukty()
{
$this->template->posts = $this->database->table('product');
}
A vše začalo fungovat, jelikož ale já nemohu mít takové štěstí tak se mi nezobrazuje obrázek produktu, tedy zobrazí se, že tam nějaký img je, ale ne s adresou na obrázek, vypíše mi to něco takového. Jak tohle opravit?
<img class="product_photo" src="error: Cannot load presenter 'Post', class 'PostPresenter' was not found in 'C:\Program Files\EasyPHP-DevServer-14.1VC9\data\localweb\Drazdik\administer\app/presenters/PostPresenter.php'.">
- Zax
- Člen | 370
PostPresenter máš? Víš vůbec, co dělá macro {link}? Vidím, že zkoušíš všude cpát stejnou adresu, idčko a obrázek, obojí zkoušíš odkazovat na stejný presenter a akci, prostě sorry, ale tím, že sem budeš pořád posílat chybové hlášky, se moc daleko nedostaneš. My ten web za tebe neuděláme ;-)
Zkusil bych začít zde
- Sveet
- Člen | 55
Zax napsal(a):
PostPresenter máš? Víš vůbec, co dělá macro {link}? Vidím, že zkoušíš všude cpát stejnou adresu, idčko a obrázek, obojí zkoušíš odkazovat na stejný presenter a akci, prostě sorry, ale tím, že sem budeš pořád posílat chybové hlášky, se moc daleko nedostaneš. My ten web za tebe neuděláme ;-)
Zkusil bych začít zde
Dokumentaci jsem prošel, ale nic není v začátcích o výpisu obrázku z databáze. Nemyslím si, teda sto procentně vím, že celý web neuděláte za mě, ale jen jsem se chtěl zeptat na výpis z databáze, u klasického PHP je to tedy lehčí snad o sto procent, a to má Nette práci ulehčovat. Já bych řekl, že spíš práci přidává, každopádně Nette se chci učit, jen ten výpis s databáze je u PHP s sto procent lehčí. Nevím jak se v nette dělá s databázi, a jak jsem již napsal v předchozích tématech chtěl jsem to zkusit formou pokud omyl, respektive něco se naučit, a vyzkoušet, u pro starší verze Nette není sepsána dokumentace, jen pro 0.9 co jsem vyděl.
Do výuky Nette jsem se pustil protože je v poslední době in, a chtějí jej téměř všichni
- Zax
- Člen | 370
Sveet napsal(a):
Dokumentaci jsem prošel, ale nic není v začátcích o výpisu obrázku z databáze. Nemyslím si, teda sto procentně vím, že celý web neuděláte za mě, ale jen jsem se chtěl zeptat na výpis z databáze, u klasického PHP je to tedy lehčí snad o sto procent, a to má Nette práci ulehčovat. Já bych řekl, že spíš práci přidává, každopádně Nette se chci učit, jen ten výpis s databáze je u PHP s sto procent lehčí. Nevím jak se v nette dělá s databázi, a jak jsem již napsal v předchozích tématech chtěl jsem to zkusit formou pokud omyl, respektive něco se naučit, a vyzkoušet, u pro starší verze Nette není sepsána dokumentace, jen pro 0.9 co jsem vyděl.
Do výuky Nette jsem se pustil protože je v poslední době in, a chtějí jej téměř všichni
Nette, stejně jako každý jiný framework, v některých oblastech práci ulehčuje a v jiných ji přidělává (což se u Nette zrovna moc nestává ;-)). Nicméně aby práci ulehčoval, je třeba mu rozumět a ano, naučit se to je celkem běh na dlouhou trať.
Nicméně, vůbec nic ti nebrání použít čisté PHP tam, kde si nevíš rady.
Obrázek máš v databázi uložený jak? Normálně jako název? Pak by ti mělo fungovat docela obyčejné:
<img class="product_photo" src="{$post->photo}">
pokud je v nějaké podsložce, tak
<img class="product_photo" src="slozka/podslozka/{$post->photo}">
nebo ještě lépe
<img class="product_photo" src="{$baseUri}/slozka/podslozka/{$post->photo}">
($baseUri je proměnná, která se automaticky vkládá do šablon a obsahuje umístění projektu – díky tomu je možné mít celou aplikaci v podsložce a nerozbijou se ti adresy na obrázky, styly, JS apod. – docela dobrý tohle vědět a používat)
- Sveet
- Člen | 55
Zax napsal(a):
Sveet napsal(a):
Dokumentaci jsem prošel, ale nic není v začátcích o výpisu obrázku z databáze. Nemyslím si, teda sto procentně vím, že celý web neuděláte za mě, ale jen jsem se chtěl zeptat na výpis z databáze, u klasického PHP je to tedy lehčí snad o sto procent, a to má Nette práci ulehčovat. Já bych řekl, že spíš práci přidává, každopádně Nette se chci učit, jen ten výpis s databáze je u PHP s sto procent lehčí. Nevím jak se v nette dělá s databázi, a jak jsem již napsal v předchozích tématech chtěl jsem to zkusit formou pokud omyl, respektive něco se naučit, a vyzkoušet, u pro starší verze Nette není sepsána dokumentace, jen pro 0.9 co jsem vyděl.
Do výuky Nette jsem se pustil protože je v poslední době in, a chtějí jej téměř všichni
Nette, stejně jako každý jiný framework, v některých oblastech práci ulehčuje a v jiných ji přidělává (což se u Nette zrovna moc nestává ;-)). Nicméně aby práci ulehčoval, je třeba mu rozumět a ano, naučit se to je celkem běh na dlouhou trať.
Nicméně, vůbec nic ti nebrání použít čisté PHP tam, kde si nevíš rady.
Obrázek máš v databázi uložený jak? Normálně jako název? Pak by ti mělo fungovat docela obyčejné:
<img class="product_photo" src="{$post->photo}">
pokud je v nějaké podsložce, tak
<img class="product_photo" src="slozka/podslozka/{$post->photo}">
nebo ještě lépe
<img class="product_photo" src="{$baseUri}/slozka/podslozka/{$post->photo}">
($baseUri je proměnná, která se automaticky vkládá do šablon a obsahuje umístění projektu – díky tomu je možné mít celou aplikaci v podsložce a nerozbijou se ti adresy na obrázky, styly, JS apod. – docela dobrý tohle vědět a používat)
Díky netušil jsem, že mohu kombinovat klasické php s nette frameworkem
- Zax
- Člen | 370
Ono celé to je klasické PHP, i Nette je napsané v PHP, jenom je to prostě udělané tak, aby ti to ušetřilo psaní nějakého rutinního kódu, abys nemusel pořád ručně sahat do $_GET, abys nemusel pořád dokola řešit bezpečnost apod.
Akorát šablonovací systém v Nette je lehce odlišný od PHP, ale zkus si to prostě představit tak, že místo <?php a ?> použiješ { a }. Ono to sice přesně tak nefunguje, viz makra – dočteš se, že {expression} vypíše escapovaný expression (expression může být třeba obyčejná PHP proměnná), ale čistý PHP příkaz provedeš pomocí {?nejakyKod} (nepoužívat pokud to není nezbytně nutné, napsal jsem to jenom pro úplnost). Jinak šablony fungují na tom principu, že se makra přeloží do normálního PHP a to se uloží do cache.
Fakt to není složitý, pořád používáš klasické PHP, jen to není tolik „poznat“ ;-)
Editoval Zax (10. 6. 2014 12:44)
- Zax
- Člen | 370
Jan Endel: dobrá připomínka, dopsal jsem upozornění do příspěvku.. nicméně se to občas hodí pro pomocné proměnné, například mám seznam nějakých společenských akcí vypisovaný pomocí foreach a seřazený podle času a mezi aktuálními a minulými položkami chci zobrazit nadpis „akce, které proběhly“, tak si uložím do pomocné proměnné informaci, jestli jsem to už vypsal nebo ne (jestli máš lepší řešení, tak sem s ním :-P ).
Editoval Zax (10. 6. 2014 12:50)