Undefined variable: database – V šabloně nejde používat databázi

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

Dobrý den

Chtěl bych se zeptat: Co mám udělat pro to, abych mohl v šabloně takhle pracovat s foreachem jako v ukázce v dokumentaci?

{foreach $database->table('book')->order('title')->limit(5) as $book}
    <h2>{$book->title} ({$book->author->name})</h2>

    {foreach $book->related('book_tag') as $book_tag}
        {$book_tag->tag->name}{sep}, {/sep}
    {/foreach}
{/foreach}

Mě to furt hází chybu Undefined variable: database. Mám někam něco přidat?

Potřeboval bych to kvůli vnořenému cyklu co mám v šabloně.

Děkuji

Etch
Člen | 403
+
0
-

Musíš si tu „databázi“ do té proměnné nacpat. V presenteru:

$this->template->database = $database;
Šaman
Člen | 2668
+
0
-

Jen rovnou upozorňuji, že tohle je zlá, nepěkná případ ignorace MVC, dokonce i VC architektury. Šablona má zobrazovat to, co ji předá presenter. Správně by měl výběr knih provést presenter a předat je jako pole/kolekci do šablony a tak už si z nich pak vytáhne, co se má zobrazit. Bez příměho přístupu k db.

Takže presenter:

<?php
$books = $this->connection->table('book')->order('title')->limit(5);
$this->template->books= $books;
?>

a pak v šabloně:

{foreach $books as $book}
    <h2>{$book->title} ({$book->author->name})</h2>

    {foreach $book->related('book_tag') as $book_tag}
        {$book_tag->tag->name}{sep}, {/sep}
    {/foreach}
{/foreach}

Později, až zjistíš, že model ti dále zpřehledňuje aplikaci, nebudeš mít databázi ani v presenteru, ale presenter bude přistupovat třeba k repozitáři BookRepository a jeho metodám. Výhoda bude v tom, že všechen kód pro práci s tabulkou book bude v jediné třídě a tedy i dobře udržovatelný.

dzejhou
Člen | 2
+
0
-

Děkuju moc za odpovědi :)

  1. Zkusil jsem teda tu proměnnou „nacpat“ do šablony takto:
<?php

namespace App;

use Nette,
	Model;

/**
 * Homepage presenter.
 */
class UserAdministrationPresenter extends BasePresenter
{

     public $database;

    function __construct(Nette\Database\Context $database)  // Připojíme se na naši databázi
    {
        $this->database = $database;
    }

    public function renderDefault()
    {
        if(!($this->user->isInRole('admin')))
        {
            $this->flashMessage('Nemáte požadovanou roli.');
            $this->redirect('Homepage:');
        }
        else
        {
            $this->template->users = $this->database->query('SELECT * FROM users');
            $this->template->queries = $this->database->query('SELECT DISTINCT users.idu, roles.role FROM roles JOIN usersroles ON roles.idr = usersroles.idr JOIN users ON usersroles.idu = users.idu');
            $this->template->database = $database;
        }
    }
.
.
.

no a tentokrátm mě to napíše chybu u řádku $this->template->database = $database;
a píše to → Undefined variable: database

  1. Nejdradši bych to takhle nedělal, ale nevím jak to udělat jinak. V šabloně chci udělat cycklus s vnořeným cyklem, no a ten vnořený se mi provede vždycky jen u prvního řádku :( Napadlo mě právě, že by pomohlo ze šablony přistupovat k tabulce přes proměnnou database

kdyžtak posílám ještě ukázku té šablony

<table id="administration">
    <tr>
        <td>ID</td><td>Uživ. jméno</td><td>Celé jméno</td><td>Role</td>
    </tr>
    {foreach $users as $user}
    <tr>
        <td>
            {$user->idu}
        </td>
        <td>
            {$user->username}
        </td>
        <td>
            {$user->fullname}
        </td>
        <td>

             <?php // Vnořený cycklus
                while($row = $queries->fetch())
                {
                    if($row[0] == $user->idu)
                    {
                        echo $row[1] . " ";
                    }
                }

             ?>
        </td>
        <td class="no_border">
            <a href="{link UserAdministration:edit $user->idu}">Upravit</a>
        </td>
        <td class="no_border">
            <a href="{link UserAdministration:delete $user->idu}">Smazat</a>
        </td>
    </tr>
    {/foreach}
</table>
akadlec
Člen | 1326
+
0
-

A co se takhle aspoň naučit základy PHP????

Ta chyba je přeci zřejmá ne? Používáš proměnnou která neexistuje. Když už tak aspoň takto:

$this->template->database = $this->database;
jiri.pudil
Nette Blogger | 1034
+
0
-

2. Nette\Database nabízí přesně na tohle pohodlné API.