Nextras\Datagrid – datagrid se vsim jak ma byt
- Azathoth
- Člen | 495
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
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.
- Azathoth
- Člen | 495
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‘.
- hrach
- Člen | 1838
@Azathoth
setTranslator
https://github.com/…Datagrid.php#L228 neni dostatecne?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- 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';
}
- n.u.r.v.
- Člen | 485
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
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
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.
- n.u.r.v.
- Člen | 485
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
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)
- doly
- Člen | 4
hrach napsal(a):
registrujes makro tak, jak se to dela v nette 2.2., najdi si jak v 2.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.
- 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.
- 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
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 | 626
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
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
@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 | 1838
@ali trik je v pridani custom atributu pro ten link, javascript to pak osefuje. https://github.com/…tagrid.latte#L86
- ali
- Člen | 342
@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
- ali
- Člen | 342
@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)
- Petr Steinbauer
- Člen | 26
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 | 626
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říkladfa 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
@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?
- abc
- Člen | 92
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 | 626
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
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)
- Azathoth
- Člen | 495
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 | 626
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)