[addon datagrid] DataGrid
- jarks
- Člen | 94
Pro zajímavost: hodně jsem se natrápil s nefunkčním ajaxem v šabloně, něco jako:
{snippet nazev span}
<a href="{link editPolozka!, 'editId' => $p->id}" class="ajax">{$p->nazev}</a>
{/snippet}
Signál se zavolal, ale ne prostřednictvím ajaxu. Po dlouhém zkoušení a
cyklickém pročítání všech možných návodů jsem si nakonec všiml, že
jsem z příkladu DataGridu přikopíroval i javascript
jquery.nette.js
.
Nahradil jsem ho originálním z Extras, a najednou všechno začalo fungovat. I když v DataGridu je teď třeba při použití filtru kliknout na ikonku a z nějakého důvodu se zobrazují dva spinnery. V javascriptu se bohužel vyznám jen málo a nemám možnost to teď detailně zkoumat, ale chtěl bych se zeptat, co si o tom myslíte a případně navrhnout, jestli by bylo možno modifikace nějak oddělit do zvláštního souboru, aby se to nestalo někomu dalšímu.
- Honza Kuchař
- Člen | 1662
Na obsluhu AJAXu potřebuješ znát JavaScript (alespoň základně). Protože jinak se v tom budeš pořád plácat.
- dotTwelve
- Člen | 167
S odvolanim na blog jQuery jsem si musel upravit nacitani externiho jQuery skriptu v DataGridu.
konkretne
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>
- Patrik Votoček
- Člen | 2221
Někde jsem četl že bude vydán další „stable“ build hned jak výjde „stable“ nette. Nette 0.9.0 už tu nějáký čas je a tak se ptám kdy bude „stable“ DataGrid?
- ji_ri_k
- Člen | 44
honzakuchar: Koukal jsem se na to video s tím DataGridem co jsi vystavil. Co mne zaujalo. V 36 vteřině klikneš na uložení zakázky. Při zpracování (ajaxovém) ti vyskočí vyjímka. Ve své aplikaci mám chybové zprávy také jakžtakž zpracovány, krom těch, které vzniknou při ajaxových požadavcích. Ty vidím pouze ve FireBugu. Mohl by si mne „nakopnout“ jak toto řešit? Rád bych, aby byl uživatel nějakým způsobem upozorněn pokud se při ajaxovém požadavku vyskytne nějaká chyba.
Předpokládám, že to bude nějak takto – zachytím vyjímku (v ErrorPresenteru nebo někde dřív?), unvaliduju snippet a chybu pošlu do něj (nebo je to řešeno jinak?).
Omlouvám se, že to píšu v tomto threadu, ale to video jsem viděl zde :-)
Děkuji za odpověď
- Patrik Votoček
- Člen | 2221
Řekl bych že je javascript narazí místo návratového kódu 200 na 500 a tak to zpracuje jako chybu a zobrazí to tak jak to zobrazí… Nevím jestli to honza řeší takhle ale jeví se mě to jako pravděpodobné…
- Patrik Votoček
- Člen | 2221
K nové verzi:
Nešlo by aby $grid->displayedItems = NULL;
vypnulo zobrazení
roletky?
$renderer->onRowRender[] = callback(Html $row, DibiRow $data);
$renderer->onCellRender[] = callback(Html $cell, string $column, mixed $value);
Sežere to když v callback-u nastavím
$row
/$cell
na NULL
? Jak už jsem tady
někde psal hodilo by se mě to na akce (nemužu si půjčit DVD které už je
půjčené).
- Honza Kuchař
- Člen | 1662
vrtak-cz napsal(a):
Řekl bych že je javascript narazí místo návratového kódu 200 na 500 a tak to zpracuje jako chybu a zobrazí to tak jak to zobrazí… Nevím jestli to honza řeší takhle ale jeví se mě to jako pravděpodobné…
Přesně tak to řeším. ;)
Tyhle zprávičky zobrazují:
- chybové zprávy při chybě přenosu. Měl jsem tam i AjaxErrorPresenter, který zobrazil i podrobnější informace (předal to v JSON), ale nebylo o uplně spolehlivé.
- Vyzobává ze stránky flash messages a zobrazuje je v tomto stylu.
//EDIT: využívá to jQuery plug-in jGrowl.
Editoval honzakuchar (24. 8. 2009 15:12)
- Jakub Šulák
- Člen | 222
Chtěl bych se zeptat na dvě věci, které jsem nenašel, jak udělat:
- Jakým způsobem mohu udělat omezení akcí a operací u jednotlivých řádků – tedy mám-li X záznamů a podle sloupce „allow (true/false)“ bych chtěl, aby akci bylo/nebylo možné provést (bylo/nebylo možné zaškrtnou řádek k operaci).
- Je nějaká možnost udělat z TextColumn ActionColumn (bez nutnosti psát novou odvozenou třídu)? Jde mi o to, aby tlačítko, například pro editaci, bylo udělané jako odkaz jednoho sloupce daného řádku.
díky za odpověď
- marek-m
- Člen | 66
Skuste ma opravit
obmedzenie akcie by som vykonal v DataGridRender na riadku cca. 540 v if ($column instanceof ActionColumn) { kde by som si dopisal nejaku funciu /callback/ za $html = $action->getHtml() , ktora by cez $data[$primary] a !title! kontrolovala moznost spustenia akcie, tu kontrolu by potom trebalo vykonat aj na handle akcie — berte ma s rezervou, v nette sa len orientujem.
- marek-m
- Člen | 66
tak som si to skusil – uprava len v DataGridRender
1 – pridat premennu
/** @var array of function($title, DibiRow $data) */
public $onAkctionRender;
2 – upravit funkciu
generateContentRow – blok
if ($column instanceof ActionColumn) {
.....
}
za
if ($column instanceof ActionColumn) {
$value = '';
foreach ($this->dataGrid->getActions() as $action) {
$html = $action->getHtml();
$use_action = TRUE;
if (isset($this->onAkctionRender)) {
foreach ($this->onAkctionRender as $callback) {
if (is_callable($callback)) {
if (call_user_func($callback, $html->title, $data) === FALSE)
$use_action = FALSE;
}
}
}
if ($use_action === TRUE) {
$html->title($this->dataGrid->translate($html->title));
$action->generateLink(array($primary => $data[$primary]));
$value .= $html->render() . ' ';
}
}
$cell->addClass('actions');
}
cez to title je to vsak o drsku /moj nazor/
presenter $renderer->onAkctionRender[] = array($this, 'customersGridonAkctionRender');
vo funkcii kontrolujem podmienku bud cely riadok, alebo cez title, konkretna
akcia – potom este kontrola na handle – resp. akciu
ak funkcia vrati FALSE – akcia sa nezobrazi
kontrolovat zaskrtnutie riadku na operaciu nevidim za opotstatnene, pretoze na jeden riadok moze byt viacero operacii, ktore mozu a nemusia byt /nemozem mazat, mozem si pozriet info/, to by som uz kontroloval pri samotnej akcii – napisal hlasku pri nemoznosti urcitej operacie
Editoval marek-m (26. 8. 2009 8:27)
- ji_ri_k
- Člen | 44
Tak jsem narazil na další problém, který souvisí s mým předchozím příspěvkem, kdy není možno vložit jako název sloupce diakritiku.
Nyní mám jako primární klíč ($grid->keyName) e-mail, který kvůli stejné kontrole neprojde. Příjde mi to zvláštní, že je kontrolován název sloupce, nebo primární klíč (když primární klíč může být v podstatě jakýkoliv řetězec).
Bohužel jsem datagrid moc nezkoumal, tak nevím z jakého důvodu to tak je, tak se jen ptám někoho zkušeného zda to lze nějak obejít. Děkuji
// EDIT: doplněné informace
Ještě pro upřesnění. Přiřazení $grid->keyName to zkousne, pokud
jej následně nepoužiju pro zpracující handler
$grid->allowOperations($operations, $callback, 'email');
Editoval ji_ri_k (27. 8. 2009 0:52)
- Honza Kuchař
- Člen | 1662
není možno vložit jako název sloupce diakritiku
Pokud vím, tak to dělá Nette.
- Ondřej Mirtes
- Člen | 1536
Tak jsem se dnes stal také šťastným uživatelem DataGridu (vše běží
jak po másle hned na první pokus, super :)), ale potřeboval bych se
v případě action dostat k Html objektu odkazu – konkrétně mu přidat
class confirm
.
//přidá class confirm k tomu spanu, potřebuji ji předat odkazu, který ho obaluje
$grid->addAction('Delete', 'Delete!', Html::el('span')->class('icon icon-del confirm'), false);
Jde to nějak, nebo mám upravit svůj javascript? :)
- Etch
- Člen | 403
LastHunter napsal(a):
Tak jsem se dnes stal také šťastným uživatelem DataGridu (vše běží jak po másle hned na první pokus, super :)), ale potřeboval bych se v případě action dostat k Html objektu odkazu – konkrétně mu přidat class
confirm
.//přidá class confirm k tomu spanu, potřebuji ji předat odkazu, který ho obaluje $grid->addAction('Delete', 'Delete!', Html::el('span')->class('icon icon-del confirm'), false);
Jde to nějak, nebo mám upravit svůj javascript? :)
Osobně sem na to řešení nenalezl. Takže sem to řešil takovouto prasárnou :
$("a[title='Delete']").live("click", function () {
return confirm('...');
});
- Ondřej Mirtes
- Člen | 1536
Etch napsal(a):
LastHunter napsal(a):
Tak jsem se dnes stal také šťastným uživatelem DataGridu (vše běží jak po másle hned na první pokus, super :)), ale potřeboval bych se v případě action dostat k Html objektu odkazu – konkrétně mu přidat class
confirm
.//přidá class confirm k tomu spanu, potřebuji ji předat odkazu, který ho obaluje $grid->addAction('Delete', 'Delete!', Html::el('span')->class('icon icon-del confirm'), false);
Jde to nějak, nebo mám upravit svůj javascript? :)
Osobně sem na to řešení nenalezl. Takže sem to řešil takovouto prasárnou :
$("a[title='Delete']").live("click", function () { return confirm('...'); });
Já jsem si říkal, že bych při nejhorším upravil své
$("a.confirm").live("click", function(event) {
event.preventDefault();
if (confirm("Jste si jisti?")) $.get(this.href);
});
na toto:
$("span.confirm").live("click", function(event) {
if (confirm("Jste si jisti?")) $.get($(this).parent("a").href);
});
- romansklenar
- Člen | 655
LastHunter napsal(a):
Tak jsem se dnes stal také šťastným uživatelem DataGridu (vše běží jak po másle hned na první pokus, super :)), ale potřeboval bych se v případě action dostat k Html objektu odkazu – konkrétně mu přidat class
confirm
.//přidá class confirm k tomu spanu, potřebuji ji předat odkazu, který ho obaluje $grid->addAction('Delete', 'Delete!', Html::el('span')->class('icon icon-del confirm'), false);
Jde to nějak, nebo mám upravit svůj javascript? :)
Zkus
$action->getHtml()->addClass(...);
- romansklenar
- Člen | 655
vrtak-cz napsal(a):
K nové verzi:
Nešlo by aby$grid->displayedItems = NULL;
vypnulo zobrazení roletky?
Nějak jednoduše nešlo, prostě si nastav jinak
$grid->getRenderer()->infoFormat
.
- romansklenar
- Člen | 655
Do vykreslovače jsem přidal událost onActionRender
:
$renderer->onActionRender[] = callback(Html $action, DibiRow $data);
- Jakub Šulák
- Člen | 222
Chci se zeptat, zda jste někdo přemýšlel, jak do DataGridu přidat
podporu exportu do Excelu?
Napadá mě více způsobů, ale každý se mi zdá „nedokonalý“…
Má někdo již řešení, nebo nad ním přemýšlel?
Co má plug-in dělat:
- do datagridu přidat ikonu/tlačítko pro export do Excelu
- po kliknutí nabídnout uživateli soubor ke stažení
- export dat vždy nezávisle na listování (export všeho)
Problémy co mě teď napadají:
- jde nějak obejít, abych nemusel na ten Excel mít vlastní presenter (abych nemusel mít komponentu v x souborech)?
- generovat excel knihovnou? další knihovna v projektu :( Nebo se spokojit s nějakým csv?
- jak napojit na datagrid možnost exportu jen vyfiltrovaných dat…
- marek.dusek
- Člen | 99
Jakub Šulák napsal(a):
Chci se zeptat, zda jste někdo přemýšlel, jak do DataGridu přidat podporu exportu do Excelu?
Napadá mě více způsobů, ale každý se mi zdá „nedokonalý“…
Heh, shodou okolnosti jsem to nedavno potreboval – resenim bylo priohnuti DataGridu tak, aby mi na urceny signal (definovany primo na urovni potomka DG, ktereho pouzivam) vratil jakoby DataGrid, ale vse poslal s hlavickou „Content-type: application/vnd.ms-excel“ a „Content-disposition: attachment; filename=neco.xsl“ .. je to spinavy a navic to „funguje“ jen pro MS Excel < 2007 (nova verze si uz kontroluje, jestli xls soubor = binarni a zobrazi warning pri otevirani; coz mne ale neva, protoze aplikace byla delana pro uzivatele OO).
Jinak bych na to sel pres PEARovskej Excel writer, ani by to nemuselo byt tak slozite (sirka, datovy typ, atd. – vse je v metadatech sloupcu)
- marek.dusek
- Člen | 99
Mam jiny technicky – pri ladeni nejakych dotazu na MySQL (kterou jsem povazoval za slusnou DB presne do chvile, nez jsem zjistil, ze „SELECT * FROM table WHERE a = 1“ neni totez, jako „SELECT * FROM (SELECT * FROM table WHERE a = 1) x“ ⇒ nechapu, jak toto muze nekdo slusne pouzivat pro cokoli vetsiho nez 1000radkovou tabulku) jsem se setkal s tim, ze DG pro me nepochopitelne vola nekolikrat count() nad datasourcem – jednou hned v konstruktoru, pak pri zjistovani, jestli DS neni uplne prazdny, atd … pokud ale mam nejake filtry, znamena to nekolik volani navic („DS se v case meni“) ⇒ na slozitejsich dotazech je to poznat.
Ma to nejaky duvod?
- romansklenar
- Člen | 655
Počet dotazů jsem se snažil vyoptimalizovat jak to jen jde (těch dotazů
je opravdu minimum), pokud se ti povede implementovat lepší a zároveň
čístý způsob (žádné ukládání výsledků do nějaké proměnné
v gridu) budu jen rád. Sám jsem to testoval na tabulce s 50000 položkama
v db sqlite a mysql, kterou můžu poskytnout. Jediné výraznější
zpomalení (viz
v poznámkách) nad takto velkou tabulkou je díky nepodpory DISTINCT v
DibiDataSource
, (kde se musí dotaz převádět na
DibiFluent
) u generování položek filtru selectboxu. Selectbox
si sice sám odstraňuje duplicity, ale proč mu práci neusnadnit. Jinými
slovy – db enginu by to mělo určitě trvat o něco méně než samotné
funkci array_unique
.
- Jakub Šulák
- Člen | 222
K tomu Excelu:
Já přemýšlím, zda by nešlo vůbec do toho DataGridu přidat nějaké
rozhraní na podporu pluginů. Aby se z Datagridu nestala super obří
komponenta, ale například šlo udělat Excel plugin, další export
pluginy – nebo ještě něco? Takže asi jen rozhraní pro exportní
pluginy…
- Jakub Šulák
- Člen | 222
Mohl bych požádat autora, aby doplnil do návodu v Extras jak se používá PositionColumn. Chvilku jsem se s tím trápil, protože jsem čekal, že to funguje trochu jinak.
Myslel jsem si, že to umí přímo v tabulce prohodit čísla v order column.
- Ani
- Člen | 226
V novejsich revizich nette, nejspis po tehle uprave https://forum.nette.org/…te-formularu mi prestali fungovat formularovy prvky (filtr, pocet radek…). Reseni je mimo muj dosavadni rozsah znalosti.
Editoval Ani (18. 9. 2009 14:24)
- Honza Kuchař
- Člen | 1662
Problém je v tom, že zmizela metoda isPopulated(). (datagrid.php:922) → Datagrid prostě nefunguje.
Existuje nejaká náhrada za isPopulated?
- stoupa101
- Člen | 2
Mozna hloupy dotaz, ale nevim jak to udelat.
mam:
<?php
$grid->addColumn('jmeno', 'Jméno');
$grid->addColumn('mestoid', 'Město');
?>
a zvlast v action sloupci:
<?php
$grid->addActionColumn('Actions');
$grid->addAction('Edit', 'Jmeno:edit', clone $icon->class('icosn icosn-edit'));
?>
Ted jak dostat tento odkaz na editaci pod jmeno, abych nemusel mit Action sloupecek?
Dotaz c.2: Jak toto udelat v pripade ze jde o joinovanou tabulku (mesto) a zde bych rad mel odkaz na Mesto:edit
Editoval stoupa101 (5. 10. 2009 14:11)
- kozel
- Člen | 14
1.
Musis si naprogramovat callback – tj. funkci, ktera upravuje hodnotu sloupce,
nez se zobrazi. V presenteru tuto funkci zavolas na sloupecek ‚jmeno‘:
$grid->addColumn('jmeno', 'Jméno')->formatCallback[] = 'vytvorOdkaz';
Funkci ‚vytvorOdkaz‘ si nekde definujes (ja ji mivam v souboru app/components/callbacks.php – potom se nesmi zapomenout includovat tenhle soubor):
function vytvorOdkaz($value) {
return link('Jmeno:edit', $value); // tohle strilim z hlavy; pokud to nebude fungovat, tak neco podobneho
}
a v Presenteru ji asi budes muset zaregistrovat jako tzv. helper (ted nevim presne kde, zkus hledat nekde v dokumentaci – muzes zacit asi u sablon: filtry a helpery):
protected function beforeRender() {
...
$this->template->registerHelper('vytvorOdkaz', 'vytvorOdkaz');
...
}
- vlki
- Člen | 218
To zní nějak až moc složitě:)
Myslím, že callback můžeš v klidu nechat přímo v Presenteru. Tam se stejně nejčastěji míchá logika pohledu a „controlleru“.
A navíc v jeho kontextu můžeš využít metod link apod.
V praxi?
class SomePresenter extends BasePresenter
{
protected function createComponentDg($name)
{
$dg = new DataGrid;
// ...
$dg->addColumn('name', 'Jméno')->formatCallback[] = array($this, 'formatDgNameColumn');
// ...
return $dg;
}
public function formatDgNameColumn($value, $data)
{
return $value . ' ' . $this->link('Jmeno:edit', $value);
}
}
- Honza Kuchař
- Člen | 1662
Ahojte,
pokouším se předělat datagrid na DibiFluent. DibiDatasource je ve větší
MySQL databázi naprsoto nepoužitelný, protože databáze zapomíná na
indexy. Vycházím z toho, že stejně ve většině případů bylo jako
datasource SELECT * FROM něco
. Jenom tak čísla pro
zajímavost:
Datasource datagrid ~500–600ms
Fluent datagrid ~4–15ms (doba SQL dotazů).
Až to bude nějaké trochu více stable, tak to vydám.
//EDIT: popřípadě nechtěl by autor sám přejít s datagridem na DibiFluent. Změny jsou naprosto minimální.
Editoval honzakuchar (10. 10. 2009 22:58)
- marek.dusek
- Člen | 99
OT: Presne o TOMHLE jsem tu nekde psal – nechapu, jak muze ve 21. stoleti existovat „databaze“, kde „SELECT * FROM tabulka“ neni identicke s „SELECT * FROM (SELECT * FROM tabulka) t“ …
- Jan Tvrdík
- Nette guru | 2595
Zrovna v takto jednoduchém případě lze ale místo
dibi::dataSource('SELECT * FROM tabulka')
psát
dibi::dataSource('tabulka')
čímž se poddotaz nevytvoří (alespoň myslím).
- Honza Kuchař
- Člen | 1662
nechapu, jak muze ve 21. stoleti existovat „databaze“
To je sice hezký, ale tahle databáze je na většině serverech.
dibi::dataSource(‚tabulka‘)
To vypadá zajímavě, ale i tak mi to nepomůže. (fakt to tak je: https://api.dibiphp.com/…rce.php.html#67 ) Pokud mám tabulku z ní něco chci vyfiltrovat a potom na to terve vypustit datagrid.
Tak jsem nad tím včera přemýšlel a došel jsem k tomu, že nebudu předělávat datagrid na DibiFluent (i když už ho mám funkční a předělaný), ale že udělám SimpleDibiDatasource, který na vstupu bude akceptovat pouze dibi fluent a s tím si potom bude pracovat dále. Nejspíš to nebude fungovat na nějakých složitějších dotazech, ale většinou se dá najít řešení, jak to přepsat nekaskádového dotazu.
Nevíte o nějakém SQL optimizeru, kterému byste dali nějaký takovýhle nějaký neoptimální dotaz a on by z toho udělal o něco optimálnější dotaz?
// EDIT: Kukněte pak někdo sem a prosím otestujte to: https://forum.dibiphp.com/…v-dibifluent?… (100 násobné zrychlení funkce count())
Editoval honzakuchar (11. 10. 2009 8:59)
- marek.dusek
- Člen | 99
Jan Tvrdík napsal(a):
Zrovna v takto jednoduchém případě lze ale místo
dibi::dataSource('SELECT * FROM tabulka')
psát
dibi::dataSource('tabulka')
čímž se poddotaz nevytvoří (alespoň myslím).
Presne tak – cele to je vlastne o tom, ze stavajici implementace datasource je univerzalnejsi (a fakticky jedina mozna), pokud totiz budu mit v selektu nejakou „vypocitavanou“ promennou a pak ji hodim do trideni/filtru, trivialni pridani do WHERE / ORDER BY neni mozne bez prave toho zaobaleni puvodniho dotazu (jestli si rozumime).
Proto asi nevymyslime nic lepsiho, nez vzdy selektit jen „nativni“ sloupecky a pripadne nutnosti „vypocitavanych“ vzdy pres pohledy (ktere jsou mimochodem v MySQL take nic moc).
Osobne to povazuju za zcela zasadni poznatek k vykonnosti aplikace, ale vetsina webu patrne jede na tabulkach o par stovkach/tisicich radku bez potreb slozitejsich joinu (ktere jsou take, odpustte, v MySQL strasne a bez STRAIGHT_JOIN je „optimalizator“ fakt jalovej), kde se fatalni zpomaleni pri „obalovani“ tolik neprojevi (ten COUNT je vybornej priklad).
- David Grudl
- Nette Core | 8218
honzakuchar napsal(a):
tak me napadlo, co kdyby datasource vytvorilo docasne pohled
Dočasné pohledy, to je další věc, co MySQL neumí :-(
A „nedočasný pohled“ = operace na disku & potřeba oprávnění.
- phx
- Člen | 651
Bylo by fajn aby DataGrid akceptoval i DibiFluent. Kdyz se dotaz spravne napise tak i filtrovani a razeni by nemel byt problem ne?
Jedine co nepujde je delat selekt sloupecku. Na to by se muselo myslet jiz pri psani dotazu.
Mejme nejaky slozity dotaz:
SELECT
neco, neco2, neco3, NOW() AS datum, DATE(datumacas) as jendatum
FROM tabulka
LEFT JOIN jina_tabulka USING(pk)
WHERE (
neco3 = 'X'
AND
DATE(datumacas) = '2009-10-11' -- ha zde jsem narazil zde nebude fungovat jendatum = ... :(
)
AND -- doplni filtr
No tak nejde uplne vse:( Sakrys…
Vse by slo za predpokladu:
- v selektu zadne operace s hodnotami dle kterych ma byt filtrovano
- podminky v jedne velike zavorce aby filtr mohl pridat AND … bez naruseni priority operaturu
Co myslite?
Editoval phx (13. 10. 2009 11:14)
- Klokan
- Člen | 47
Ahoj,
určitě jste se už s tímto problémem někdo setkal, ale nikde na fóru jsem
ho nenašel, tak se zkusím obrátit sem. Jedná se o přepisování id při
práci s Ajaxem v Datagridu.
Mám master tabulku ze ktere odkazuji na seznam detailu (v linku je tedy id
masteru).
/detail/default/1.
V seznamu detailů chci nyní detail editovat (jedná se o ajax, kdy ve
stávající šabloně otevírám nový formulář). Datagrid mi vytvoří link
/detail/default/29?do=edit. Tj. správně vloží klíč detailu.
(Při vkládání nového záznamu je tam ten původní link
/detail/default/1?do=add).
Jenže po opravě záznamu mě odkáže pochopitelně na /detail/default/29, čímž se dostanu úplně jinam.
Existuje nějaký způsob, jak toto správně vyřešit ? Napadlo mě
v callbacku Action přidat persistentní parametr, resp. změnit ten link. Je
to správná cesta ? Posledním řešením je vyrušit ajax a opravu udělat na
samostatné stránce, ale tohle už určit někdo vyřešil.
Díky za případné odpovědi.
- Honza Kuchař
- Člen | 1662
Já na tohle používám TabControl. (alespoň tedy pokud jsem to správně pochopil) Pokud to nechceš mít ve formě tabů, tak stačí přestylovat.
- Klokan
- Člen | 47
honzakuchar napsal(a):
Já na tohle používám TabControl. (alespoň tedy pokud jsem to správně pochopil) Pokud to nechceš mít ve formě tabů, tak stačí přestylovat.
Díky za nápad. Není to sice odpověď na můj dotaz, ale řešit to takhle asi taky půjde. Jdu to vyzkoušet a ještě jednou dík za inspiraci.
- Klokan
- Člen | 47
Tak přeci jen mi to nedá a zkusím se optat ještě jednou resp. to lépe vysvětlit.
Volám z master tabulky detail takto: /detail/default/x, kde x je
číslo záznamu detailu. Detail obsahuje seznam záznamů k masteru, které se
zobrazují přes dataGrid.
V dataGridu se mi pro vložení nového detailu vytvoří link
/detail/default/x?do=add (vytvářím ručně metodou link), ale pro
opravu stávajícího záznamu mi vytvoří link
/detail/default/y?do=edit.
Jak takovouhle situaci řešíte ? Nemůže to vytvořit link */detail/default/x/y?do=edit nebo nějaké jiné řešení ? Logicky by měl původní link zachovat a přidat si k němu svoje parametry myslím.
- Klokan
- Člen | 47
Tak už jsem řešení konečně našel. Nejprve jsem hledal v dokumentaci
možnost změnit druhý parametr, tedy link. Je tam psáno, že se „tvoří
klasickým způsobem, jakým se v Nette tvoří odkazy“. Lze zde však zadat
pouze řetězec, takže tady parametry použít nejdou. Klíčem je poslední
parametr označený v dokumentaci jako $type = DataGridAction::WITHOUT_KEY.
Tímto typem je však klíč, který může nabývat popsané konstanty
WITHOUT_KEY, WITH_KEY, ale také název pole.
Potom pokud vypíšu do klíče ‚id_detail‘, vytvoří se odkaz
/detail/default/x?id_detail=y, což je požadovaný tvar.
Takže doufám, že to někomu pomůže až bude hledat stejně jako já.
- romansklenar
- Člen | 655
Ani napsal(a):
V novejsich revizich nette, nejspis po tehle uprave https://forum.nette.org/…te-formularu mi prestali fungovat formularovy prvky (filtr, pocet radek…). Reseni je mimo muj dosavadni rozsah znalosti.
honzakuchar napsal(a):
Problém je v tom, že zmizela metoda isPopulated(). (datagrid.php:922) → Datagrid prostě nefunguje.
Existuje nejaká náhrada za isPopulated?
Opraveno v revizi 52. Nyní by měl být DataGrid kompatibilní i s vývojovou verzí 0.9.2
- na1k
- Člen | 288
Rád bych se zeptal – je možné dodat data pro DG jinak než v dataSource? Resp. je možné pro účel základního gridu (jen listování a řazení) implementovat vlastní dataSource, který by bral data například z vícerozměrného pole anebo využívá DG některé funkce, které bych vlastní implementací nenasimuloval?
Jde mi o to, že ukládám méně významné uživatelské detaily (telefon, icq,..) v jediném sloupci tabulky, a to v serializované formě. A jelikož MySQL neumí odserializovat a rozdělit do sloupců, ztrácím nad tímto sloupcem možnost řadit. Můžu si maximálně doplnit callback na „překlad“ obsahu, ale ten mi dovolí nanejvýš odserializovat a vypsat co potřebuji.
(Mmch. nenapadá vás lepší řešení s ohledem na to, že detaily můžou přibývat a ubývat a moc se mi nechce dělat další tabulky se složitýma relacema?)