Úplný výpis z databáze, začinam s OOP aj Nette
- Andurit
- Člen | 131
cawte, zacinam s Nette a vlastne s OOP celkovo preto sa vopred ospravedlnujem ak je môj problm doslova trivialny. Bohuzial si s nim neviem velmi poradit. Takze potrebujem urobit vypis celej tabulky z databaze
Moj model:
<?php
use Nette\Security;
use Nette\Utils\Strings;
use Nette\Diagnostics\Debugger;
class PrintOut extends Nette\Object
{
private $database;
public function __construct(Nette\Database\Connection $database)
{
$this->database = $database;
}
public function banlist()
{
$rows = $this->database->table('banlist');
Debugger::dump($rows);
return;
}
}
?>
Následne môj prezenter vyzera asi takto:
<?php
use Nette\Database\Connection;
use Nette\Diagnostics\Debugger;
class BanPresenter extends BasePresenter
{
public function renderDefault() {
$this->template->ban = $this->context->ban->banlist();
}
}
?>
Moj template:
{block content}
<table>
<thead>
<tr>
<th>Name</th>
<th>Reason</th>
<th>Admin</th>
</tr>
</thead>
<tbody>
<tr>
<td>{$ban}</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
{/block}
Prikladám sem aj vypis z debuggeru http://pastebin.com/eZBGMnqN
Samozrejme si uvedomujem ze by som to mal prejst foreachom ale pre akysi debuggin som si to dal zatial takto aby som vôbec videl co je v tej premennej. Mam ale dojem ze len selectujem tabulku a nic z nej neberiem. Ako mam teda postupovať?
p.s. Este raz sa ospravedlnujem za trivialnosť problemu rieseneho v tohto topicu, teda aspon ratam pre väčšinu z vás.
Editoval Andurit (6. 11. 2013 15:40)
- romiix.org
- Člen | 343
S využitím DI by to malo vyzerať nejak takto:
Model PrintOut.php
:
<?php
class PrintOut extends Nette\Object
{
/** @var Nette\Database\Connection */
private $connection;
public function __construct(Nette\Database\Connection $connection)
{
$this->connection = $connection;
}
/** @return Nette\Database\Table\Selection */
public function banlist()
{
return $this->connection->table('banlist');
}
}
Konfigurácia služby v config.neon
:
common:
services:
printOut: PrintOut
Presenter BanPresenter.php
:
<?php
class BanPresenter extends BasePresenter
{
/** @var PrintOut */
protected $printOut;
/** @var PrintOut */
public function __construct(PrintOut $printOut)
{
$this->printOut = $printOut;
}
public function renderDefault() {
$this->template->banlist = $this->printOut->banlist();
}
}
Template:
{block content}
<table>
<thead>
<tr>
<th>Name</th>
<th>Reason</th>
<th>Admin</th>
</tr>
</thead>
<tbody>
<tr n:foreach="$banlist as $ban">
<td>{$ban->name}</td>
<td>{$ban->reason}</td>
<td>{$ban->admin}</td>
</tr>
</tbody>
</table>
{/block}
Kým nepoužiješ na Nette\Database\Table\Selection
metódu fetch()
alebo objekt nepreženieš cez foreach
, nedostaneš sa k dátam.
Dovtedy iba skladáš dotaz.
V iterácií (vo vnútri foreach
) alebo po zavolaní fetch()
dostaneš Nette\Database\Table\ActiveRow –
ten obsahuje okrem iného aj dáta.
Odporúčam ešte raz si prejsť dokumentáciu ;)
Editoval romiix.org (6. 11. 2013 15:50)
- Andurit
- Člen | 131
Prechadzam si to cele a uplne nechapem co presne ma robit toto:
<?php
/** @var PrintOut */
protected $printOut;
/** @var PrintOut */
public function __construct(PrintOut $printOut)
{
$this->printOut = $printOut;
}
?>
Nasiel by si si este cas vysvetlit mi to nejako detailnejsie?
- romiix.org
- Člen | 343
Pri vytváraní presentera sa volá jeho konštruktor. Nette automaticky
doňho dodá služby tried podla hintov. V konštruktore sa nastaví do
premennej $printOut
služba vytvorená z triedy
PrintOut
.
Lepšie to asi vysvetlí dokumentácia konfigurácie.
- japlavaren
- Člen | 404
DI pomocou __construct by mali dostavat service/factory/etc. urcite nie presentery.
pouzivaj radsej inject
- Jendaaa
- Člen | 21
Jak píše japlavaren, pro závislosti používej metody inject*(), volají se v době inicializace presenteru. Presenter by měl být potom třeba takto:
<?php
class BanPresenter extends BasePresenter
{
/** @var PrintOut */
protected $printOut;
/** @var PrintOut */
public function injectPrintOut(PrintOut $printOut)
{
$this->printOut = $printOut;
}
public function renderDefault() {
$this->template->banlist = $this->printOut->banlist();
}
}
?>