Undefined variable: database – V šabloně nejde používat databázi
- dzejhou
- Člen | 2
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
- Šaman
- Člen | 2668
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
Děkuju moc za odpovědi :)
- 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
- 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>