[addon tabcontrol] TabControl

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

co ti napadlo?

Honza Kuchař
Člen | 1662
+
0
-

Problém je v tom, že když zavoláš addTab tak se tab přidá. Ale jen do současného zpracovávání skriptu. (při tom jednom renderování, protože když se ten skript zpracovává poprvé, tak vlastně máš v handle addTab, ale při odeslání formuláře se už ten handler nevolá. Možná by jsi to mohl dočasně vyřešit tak, že si uděláš persistetní parametr a pokud bude roven třeba editing, tak si vždy zavoláš fci, která bude volat addTab()) Takže teda, kam uložit, které taby teda zobrazovat a které ne. Možná jako dočasné řešení by mohlo být, něco jako callback, který by vrazel bool, jestli tab vykreslit nebo ne. Ale pořád je to takové drbání levou nohou za pravým uchem, protože tak dynamicky nepřidávám, ale dynamicky skrývám. Pokud to čte někdo nette-zkušenější, tak poprosím o zamyšlení nad řešením.

Editoval honzakuchar (29. 11. 2009 11:46)

bajzic
Člen | 4
+
0
-

Ahoj, díky za komponentu, je skvělá. Mám ale drobný problém, nedaří se mi rozjet MODE_PRELOAD. Tenhle mód mi nefunguje mi ani v dodaném příkladu ze SVN…
Je to nějaký známý problém? Funguje to ostatním?

bajzic
Člen | 4
+
0
-

bajzic napsal(a):

Ahoj, díky za komponentu, je skvělá. Mám ale drobný problém, nedaří se mi rozjet MODE_PRELOAD. Tenhle mód mi nefunguje mi ani v dodaném příkladu ze SVN…
Je to nějaký známý problém? Funguje to ostatním?

Odpovím si sám, našel jsem chybu ve funkci handlePreload, která byla bez argumentu ($activeTab). Měla by tedy vypadat například takto?

<?php
	/**
	 * What to do when tab is preloading
	 */
	function handlePreload($activeTab = self::REDRAW_CURRENT) {
      		$this->redraw($activeTab);
	}
?>

Takto funguje bez problémů…

Honza Kuchař
Člen | 1662
+
0
-

Ta oprava ti sice možná funguje, ale chyba se může projevit někde úplně jinde. Neaktivuješ totiž tab, ale pouze ho překreslíš, což může být problém, pokud se v tom tabu někde dále odkazuješ…

Opravil jsem to na SVN. Chyba vznikla v 9 revizi, kde jsem přejmenoval @persistent proměnnou activeTab na tab a v při generování odkazu jsem na to zapomněl.

fixed

Editoval honzakuchar (15. 12. 2009 17:23)

bazo
Člen | 620
+
0
-

ahoj,

nechysta sa nahodou verzia kompatibilna aj s najnovsiou verziou nette?

sodae
Nette Evangelist | 250
+
0
-

tabcontrol potřebuje menší upravu nette a na tu se podstatě čeká ze strany Davida

redhead
Člen | 1313
+
0
-

