Nextras\Datagrid – datagrid se vsim jak ma byt

abc
Člen | 92
+
0
-

Aha díky! A kde je správné místo pro znovuinicializaci?

hrach
Člen | 1834
+
0
-

idealne ten doplne musi podporovat nette.ajax.js, nebo si do nej musis napsat vlastni extension, aby po ajax request se tvoje inputy znovuinicializovali.

Azathoth
Člen | 495
+
0
-

Ahoj,

tenhle datagrid je skvělý, ale mám jednu malou otázku: jak do něj dostat translator? Používám Kdyby/Translation a rád bych ho tam nějak elegantně poslal pomocí DI. Je translator nějak vyřešený?

Azathoth
Člen | 495
+
0
-

Ahoj,
měl bych jednu otázku k tomu inline editování:
když si otevřu datagrid a kliknu na tlačítko edit, tak se spustí anonymní funkce s parametrem ($row), kterou předávám jako parametr v metodě $grid->setEditFormFactory

a když kliknu na tlačítko save, spustí se opět ta metoda, ale tentokrát předávaný parametr $row == null.

Mohl by mi to někdo, prosím, osvětlit?

Azathoth
Člen | 495
+
0
-

Ahoj,
opět mám dotěrnou otázku: Jak si uvnitř .latte souboru, kde si definuji sloupec, zpřístupnit GET parametr? Vzhledem k tomu, že ten .latte soubor, kde definuji sloupec k datagridu má (logicky) jiný název než presenter, tak úplně nefunguje $this->template>variable. Mohu poslat nějakou proměnnou do toho datagridu, abych ji potom mohl používat uvnitř define tagu?
{define col-subscribe}
{$proměnná, která není obsažena v row, ale která je GET parametr a kterou velmi potřebuji}
{/define}

Děkuji za všechny odpovědi.

nanuqcz
Člen | 822
+
0
-

@Azathoth Ahoj, nezkoušel jsem, ale předpokládám, že by mělo fungovat tohle:

$grid = new Nextras\Datagrid\Datagrid;
$grid->template->variable = 'value';
Azathoth
Člen | 495
+
0
-

Bohužel ne. Mám tam

<?php
$grid->addCellsTemplate(__DIR__ . '/../templates/Profile/cells.manageSubscribedLectors.latte');
$client = $this->userHandler->getUserWithId($this->id);
$grid->template->client = $client;
?>

a padá to při zavolání $grid->template:
Nette\InvalidStateException

Component '' is not attached to ‚Nette\Application\UI\Presenter‘.

iguana007
Člen | 970
+
0
-

A toto taky neprojde?

$grid->getPresenter()->template->client = $client;
Azathoth
Člen | 495
+
0
-

Bohužel, to také neprojde.

hrach
Člen | 1834
+
+1
-

@Azathoth

  1. setTranslator https://github.com/…Datagrid.php#L228 neni dostatecne?
  2. setRowFactory opravdu jednou dostava argument prazdny, je to hlavne proto, ze „teoreticky“ ho pri savu nepotrebuje. viz ukazka treba tady: https://github.com/…resenter.php#L39
  3. Promennou predas pres sablonu gridu, ale ten musi byt uz pripojen k presenteru. Viz. fungovani komponent v nette, tj. buz v sablone {$presenter->getParameter('asd'), nebo tovarnicku takto:
public function createComponentDatagrid($name)
{
	$grid = new Nextras\Datagrid\Datagrid($this, $name);
	$grid->template->variable = 'value';
}
Azathoth
Člen | 495
+
0
-

Děkuji moc!
Teď se stydím, že mi unikl ten setter na translator…

chladekt
Člen | 10
+
0
-

Předpokládám, že třídění podle více sloupců (šipečky u více sloupců) není podporováno. Plánuje se to? Kdy by to mohlo být? Nevíte, jaký jiný plugin pro Nette by to umožňoval? jQuery plugin tablesorter to umí. Možná ho proto upřednostním před tímto pluginem.

hrach
Člen | 1834
+
0
-

@chladekt aktualne to opravdu neni v planu. nevidel jsem jeste nejake chytre UI, ktere by to umelo dobre :)

n.u.r.v.
Člen | 485
+
0
-

