{snippet} a jeho druhý parametr

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

Ahoj, ve třídě SnippetHelper mám návrh na vylepšení. 3. volitelný parametr by nadále akceptoval string, ale akceptoval by i třídu Html. Implementováno to vypadá takto:

/**
 * Control snippet template helper.
 *
 * @author     David Grudl
 * @copyright  Copyright (c) 2004, 2009 David Grudl
 * @package    Nette\Templates
 */
class SnippetHelper extends /*Nette\*/Object
{
	/** @var bool */
	public static $outputAllowed = TRUE;

	/** @var string */
	private $id;

	/** @var Html */
	private $tag;

	/** @var ArrayObject */
	private $payload;

	/** @var int */
	private $level;



	/**
	 * Starts conditional snippet rendering. Returns SnippetHelper object if snippet was started.
	 * @param  Control      control
	 * @param  string       snippet name
	 * @param  string|Html  start element
	 * @return SnippetHelper
	 */
	public static function create(/*Nette\Application\*/Control $control, $name = NULL, $tag = 'div')
	{
		if (self::$outputAllowed) { // rendering flow or non-AJAX request
			$obj = new self;
                        if(is_string($tag)){
                            $obj->tag = HTML::el(trim($tag, '<>'));
                        }elseif($tag instanceof Html){
                            $obj->tag = $tag;
                        }else throw new InvalidArgumentException("Parameter 'tag' must be string or instace of Html.");
                        if ($obj->tag){
                            $obj->tag->id = $control->getSnippetId($name);
                            echo $obj->tag->startTag();
                        }
			return $obj; // or string?

		} elseif ($control->isControlInvalid($name)) { // start snippet buffering
			$obj = new self;
			$obj->id = $control->getSnippetId($name);
			$obj->payload = $control->getPresenter()->getPayload();
			ob_start();
			$obj->level = ob_get_level();
			self::$outputAllowed = TRUE;
			return $obj;

		} else {
			return FALSE;
		}
	}



	/**
	 * Finishes and saves the snippet.
	 * @return void
	 */
	public function finish()
	{
		if ($this->tag !== NULL) { // rendering flow or non-AJAX request
			if ($this->tag) echo $this->tag->endTag();

		} else {  // finish snippet buffering
			if ($this->level !== ob_get_level()) {
				throw new /*\*/InvalidStateException("Snippet '$this->id' cannot be ended here.");
			}
			$this->payload->snippets[$this->id] = ob_get_clean();
			self::$outputAllowed = FALSE;
		}
	}

}

Změny:

– PHPDoc
 – v metodě finish(): echo $this->tag->endTag();
 – v metodě create():

if(is_string($tag)){
    $obj->tag = HTML::el(trim($tag, '<>'));
}elseif($tag instanceof Html){
    $obj->tag = $tag;
}else throw new InvalidArgumentException("Parameter 'tag' must be string or instace of Html.");
if ($obj->tag){
    $obj->tag->id = $control->getSnippetId($name);
    echo $obj->tag->startTag();
}

Použití

Když potřebuji tagu snippetu přidat nějaký atribut.

EDIT: Myslíš, že by se něco takového dalo dát do distribuce? Připravuji komponentu TabControl (tabování bez JS nebo s jQuery UI) a tam by se mi to docela dosti hodilo.

Editoval honzakuchar (2. 8. 2009 12:05)

romansklenar
Člen | 655
+
0
-

Mám to připravené na commit, jen to chce požehnání Davida, jestli to není třeba nějaký důvod, proč tam podpora pro objekty Html není.

PS: když už píšeš patch tak dodrž kulturu psaní, kterou je napsáno celé Nette.

Honza Kuchař
Člen | 1662
+
0
-

Příště se budu více snažit. ;) Jinak už tuhle věc používám v dalším projektu a zatím bez jediného problémku.

David Grudl
Nette Core | 8218
+
0
-

Zatím s tím vydrž, snippety se hodně změní. Ps. k čemu je vlastně dobré mít tag jako Html objekt?

Honza Kuchař
Člen | 1662
+
0
-

Můžu mi třeba nastavit class (a tím ho ostylovat – viz TabControl).

Vitek Jezek
hledá kolegy | 285
+
0
-

primlouval bych se i za kratkodobou pritomnost tohodle rozsireni – pomuze imho dost lidickam napr. pri implementaci zminovaneho tabcontrolu : )

//pokud jsem to dobre pochopil tak je 100% zpetne kompatibilni a tak ani moc nevidim duvod, proc by se aspon na chvilku neohralo v ofic. distribuci. Nebo nejaky preci jenom je?

Honza Kuchař
Člen | 1662
+
0
-

Je to 100% zpětně kompatibilní. A můžeš využívat všechny hezké vlastnosti třídy HTML.

O žádném problému nevím. Používám to ve všech svých projektech a nikde žádný wtf nepozoruji. Možná rychlost?

Honza Kuchař
Člen | 1662
+
0
-

Ahoj, znovu otevírám toto téma.

Objevil se nějaký problém s implementací třídy Html jako druhého parametru?

Editoval honzakuchar (27. 10. 2009 15:49)

Honza Marek
Člen | 1664
+
0
-

U těch nových snippetů snippet snippetuje bez toho svého snippetového divu, tedy generuje jen obsah snippetu. Snippetový div dodáváš ručně.

<div id="cosi">
{snippet:cosi}
obsah
{/snippet}
</div>
Honza Kuchař
Člen | 1662
+
0
-

Aha, dik. A dá se to použít nějak spolehlivě (i v zanořených komponentách) nebo je to zatím hodně vývojová verze?

Honza Marek
Člen | 1664
+
0
-

Je to zatím hodně vývojové.

sin
Člen | 82
+
0
-

Jak to je s tímto tématem? bude se to nějak dále řešit nebo je to pasé? Díky