ono se toho od Davida očekává už víc (https://github.com/…nette/issues) ;)

bazo
Člen | 620
+
0
-

ahoj,

je mozne zariadit, aby tab ziskaval content z viacerych tovarniciek?

Honza Kuchař
Člen | 1662
+
0
-

Ano je.

  1. Přes template. (vyzkoušeno)
  2. Vlastní merodou render() (jeden z callbacků při vytváření tabu) (nevyzkoušeno)
Honza Kuchař
Člen | 1662
+
0
-

Přihodil jsem úpravu SnippetHelperu na bug tracker https://github.com/…nette/issues#…

ZETCHA
Člen | 59
+
0
-

Zdravím.
Nedaří se mi zprovoznit načítání tabu ajaxem. Ajax request mi vrací např:

{"state":{"tabs-tab":"pictures"}}

ale žádná další data. Netušíte kde by mohl být zádrhel?
Presenter vypadá následovně:

<?php
class Admin_ProductsPresenter extends Presenter
{

    public $id = null;


    public function renderDefault()
    {
        $this->template->title = 'Seznam';
    }

    function createComponentTabs($name)
    {
        $tc = new TabControl( $this, $name );
        $tc->mode = TabControl::MODE_LAZY;
        $tc->sortable = false;
        $tc->jQueryTabsOptions = "{ fx: { height: 'toggle',opacity:'toggle',marginTop:'toggle',marginBottom:'toggle',paddingTop:'toggle',paddingBottom:'toggle'} }";
        $tc->loaderText = 'Načítám ...';


        $t = $tc->addTab( "product" );
        $t->header = "Produkt";
        $t->contentFactory = array( $this, "createTabProduct" );
        $t->hasSnippets = false;

        $t = $tc->addTab( "pictures" );
        $t->header = "Obrázky ";
        $t->contentFactory = array( $this, "createTabPictures" );
        $t->hasSnippets = false;

        $t = $tc->addTab( "files" );
        $t->header = "Soubory ";
        $t->contentFactory = array( $this, "createTabFiles" );
        $t->hasSnippets = false;

        return $tc;
    }


    function createTabProduct($name, Tab $tab)
    {
        return 'Product.....';
    }


    function createTabPictures($name, Tab $tab)
    {
        echo 'Images.....';
    }


    function createTabFiles($name, Tab $tab)
    {
        return 'Files......';
    }
}
?>

Díky za radu.

Matúš Matula
Člen | 257
+
0
-

mas dobre zavinace ?

ZETCHA
Člen | 59
+
0
-

Si myslím, že ano.
V @layout.phtml :

<?php
<div id="content">
     <div class="inner">
{include #content}
     </div>
</div>...
?>

A v defaut.phtml:

<?php
@{block content}
	@{widget tabs}
@{/block}
?>
Matúš Matula
Člen | 257
+
0
-

v @layout.phtml si daj @ pred {include #content}

ZETCHA
Člen | 59
+
0
-

To jsem už zkoušel, obsah widgetu se vypsal před stránku.

Mikulas Dite
Člen | 756
+
0
-

Před include určitě má být. Mrkni jestli tam někde nemáš iteraci nebo podmínku, která obaluje to cos poslal a zavináš nemá. A hlavně @ musí být nejenom na začátku, ale i na konci bloku.

Editoval Mikulas Dite (5. 6. 2010 16:18)

ZETCHA
Člen | 59
+
0
-

No samozřejmě, že jo. :-)
Kua musím si to líp v těch šablonách formátovat!
Pak to přehlédnu. Velice děkuji.

Matúš Matula
Člen | 257
+
0
-

pozeram na ten kod a vidim tam
<?php $t->hasSnippets = false; ?>

Zmen to na true. Podla dokumentacie
$t->hasSnippets = true;
// Potřeba nastavit u každého tabu, ve kterém budou snippety! Jinak nebude fungovat AJAX! Má stejnou funkci jako @ v šablonách

Editoval Matúš Matula (5. 6. 2010 16:28)

Honza Kuchař
Člen | 1662
+
0
-

Matúš Matula napsal(a):

pozeram na ten kod a vidim tam
<?php $t->hasSnippets = false; ?>

Zmen to na true. Podla dokumentacie
$t->hasSnippets = true;
// Potřeba nastavit u každého tabu, ve kterém budou snippety! Jinak nebude fungovat AJAX! Má stejnou funkci jako @ v šablonách

Díky za odpověd, jsem rád, že tu funguje komunita. :-)

Z0MBie
Člen | 19
+
0
-

Zdravím, zkoušel jste někdo rozchodit tento plugin na Nette 1.0?
Resim problem, ze do zdrojového kodu mi vypisuje vcelku nesmysly – například

</div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"></div>								<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"></div id="snippet-tabs-new">								<div class="ui-helper-clearfix"></div>
</div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"></div>								<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"></div id="snippet-tabs-accepted">								<div class="ui-helper-clearfix"></div>
</div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"></div>								<div class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide"></div id="snippet-tabs-done">

V presenteru si TabControl volám podle návodu takto

 function createComponentTabs($name){
	$tc = new TabControl($this,$name);
	$tc->mode = TabControl::MODE_RELOAD;
	$tc->sortable = false;

$t = $tc->addTab("hot");
	    $t->header = "Žhavé";
	    $t->contentFactory = array($this,"createVotesHot");
	    $t->hasSnippets = true;

$t = $tc->addTab("new");
	    $t->header = "Nové";
	    $t->contentFactory = array($this,"createVotesNew");
	    $t->hasSnippets = true;

Následují dvě dummy funkce

 public function createVotesHot ($name,Tab $tab){
	return $this->createVotesTab($name, $tab, 'hot');
   }

public function createVotesNew ($name,Tab $tab){
	return $this->createVotesTab($name, $tab, 'new');
   }

a pročištěný zdrojový kód továrničky createVotesTab (visualpaginator a volani modelu tu snad potreba nejsou)

public function createVotesTab ($name, Tab $tab, $type){
	$template = $this->createTemplate();
	$template->registerFilter(new LatteFilter);
	$template->registerHelper('int', array($this->feedback, 'toInt'));
	$template->setFile(APP_DIR . '/templates/Main/ideas.phtml');

	$template->Ideas = Model::NecoZModelu($type);

	return $template;
}
Honza Kuchař
Člen | 1662
+
0
-

Máš patchnutý SnippetHelper?

Z0MBie
Člen | 19
+
0
-

Žádné patchování jsem neprováděl. Alespoň co jsem se tu pídil po fóru, tak jsem někde (omlouvám se za nekonkrétnost) narazil na tvrzení, že v nějaké podobě už je ten patch v 1.0 nahozenej.

Z0MBie
Člen | 19
+
0
-

Paráda. Patchnul jsem to a šlape to jako víno. Díky :o).

johny9009
Člen | 3
+
0
-

Ahoj, tohle je moc užitečná věcička, ale mám s ní takovej jeden problém s Ajaxem.
Pokud mám nějaký ajaxový formulář na jednom tabu a po odeslání chci skočit na tab jiný, tak je vše v pořádku, normálně v submittu použiji metodu select(„tab“). Když je ale v tabu malej formulář na přidání něčeho a zároveň i samotnej seznam a tudíž je třeba po odeslání obnovit ten samý tab, tak se mi prostě nedaří udělat, aby se nový prvek v seznamu po odeslání objevil hned. Je tam až když třeba přejdu na tab jinej a zpět. Zkoušel jsem snad už všechno – v submittu místo selectu render, různě to kombinovat, snippety se změněním hasSnippets, atd.
Ve firebugu jsem zjistil, že v tom prvním případě přijde POST jako submitt formuláře a pak ten select vyvolá GET se signálem tabs-select. Ve druhém případě, ale dojde jenom k tomu POSTu.
Různě jsem to debuggoval, ale prostě jsem nepřišel na to, proč při zavolání select(„stejny tab“) k tomu signálu nedojde.
Nedokázal by mi prosím někdo poradit, jak bych to mohl zkusit jinak nebo proč nefunguje ten select, prosím? Už se s tím trápím opravdu dlouho, byl bych Vám vděčný.
Děkuji

Honza Kuchař
Člen | 1662
+
0
-

Z hlavy ti mohu říce jen to, že tuším, že u té metody select je nějaký (skrytý) parametr forceRender nebo tak něco… Doufám, že se nemýlím. ;)

