Párový include – možnost includovat childrens elementy z rodičovského makra

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

Ahoj,

existuje možnost párového includu, ve kterém by se daly vypsat childrens? Něco na způsob:

Šablona:

{include "test.latte"}
   <a>Test</a>
{/include}

Komponenta (test.latte):

<div>
	{include childrens} {* includne kód z rodičovského makra? *}
</div>

Ideální by bylo například:

Použití v šabloně:

{component "button", type => "primary", link="http://nette.org"}
	Nette
{/component}

A v nějaké složce by byly komponenty.

button.latte

<a href="{$link}" class="btn btn--{$type}">{include childrens}</a>

Díky.

Editoval jakubch (24. 10. 2016 18:01)

David Matějka
Moderator | 6445
+
0
-

Ahoj, zadne ze zakladnich maker to neumi, ale hodilo by se to. Jen je potreba to trochu domyslet, jelikoz obcas tam chces predat vice bloku kodu, nez jen jedno „childrens“.

Mam nekde rozpracovany, ze by slo do include predavat odkazy na blocky, tedy neco jako

{define foo}
	Foo
{/define}
{define bar}
	Lorem
{/define}
{include button foo => #foo, bar => #bar}

coz by to taky vyresilo, ale nelibi se mi moc implementace a verim, ze i pouziti by mohlo byt intuitivnejsi.

CZechBoY
Člen | 3608
+
0
-

@DavidMatějka jo, takhle nějak to teď řeším… akorát místo define používám capture do proměnné… Sice se tím dost omezuje použití jen ve stejném kontextu, ale zatím prostě není alternativa.

jakubch
Člen | 2
+
0
-

@DavidMatějka Nad víc bloky sem nepřemýšlel. Ale je pravda, že by se to mohlo hodit.

Zatím sem si napsal jednoduchý makro.

Šablona:

{component "button.latte" link => $presenter->link("Homepage:default")}
   Homepage
{/component}

button.latte

<a href="{$link}" class="button">{$childrens|noescape}</a>

CustomMacros.php

<?php

use Latte\MacroNode;
use Latte\PhpWriter;

class CustomMacros extends Latte\Macros\MacroSet
{

    public static function install(Latte\Compiler $compiler)
    {
        $set = new static($compiler);

        $set->addMacro('component', array($set, 'macroComponent'), array($set, 'macroComponentEnd'));
    }

    /**
     * {component "component.latte"}
     */
    public function macroComponent(MacroNode $node, PhpWriter $writer)
    {
        $node->data->variable = '$childrens';
        return 'ob_start(function () {})';
    }


    /**
     * {/component}
     */
    public function macroComponentEnd(MacroNode $node, PhpWriter $writer)
    {
        $code = $writer->write('$_b->templates[%var]->renderChildTemplate(%node.word, %node.array? + $template->getParameters() + ["childrens" => %modify(ob_get_clean())])',
            $this->getCompiler()->getTemplateId());

        if ($node->modifiers) {
            return $writer->write('ob_start(function () {}); %raw; echo %modify(ob_get_clean())', $code);
        } else {
            return $code;
        }
    }


}

Líbilo by se mi n:makro které by předalo parametry includované šabloně. Šablona by musela obsahovat pouze 1 root element, který by podědil parametry. Parametry z elementu s n: makrem by přepisovali parametry z šablony komponenty.

Použití:

<a n:href="Homepage:default" n:component="button">Homepage</a>

button.latte

<a class="button button--primary">{include childrens} -></a>

Výstup by byl:

<a href="/" class="button button--primary">Homepage -></a>

Editoval jakubch (25. 10. 2016 13:38)