Získání dat např ID z URL
- TomasHuttner
- Člen | 66
Díky, a když chci podle toho ID vybrat položku v databazi abych jí pak mohl vypisovat do šablony?
- TomasHuttner
- Člen | 66
Děkuji už to mám, ale teď řeším jinej problém
Mám:
<h3 n:block="title">{$nazev->nazev}..</h3>
{if $nazev->nazev == $items->kategorie}
{foreach $items as $item}
<div class="thumbnails span10">
<li class="span4">
<div class="thumbnail">
<img data-src="holder.js/300x200" alt="">
<div class="caption">
<h3>{$item->nazev}</h3>
<p>{$item->popisek}</p>
<p><a href="#" class="btn btn-info">Action</a>
</div>
</div>
</li>
</div>
{/foreach}
{/if}
A laděnka mi vyhazuje:
Cannot read an undeclared property
Nette\Database\Table\Selection::$kategorie.
- David Matějka
- Moderator | 6445
hlavne, $items
neni radek (ActiveRow), ale cely vyber
(Selection
). ceho chces dosahnout? aby se vypisovaly polozky jen
z te kategorie? to uz si nastav v presenteru/modelu
pomoci ->where(...)
- TomasHuttner
- Člen | 66
Mám jedu šablonu zbozi a na tý chci vytvořitt podle toho na jaký mǎčku dokaz v menu např Mobily tak aby sem mi na tý stránce ukazovali jen mobily a kdyź zase mamčknu na tekevice tak aby se mi zobrazovali jen televize.
- Mysteria
- Člen | 797
Ale tak v tom případě to řešíš špatně. Pokud to menu chceš jako filtraci položek podle typu, tak bych to udělal takhle: V menu si udělej odkazy ve stylu
<a n:href='this $category->id'>{$category->name}</a>
pak v presenteru budeš mít něco jako
public function renderDefault($categoryID) {
$this->template->items = empty($categoryID) ? $this->model->getAllItems() : $this->model->getItemsByCategory($categoryID);
}
a v modelu
public function getAllItems() {
return $this->database->table('items');
}
public function getItemsByCategory($categoryID) {
return $this->database->table('items')->where('category_id', $categoryID);
}
A v šabloně pak budeš mít v $items buď všechny položky (když si nevybral žádnou kategorii) nebo jenom položky té jedné kategorie, když si nějakou v menu vybereš.
- TomasHuttner
- Člen | 66
Děkuji za radu ale když to použiji tak mi to v šabloně píše chybu Undefined variable: category
- Oli
- Člen | 1215
EDIT: Odpověď na smazaný příspěvek.
Protoze to volas nad objektem UserManager. To předpokládám nechceš. Musíš si do presenteru předat ten model, kterej obsahuje zbozi.
Btw. Ta hláška je docela jasná.
//Odpověď na nový dotaz:
Protože nevypisuješ něco $this->template->category. Musíš si category
nějak předat do šablony, např:
$this->template->category = $this->categoryModel->getByCategoryId($categoryId);
//v modelu zhruba
return $this->connection->table('categories')->wherePrimary($categoryId)->fetch();
Editoval Oli (24. 3. 2014 17:21)
- TomasHuttner
- Člen | 66
Mysteria napsal(a):
<a n:href='this $category->id'>{$category->name}</a>
Já ale potřebuju v tom odkazu přesměrovat na:
<a n:href='Admin:zbozi $category->id'>{$category->name}</a>
proto mi to pořád nefunguje podle toho návodu..
- TomasHuttner
- Člen | 66
Mysteria napsal(a):
Ale to je úplně jedno kam to přesměrováváš, jenom se ta metoda nebude jmenovat renderDefault($categoryID) ale renderZbozi($categoryID) v tomhle konkrétním případě. Nebo co ti to teď píše za chybu?
Ve zbozi šabloně mám chybu:
Cannot read an undeclared property Nette\Database\Table\Selection::$nazev.
23:
24: </div>
25: </div>
26: <?php
27: }}
28:
29: //
30: // block title
31: //
32: if (!function_exists($_l->blocks['title'][] = '_lb90d5c2851e_title')) { function _lb90d5c2851e_title($_l, $_args) { foreach ($_args as $__k => $__v) $$__k = $__v
33: ?> <h3><?php echo Nette\Templating\Helpers::escapeHtml($items->nazev, ENT_NOQUOTES) ?>..</h3>
34: <?php
35: }}
36:
37: //
chyba je na řádku 33
- Oli
- Člen | 1215
Nette\Database\Table\Selection obsahuje iterovatelné položky, pokud je chceš vypsat všechny, tak to prožeň foreachem.
Pokud chceš jen první tak nad objektem, který obsahuje Nette\Database\Table\Selection zavolej ->fetch(). Pak můžeš zavolat $items->nazev. Ale bude to obsahovat jen jednu položku…
- TomasHuttner
- Člen | 66
Tak já už fakt nevím co tím.. Mám to takhle:
Menu (Admin:default):
<ul class="nav nav-tabs nav-stacked">
<li {ifCurrent Admin:default}class="active"{/ifCurrent}><a n:href="Admin:default">Hlavní stránka</a></li>
{foreach $items as $item}
<li {ifCurrent Admin:zbozi $item->id}class="active"{/ifCurrent}><a n:href="Admin:zbozi $item->id">{$item->nazev}</a></li>
{/foreach}
<li {ifCurrent Admin:kontakt}class="active"{/ifCurrent}><a n:href="Admin:kontakt">Kontakt</a></li>
</ul>
AdminPresenter:
public function renderDefault($categoryID)
{
$this->template->items = empty($categoryID) ? $this->model->getAllItems() : $this->userManager->getItemsByCategory($categoryID);
}
public function renderZbozi($categoryID)
{
$this->template->items = empty($categoryID) ? $this->model->getAllItems() : $this->userManager->getItemsByCategory($categoryID);
}
A model:
public function getAllItems()
{
return $this->database->table('menu');
}
public function getItemsByCategory($categoryID)
{
return $this->database->table('menu')->where('id', $categoryID);
}
- Oli
- Člen | 1215
Tam to je v pohode, ale problem je nekde jinde, kde se snazis vypsat $items->nazev. Coz je nesmysl. Bud musis vypsat {foreach $items as $item}. Přesně tak jak to máš v tom menu. Nebo musíš mít jinou proměnnou $item, která obsahuje instanci ActiveRow. Tvoje $items obsahuje instanci selection a proto ti to nejde…
- TomasHuttner
- Člen | 66
Teď tomu vůbec nerozumím =( tak ten problém napíšu ještě jednou..
Mám první tabulku která se jmenuje menu do té to tabulky se ukládají názvy položek v menu, to tom mám další tabulku která se jmenuje zbozi a v ní jsou uložený informace o zboží. Za tabulky menu si vypisuji data do šablony admin pomocí renderDefault:
public function renderDefault()
{
$this->template->items = empty($categoryID) ? $this->userManager->getAllItems() : $this->userManager->getItemsByCategory($categoryID);
}
a v šbalone Admin:default:
<ul class="nav nav-tabs nav-stacked">
<li {ifCurrent Admin:default}class="active"{/ifCurrent}><a n:href="Admin:default">Hlavní stránka</a></li>
{foreach $items as $item}
<li {ifCurrent Admin:zbozi $item->id}class="active"{/ifCurrent}><a n:href="Admin:zbozi $item->id">{$item->nazev}</a></li>
{/foreach}
<li {ifCurrent Admin:kontakt}class="active"{/ifCurrent}><a n:href="Admin:kontakt">Kontakt</a></li>
</ul>
dále mám šablobu Admin:zbozi:
{block content}
<div class="container">
{include headerAdmin}
{include navigationAdmin}
<div class="obsah">
<div n:foreach="$flashes as $flash" class="alert alert-{$flash->type}">{$flash->message}<button type="button" class="close" data-dismiss="alert">×</button></div>
<h3 n:block="title">{$items->nazev}</h3>
</div>
</div>
{/block}
to $items->nazev je z tabulky menu. A potom chci vytvořit nějakou podmínku aby se mi podle to to naco máčku v nemu např Mobily tak aby s mi v tý šabloně vypisovali jen mobily z tabulky zbozi.
- Oli
- Člen | 1215
Tak jestli to chapu dobře, tak v tom bude ten problém. renderDefault pošle items jen do Admin:default a pokud se snažíš to samé items zobrazit v Admin:zbozi, tak tam není.
Jestli je to skutečně tvůj problém, tak použij:
public function beforeRender()
{
parent::beforeRender();
$this->template->items = empty($this->categoryID) ? $this->userManager->getAllItems() : $this->userManager->getItemsByCategory($this->categoryID);
}
Editoval Oli (25. 3. 2014 10:59)
- Šaman
- Člen | 2666
Tak ještě napiš co máš v renderZbozi()
. Protože pokud je v
$items
pole, pak je zápis $items->nazev
nesmyslny.
Podle toho odkazu v šabloně default
ale předpokládám, že do
šablony zbozi
předáváš entitu Zbozi
, pak je
matoucí to pojmenování proměnné jako $items
. Takže dokud
nepošleš renderZbozi()
, můžem se jen dohadovat, co do té
šablony předáváš.
Používat beforeRender()
na předávání konkrétních dat
šabloně nedoporučuji, protože pak se v tom můžeš zamotat. To už je
lepší ten řádek dát do obou render metod, aspoň je pak jasně vidět
s čím bude šablona pracovat.
To beforeRender()
se dá využít spíš pro předávání dat
nutných pro vykreslení layoutu. Pak metoda renderXxx() a šablona xxx.latte
spolu korespondují 1:1 a nestane se ti třeba při refaktoringu, že z render
metody vymažeš „nepoužitou“ proměnnou, která se ve skutečnosti
používá, ale ne v souboru s šablonou.
Editoval Šaman (25. 3. 2014 11:04)
- Mariocz
- Člen | 52
Očividně ti na takovýhle věci chyběj základy php. Najdi nějakej kurz nebo knížku a projdi uč se od začátku. Tím že budeš náhodně přidávat písmenka a slovat to určitě nerozchodíš.
- v metodě renderDefault ti chybí $categoryId
- určitě chceš tahat zboží z userManageru?
- pro šablonu zbozi budeš muset taky nějak dostat z db data
- metoda renderZbozi
- jestli chceš jedno zboží tak
$this->userManager->getItemsById($itemID)->fetch();
-jestli jich bude vypsáno víc tak bez fetch() a zase vypisovat v cyklu {foreach}
- TomasHuttner
- Člen | 66
renderZbozi vypadá takto:
public function renderZbozi($categoryID)
{
$this->template->items = empty($categoryID) ? $this->userManager->getAllItems() : $this->userManager->getItemsByCategory($categoryID);
}
- sKopheK
- Člen | 207
Tímto vytáhneš z databáze pole zaznamů (neřeším teď, co je
userManager
). V šabloně si vypiš, co je přesně v té
proměnné $items
.
{dump $items}
Vidíš tam někde klíč nazev
?
Předpokládám, že chceš zobrazit název kategorie a pak zboží, které do ní patří, tzn. že musíš z tabulky s kategoriemi dostat řádek s daty vybrané kategorie a z tabulky se zbožím řádky, které patří do vybrané kategorie. Pořádně si projeď tutoriál k databázím v Nette.