Ahoj, používám tento skvělý datagrid na několika místech v app, ale v jednom případě mám velký problém – nechce se vložit do formu žádné hidden pole i když ho z db načítám… jediné hidnen, které se do formuláře vloží je pole „_token_“. Netušíte čím to může být?

V presenteru mám:

public function createComponentGrid() {
        $parameters = $this->parameters;
        $grid = new \Nextras\Datagrid\Datagrid;
        $grid->addColumn("NAME", "Název skupiny")->enableSort();
        $grid->addColumn("NUMBER", "Počet členů")->enableSort();
        $grid->setEditFormFactory(function($row) use ($parameters) {
                    $form = new Nette\Forms\Container;
                    $form->addText('NAME')
                            ->setRequired('Prosím vložte název nové skupiny.')
                            ->addRule(Form::MAX_LENGTH, 'Maximální délka názvu skupiny je %d znaků.', $parameters['groupMaxLengthName'])
                            ->setAttribute('placeholder', 'Název skupiny')
                            ->setAttribute('autofocus', 'autofocus')
                            ->setAttribute('class', 'form-control form-required')
                            ->setAttribute('style', 'margin-bottom: 0px;height:25px; padding: 0px;');
                    $form->addHidden('HASH');
                    $form->addSubmit("save", "Uložit")
                            ->setAttribute('class', 'btn btn-snd btn-sm');
                    $form->addSubmit("cancel", "Zrušit")
                            ->setAttribute('class', 'btn btn-snd btn-sm');
                    !$row ? : $form->setDefaults($row);
                    return $form;
                });
        $grid->setRowPrimaryKey('ID');
        $grid->setDataSourceCallback($this->getDataSource);
        $grid->setEditFormCallback($this->saveData);
        $grid->setDefaultLatte(__DIR__ . '/../templates/Groups/Datagrid.latte');
        $grid->setDefaultText('<td colspan="3" style="color:#323232; font-style:italic; line-height:30px;">Nejsou zadáné žádné třídy.</td>');
        $grid->addCellsTemplate(__DIR__ . '/../templates/Groups/@cells.latte');
        return $grid;
    }

public function getDataSource($filter, $order, Paginator $paginator = NULL) {
        if ($order and is_array($order)) {
            return $this->schoolRepository->getAllGroupsGrid($this->user->getIdentity()->firmId, $order);
        } else {
            return $this->schoolRepository->getAllGroupsGrid($this->user->getIdentity()->firmId);
        }
    }

V modelu načtení dat z DB:

public function getAllGroupsGrid($firm_id, $order=null) {
        $firm_id = intval($firm_id);
        $orderFinall = ' ORDER BY g.DATE_CREATE DESC';
        if(is_array($order) and count($order)==2){
            if($order[0]=='NUMBER'){
                $orderFinall = ' ORDER BY '.$order[0].' '.$order[1];
            }else{
                $orderFinall = ' ORDER BY g.'.$order[0].' '.$order[1];
            }
        }
        return $this->database->getConnection()->query('SELECT g.ID, g.NAME, g.HASH,
                          (SELECT count(ID) FROM user WHERE FIRM_ID = ' . $firm_id . ' AND CLASSROOM_ID = g.ID AND DATE_DELETE IS NULL) AS NUMBER
                     FROM group AS g
                    WHERE g.FIRM_ID = ' . $firm_id . ' AND g.DATE_DELETE IS NULL'.$orderFinall)->fetchAll();
    }

$form->addHidden(‚HASH‘); nefunguje. Kde může být chyba? Stejný postup používám na jiném místě a funguje to…Díky

P.S.: Latte šablony pokud bude třeba, nekam uploadnu – jsou moc velké a nechci tu dělat bordel…

Editoval n.u.r.v. (9. 9. 2014 11:11)

n.u.r.v.
Člen | 485
+
0
-

Hmm, tak nechápu – na ostrém webu to hidden pole vkládá, na localu ne…

hrach
Člen | 1834
+
0
-

@n.u.r.v nebude to nejaka cache?

vvoody
Člen | 910
+
0
-

Neprekresluje sa len riadok miesto celej komponenty gridu?

n.u.r.v.
Člen | 485
+
0
-

hrach napsal(a):

@n.u.r.v nebude to nejaka cache?

celá složka temp smazaná a znovu vytvořená…smazána i cache v browseru, vyzkoušeno několik browserů…

Jediný rozdíl je v tom, že na localu mám php 5.5 a na hostingu 5.4.

Přitom když zkusím vytvořit dvakrát to pole (se stejným názvem), tak to hodí chybu, že už položky existuje – takže někde se to tvoří, ale v html kodu to pole není a v odeslaném formuláři to pole také není…

No, hlavně že to funguje na hostingu… ale je to záhada… Zkoušel jsem i nejnovější verzi datagridu – ta moje jen asi půl roku stará, ale stejný problém…

vvoody napsal(a):

Neprekresluje sa len riadok miesto celej komponenty gridu?

to je docela možné, ale proč…

Editoval n.u.r.v. (10. 9. 2014 10:22)

vvoody
Člen | 910
+
0
-

Ja sa len pýtam :) nepamätám si presne ako je v gride riešená invalidácia, ak by sa prekresloval len riadok pri riadkovej editácií, tak sa možno neprekreslí koniec formu kde sa ukladajú hidden fieldy. Možno trepem húposti, ale aj tak vyskúšaj vypnúť ajax čím by mal tento problém odpadnúť. Samozrejme to nebude riešenie, ale budeme aspoň vedieť viac.

