Undefined variable: posts

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

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
besanek
Člen | 128
+
0
-

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áš?

Sveet
Člen | 55
+
0
-

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)

echo
Člen | 134
+
0
-
<div n:foreach="$posts as $post" class="product_box">

      <img class="product_photo" n:src="Post:show $post->photo">

         <p>

            <a n:href="Post:show $post->id">{$post->name}</a>

         </p>

</div>

Editoval echo (10. 6. 2014 7:34)

Sveet
Člen | 55
+
0
-

echo napsal(a):

<div n:foreach="$posts as $post" class="product_box">

      <img class="product_photo" n:src="Post:show $post->photo">

         <p>

            <a n:href="Post:show $post->id">{$post->name}</a>

         </p>

</div>

Makro n:src neexistuje

Unknown macro-attribute n:src
Tabetha
Člen | 140
+
0
-

zmen to n:src naspäť za ten link

Sveet
Člen | 55
+
0
-

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

Zax
Člen | 370
+
+2
-

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

Editoval Zax (10. 6. 2014 7:54)

besanek
Člen | 128
+
0
-

A k původní chybě, zobrazuješ presenter Admin s akcí produkty, ale v prvním postu ukazuješ presenter Homepage který má akce default a before. Existuje i AdminPresenter a přiřazuje tu proměnnou do šablony?

Sveet
Člen | 55
+
0
-

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š presenter Homepage který má akce default a before. Existuje i AdminPresenter 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
+
0
-

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)

Oli
Člen | 1215
+
+1
-

Mícháš makra a n:makra dohromady. Bud je to n:makro

<a n:href="Post:show $post -> id">{$post -> name}</a>

nebo makro

<a href="{link Post:show $post -> id}">{$post -> name}</a>
Sveet
Člen | 55
+
0
-

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
Šaman
Člen | 2666
+
0
-

V jakém souboru je ta chyba? Resp. možná bude nejlepší když celý projekt nahraješ někam na GitHub, ať to můžem proklikat, chyba bude někde zakopaná. Jsi určitě ve správné metodě správného presenteru?

besanek
Člen | 128
+
0
-

Však v tom AdminPresenteru bys měl mít něco jako:

public function renderProdukty()

       {

          $this->template->posts = $this->database->table('posts')
               ->order('created_at DESC');
       }
Sveet
Člen | 55
+
0
-

besanek napsal(a):

Však v tom AdminPresenteru 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.
besanek
Člen | 128
+
0
-

Jakou používáš verzi Nette a jak vytváříš databázi v konfiguraci?

Sveet
Člen | 55
+
0
-

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.

besanek
Člen | 128
+
0
-

V 2.0.* ještě Database\Context není, mělo by stačit dát místo něj v konstruktoru Nette\Database\Connection

Sveet
Člen | 55
+
0
-

besanek napsal(a):

V 2.0.* ještě Database\Context není, mělo by stačit dát místo něj v konstruktoru Nette\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
+
+4
-

Zkus číst hlášky a přemýšlet místo toho, abys okamžitě každou chybu dával sem…

Sveet
Člen | 55
+
0
-

Michal Vyšinský napsal(a):

Zkus číst hlášky a přemýšlet místo toho, abys okamžitě každou chybu dával sem…

Čtu, ale databáze shopsys nemá tabulku posts, ale má produkty, pak by zápis byl zřejmě takový nebo se pletu?

{foreach $produkty as $produkt}
Zax
Člen | 370
+
0
-

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

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

besanek
Člen | 128
+
0
-

Nebo spíš upravit něco tady ;)

$this->database->table('posts')
Sveet
Člen | 55
+
0
-

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

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

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

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

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

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)

Jan Endel
Člen | 1016
+
+1
-

Důrazně kohokoliv varuju kdo čte toto vlákno od použití makra {? z 99% to smrdí kódem co patří do presenteru, používejte jen tehdy pokud skutečně víte co děláte.

Zax
Člen | 370
+
0
-

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)

akadlec
Člen | 1326
+
+6
-

Důrazně doporučuji tazateli se naučit aspoň elementární znalosti jazyka ve kterém se snaží programovat. Nevím co je to poslední dobou za módu že všichni musí umět PHPko nebo se tvářit tak že staví eshopy apod. To se na to dají balit baby nebo co?