Úplný výpis z databáze, začinam s OOP aj Nette

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

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

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

ďakujem za pomoc, bohužial tvoj kod mi hádže chybu: Undefined variable: database

romiix.org
Člen | 343
+
0
-

Zostala mi stará premenná v triede PrintOut. Skús teraz.

Andurit
Člen | 131
+
0
-

Ide to, super vdaka. Ohladom toho foreachu ja som to prave skusal aj cez neho ale hadzalo mi to undefine variabile tak som si to chcel dumpnut evidente som to ale spravil zle.
Tak ešte raz vďaka

romiix.org
Člen | 343
+
0
-

Rado sa stalo;)

Andurit
Člen | 131
+
0
-

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

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.

iNviNho
Člen | 352
+
0
-

Na to ti odporúčam tutorialy na youtube na temu PHP OOP od thenewboston. Veľa vecí pochopíš a pôjde ti to potom od ruky.

Editoval iNviNho (14. 11. 2013 10:27)

japlavaren
Člen | 404
+
0
-

DI pomocou __construct by mali dostavat service/factory/etc. urcite nie presentery.

pouzivaj radsej inject

Jendaaa
Člen | 21
+
0
-

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();
    }
}
?>