hrach
Člen | 1834
+
0
-

zkus zkontrolovat, jestli zkompilovana sablona obsahuje vykresleni toho hidden inputu.

n.u.r.v.
Člen | 485
+
0
-

hrach napsal(a):

zkus zkontrolovat, jestli zkompilovana sablona obsahuje vykresleni toho hidden inputu.

Myslíš podívat se do vygenerovaného souboru v temp/cache/_Nette.FileTemplate ? Kouknul jsem se a nenašel…Není ale ani v té šabloně, která funguje dobře… Nebo špatně hledám…

doly
Člen | 4
+
0
-

Ahojte!

Mám problém s redefinemacro.
Nachádza sa: /vendor/nextras/latte-macros/Nextras/Latte/Macros/RedefineMacro.php

/composer.json:

	"require": {
		"php": ">= 5.3.7",
		"nette/nette": "=2.2.1",
"nextras/latte-macros": "~1.0.0",
"nextras/datagrid": ">= 2.0",
		"dg/adminer-custom": "1.*"

Dal som ho do config.neon

latte:
    macros:
        - Nextras\Latte\Macros\RedefineMacro::install

Dostávam chybovú hlášku:
**Found sections ‚latte‘ in configuration, but corresponding extensions are missing.
**
Som začiatočník ohľadom makier v nette, composeru aj config.neon

Ďakujem

Editoval doly (18. 9. 2014 10:43)

hrach
Člen | 1834
+
0
-

registrujes makro tak, jak se to dela v nette 2.2., najdi si jak v 2.1 ;)

doly
Člen | 4
+
0
-

hrach napsal(a):

registrujes makro tak, jak se to dela v nette 2.2., najdi si jak v 2.1 ;)

  1. Ako vidno podľa composera používam nette 2.2, prečo mám registrovať makro tak, ako sa to robí v nette 2.1.
  2. Na webe som našiel návod len k registrácii 2.0 a 2.1-dev, otázka je, či by mi to pomohlo s datagridom, keď predsa len používam nette 2.2.1.
  3. Som začiatočník, ako som už písal vyššie, takže prosím o dlhšiu odpoveď ako jeden riadok.

Ďakujem

doly
Člen | 4
+
0
-

Tak som to rozchodil. Pre budúce generácie:

1. Vo verzii 2.2.x sa registruje Redefine macro:

	latte:
		macros:
			- Nextras\Latte\Macros\RedefineMacro::install

2. V presenteri

$grid->addCellsTemplate(__DIR__ . '/../../../vendor/nextras/datagrid/bootstrap-style/@bootstrap3.datagrid.latte');

Keby niekomu niečo neišlo, kľudne sa ozvite cez mail. Doly

MW
Člen | 615
+
0
-

Prosím moc o radu.
Přesel jsem na novou verzi Nette a dostavam chybu:

Undefined property: stdClass::$blocks

a to zde v sablone:

<?php $_l->blocks['pagination'] = array_reverse($_l->blocks['pagination']) ?>

