Dynamické načítání presenterů

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

Zdravím,

mám udělané načítání presentrů z pole. Pokud se jedná o jednoduchou stránku, načítá se presenter Page: s parametrem slug (treba pekna-url). V sablone to ± vypada takto:

{foreach ... as $menuItem}
...
// pokud je to jednoducha stranka, natahni obsah z db
// tady mam pro priklad natvrdo pekna-url
{if !empty($menuItem['page'])}
	{var $menuItem['presenter'] = "Page: 'pekna-url'"}
{/if}
// jinak vloz nazev presenteru (třeba Eshop:)

<li><a href="{link $menuItem['presenter']}"><span>{$menuItem['name']}</span></a></li>

Problém je, že když dám za název presenteru mezeru (v příkladu mezera mezi Page: a pekna-url), tak mi to vytvoří link jako Page: ‚pekna-url‘() .

Tedy to vytvoří link, kde jsou navíc ty závorky. Nevíte proč? Případně jak to vyřešit lépe. Určitě to nechci řešit tak, že odeberu poslední dva znaky :). Btw. mechanismus načítání linků není dokonalý ale momentálně dostačující.

Díky za nápady

Majkl578
Moderator | 1364
+
0
-

Máš to špatně. Správně bys měl parametr dávat zvlášť.Zhruba takhle:

{foreach ... as $menuItem}
	...
	<li>
		<a href="{if !empty($menuItem['page'])}{link Page:, 'pekna-url'}{else}{link Eshop:}{/if}">
			<span>{$menuItem['name']}</span>
		</a>
	</li>
{/foreach}
studna
Člen | 181
+
0
-

Nějak se mi tam nezdá ta hezká url. Pokud chceš vytvořit link a znáš hezkou URL, tak bys neměl mít potřebu použít link. To by měl hezky vyřešit router, resp. filtr.

Pokud bys chtěl jít touto cestou, tak je lepší sestavit link při ukládání menu do databáze. Tedy nějaký sloupeček „link“ do kterého by si ukládal něco jako „Presenter:action, params“ a různé. A nebo přímo vygenerovaný odkaz.

Pak se ti šablona zjednoduší na

<li n:foreach="$mitems as $item">
	<a n:href="$item['link']">{$item['name']}</a>
</li>
zis
Člen | 16
+
0
-

Díky oběma,

ale pořád mi to dělá tu samou věc. Pokud použiju příklad od Majkla, tak to fachá, ale jen za předpokladu, že se to do makra {link} zadá „natvrdo“ ({link Page:, ‚pekna-url‘}). Pokud bych ten příklad upravil tak, jak to používám, bylo by to nějak:

<li>
	<a href="{if !empty($menuItem['page'])}{link $menuItem['page']}{else}{link $menuItem['presenter']}{/if}">
        	<span>{$menuItem['name']}</span>
        </a>
</li>

kde pod

$menuItem['presenter']

je presenter třeba Eshop: a pod

$menuItem['page']

je třeba Page:, ‚pekna-url‘

Tak mi to v obou případech, jak od majkla tak od studny pořád píše error: No route for Web:Page:, ‚o-nas‘() , protože tam sou zas ty závorky. Dělám něco špatně? Btw. menu z databáze je dobrý nápad, ale zatím dostačuje pouze z pole, ale výsledek by měl být stejný.

Ale díky za komenty.

zis
Člen | 16
+
0
-

Tak po X-milionech kombinacích sem stále nepřišel na to, jak to vyřešit. I když si vypíšu proměnou, třeba $menuItem[‚page‘] a výstup je „Page: pekna-url“, vložím to do linku n:href nebo {link $menuItem[‚page‘]} furt se vypisuje stejná chyba. Pokud ovšem obsah proměné zkopíruji jako text („Page: pekna-url“) a vložím do n:href nebo {link} tak to samoyřejmě funguje. podle mého názoru bug.

Majkl578
Moderator | 1364
+
0
-

Bug to možná je, ale v tvém kódu.
Do link resp. n:href předáváš pouze jeden parametr. Generování linků funguje tak, že první parametr je presenter, další parametry jsou parametry pro URL.

Pokud v $menuItem['page'] bude ‚Page: pekna-url‘ a link generuješ takto:

{link $menuItem['page']}

očividně předáváš pouze jeden parametr, přeloží se na:

$control->link($menuItem['page'])

Je to zcela zprávné chování. Oprav si svůj kód.