johny9009
Člen | 3
+
0
-

Honza Kuchař napsal(a):

Z hlavy ti mohu říce jen to, že tuším, že u té metody select je nějaký (skrytý) parametr forceRender nebo tak něco… Doufám, že se nemýlím. ;)

Díky za odpověď, nějak ale nechápu co myslíš tím skrytým parametrem. A máš na mysli metodu select u UI Tabs nebo u TabControl? Já to posílal přes ten TabControl. Každopádně jsem se díval na obojí a nic takového jsem nenašel. Mohl by jsi mi tedy prosím upřesnit co je ten skrytý parametr? Děkuji

Honza Kuchař
Člen | 1662
+
0
-

budu to muset najít…

Honza Kuchař
Člen | 1662
+
0
-

Zajímat by tě měly metody TabControl::select() a TabControl::redraw().

johny9009
Člen | 3
+
0
-

Honza Kuchař napsal(a):

Zajímat by tě měly metody TabControl::select() a TabControl::redraw().

Jo, tak přesně tam jsem se taky koukal. Mam pocit, že jsem to prošel skrz naskrz a nic. Ono to taky může být tím, že netuším, jak může něco jako skrytý parametr fungovat. Děkuji moc za pomoc

Honza Kuchař
Člen | 1662
+
0
-

