{snippet} a jeho druhý parametr

#1 před 3 lety

Honza Kuchař
Moderator
Registrovaný: 12. 8. 2007
Příspěvky: 1588

{snippet} a jeho druhý parametr

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)

 

#2 před 3 lety

romansklenar
Moderator
Registrovaný: 20. 7. 2008
Příspěvky: 780

Re: {snippet} a jeho druhý parametr

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.

 

#3 před 3 lety

Honza Kuchař
Moderator
Registrovaný: 12. 8. 2007
Příspěvky: 1588

Re: {snippet} a jeho druhý parametr

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.

 

#4 před 3 lety

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5835

Re: {snippet} a jeho druhý parametr

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

 

#5 před 3 lety

Honza Kuchař
Moderator
Registrovaný: 12. 8. 2007
Příspěvky: 1588

Re: {snippet} a jeho druhý parametr

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

 

#6 před 3 lety

Vitek Jezek
Posobota guy
Registrovaný: 16. 8. 2008
Příspěvky: 253

Re: {snippet} a jeho druhý parametr

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?

 

#7 před 3 lety

Honza Kuchař
Moderator
Registrovaný: 12. 8. 2007
Příspěvky: 1588

Re: {snippet} a jeho druhý parametr

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?

 

#8 před 3 lety

Honza Kuchař
Moderator
Registrovaný: 12. 8. 2007
Příspěvky: 1588

Re: {snippet} a jeho druhý parametr

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)

 

#9 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Re: {snippet} a jeho druhý parametr

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>

Online

 

#10 před 3 lety

Honza Kuchař
Moderator
Registrovaný: 12. 8. 2007
Příspěvky: 1588

Re: {snippet} a jeho druhý parametr

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?

 

#11 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Re: {snippet} a jeho druhý parametr

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

Online

 

#12 před rokem

sin
Člen
Registrovaný: 29. 7. 2009
Příspěvky: 85

Re: {snippet} a jeho druhý parametr

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

 

Zápatí