Nevi někdo prosim.. nic jsem nenasel..

Editoval MW (14. 10. 2014 21:43)

Azathoth
Člen | 495
+
0
-

@MV ukaž, jak to vypadá v tvé latte šabloně.

Azathoth
Člen | 495
+
0
-

Měl bych jeden dotaz: jde upravit vykreslování celého řádku? Třeba když budu chtít obalit celý řádek do <a> tagu, jde to nějak elegantně udělat?

Editoval Azathoth (20. 10. 2014 16:21)

Azathoth
Člen | 495
+
0
-

Jde nějak upravit renderování, aby to nebylo jako table, ale jako divy a spany?

MW
Člen | 615
+
0
-

Azathoth napsal(a):

@MV ukaž, jak to vypadá v tvé latte šabloně.

Tak presne takto:

{define pagination}
<?php
$page = $paginator->getPage();
if ($paginator->pageCount < 2) {
    $steps = array($page);
} else {
    $arr = range(max($paginator->firstPage, $page - 3), min($paginator->lastPage, $page + 3));
    $count = 4;
    $quotient = ($paginator->pageCount - 1) / $count;
    for ($i = 0; $i <= $count; $i++) {
	$arr[] = round($quotient * $i) + $paginator->firstPage;
    }
    sort($arr);
    $steps = array_values(array_unique($arr));
}
?>

<div class="paginator">
    {if $paginator->isFirst()}
    <span class="button">« Předchozí</span>
    {else}
    <a href="{link paginate!, 'page' => $paginator->page - 1}" class="ajax">« Předchozí</a>
    {/if}

    {foreach $steps as $step}
    {if $step == $paginator->page}
    <span class="current">{$step}</span>
    {else}
    <a href="{link paginate!, 'page' => $step}" class="ajax">{$step}</a>
    {/if}
    {if $iterator->nextValue > $step + 1}<span>…</span>{/if}
    {/foreach}

    {if $paginator->isLast()}
    <span class="button">Další »</span>
    {else}
    <a href="{link paginate!, 'page' => $paginator->page + 1}" class="ajax">Další »</a>
    {/if}

</div>

{/define}

{? $_l->blocks['pagination'] = array_reverse($_l->blocks['pagination'])}
ali
Člen | 342
+
0
-

Azathoth napsal(a):

Měl bych jeden dotaz: jde upravit vykreslování celého řádku? Třeba když budu chtít obalit celý řádek do <a> tagu, jde to nějak elegantně udělat?

cely radek do tagu <a> dat nemuzes (neni to validni), musis do tagu dat jednotlive bunky, coz docilis predefinovanim row-inner blocku a v css si pak nastavis neco takoveho

a { display: block; width: 100%; height: 100% }

Azathoth napsal(a):

Jde nějak upravit renderování, aby to nebylo jako table, ale jako divy a spany?

kompletne cele renderovani si muzes nastavit v sablone, kterou si potom nactes v komponente, viz navod nebo demo

Editoval ali (22. 10. 2014 10:07)

ali
Člen | 342
+
0
-

@hrach
Mam takovy problem, ktery mam nejspise od prvniho dne, kdy pouzivam Nextras\Datagrid a to je pri uprave, radku, kdy mam otevrenou editaci radku cislo #X a chci zacit editovat radek cislo #Y, bez toho aniz bych data v radku #X ulozil nebo kliknul na cancel, tak mi moznost editace radku #X nezmizi..
Ja to ze zacatku jako bug nepovazoval (az dodnes, kdy jsem se podival na tvoje full demo datagridu), mam nastavene vsechno spravne, zkousel jsem datagrid zobrazit i bez mych template uprav, ale vysledek porad stejny..

Nette 2.2.3
Scripty, ktere mam vlozene na strance:

<script src="{$basePath}/js/jquery-1.11.1.min.js"></script>
<script src="{$basePath}/js/bootstrap.min.js"></script>
<script src="{$basePath}/js/netteForms.js"></script>
<script src="{$basePath}/js/nette.ajax.js"></script>
<script src="{$basePath}/js/spinner.ajax.js"></script>
<script src="{$basePath}/js/nextras.datagrid.js"></script>
	<script>
		$(function() {
			$.nette.init();
		});
	</script>

