Vlastní komponenta nebo makro nebo šablona

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

Ahoj, Nette se učím od včera, čtu poctivě dokumentaci, ale jedna věc mi není jasná a pořád mi vrtá hlavou.

Řekněme, že bych chtěl udělat „komponentu“ která bude generovat boxík. Obsah boxíku budu předávat „komponentě“ jako parametry.

Př. boxíku:

<div class="box">
    <img src="{$imgSrc}" alt={$title}>
    <strong class="box__title">{$title}</strong>
    <p class="box__text">{$text}</p>
</div>

Použití si představuji zhruba takto (vygeneruje dva boxíky za sebou):

{component box $imgSrc1, $title1, $text1}
{component box $imgSrc2, $title2, $text2}

Jak vytvořit takovouto „komponentu“, abych ji mohl používat v šablonách? Měla by to být komponenta, kterou budu vkládat přes {control ...}? Nebo šablona, kterou budu vkládat přes {include ...}? Nebo vlastni makro, které budu vkládat přes {mujBoxik ...}? Nebo ještě něco jiného?

Můžete mi vysvětlit který způsob použít (z hlediska best practices) a proč právě ten? Jaké má vhodný způsob výhody/nevýhody oproti ostatním možnostem.

Díky

Editoval Madaovi (1. 10. 2016 18:01)

Martk
Člen | 661
+
0
-

{include …} – musíš psát umístění souboru
{control …} a {mujBoxik …} – Výhoda mujBoxik oproti control je kratší zápis, ale jakmile budeš chtít strčit hodně dat do proměnné text, tak budeš muset použít:

{capture $text1}
	...
{/capture}
{control box $imgSrc1, $title1, $text1}

Asi před rokem a něco jsem narazil na doplněk od aleskafka component-macro , která má hezkou syntaxi, jelikož je to dlouho neudržované (pokoušel jsem se poslat pr) a potřeboval jsem tam udělat hodně změn, tak jsem vytvořil chováním stejnou komponentu, zjednodušil jsem to a vyházel pro mě zbytečné věci:

Instalace:

public function createTemplate() {
	$template = parent::createTemplate();

	$appDir; // Získej z DI
	WebChemistry\Macros\ComponentMacro::install($template->getLatte()->getCompiler(), $appDir . '/latte-components');

	return $template;
}

Syntax:

<Box n:component="imgSrc => xxx, title => title">
	Text
</Box>

Soubor %appDir%/latte-components/box.latte:

<div class="box">
    <img src="{$imgSrc}" alt={$title}>
    <strong class="box__title">{$title}</strong>
    <p class="box__text">{$_content}</p>
</div>

Editoval Antik (1. 10. 2016 18:37)

iNviNho
Člen | 352
+
0
-

Prepac som na cestach, ale odporucam checknut ako vytvarat komponenty je to pekne napisane :)