[addon tabcontrol] TabControl
- Honza Kuchař
- Člen | 1662
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
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
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)
- Honza Kuchař
- Člen | 1662
Ano je.
- Přes template. (vyzkoušeno)
- Vlastní merodou render() (jeden z callbacků při vytváření tabu) (nevyzkoušeno)
- Honza Kuchař
- Člen | 1662
Přihodil jsem úpravu SnippetHelperu na bug tracker https://github.com/…nette/issues#…
- ZETCHA
- Člen | 59
Zdravím.
Nedaří se mi zprovoznit načítání tabu ajaxem. Ajax request mi
vrací např:
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.
- Mikulas Dite
- Člen | 756
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)
- Matúš Matula
- Člen | 257
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
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
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;
}
- johny9009
- Člen | 3
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
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
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
- johny9009
- Člen | 3
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
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
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?
- figi
- Člen | 9
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
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
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
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
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áč)