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 | 324
 
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" givenKdyž 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" givenKdyž 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 | 324
 
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 | 1034
 
Vyhazuje ti to skutečně tu výjimku, kterou máš v catch?
Popř. máš v souboru s catchem 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 scatchem 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 | 846
 
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 | 846
 
Já bych si dal ten persistentní $src do té komponenty, ne do presenteru. Tak mi to funguje…

- Kamil Valenta
 - Člen | 846
 
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 | 846
 
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í.