[addon datagrid] DataGrid

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

Ř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
+
0
-

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
+
0
-

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í:

  1. 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é.
  2. 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)

marek-m
Člen | 66
+
0
-

Ako zistim v definovanej funkcii na onCellRender hodnotu keyName?

Editoval marek-m (25. 8. 2009 16:09)

Jakub Šulák
Člen | 222
+
0
-

Chtěl bych se zeptat na dvě věci, které jsem nenašel, jak udělat:

  1. 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).
  2. 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
+
0
-

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
+
0
-

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)

jasir
Člen | 746
+
0
-

marek-m:

Takhle se to nedá číst :-) formátování příspěvků

marek-m
Člen | 66
+
0
-

sorac, este sa len orientujem

ji_ri_k
Člen | 44
+
0
-

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
+
0
-

není možno vložit jako název sloupce diakritiku

Pokud vím, tak to dělá Nette.

Ondřej Mirtes
Člen | 1536
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

Do vykreslovače jsem přidal událost onActionRender:

$renderer->onActionRender[] = callback(Html $action, DibiRow $data);
Jakub Šulák
Člen | 222
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

Problém je v tom, že zmizela metoda isPopulated(). (datagrid.php:922) → Datagrid prostě nefunguje.

Existuje nejaká náhrada za isPopulated?

stoupa101
Člen | 2
+
0
-

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
+
0
-

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
+
0
-

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);
	}

}
stoupa101
Člen | 2
+
0
-

Super diky moc, jen sem trosku upravil ten callback

public function formatDgNameColumn($value, $data)
{
        return Html::eq('a')->href($this->link('Jmeno:edit', $data->id))->setText($value);
}
Honza Kuchař
Člen | 1662
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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).

Honza Kuchař
Člen | 1662
+
0
-

tak me napadlo, co kdyby datasource vytvorilo docasne pohled

David Grudl
Nette Core | 8218
+
0
-

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í.

Tomik
Nette Evangelist | 485
+
0
-

OT: DibiDataSource by byl naprosto dokonalý, nebejt toho zas*anýho MySQL. :)

Editoval Tomik (12. 10. 2009 17:14)

phx
Člen | 651
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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?)