Nextras\Datagrid – datagrid se vsim jak ma byt
- MartinitCZ
- Člen | 580
@**hrach**: Nejde o nic složitého. Chci jen zdůraznit možnost
řazení tím, že jí ukážu i v případě neřezaní dle daného
sloupce.
Na #L35
hodit toto:
{else}
<span class="grid-sort-symbol"><em>▲</em><em>▼</em></span> // Ten znak by to chtělo lepší, ale neznám žádný takový
{/if}
- n.u.r.v.
- Člen | 485
hrach napsal(a):
@n.u.r.v.
- v kazdem blocku mas dostupny
$row
, coz je proste ten radek, co se renderuje- doporucuji jen pres css, alternativne si muzes prepsat block
row
, link- bud si tlacitka pridej ve svem editFormFactory (oni se nepridaji znovu, pokud uz existuji), nebo si prepis block
row-actions-edit
, link- to aktualne nejde, idealne asi by to chtelo PR, ktery zavede tady novy block.
Ok, díky… ještě mám jeden problém – potřebuji do editačního formuláře dát select. Tento select potřebuji naplnit, ale na metodu v prezenteru, která mi vrací pole pro select, se nedostanu -nevíte co s tím?
- n.u.r.v.
- Člen | 485
hrach napsal(a):
a kde ten editacni form (teda spis container vytvaris?). normalne v clousure muzes dat
$this->
, pridapdne v 5.3 presuse ($data)
Takto vytvářím grid s formulářem pro editaci:
public function createComponentGrid() {
$grid = new \Nextras\Datagrid\Datagrid;
$grid->addColumn("SURNAME", "Příjmení")->enableSort();
$grid->addColumn("NAME", "Jméno")->enableSort();
$grid->addColumn("GROUPMNAME", "Skupina");
$grid->setEditFormFactory(function($row) {
$form = new Nette\Forms\Container;
$form->addText('SURNAME')
->setAttribute('autofocus', 'autofocus')
->setAttribute('class', 'form-control form-required')
->setAttribute('style', 'margin-bottom: 0px;height:25px; padding: 0px;');
$form->addText('NAME')
->setAttribute('autofocus', 'autofocus')
->setAttribute('class', 'form-control form-required')
->setAttribute('style', 'margin-bottom: 0px;height:25px; padding: 0px;');
$form->addSelect('GROUPID', null, $this->fillSelect());
$form->addHidden('HASH');
$form->addSubmit("save", "Uložit")
->setAttribute('class', 'btn btn-snd')
->setAttribute('style', 'height:25px;');
!$row ? : $form->setDefaults($row);
return $form;
});
$grid->setRowPrimaryKey('ID');
$grid->setDataSourceCallback($this->getDataSource);
$grid->setEditFormCallback($this->saveData);
$grid->setDefaultLatte(__DIR__ . '/../templates/Students2/Datagrid.latte');
$grid->setDefaultText('<td colspan="5" style="color:#323232; font-style:italic; line-height:30px;">Nezvolili jste třídu nebo nejsou přiřazeni žádní žáci ke třídě.</td>');
$grid->addCellsTemplate(__DIR__ . '/../templates/Students2/@cells.latte');
return $grid;
}
metoda fillSelect()), která vrací pole pro select je v presenteru, jako je továrna pro grid.
Jenže dostávám chybu: Fatal Error
Using $this when not in object context
- n.u.r.v.
- Člen | 485
hrach napsal(a):
Nauc se php ;) v 5.4 by ti to uz fungovalo.
$presenter = $this; $grid->setEditFormFactory(function($row) use ($presenter) {
jsem to ale píp…Ještě ale musím přijít na to, jak udělat následující:
tabulka má sloupce: NAME, SURNAME, GROUPNAME,… ->tyto tři se mohou editovat, select je GROUPNAME.
Jenže když plním select hodnotami, tak mu předám pole ve tvaru ID=>GROUPNAME : array(„1234“=>„xxx“, „5678“=>„yyy“…);, což je problém, protože při generování formuláře to nesedí – je očekáváno, že to co je vypsáno v tabulce, bude v poli jako index a ne hodnota…, tedy dostanu toto:
Value ‚xxx‘ is out of range of current items.
- Re4DeR
- Člen | 71
Ahoj, mám aplikaci která je komplet za prihlasenim.
a ted jsem narazil na problém s ajaxem – razeni gridu funguje normalne, ale
editace ne – pri kliku na „Edit“ se nic nestane. pri vypnutem ajaxu je
editace v klidu.
javascriptova konzole pise ze „Failed to load resource: the server responded
with a status of 500 (Internal Server Error)“ – jasne, url co to chce je
pro neprihlaseneho opravdu nedosupna. ale jak je mozné ze filtrovani funguje?
je nějaké řešení?
- n.u.r.v.
- Člen | 485
Hmm, ještě tu mám jeden problém – mám několik datagridů a všechny mají základ stejný, ale v jednom mi nefunguje u editace tlačítko cancel – nastane chyba 500 a v logu je toto:
Exception
Row not found
File: ...\vendor\others\Nextras\Datagrid\Datagrid.php:283
273: if ($key === NULL) {
274: return $this->data;
275: }
276:
277: foreach ($this->data as $row) {
278: if ($this->getter($row, $this->rowPrimaryKey) == $key) {
279: return $row;
280: }
281: }
282:
283: throw new \Exception('Row not found');
284: }
285:
286: /**
287: * @internal
Nevíte co to může být? Díky
- n.u.r.v.
- Člen | 485
hrach napsal(a):
no tak posli jak mas nakonfigurovany ten jeden.
Presenter:
...
...
public function createComponentGrid() {
$presenter = $this;
$grid = new \Nextras\Datagrid\Datagrid;
$grid->addColumn("SURNAME", "Příjmení")->enableSort();
$grid->addColumn("NAME", "Jméno")->enableSort();
$grid->addColumn("GROUPNAME", "Skupina");
$grid->addColumn("RELATION_NUMBER", "Počet relací")->enableSort();
$grid->setEditFormFactory(function($row) use ($presenter) {
$form = new Nette\Forms\Container;
$form->addText('SURNAME')
->addRule(Form::MAX_LENGTH, 'Maximální délka příjmení je %d znaků.', $presenter->context->parameters['userMaxLengthSurName'])
->setAttribute('autofocus', 'autofocus')
->setRequired("Vyplňte jméno a příjmení uživatele.")
->setAttribute('class', 'form-control form-required')
->setAttribute('placeholder', 'Příjmení uživatele')
->setAttribute('style', 'margin-bottom: 0px;height:25px; padding: 0px;');
$form->addText('NAME')
->addRule(Form::MAX_LENGTH, 'Maximální délka jména je %d znaků.', $presenter->context->parameters['userMaxLengthName'])
->setAttribute('autofocus', 'autofocus')
->setRequired("Vyplňte jméno a příjmení uživatele.")
->setAttribute('class', 'form-control form-required')
->setAttribute('placeholder', 'Jméno uživatele')
->setAttribute('style', 'margin-bottom: 0px;height:25px; padding: 0px;');
$form->addHidden('HASH');
$form->addHidden('GROUP_ID');
$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/Users2/Datagrid.latte');
$grid->setDefaultText('<td colspan="5" style="color:#323232; font-style:italic; line-height:30px;">Nezvolili jste skupinu nebo nejsou přiřazeni žádní uživatelé ke skupině.</td>');
$grid->addCellsTemplate(__DIR__ . '/../templates/Users2/@cells.latte');
return $grid;
}
public function saveData(Nette\Forms\Container $form) {
$values = $form->getValues();
...
...
}
public function getDataSource($filter, $order, Paginator $paginator = NULL) {
$selection = $this->prepareDataSource($filter, $order);
/* if ($paginator) {
$selection->limit($paginator->getItemsPerPage(), $paginator->getOffset());
} */
return $selection;
}
private function prepareDataSource($filter, $order) {
$filters = array();
foreach ($filter as $k => $v) {
if ($k === 'ID' || is_array($v))
$filters[$k] = $v;
else
$filters[$k . ' LIKE ?'] = "%$v%";
}
if ($order and is_array($order)) {
$selection = $this->userRepository->getUsersList2($this->user->getIdentity()->firmId, $this->groupID, $order);
} else {
$selection = $this->userRepository->getUsersList2($this->user->getIdentity()->firmId, $this->groupID);
}
return $selection;
}
Model:
public function getUsersList2($firmId, $groupId, $order=null) {//METODA PRO NACTENI SEZNAMU USERU VYBRANE SKUPINY
$orderComplete = '';
if(is_array($order) and count($order)==2){
if($order[0]=='RELATION_NUMBER'){
$orderComplete = ' ORDER BY '.$order[0].' '.$order[1];
}else{
$orderComplete = ' ORDER BY u.'.$order[0].' '.$order[1];
}
}
return $this->database->getConnection()->query('SELECT u.ID, u.NAME, u.SURNAME, u.HASH, u.GROUP_ID,g.NAME AS GROUPNAME,
(SELECT count(ID) FROM relation WHERE relation.USER_ID = u.ID) AS RELATION_NUMBER
FROM user AS u, group AS g
WHERE g.ID = u.GROUP_ID and u.FIRM_ID = ' . intval($firmId) . ' AND u.GROUP_ID = ' . intval($groupId) . ' AND u.DATE_DELETE IS NULL and u.USER_TYPE = "S"'.$orderComplete)->fetchAll();
}
public function saveData(Nette\Forms\Container $form) {
$values = $form->getValues();
..
..
}
Editoval n.u.r.v. (16. 1. 2014 9:09)
- Re4DeR
- Člen | 71
razeni podle data nefunguje bych rekl – i v demu to zlobi http://nextras.cz/datagrid/full
- mrtnzlml
- Člen | 140
Ahoj, jak se v tomto gridu elegantně řeší takové to, když z je selectbox z databáze a potřebujete ho ve sloupečku vypsat např. v češtině?
<?php
$form->addSelect('status', NULL, array(
'new' => 'nové',
'complete' => 'vyřízené',
));
?>
Takto je to v selectboxu v záhlaví, ale jak to hezky pořešit i v šabloně?
- n.u.r.v.
- Člen | 485
Ahoj, konečně jsem na chybu přišel:
v metodě prepareDataSource jsem načítal data do gridu takto (zkráceně…):
$selection = $this->firmRepository->getUserList($this->user->getIdentity()->firmId, $this->groupID);
A problém byl v té prom. $this->groupID… Tato proměnná se plní v render metodě (je to param v url adrese). Jenže při cancel se proměnná neplní, takže proto vznikl ten problém…
Dal jsem to tedy do session (jiné řešení mě zatím nenapadá)
- Honza_S
- Člen | 12
Ahoj, dostal jsem se ve svém použití DataGridu do mrtvého bodu, kdy
chápu, že mám někde chybu, ale nejsem schopen ji odstranit. Datagrid fuguje
skvěle až do okamžiku kdy ve filtru použiju addon DateInput pak se
processForm filtru zastaví na tom, že obdrží objekt DateTime.
Mám se zaměřit na tuto část DataGrid.php
<?php
$values = array_filter($values, function($val) {
return is_array($val) ? (count($val) > 0) : (strlen($val) > 0);
});
?>
nebo jsem úplně mimo a dá se to řešit jednodušeji?
- Honza_S
- Člen | 12
Laděnka vypíše na Datagrid.php:464
<?php
Warning
strlen() expects parameter 1 to be string, object given
public function processForm(UI\Form $form){
...
$values = $form['filter']->getValues(TRUE);
unset($values['filter']);
463: $values = array_filter($values, function($val) {
464: return is_array($val) ? (count($val) > 0) : (strlen($val) > 0);
...
?>
$val je v tuhle chvíli objekt Nette\DateTime a tudíž je strlen($val) chybové.
- Honza_S
- Člen | 12
Tak jsem trochu pokročil, ale je to „na prasáka“ – vložením do DataGrid.php:463
<?php
...
foreach ($values as $key => $value) {
if (is_object($value)){
$values[$key]=$value->format("Y-m-d");
}
}
...
?>
to mi funguje, ale v tomhle mám nějakou blbost
<?php
if ($value instanceof \Nette\DateTime){
...
?>
- voda
- Člen | 561
Úpravy
datagridu už nejsou potřeba. Jinak DateInput nevrací
\Nette\DateTime
ale DateTime
.
- tomhrb
- Člen | 23
mohu poprosit o nejaky better practice v obsluze valstniho signalu
z DataGrid?
zatim jsem kyzeneho vysledku dosahl pouze touto konstrukci
class CustomDatagrid extends Datagrid {
function handleMarkPresence($id, $present=0) {
//obsluha
}
}
a komponentu tedy pak
public function createComponentGrid(){
$grid = new CustomDatagrid;
…ale slovy herce Polaska – citim z toho takove to pi#o :D
diky
Editoval tomhrb (23. 2. 2014 16:26)
- tomhrb
- Člen | 23
MW napsal(a):
Zdravím,
nemá prosím někdo nějaké řešení, jak na gridu zafixovat záhlaví?
Při posunu dolu, aby zůstalo viditelné ?Díky!
v tomto duchu http://fixedheadertable.com/ ? osobne nemam :D
- ali
- Člen | 342
Zkousel nekdo zprovoznit paginator na dibi? Nejak se mi to nedari zprovoznit
(spis moc nevim jak), zkousel jsem to udelat jak uz bylo popsano v tomto
vlaknu, ale bezuspechu.. nejake rady?
komponenta
protected function createComponentGrid()
{
$grid = new \Nextras\Datagrid\Datagrid;
$grid->addColumn("order_id","#")->enableSort();
$grid->addColumn("order","Order")->enableSort();
$grid->addColumn("order_qty","Qty")->enableSort();
$grid->addColumn("dept_code","Dept. code")->enableSort();
$grid->addColumn("order_login","User")->enableSort();
$grid->addColumn("order_time","Order time")->enableSort();
$grid->setFilterFormFactory(function(){
$form = new Nette\Forms\Container;
$form->addText("order");
$form->addText("dept_code");
$form->addText("order_login");
$form->addSubmit("filter","Filter data")->getControlPrototype()->class = 'btn btn-primary';
$form->addSubmit("cancel","Cancel filter")->getControlPrototype()->class = 'btn';
return $form;
});
$grid->setDatasourceCallback(
function($filter,$order)
{
$dataSource = $this->warehouseModel->dataSource();
// nastaveni WHERE pro data
forEach($filter as $key => $value)
{
$dataSource->where("[$key] LIKE %s","%$value%");
}
// nastaveni razeni
if($order!=null)
{
$dataSource->orderBy($order[0],$order[1]);
}
else
{
$dataSource->orderBy("order_id","DESC");
}
return $dataSource;
}
);
return $grid;
}
model
public function dataSource()
{
return $this->db->dataSource("SELECT *,(SELECT [login] FROM %n WHERE %n.[user_id]=%n.[user_id]) AS [order_login] FROM %n",self::TABLE_USERS,self::TABLE_PEGA_WAREHOUSE,self::TABLE_USERS,self::TABLE_PEGA_WAREHOUSE);
}
Editoval ali (7. 3. 2014 20:03)
- ali
- Člen | 342
Tak jsem narazil na dalsi problem a to ze mi nefunguje uprava radku, ajax pozadavek se provede, ale nenajede formular na upravu a v konzoli se mi vypise error v jQuery
GET http://localhost/_a/www/pega/warehouse/?grid-primaryValue=970&do=grid-edit 500 (Internal Server Error) jquery.min.js:3
zkousel jsem i vice verzi jQuery, vcetne toho z dema, ale pokazde stejny problem
formular pro upravy vypada takto
$grid->setEditFormFactory
(
function($row)
{
$form = new Nette\Forms\Container;
$form->addText("order")
->setRequired();
$form->addText("order_qty")
->setRequired();
$form->addSubmit("save","Save data");
$form->addSubmit("cancel","Cancel editing");
!$row ?: $form->setDefaults($row);
return $form;
}
);
$grid->setEditFormCallback($this->saveData);
- ali
- Člen | 342
a.
[2014-03-10 10-16-08] Nette\InvalidArgumentException: Component with name 'edit' does not exist. in C:\wamp\www\_a\vendor\nette\nette\Nette\ComponentModel\Container.php:159 @ http://localhost/_a/www/pega/warehouse/?grid-primaryValue=980&do=grid-edit @@ exception-2014-03-10-10-16-07-1499d296160a2bf8576d0f8cf49db956.html
b. pro jistotu jsem si to jeste jednou stahnul z githubu, ale stejny problem
Editoval ali (10. 3. 2014 10:18)
- Budry
- Člen | 88
Zdravím,
mohl bych poprosit o radu jak správně upravovat defaulní layout?
Mám definováno
$datagrid->addCellsTemplate(__DIR__ . '/list.latte');
a v list.latte se snažím změnit table-open-tag
Toto spadne do chyby že makro redefine není
{redefine table-open-tag}
<table class="table table-bordered table-hover">
{/redefine}
Tento zápis to zase ignoruje a vykresluje pouze defaultní <table>
{define table-open-tag}
<table class="table table-bordered table-hover">
{/define}
Jak se tedy správně mění základní layout?
- MW
- Člen | 626
Zdravím,
kde prosím nejlépe nastavím výchozí řazení gridu?
pridal jsem si sice do modelu toto
public function prepareInvoicesDataSource($filter, $year, $order = NULL) {
.......
// default order
if (!$order) {
$order = array('since DESC');
}
........
if ($order[0])
$selection->order(implode(' ', $order));
return $selection;
}
ale to není asi správná cesta.
Třeba to nezobrazí order symbol v záhlaví, čehož bych chtěl
dosáhnout.
Předem děkuji za pomoc !!!
- ali
- Člen | 342
Mam takovy problem,
v tabulce mam user_id, ale zobrazuji misto user_id pres dalsi select
patricny login.. jenze pokazde pri editaci radku, kdy vse zkontroluji a
„unsetnu“ login a nahradim ho v poli patricnym user_id z jine tabulky, mi
to spadne na vyjimce throw new \Exception('Row not found');
Mam neco spatne, nebo jen nejde upravit zaznam, ktery se v gridu nezobrazuje?
ali napsal(a):
jo takhle, tady > http://uloz.to/…0bd5c09-html
Honzo koukal ses na tento problem? Porad mi to nefunguje a vubec nemam tuseni co stim je, ze upravovat to jde jen tehdy, pokud je nastaven nejaky filtr ??
- ali
- Člen | 342
ali napsal(a):
Mam takovy problem,
v tabulce mam user_id, ale zobrazuji misto user_id pres dalsi select patricny login.. jenze pokazde pri editaci radku, kdy vse zkontroluji a „unsetnu“ login a nahradim ho v poli patricnym user_id z jine tabulky, mi to spadne na vyjimce
throw new \Exception('Row not found');
Mam neco spatne, nebo jen nejde upravit zaznam, ktery se v gridu nezobrazuje?
takze jsem zjistil cim to je:
- mam sloupec „code“ a v nem hodnotu „AAA“
- nastavim si filtr pro sloupec „code“ a nastavim ho na „AAA“
- upravim jakykoliv vyfiltrovany zaznam a ve sloupci „code“ misto „AAA“ napisi „BBB“
- zaznam se upravi, ale nezmizne moznost jeho editace a aplikace spadne na vyjimce „Row not found“
Bug nebo muj problem v aplikaci?
Editoval ali (18. 3. 2014 22:04)
- H0w4rd
- Člen | 96
Moc dekuji za tento datagrid, je fakt moc skvely! Udelal jsem s nim vse, co jsem potreboval a to reseni pres callbacky a definici custom obsahu bunek v .latte super reseni.
Jedna drobna vec – musel jsem opravit lokalizaci ‚Filter‘ a ‚Cancel‘ jednoduse:
$form['filter']->addSubmit('filter', $this->translate('Filter'));
$form['filter']->addSubmit('cancel', $this->translate('Cancel'));
- thorewi
- Člen | 84
Mam stejny problem, jako mel ali – pokud nemam aktivni libovolny filtr (tzn aktivne nefiltruju nejaky sloupec), nefunguje mi radkova editace (uplne stejna chyba jak u aliho – Component with name ‚edit‘ does not exist.).
EDIT:
Problem vidim v line 313–315:
if (!$this->filterDataSource && $this->filterFormFactory) {
$this->filterDataSource = $this->filterFormFilter($this['form']['filter']->getValues(TRUE));
}
nebot timto se zavola createComponentForm drive nez handleEdit nastavi $this->editRowKey a tim padem se nasledujici podminka nesplni (line 409):
if ($this->editFormFactory && ($this->editRowKey || !empty($_POST['edit']))) {
Editoval thorewi (22. 4. 2014 1:30)