{snippet} a jeho druhý parametr
- Honza Kuchař
- Člen | 1662
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
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
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 | 8228
Zatím s tím vydrž, snippety se hodně změní. Ps. k čemu je vlastně dobré mít tag jako Html objekt?
- Vitek Jezek
- hledá kolegy | 285
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
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
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
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
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?