ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid
- Petr Steinbauer
- Člen | 26
Ivorius napsal(a):
Rád bych dostal resetovací tlačítko (odkaz) filtrace také nahoru nad výpis tabulky – někam k filtrovacím políčkům. Zkusil jsem tedy nasimulovat chování resetovacího tlačítka takto
$grid->addToolbarButton('dataGrid-resetFilter!', 'reset filtru') ->setRendererOnCondition( function () { return Html::el('span'); //nothing }, function () use ($grid) { return !$grid->isFilterActive(); }) ->setClass('ajax btn btn-danger btn-sm reset-filter');
Bohužel při odeslání filtračního formuláře se to nevykreslí, protože se neodesílá snippet kde by byl ten toolbar. Napadá někoho řešení jak dostat resetovací tlačítko nahoru?
Do archivu, třeba někomu pomůže…
PHP (baseGrid):
public function attached($presenter)
{
parent::attached($presenter);
$this->addToolbarButton('resetFilter')
->setRenderer(function () {
$classes = 'btn btn-xs btn-danger btn-secondary reset-filter ajax';
if (!$this->isFilterActive()) {
$classes .= ' hidden';
}
return Html::el('a')
->href($this->link('resetFilter!'))
->setAttribute('class', $classes)
->setText('Resetovat filtr');
});
$this->addToolbarButton('resetSort')
->setRenderer(function () {
if (!$this->isSortActive()) {
return null;
}
return Html::el('a')
->href($this->link('sort!', ['sort' => $this->default_sort]))
->setAttribute('class', 'btn btn-xs btn-danger btn-secondary ajax reset-sort')
->setText('Resetovat řazení');
});
}
JS:
$.nette.ext('datagrid.reset-filter-by-column', {
success: function (payload) {
var grid, href, i, key, len, ref;
if (!payload._datagrid_name) {
return;
}
grid = $('.datagrid-' + payload._datagrid_name);
grid.find('[data-datagrid-reset-filter-by-column]').addClass('hidden');
grid.find('thead .reset-filter').addClass('hidden');
if (payload.non_empty_filters && payload.non_empty_filters.length) {
ref = payload.non_empty_filters;
for (i = 0, len = ref.length; i < len; i++) {
key = ref[i];
grid.find('[data-datagrid-reset-filter-by-column=' + key + ']').removeClass('hidden');
grid.find('thead .reset-filter').removeClass('hidden');
}
href = grid.find('.reset-filter').attr('href');
return grid.find('[data-datagrid-reset-filter-by-column]').each(function () {
var new_href;
key = $(this).attr('data-datagrid-reset-filter-by-column');
new_href = href.replace('do=' + payload._datagrid_name + '-resetFilter', 'do=' + payload._datagrid_name + '-resetColumnFilter');
new_href += '&' + payload._datagrid_name + '-key=' + key;
return $(this).attr('href', new_href);
});
}
}
});
- jikki
- Člen | 73
Ivorius napsal(a):
Rád bych dostal resetovací tlačítko (odkaz) filtrace také nahoru nad výpis tabulky – někam k filtrovacím políčkům. Zkusil jsem tedy nasimulovat chování resetovacího tlačítka takto
$grid->addToolbarButton('dataGrid-resetFilter!', 'reset filtru') ->setRendererOnCondition( function () { return Html::el('span'); //nothing }, function () use ($grid) { return !$grid->isFilterActive(); }) ->setClass('ajax btn btn-danger btn-sm reset-filter');
Bohužel při odeslání filtračního formuláře se to nevykreslí, protože se neodesílá snippet kde by byl ten toolbar. Napadá někoho řešení jak dostat resetovací tlačítko nahoru?
@Ivorius Přidej si za to ještě tohle
$grid->onFiltersAssembled[] = function () use ($grid) {
if ($this->isAjax()) {
$grid->reload(['grid']);
//$grid->reloadTheWholeGrid();
}
};
- Ivorius
- Nette Blogger | 119
Díky za inspiraci, nakonec jsem tedy zvolil překreslení snippetu s tabulkou, protože snippet pro toolbar není (možná PR?).
Kdyby tedy někdo potřeboval, tak moje verze je
$grid->onAnchor[] = function() use ($grid) {
$grid->addToolbarButton($grid->getName() . '-resetFilter!', 'reset filtru')
->setRendererOnCondition(
function () {
return Html::el('span'); //nothing
},
function () use ($grid) {
return !$grid->isFilterActive();
})
->setClass('ajax btn btn-danger btn-sm reset-filter');
};
$grid->onFiltersAssembled[] = function () use ($grid) {
$grid->redrawControl('table');
};
- jikki
- Člen | 73
@Ivorius Koukám, že ani jedno z řešení není ideální. Protože dojde k překreslení celé tabulky, tedy i filtrů.. tzn. když píšeš do filtru hledaný text, tak se napíše 1–2 písmena a dojde k překreslení a kurzor zmizí. Což není moc ideální.
@PavelJanda Nešlo by připsat n:snippet=„toolbar“ do spanu s toolbar tlačítky? Zkoušel jsem to a funguje. Vyřešilo by náš problém :)
<span n:if="$toolbarButtons" n:snippet="toolbar">
{foreach $toolbarButtons as $toolbar_button}{$toolbar_button->renderButton()}{/foreach}
</span>
- black72
- Člen | 5
Ahoj všem. Jsem začátečník, takže možná stupidní dotaz. Potřebuji
v Gridu dotáhnou data z tabulky photo, takže jsem požil
:related_table.name:through_column_id.
Potřebuji ale ty data dále upravit přes Callback. Neumím se ale v Callbacku
dostat k těm datům z tabulky photo.
Relace je 1:N. Jde o fotky k případům. Nepotřebuji je všechny vypsat, ale
spíše spočítat počet, abzch měl fotky jsou a je jich X nebo fotky
nejsou.
Má to řešení?
Můj kod.
public function createComponentDluGrid(): \Ublaboo\DataGrid\DataGrid
{
$grid = new DataGrid();
$grid->addColumnText('id', 'id')->setSortable();
$grid->addColumnText('dlu_id', 'dlu_id')->setSortable();
$grid->addColumnText('partner_nazev', 'Klient')->setSortable()->setFilterText();
$grid->addColumnText('produkt', 'Produkt')->setSortable()->setFilterText();
$grid->addColumnText('photo', 'FOTO', ':photo.filename:dlu_id')->setTemplateEscaping(false);
$grid->addColumnCallback('photo', function ($column, $item) {
$column->setRenderer(function($item) {
return '?????'
});
});
return $grid;
}
DataSource nastavuji v render metode.
public function renderDefault() {
$this['dluGrid']->setDataSource($this->DluRepository->findActive();
}
- jAkErCZ
- Člen | 322
Karlito napsal(a):
Ahoj, lze nějak jednoduše přidat pořadí položek do filtrovaného exportu pro CSV ?
Rád bych měl položky vždy
#(pořadí) | název_jednoho_sloupce | název_dalšího_sloupce
Normálně si je vygeneruj metodou setColumns
Ukázka
$column_date = new ColumnText($grid, 'date', 'date', 'Datum');
$column_fenix_id = new ColumnText($grid, 'fenix_project_id', 'fenix_project_id', 'Číslo Projektu');
$date_format = 'projects_'.new DateTime('now'). '.csv';
$grid->addExportCsvFiltered('Exportovat do csv', $date_format, 'windows-1250')
->setTitle('Exportovat do csv')
->setColumns([
$column_date,
$column_fenix_id
]);
A pořadí si určíš sám jak chceš 😊
A já mám takový problém když se snažím exportovat data z gridu funkcí
$grid->addExportCsvFiltered('Exportovat do csv', $date_format, 'windows-1250')
->setTitle('Exportovat do csv')
->setColumns([
$column_date,
$column_fenix_id,
$column_production,
$column_customer,
$column_name,
$column_status,
$column_price,
$column_source
]);
Vrací mi to tuto chybu.
mb_convert_encoding(): Argument #2 ($to_encoding) must be a valid encoding, "windows-1250" given
Když tam kódování nevyplním tak se export provede dobře ale texty jsou ala rozsypaný čaj.
Díky za pomoc :)
Editoval jAkErCZ (29. 1. 2021 10:57)
- honzazach
- Člen | 4
Zdravím, bojuji s tím, že mi nefunguje skrývání sloupců (nebo zase nefunguje inlineadd). Netušíte čím by to mohlo být? Předpokládám, že problém je někde ve skriptech.. vzal jsem i skripty přímo z dokumentace, chyba je v požadavku na popper, ale ten se natahuje s bootstrapem a i když ho tam přidám extra, chyba je stejná.
Chyba:
Uncaught TypeError: Bootstrap's dropdowns require Popper.js (https://popper.js.org/)
show dropdown.js:164
toggle dropdown.js:137
_jQueryInterface dropdown.js:375
jQuery 2
_jQueryInterface dropdown.js:362
<anonymous> dropdown.js:528
jQuery 8
<anonymous> alert.js:160
<anonymous> bootstrap.js:9
<anonymous> bootstrap.js:10
dropdown.js:164:14
show dropdown.js:164
toggle dropdown.js:137
_jQueryInterface dropdown.js:375
jQuery 2
_jQueryInterface dropdown.js:362
<anonymous> dropdown.js:528
jQuery 8
<anonymous> alert.js:160
<anonymous> bootstrap.js:9
<anonymous> bootstrap.js:10
Šablona:
{block scripts}
<script src="https://cdn.jsdelivr.net/npm/happy-inputs@2.1.0/src/nomodule-es5-fallback.js"></script>
<script>
var happy = new Happy;
happy.init();
</script>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.4.1/dist/js/bootstrap.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap-datepicker@1.9.0/dist/js/bootstrap-datepicker.js"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery-ui-sortable@1.0.0/jquery-ui.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/nette.ajax.js@2.3.0/nette.ajax.js"></script>
<script src="https://cdn.jsdelivr.net/npm/ublaboo-datagrid@6.2.13/assets/datagrid.js"></script>
<script src="https://cdn.jsdelivr.net/npm/nette-forms@3.0.4/src/assets/netteForms.min.js"></script>
<!-- It is recommended to include this JS file with just a few bits. It refreshes URL on non ajax request -->
<script src="https://cdn.jsdelivr.net/npm/ublaboo-datagrid@6.2.13/assets/datagrid-instant-url-refresh.js"></script>
<!-- Use this little extension for ajax spinners -->
<script src="https://cdn.jsdelivr.net/npm/ublaboo-datagrid@6.2.13/assets/datagrid-spinners.js"></script>
<!-- Include bootstrap-select.js when using FilterMultiSelect (silviomoreto.github.io/bootstrap-select) -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap-select@1.13.15/dist/js/bootstrap-select.js"></script>
<!-- END DATAGRIDS-->
{/block}
Editováno:) Díky případně za pomoc
Editoval honzazach (30. 1. 2021 19:21)
- Pavel Janda
- Člen | 977
@jAkErCZ Dokázal bys, pls, udělat ukázku v sandboxu a nahrát někam na github? Mrknl bych se na to, díky. Na jaké platformě to jede? Pokud tam hodíš i Dockerfile/docker-compose, tak ideál 👍👍 Díky
- Karlito
- Člen | 18
jAkErCZ napsal(a):
Karlito napsal(a):
Ahoj, lze nějak jednoduše přidat pořadí položek do filtrovaného exportu pro CSV ?
Rád bych měl položky vždy
#(pořadí) | název_jednoho_sloupce | název_dalšího_sloupceNormálně si je vygeneruj metodou setColumns
Ukázka
$column_date = new ColumnText($grid, 'date', 'date', 'Datum'); $column_fenix_id = new ColumnText($grid, 'fenix_project_id', 'fenix_project_id', 'Číslo Projektu'); $date_format = 'projects_'.new DateTime('now'). '.csv'; $grid->addExportCsvFiltered('Exportovat do csv', $date_format, 'windows-1250') ->setTitle('Exportovat do csv') ->setColumns([ $column_date, $column_fenix_id ]);
A pořadí si určíš sám jak chceš 😊
A já mám takový problém když se snažím exportovat data z gridu funkcí
$grid->addExportCsvFiltered('Exportovat do csv', $date_format, 'windows-1250') ->setTitle('Exportovat do csv') ->setColumns([ $column_date, $column_fenix_id, $column_production, $column_customer, $column_name, $column_status, $column_price, $column_source ]);
Vrací mi to tuto chybu.
mb_convert_encoding(): Argument #2 ($to_encoding) must be a valid encoding, "windows-1250" given
Když tam kódování nevyplním tak se export provede dobře ale texty jsou ala rozsypaný čaj.
Díky za pomoc :)
Špatně jsme se pochopily, myslel jsem pořadí jako očíslované řádky. Asi jsem se špatně vyjádřil. Pokusím se to nastínit:
#číslo | název_jednoho_sloupce | název_dalšího_sloupce
________________________________________________________
1 | první záznam | nějaké info
2 | druhý záznam | nějaké info
3 | třetí záznam | nějaké info
4 | čtvrtý záznam | nějaké info
Potřeboval bych do toho sloupce přidat nějaký iterátor, který bude vypisovat čísla podle řádků a né podle obsahu, aby při filtraci nedocházelo k prohazování očíslování řádků.
Tedy si vyfiltruji například druhý a čtvrtý řádek a chtěl bych v exportu vidět nasledující
#číslo | název_jednoho_sloupce | název_dalšího_sloupce
________________________________________________________
1 | druhý záznam | nějaké info
2 | čtvrtý záznam | nějaké info
Co se týče tvého problému, narazil jsem na to taky a vyřešil jsem to né moc pěkně, ale funguje to tak.
$column_name = new ColumnText($grid, 'full_name', 'full_name', iconv('UTF-8', 'windows-1250','Celé jméno'));
$column_name->setRenderer(function(array $item) {
return iconv('UTF-8', 'windows-1250', $item['full_name']);
});
- Pavel Janda
- Člen | 977
@Karlito Pro to očíslování řádku zkus třeba toto:
$i = 1;
$grid->addColumnNumber('number', 'Number')
->setRenderer(function() use (&$i): int {
return $i++;
});
- Siki
- Člen | 9
jAkErCZ napsal(a):
A já mám takový problém když se snažím exportovat data z gridu funkcí
$grid->addExportCsvFiltered('Exportovat do csv', $date_format, 'windows-1250') ->setTitle('Exportovat do csv') ->setColumns([ $column_date, $column_fenix_id, $column_production, $column_customer, $column_name, $column_status, $column_price, $column_source ]);
Vrací mi to tuto chybu.
mb_convert_encoding(): Argument #2 ($to_encoding) must be a valid encoding, "windows-1250" given
Když tam kódování nevyplním tak se export provede dobře ale texty jsou ala rozsypaný čaj.
Díky za pomoc :)
Taky jsem měl stejný problém PHP 7.4.14 a Datagrid 6.6.1. Windows-1250 jsem nahradil ISO-8859–2:
$grid->addExportCsvFiltered('Export do CSV', 'export.csv', 'ISO-8859-2');
- turbo80
- Člen | 50
galab napsal(a):
@turbo80 Asi bych to řešil přes setRenderer, kde bych vrátil input a na JS onBlur bych navázal volání nějaké handle update metody. Bez použití datagridovského editu.
@galab
Super, ale vubec nevim jak na to? mohl by jsi me trosku nakopnout.
Moc dekuji
Editoval turbo80 (16. 2. 2021 22:26)
- MW
- Člen | 626
Zdravím,
chápu prosím správně, že zatím Ublaboo nepodporuje?
Problem 1
– ublaboo/datagrid[v6.7.0, …, v6.7.1] require nette/forms >=3.0.1
<3.1.0 → found nette/forms[v3.0.1, …, v3.0.7] but it conflicts with your
root composer.json require (^3.1).
– Root composer.json requires ublaboo/datagrid ^6.7 → satisfiable by
ublaboo/datagrid[v6.7.0, v6.7.1].
Díky moc
Editoval MW (22. 2. 2021 21:22)
- jAkErCZ
- Člen | 322
Narazil jsem na chybu.
grid mi začal při použití $grid->addInlineAdd() házet
tuto chybu
Warning
Undefined array key "perPage"
File: ...\vendor\ublaboo\datagrid\src\DataGrid.php:1509
1506: /**
1507: * Per page
1508: */
1509: $this->saveSessionData('_grid_perPage', $values['perPage']);
1510: $this->perPage = $values['perPage'];
public function createComponentTermsSingleGrid($name): DataGrid
{
$manager = $this->eventRepository;
$grid = new DataGrid($this, $name);
$reasons = $this->eventRepository->getReasonList($this->presenter->getParameter('id'));
$grid->setPrimaryKey('id');
$grid->setDataSource($reasons);
$grid->addColumnText('time', 'Time')
->setEditableCallback(function ($ID, $value) use ($manager, $grid) {
$manager->saveSingle($ID, 'time', $value);
$this->presenter->flashMessage('Time is update!', 'success');
$this->presenter->redrawControl('flashMessages');
})->setAlign('center');
$grid->addColumnText('days', 'Days')
->setEditableCallback(function ($ID, $value) use ($manager, $grid) {
$manager->saveSingle($ID, 'days', $value);
$this->presenter->flashMessage('Days is update!', 'success');
$this->presenter->redrawControl('flashMessages');
})->setAlign('center');
/**
* Edit Action
*/
$grid->addAction('delete', '', 'delete!')
->setIcon('trash')
->setTitle('Smazat')
->setClass('btn btn-xs btn-danger ajax')
->setConfirmation(
new CallbackConfirmation(
function($item) {
return 'Opravdu chcete smazat termín '. $item['id'] . '? Tento krok je nenávratný!';
}
));
$grid->addInlineAdd()->setPositionTop()
->onControlAdd[] = function(\Nette\Forms\Container $container) {
$container->addHidden('tour')->setDefaultValue($this->presenter->getParameter('id'));
$container->addText('time');
$container->addText('days');
};
$grid->getInlineAdd()->onSubmit[] = function(\Nette\Utils\ArrayHash $values): void {
$v = '';
foreach($values as $key => $value) {
$v .= "$key: $value, ";
}
$v = trim($v,', ');
$this->flashMessage("Record with values [$v] was added! (not really)", 'success');
$this->redrawControl('flashes');
};
return $grid;
}
Composer:
adamstipak/webpay-php 1.1.1 GP Webpay API Wrapper
braintree/braintreehttp 0.2.4
composer/package-versions-deprecated 1.11.99.1 Composer plugin that provides efficient querying for ins...
contributte/application v0.5.0 Extra contrib to nette/application
contributte/di v0.5.1 Extra contrib to nette/di
contributte/translation v0.8.3 Symfony/Translation integration for Nette Framework.
dibi/dibi v4.2.0 Dibi is Database Abstraction Library for PHP
doctrine/annotations 1.12.1 Docblock Annotations Parser
doctrine/cache 1.10.2 PHP Doctrine Cache library is a popular cache implementa...
doctrine/collections 1.6.7 PHP Doctrine Collections library that adds additional fu...
doctrine/common 3.1.1 PHP Doctrine Common project is a library that provides a...
doctrine/dbal 2.12.1 Powerful PHP database abstraction layer (DBAL) with many...
doctrine/event-manager 1.1.1 The Doctrine Event Manager is a simple PHP event system ...
doctrine/inflector 2.0.3 PHP Doctrine Inflector is a small library that can perfo...
doctrine/instantiator 1.4.0 A small, lightweight utility to instantiate objects in P...
doctrine/lexer 1.2.1 PHP Doctrine Lexer parser library that can be used in To...
doctrine/orm 2.8.2 Object-Relational-Mapper for PHP
doctrine/persistence 2.1.0 The Doctrine Persistence project is a set of shared inte...
froala/wysiwyg-editor-php-sdk 1.1.1 PHP SDK for Froala WYSIWYG Editor
gregwar/cache v1.0.12 A lightweight file-system cache system
gregwar/image v2.1.0 Image handling
heureka/inflection v3.0.3 Czech inflection library
jakercz/dependent-select-box v5.0.4 Dependent Select Box for Nette Framework.
latte/latte v2.10.3 ☕ Latte: the intuitive and fast template engine for th...
nette/application v3.1.2 🏆 Nette Application: a full-stack component-based MVC...
nette/bootstrap v3.1.1 🅱 Nette Bootstrap: the simple way to configure and b...
nette/caching v3.1.0 ⏱ Nette Caching: library with easy-to-use API and many...
nette/component-model v3.0.1 ⚛ Nette Component Model
nette/database v3.1.1 💾 Nette Database: layer with a familiar PDO-like API ...
nette/di v3.0.7 💎 Nette Dependency Injection Container: Flexible, com...
nette/finder v2.5.2 🔍 Nette Finder: find files and directories with an in...
nette/forms v3.1.2 📝 Nette Forms: generating, validating and processing ...
nette/http v3.1.1 🌐 Nette Http: abstraction for HTTP request, response ...
nette/mail v3.1.5 📧 Nette Mail: handy email creation and transfer libra...
nette/neon v3.2.1 🍸 Nette NEON: encodes and decodes NEON file format.
nette/php-generator v3.5.2 🐘 Nette PHP Generator: generates neat PHP code for yo...
nette/robot-loader v3.3.1 🍀 Nette RobotLoader: high performance and comfortable...
nette/routing v3.0.2 Nette Routing: two-ways URL conversion
nette/schema v1.2.0 📐 Nette Schema: validating data structures against a ...
nette/security v3.1.3 🔑 Nette Security: provides authentication, authorizat...
nette/tester v2.3.5 Nette Tester: enjoyable unit testing in PHP with code co...
nette/utils v3.2.1 🛠 Nette Utils: lightweight utilities for string & ar...
nettrine/annotations v0.7.0 Doctrine Annotations for Nette Framework
nettrine/cache v0.3.0 Doctrine Cache for Nette Framework
nettrine/dbal v0.7.0 Doctrine DBAL for Nette Framework
nettrine/orm v0.8.1 Doctrine ORM for Nette Framework
paypal/rest-api-sdk-php dev-2.0-beta c6b53be
psr/container 1.0.0 Common Container Interface (PHP FIG PSR-11)
spatie/schema-org 3.3.0 A fluent builder Schema.org types and ld+json generator
symfony/config v5.2.3 Helps you find, load, combine, autofill and validate con...
symfony/console v5.2.3 Eases the creation of beautiful and testable command lin...
symfony/deprecation-contracts v2.2.0 A generic function and convention to trigger deprecation...
symfony/filesystem v5.2.3 Provides basic utilities for the filesystem
symfony/polyfill-ctype v1.22.1 Symfony polyfill for ctype functions
symfony/polyfill-intl-grapheme v1.22.1 Symfony polyfill for intl's grapheme_* functions
symfony/polyfill-intl-normalizer v1.22.1 Symfony polyfill for intl's Normalizer class and related...
symfony/polyfill-mbstring v1.22.1 Symfony polyfill for the Mbstring extension
symfony/polyfill-php73 v1.22.1 Symfony polyfill backporting some PHP 7.3+ features to l...
symfony/polyfill-php80 v1.22.1 Symfony polyfill backporting some PHP 8.0+ features to l...
symfony/property-access v5.2.3 Provides functions to read and write from/to an object o...
symfony/property-info v5.2.3 Extracts information about PHP class' properties using m...
symfony/service-contracts v2.2.0 Generic abstractions related to writing services
symfony/string v5.2.3 Provides an object-oriented API to strings and deals wit...
symfony/translation v5.2.3 Provides tools to internationalize your application
symfony/translation-contracts v2.3.0 Generic abstractions related to translation
tracy/tracy v2.8.3 😎 Tracy: the addictive tool to ease debugging PHP co...
ublaboo/datagrid v6.6.1 DataGrid for Nette Framework: filtering, sorting, pagina...
uestla/recaptcha-control
Nevíte někdo čím to může být?
Editoval jAkErCZ (23. 2. 2021 19:13)
- MW
- Člen | 626
jAkErCZ napsal(a):
Narazil jsem na chybu.
Narazil jsem na to samé + další chyba, co David již řeší zde ":https://forum.nette.org/…ri-getvalues
- MW
- Člen | 626
Zdravím, prosím o radu, jak bych tady mohl vyhodit nějakou flashMessage?
$inlineAdd->onSubmit[] = function($values) {
try {
$this->userManager->add($values['username'], $values['email'], $values['password']);
} catch (Model\DuplicateNameException $e) {
// tady i když dám flasheMessage mě vyhodí výjimku Model
return;
}
$this->flashMessage('Záznam přidán!', 'success');
$this->redrawControl('flashes');
};
Vyhazuje mi to vyjímku z Modelu.
Díky moc
- jiri.pudil
- Nette Blogger | 1030
Vyhazuje ti to skutečně tu výjimku, kterou máš v catch
?
Popř. máš v souboru s catch
em správně její
namespace/use?
- MW
- Člen | 626
jiri.pudil napsal(a):
Vyhazuje ti to skutečně tu výjimku, kterou máš v
catch
? Popř. máš v souboru scatch
em správně její namespace/use?
Ano, jen bych ji chtěl podchytit a poslat do flashMessage .. je to v podstatě čistý Nette\Sandbox. Ta vyjimka(metoda) je v modelu prázdná. Spíše asi nevím, jak a kde to implemetovat, aby to nepadalo do laděnky :)
Editoval MW (26. 2. 2021 10:00)
- Pavel Janda
- Člen | 977
@radas Určitě toho půjde docílit. Například, můžeš si v eventu „onFiltersAssembled“ zkontrolovat, zda nějaké filtry existují a pokud ne, vytáhnout si data source („getDataSource“) a přidat do něj něco jako u Dibi „->where(1 = 0)“.
Editoval Pavel Janda (2. 3. 2021 9:21)
- Pavel Janda
- Člen | 977
@lubos Určitě, šablonu komponenty si vytáhneš normálně přes DataGrid::getTemplate(). Nad tím už můžeš dělat standardní kejkle s přidáváním filtrů, maker atd.
- Pavel Janda
- Člen | 977
Normálně sem nedávám info o releasech, ale nová verze 6.8.0 fixuje nějaké poslední bugy + podporuje nette/forms ^3.1.3.
- Sami_
- Člen | 15
Ahoj, chci AJAXově odeslat data a následně jimi naplnit Datagrid a reloadnout ho, avšak Datagridu se vykreslí pouze 1 strana se záznamy a po překliknutí strany všechny záznamy zmizí.
V createComponentGrid mám setDataSource($src)
, kde
$src
je proměnná v presenteru (na začátku prázdné pole).
Když potom v zavolaném handleFillWithData($data)
naplním
$src
daty a překreslím grid přes grid->reload()
,
Datagrid se opravdu vykreslí s daty na 1 stránce. Když stranu překliknu
nebo změním počet vypisovaných řádků, data zmizí a Datagrid je opět
prázdný.
Asi by fungovalo, kdybych data uložil do databáze, avšak já potřebuju, aby
je uživatel viděl předtím, než se uloží.
Napadá vás, co dělám špatně? Díky : )
Editoval Sami_ (8. 3. 2021 19:50)
- Kamil Valenta
- Člen | 815
Zkontroluj si všechna místa, kde na $src saháš. Je možné, že se hodnota pole persistencí přenese a ty si ho pak někde nezáměrně vynuluješ…
Editoval Kamil Valenta (8. 3. 2021 22:19)
- Sami_
- Člen | 15
Kamil Valenta napsal(a):
Zkontroluj si všechna místa, kde na $src saháš. Je možné, že se hodnota pole persistencí přenese a ty si ho pak někde nezáměrně vynuluješ…
Posílám minimalistický kód. Na $src opravdu nesahám
Presenter:
/** @persistent */
public $src = [];
private function myGrid($source)
{
$g = new DataGrid();
$g->setDataSource($source);
$g->addColumnDateTime('timeOpen', 'Čas otevření');
return $g;
}
protected function createComponentImportGrid(string $name): ?Nette\ComponentModel\IComponent
{
return $this->myGrid($this->src);
}
public function handleTest($data)
{
$this->src = $this->myService->getObjectsFromData($data); // vrátí array X objektů
$this['myGrid']->reload();
}
Latte (Blok ‚content‘ includuju v layoutu):
{block content}
{control importGrid}
{/block}
… a javascript na odeslání dat a přijetí odpovědi (Naja).
- Kamil Valenta
- Člen | 815
Já bych si dal ten persistentní $src do té komponenty, ne do presenteru. Tak mi to funguje…
- Kamil Valenta
- Člen | 815
class ImportGrid extends \Nette\Application\UI\Control {
/** @var $src @persistent */
public $src = [];
protected function createComponentGrid()
{
$grid = new DataGrid();
...
return $grid;
}
}
class ExamplePresenter extends \Nette\Application\UI\Presenter {
protected function createComponentDefaultImportGrid()
{
$obj = new ImportGrid();
...
return $obj;
}
}
Píšu z hlavy, takže to není copy-paste řešení. Ale takto mi to
funguje.
Nezohledňuju tady DI a továrničky, to si přizpůsob své struktuře.
Také názvy nemusí být ideální, neznám kontext, jen jsem chtěl
jednotlivé komponenty oddělit, aby bylo zřejmé co je kde…
Je to prostě komponenta v komponentě, přičemž ta vnější má persistentní parametr, ta vnitřní jej využívá.
- Sami_
- Člen | 15
@KamilValenta
Vážím si tvé pomoci, ale jsem stále bezradný. Souhlasí tento kód
s tvými myšlenkami?
Komponenta ImportGrid:
class ImportGrid extends \Nette\Application\UI\Control
{
/** @persistent */
public $src = [];
public function render(){
$this->template->setFile(__DIR__ . '/default.latte');
$this->template->render();
}
public function reloadAndSetData($data)
{
$this->src = $data;
$this['originalGrid']->reload();
}
protected function createComponentOriginalGrid()
{
$g = new \Ublaboo\DataGrid\DataGrid();
$g->setDataSource($this->src);
$g->addColumnDateTime('timeOpen', 'Čas otevření');
return $g;
}
}
Šablona komponenty:
{control originalGrid}
Presenter:
class MyPresenter extends BasePresenter
{
/** @inject */
public MyService $myService;
protected function createComponentImportGrid(string $name): ?Nette\ComponentModel\IComponent
{
return new ImportGrid();
}
public function handleTest($data)
{
$this['importGrid']->reloadAndSetData($this->myService->getObjectsFromData($data));
}
}
Mám 2 komponenty v sobě, $src
je persistent, ale jakmile
kliknu na další stránku gridu, $src
se nejspíš vyprázdní,
data zmizí.
EDIT: Zkoušel jsem dumpovat a když teda překliknu stránku v datagridu, spustí se znovu createComponentImportGrid funkce z Presenteru. Je toto očekávané chování? Jsem v tomto trochu neznalý, musím si doplnit vědomosti z dokumentace
Editoval Sami_ (9. 3. 2021 18:30)
- Kamil Valenta
- Člen | 815
Zdá se, že ano, ale v handleTest($data) musíš invalidovat vnější
ImportGrid.
Pokud by to nepomohlo, vyextrahoval bych to nějak z řešení,
které mám…
EDIT: ano, při ajaxovém požadavku (např. při stránkování) se celý request rozběhne od počátku.
Editoval Kamil Valenta (9. 3. 2021 18:34)
- Sami_
- Člen | 15
Kamil Valenta napsal(a):
Zdá se, že ano, ale v handleTest($data) musíš invalidovat vnější ImportGrid.
Pokud by to nepomohlo, vyextrahoval bych to nějak z řešení, které mám…EDIT: ano, při ajaxovém požadavku (např. při stránkování) se celý request rozběhne od počátku.
Zkusil jsem obalit vnější ImportGrid do snippetu a ten v handleTest invalidovat, nic se nezměnilo : (
- Pavel Janda
- Člen | 977
Tak to možná zkuste uložit do session, to by mělo být celkem rychlé/snadné řešení.