S timhle tim problemem nejspise souvisi jeden bug v me aplikaci, kdy se jeden radek prepise druhym, ale to tu nebudu zatim popisovat, protoze je mozne, ze to bude vyse popsanym.

Editoval ali (22. 10. 2014 10:45)

hrach
Člen | 1834
+
0
-

@ali trik je v pridani custom atributu pro ten link, javascript to pak osefuje. https://github.com/…tagrid.latte#L86

ali
Člen | 342
+
0
-

@hrach to jsem si myslel ze to tak funguje, timpadem nechapu proc to v me aplikaci nefunguje. Zkousim to i s orginalni sablonou, verzi Datagridu mam aktualni.. testoval jsem to i bez filtru, bez paginatoru, s ruznym poctem radku, jinym poctem sloupcu, se stejnou verzi jQuery a nette.ajax co mas v demu a uz me nic jinciho nenapada, v cem by mohla byt nejaka nekompatibilita

hrach
Člen | 1834
+
0
-

a mas opravdu nacteny datagridi javascript? jaky url to generuje, ten druhy klik?

ali
Člen | 342
+
0
-

@hrach druhy klik generuje toto

warehouse/?datagrid-primaryValue=1500&do=datagrid-edit&datagrid-cancelEditPrimaryValue=1501

coz podle dema je OK

a kdyz jich mam otevrenych vice najednou, tak toto

warehouse/?datagrid-primaryValue=1498&do=datagrid-edit&datagrid-cancelEditPrimaryValue=1501,1500,1499

Editoval ali (23. 10. 2014 5:38)

hrach
Člen | 1834
+
0
-

no vzhledem k tomu, ze je otevren vzdy jen jeden, tak k tomu druhemu by nemelo dojit…

Petr Steinbauer
Člen | 26
+
0
-

Dobrý den,
omlouvám se hrach, ale nepodařilo se mi dohledat nikde možnost změnit text v tlačítkách „vyhledat“ a „reset“.
Cílem je do nich dát ikony (například fa fa-power-off), text vyhodit a doplnit atribut „title“ s příslušným popiskem.

Lze toto nějak ovládat, existuje to?
Děkuji za nakopnutí správným smerem.

MW
Člen | 615
+
0
-

Petr Steinbauer napsal(a):

Dobrý den,
omlouvám se hrach, ale nepodařilo se mi dohledat nikde možnost změnit text v tlačítkách „vyhledat“ a „reset“.
Cílem je do nich dát ikony (například fa fa-power-off), text vyhodit a doplnit atribut „title“ s příslušným popiskem.

Lze toto nějak ovládat, existuje to?
Děkuji za nakopnutí správným smerem.

To lze nastavit v

$grid->setFilterFormFactory(function() {
.....
$form->addSubmit('filter', 'Filtrovat/Obnovit');
$form->addSubmit('cancel', 'Zrušit filtr');
....
});

Editoval MW (24. 10. 2014 13:09)

Petr Steinbauer
Člen | 26
+
0
-

@MW děkuji za radu.
Bohužel, toto nejde použít, protože když tam použiji toto html <em class="fa fa-power-off"></em> tak se mi nepřeloží jako HTML (ikona), ale vypíše se jako text.
Nenašel jsem nikde přepínač který by toto chování vypnul.
Nadále ale zůstane problém s absenci title.

Nenapadá mě jak to řešit, snad jen pomocí javascriptu a měnit přes něj obsah tlačítka?

ali
Člen | 342
+
+1
-

@Petr Steinbauer

$form->addSubmit('cancel', 'Zrušit filtr')->setAttribute("class","fa fa-power-off");

Editoval ali (26. 10. 2014 18:31)

jEhLa
Člen | 70
+
0
-

Zdravím,
asi to bude jen nějaká drobnost, ale nedaří se mi to rozchodit.
Potřebuji DataGrid dostat do komponenty \Nette\Application\UI\Control. V tu chvíli mi však přestane fungovat ajax. DataGrid nevrací žádné snippety, jen state.

abc
Člen | 92
+
0
-

Ahoj,
prosím o radu.
Rád bych použil při vykreslování buněk gridu vlastní latte filter, je to nějak možné?
Filter mám registrovaný v BasePresnteru, v šabloně mi normálně funguje, ale když chci definovat buňku gridu:

