Jak vypisovat begin, end, i attr při volání n: makra

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

Zdravím,
používám latte šablobny samostatně a naimplementoval jsem si vlastní verzi n:href makra. To mi funguje v pořádku, ale chtěl jsem dodělat funkcionalitu, kdy když link vrátí false (což znamená, že ke stránce člověk nemá přístup), tak se skryje celý odkaz. Aby odpadla potřeba dělat toto:

{if $user->hasAccess}
<a n:href="..">odkaz</a>
{endif}

Založil jsem tedy vlastní makro nějak takto:

$set->addMacro(
    'href',
    function($node, $writer) use ($that) {
        return $writer->write('if ($link='.$that->macroLink($node, $writer).'):');
    },
    'endif',
    function($node,$writer) {
        return ' ?> href="<?=$link;?>" <?php ';
    }
);

Problém je ten, že když vyplním poslední parametr $attr metody addMacro, tak se při zavolání n makra přestane vypisovat begin a end.
Kompilované PHP s parametrem attr:

<a href="<?=$link?>" >Odkaz</a>

Kompilované PHP bez parametru attr:

<?php if ($link=\TestController::getLink(array('action' => 'edit', 'id' => '55', ))): ?>
<a>Odkaz</a><?php endif ;

Jde Latte donutit, aby u určitého makra vypisovala oboje?

GEpic
Člen | 562
+
0
-

Schovávat odkazy tedy není úplně nejlepší zabezpečení, ale nemyslím si že je potřeba předělávat core n:href makro kvůli tomu, že si lenoch použít k n:href ještě n:if

Gogliostron
Člen | 2
+
0
-

Tak zaprvé. Samozřejmě, že přístup na stránku je standartně kontrolován a zde jde pouze o skrývání odkazů, které jsou ve společných šablonách.
Zadruhé, jak jsem psal, tak Latte používám mimo Nette a tím pádem si musím n:href naimplementovat sám tak jako tak.
Takže děkuji, tato odpověď byla velice nápomocná.

Editoval Gogliostron (29. 5. 2016 22:28)