Návrh na nové Latte makro {showIf}

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

Makro řeší následující situaci.

{if $foo}
	<a href="#anchor">bar</a>
{else}
	bar
{/if}

Nahradit tímto zápisem.

<a n:showIf="$foo" href="#anchor">bar</a>

Důvody:

  • šetří místo
  • neduplikuje se obsah tagu <a>

Implementace:

<?php

namespace Foo;

use Latte\Compiler;
use Latte\MacroNode;
use Latte\Macros\MacroSet;
use Latte\PhpWriter;

class Macros extends MacroSet {

    public static function install(Compiler $compiler) {
        $me = new static($compiler);
        $me->addMacro('showIf', array($me, 'macroShowIf'), array($me, 'macroEndShowIf'));
    }

    public function macroShowIf(MacroNode $node, PhpWriter $writer) {
        return $writer->write('if (%node.args) {');
    }

    public function macroEndShowIf(MacroNode $node, PhpWriter $writer) {
        $out = NULL;
        $tag = $node->htmlNode->name;
        if (preg_match('/^<' . $tag . '.*?>(?P<inner>.*)<\/' . $tag . '>$/s', $node->content, $find)) {
            $out .= '} else { ?>' . $find['inner'];
        }
        return $out . '<?php }';
    }

}

Editoval h4kuna (21. 10. 2014 10:22)

jiri.pudil
Nette Blogger | 1029
+
+11
-

Nebo pomocí prefixu tag- aplikujeme makro jen na samotné HTML značky:

<p><a href="{$url}" n:tag-if="$url">Title</a></p>

https://latte.nette.org/cs/

h4kuna
Backer | 740
+
0
-

A nebo… :)

akadlec
Člen | 1326
+
0
-

Tvoje makro tedy buď zobrazí kompletní A element a nebo jen jeho hodnotu? Chceš tak zamezit tvorbě linku pokud je např. zakázán pro malé práva?

Quinix
Člen | 108
+
-1
-

@akadlec Znovu vymyslel makro n:tag-if… case closed.