Získání dat např ID z URL

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

Ahoj, mám takový dotaz. Jak dostanu ID z url?

Mariocz
Člen | 52
+
0
-

např. když máš link

<a n:href="Homepage:contact 'id'=>2"> xxx </a>

Tak v presenteru vytvoříš tuhle metodu a máš id…

public function renderContact($id) {
}

Editoval Mariocz (21. 3. 2014 22:50)

TomasHuttner
Člen | 66
+
0
-

Díky, a když chci podle toho ID vybrat položku v databazi abych jí pak mohl vypisovat do šablony?

David Matějka
Moderator | 6445
+
0
-

precti si quickstart, konkretne tuhle stranku

TomasHuttner
Člen | 66
+
0
-

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.

Mysteria
Člen | 797
+
0
-

V tabulce, kterou máš v proměnné $items není sloupeček kategorie.

David Matějka
Moderator | 6445
+
0
-

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

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

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

Děkuji za radu ale když to použiji tak mi to v šabloně píše chybu Undefined variable: category

Oli
Člen | 1215
+
0
-

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

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..

Mysteria
Člen | 797
+
0
-

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?

TomasHuttner
Člen | 66
+
0
-

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

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

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

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

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">&times;</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
+
0
-

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

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

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}

sKopheK
Člen | 207
+
0
-

Doporučil bych se s tím poprat sám. Dá ti to mnohem víc, než když se ti tu lidi snaží radit, ale ty vůbec nechápeš, proč to tak má být. Např. na tvůj poslední problém už tu odpověď je.

TomasHuttner
Člen | 66
+
0
-

renderZbozi vypadá takto:

public function renderZbozi($categoryID)
		{
			$this->template->items = empty($categoryID) ? $this->userManager->getAllItems() : $this->userManager->getItemsByCategory($categoryID);
		}
sKopheK
Člen | 207
+
0
-

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.

Mariocz
Člen | 52
+
0
-

Radši řekni nějakýmu kamarádovi ať ti ten, předpokládám školní, projekt za pár kaček napsat. Tady ti nikdo celé řešení posílat nebude a bez minimální snahy to sám dokupy nedáš.