{define col-name}
<td>
    {$row->name|aa}
</td>
{/define}

Tak dostanu hlášku Filter ‚aa‘ is not defined.

Jak mohu registrovat filter pro Grid?
Díky!

MW
Člen | 615
+
0
-

abc napsal(a):

Ahoj,
prosím o radu.
Rád bych použil při vykreslování buněk gridu vlastní latte filter, je to nějak možné?
Filter mám registrovaný v BasePresnteru, v šabloně mi normálně funguje, ale když chci definovat buňku gridu:

{define col-name}
<td>
    {$row->name|aa}
</td>
{/define}

Tak dostanu hlášku Filter ‚aa‘ is not defined.

Jak mohu registrovat filter pro Grid?
Díky!

Mozna to pujde lepe, ale ja to udelal přes tridu, která rozsiri \Datagrid a zde jsem si filter zaregistroval. A při vytvareni instance gridu volam tuto tridu.
To jen proto, abych nezasahoval do tridy puvodni gridu, jinak to muzes samozrejme registrovat primo tam.

svobodai
Člen | 136
+
0
-

Jak mohu udělat externí filtraci.
Mám problém, že potřebuji filtrovat podle jiných sloupců než mám zobrazené. Mám join přes více tabulek a zobrazuji labely, ale filtrovat potřebuji podle ID, které náleží k těm labelům. a potřeboval bych to mít nad tabulkou datagridu.

Druhá věc, kterou navím jak udělat jednoduše, je formátování sloupců tabulek. Mám dva sloupce, ve kterých je stejná informace datetime a potřebuji tuto informaci rozdělit do dvou sloupců a samozřejmně i zarovnávat doprava.

Jinak výborný datagrid, hlavně to nabírání dat přes callback.

Editoval svobodai (31. 10. 2014 20:29)

abc
Člen | 92
+
0
-

@MW – tedy normálně podědit a zaregistrovat v konstruktoru? (děkuju za odpověď i na toto, nebudu se s tím muset zbytečně trápit)

@hrach je to správné řešení?

Díky oběma

Editoval abc (31. 10. 2014 21:41)

Azathoth
Člen | 495
+
0
-

MW napsal(a):

Azathoth napsal(a):

@MV ukaž, jak to vypadá v tvé latte šabloně.

Tak presne takto:

{? $_l->blocks['pagination'] = array_reverse($_l->blocks['pagination'])}

Asi to ode mne bude znít jako hloupá otázka, ale co je zač proměnná $_l?

Azathoth
Člen | 495
+
0
-

ali napsal(a):

Azathoth napsal(a):

Měl bych jeden dotaz: jde upravit vykreslování celého řádku? Třeba když budu chtít obalit celý řádek do <a> tagu, jde to nějak elegantně udělat?

cely radek do tagu <a> dat nemuzes (neni to validni), musis do tagu dat jednotlive bunky, coz docilis predefinovanim row-inner blocku a v css si pak nastavis neco takoveho

a { display: block; width: 100%; height: 100% }

Díky, nakonec jsem to udělal přesně takhle.

>

Azathoth napsal(a):

Jde nějak upravit renderování, aby to nebylo jako table, ale jako divy a spany?

kompletne cele renderovani si muzes nastavit v sablone, kterou si potom nactes v komponente, viz navod nebo demo

Asi mi něco nedochází, ale z https://componette.org/search/?… mi přijde, že to prostě musí začínat a končit table tagem a změna renderování řádku, tedy aby tam bylo místo tr tagů něco jiného, v tom přehledu vůbec není.

Editoval Azathoth (31. 10. 2014 21:59)

MW
Člen | 615
+
0
-

Azathoth napsal(a):

MW napsal(a):

Azathoth napsal(a):

@MV ukaž, jak to vypadá v tvé latte šabloně.

Tak presne takto:

{? $_l->blocks['pagination'] = array_reverse($_l->blocks['pagination'])}

Asi to ode mne bude znít jako hloupá otázka, ale co je zač proměnná $_l?

No to je něco, co bylo ve starsi verzi a v nove to není… a snazim se to nahradit..
Nahodil jsem zatím jen novou verzi NETTE, ve které tato promena v sablone není.

Editoval MW (6. 11. 2014 9:36)