Napsal jsem to špatně, není skrytý, ale je nepovinný. Ale stejně, výchozí hodota je, překreslovat vždy, takže teď fakt nevím, kde je problém.

Tuším ale, že mi to fungovalo. Ještě si s tím zkus pohrát, případně prosím pošli na můj mail (pošlu ti na tvůj výzvu) nějaký minimální kus programu, který delá problém. Mrknu se na to, ale myslím, že to bude nějaká drobnost.

lalo
Člen | 26
+
0
-

Ahoj,

zkouseli jste uz tab control pouzit v nette 2.0?
Me to nefunguje.
Vypisuje to chybu z sablony: Call to a member function generateSelectLink() on a non-object

V podstate jsem nic neudelal, pouze prohodil verze nette z 1.0 na 2.0 a udelal hack o kterem se pise zde forum

muzete nekdo poradit?

v6ak
Člen | 206
+
0
-

Řešili jste někdo problém s base href? V tuto chvíli mi tím ty odkazy míří na hlavní stránku, což není ono. Potřeboval byvh tam asi před křížek doplnit odkaz na sebe.

Problém je vidět až ve chvíli, kdy někdo nechá ten tab otevřít v novém panelu/kartě/okně/… .

figi
Člen | 9
+
0
-

Ahoj,
zkouším zprovoznit TabControl pod Nette 2.0 a mám problém s načítáním obsahu jednotlivých Tab. Vždy se mi načte pouze obsah prvního Tabu a v ostatních se po přepnutí na ně vypíše pouze obsah proměnné $loaderText („Načítám…“). Pokud u všech Tab nastavím $hasSnippets=false, tak se obsah všech tab načte normálně, ale jakmile u libovolné Tab nastavím na true, tak se zobrazí pouze výše uvedená hláška. Netušíte někdo v čem by mohl být problém.
Podařilo se někomu rozchodit tuto vynikající komponentu pod Nette 2.0?

Honza Kuchař
Člen | 1662
+
0
-

To je tím, že v Nette 2.0 jsou snippety implementovány jinak než v Nette 0.9.x. Tedy bude třeba prostudovat přeložené šablony s nějakým snippetem, jak fungují snippety v současném Nette a podle toho opravit TabControl.

figi
Člen | 9
+
0
-

Takže když to přeložím…pro začátečníka mého kalibru bude jednodušší se vrátit k verzi 0.9.7 pro PHP 5.2. ;-)
Jelikož jsem Nette objevil teprve před nedávnem, tak jsem nezkušeně sáhnul po nové verzi 2.0 pro PHP 5.3 a jak zjišťuju, tak to pro mě nejspíš byl moc dlouhý krok kupředu. ;-)

Honza Kuchař
Člen | 1662
+
0
-

Zatím je to ve vývoji a protože mám své aplikace pod Nette 0.9, tak i moje doplňky jsou pro Nette 0.9 a PHP 5.2.

Honza Kuchař
Člen | 1662
+
0
-

Oznamuji, že doplněk je nově dostupný na githubu. SVN repozitář je zatím pořád funkční, vyvíjet se však bude v GITu.

Těším se na pull requesty, forky a všechny další vymoženosti, které GIT přináší.

Používáte-li svn:externals, tento článek je určený pro vás.

(V případě, že bych dělal něco proti GIT-best-practices, prosím upozorněte mě na to, jsem GIT-zelenáč)