Zobrazenie tabuľky bez väzby v Repository

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

Ahojte, v Nette som viac menej začiatočník odchovaný iba na nette/examples/CD-collection. Zakladať Repository a Presenter na každú tabuľku na jednoduché na základné akcie I/U/D.

Netuším ako však postupovať ak v Repository nechcem definovať názov tabuľky, pretože ešte netuším akú tabuľku budem zobrazovať – chcel by som navrhnúť jednotné rozhranie pre pokiaľ možno čo najviac tabuliek.

public function findAll() {
     return $this->database->table('???');
 }

Ako odovzdať túto informáciu dynamicky Repositoru al. Presenteru z latte šablóny cez parameter url? Hľadal som na fóre, webe ale pravdupovediac ani neviem, kde by som mal vlastne začať.

Pavel Kravčík
Člen | 1196
+
0
-

Udělej si předka, v něm si udělej základní funkce a pak to půjde samo. :)

abstract class Repository extends Nette\Object
{
	/** @var Nette\Database\Connection */
    protected $connection;

	public function __construct(Nette\Database\Context $db)
    {
		$this->connection = $db;
    }

    /**
      * @return Nette\Database\Table\Selection
      */
    protected function getTable()
    {
		return $this->connection->table(self::tableName);
    }

	public function findAll()
	{
		return $this->getTable()->fetchAll();
	}
class ArticleRepository extends Repository
{
	const $table = 'article_table';
}

Píšu to od oka, pointa je snad jasná. :)

_rasel^
Člen | 59
+
0
-

Ďakujem za odpoveď. Neviem si rady s tým ako mám z View do Presenteru odovzdať jeden parameter. A ako mám správne vytvoriť link.
Aspoň základná predstava je taká, že v šablóne by som mal čosi takéto:

<a n:href="Zobraz:default, $tabulka">

Presenter:

use ?;
...
$table_name= $this->getPost('tabulka');

Editoval _rasel^ (18. 5. 2016 13:56)

Barvoj
Člen | 60
+
0
-

Například takto:

{var $table = "xyz"}
<a n:href="Zobraz:default, $tabulka">Klikni</a>

což vygeneruje nějaký takový odkaz: /zobraz?tabulka=xyz

use Nette\Application\UI\Presenter;

class ZobrazPresenter extends Presenter
{
	public function actionDefault($tabulka)
	{
		// v proměnné $tabulka je string "xyz"
	}
}
_rasel^
Člen | 59
+
0
-

Odovzdávanie parametrov z view pre presenteru do renderDefault funguje. Mal som chybný zápis, var mi pomohlo, ďakujem :)

Ale vôbec netuším ako odovzdať parameter z view do presenteru pre komponentu, pretože ak tento parameter použijem aj v komponente, tak Tracy zakričí, že je prázdny.

V šablóne mám čosi takéto:

{var $table = $t->table_name}
<a n:href="Tabulky:default, $table">{t->friendly_table_name}</a>

Mal som pocit, že stačí urobiť čosi takéto:

<?php
...
class TabulkyPresenter extends BasePresenter {
...
public $table_name;
...
    public function renderDefault($table) {
		$this->table_name = $table;
    }
...
    public function createComponentDataGrid($name) {
	...
	$grid->setDataSource($this->database->table($this->table_name)->order('id'));
	}

Tracy: Nette\InvalidArgumentException, Table '' does not exist.

Editoval _rasel^ (22. 5. 2016 15:42)

_rasel^
Člen | 59
+
0
-

Po niekoľkých hodinách som zistil, že zápis hore náhodile funguje a nefunguje pri stránkovaní v gride. Riešenie je jednoduché :)

class TabulkyPresenter extends BasePresenter {
...
/** @persistent */
public $table_name;
GEpic
Člen | 566
+
0
-

_rasel^ napsal(a):

Po niekoľkých hodinách som zistil, že zápis hore náhodile funguje a nefunguje pri stránkovaní v gride. Riešenie je jednoduché :)

class TabulkyPresenter extends BasePresenter {
...
/** @persistent */
public $table_name;

A ošklivé… Persistentní parametr se nese skrze celou aplikaci. Ty potřebuješ $table_name v celé aplikaci křížem krážem?

Editoval GEpic (22. 5. 2016 20:30)

_rasel^
Člen | 59
+
0
-

Aj áno, viac by ma potešilo, ak by si uviedol nejaké praktické riešenie. Toto bolo jediné na čo som so prišiel… neovládam presne životný cyklus všetkého, aby som vedel navrhnúť niečo optimálnejšie, čistejšie a elegantnejšie. Aj prasácke riešenie je riešenie – pre daný prípad najjednoduchšie, aj keď sa to ťahá všade… neťahá sa to len v rámci daného presenteru?

Editoval _rasel^ (23. 5. 2016 11:44)

GEpic
Člen | 566
+
0
-

Já bych si vytvořil akci presenteru např:

protected function renderTableName() # Takze napr renderTableUsers
{

}

# a pote:
protected function createComponentDataGrid($name)
{
	$grid->setDataSource($this->database->table(str_replace('Table', '', $this->action))->order('id'));
}

Pisu z hlavy a na rychlo.

EDIT: Můžeš tak snadno ošetřit které tabulky chceš vypsat, a které ne, navíc donastavit v renderTable<Name> další potřebné věci. V případě výše můžeš totiž do persistentního parametru podstrčit cokoliv, takhle to nemusíš hlídat.

Editoval GEpic (23. 5. 2016 15:37)

_rasel^
Člen | 59
+
0
-

Chcel som sa vyhnúť tomu, aby som nemusel na každú tabuľku napísať render, pretože v danej chvíli neviem aké tabuľky vôbec budem zobrazovať (databáza obsahovať) – inak by som s každou tabuľkou musel udržiavať zoznam renderov podľa toho o aké tabuľky ide. Chcel som to nejako dynamicky. Ak by sa dal urobiť render foreachom z db, tak to by bolo super :D

Editoval _rasel^ (23. 5. 2016 17:51)

GEpic
Člen | 566
+
0
-

Záleží na použítí, já si radši každý grid připravím zvlášť, včetně ikonek, odkazů, tlačítek a podobně. Né vždy se ta přílišná abstrakce vyplácí. :) :D