ublaboo/datagrid: mocný, rychlý, rozšiřitelný, hezký, anglicky dokumentovaný datagrid

Petr Steinbauer
Člen | 26
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

@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
+
0
-

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();
}
galab
Backer | 74
+
+1
-

@black72

$grid->addColumnText('photo', 'FOTO', 'dlu_id')
    ->setRenderer(function ($row) {
        $count = $row->related('photo', 'dlu_id')->count();
        return $count > 0 ? 'Ano ('.$count.')' : 'Ne';
    });

Editoval galab (24. 1. 2021 14:25)

black72
Člen | 5
+
+1
-

Díky. Tušil jsem, že to půjde, jen to ještě neumím všechno dohledat.

Karlito
Člen | 18
+
0
-

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

Editoval Karlito (26. 1. 2021 7:12)

jAkErCZ
Člen | 322
+
0
-

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
+
0
-

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
+
0
-

@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
+
0
-

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_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 :)

Š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
+
+1
-

@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
+
+2
-

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
+
0
-

Ahoj, dokaze mi nekdo poradit potrebuji editovat jeden sloupec po kliknuti se mi zobrazi input tak jak ma.
Chtel bych se zeptat zdali jde udelat, aby input byl zobrazeny stale bez kliknuti na danou bunku.

Vsem dekuji za rady..

galab
Backer | 74
+
0
-

@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.

Editoval galab (16. 2. 2021 22:25)

turbo80
Člen | 50
+
0
-

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)

galab
Backer | 74
+
0
-

@turbo80 Mrkni do mailu. Pak sem postneme funkční řešení, pokud by někdo potřeboval něco podobného

turbo80
Člen | 50
+
0
-

galab napsal(a):

@turbo80 Mrkni do mailu. Pak sem postneme funkční řešení, pokud by někdo potřeboval něco podobného

@galab
Super email od tebe prisel.
Urcite to sem pak dame tomu se vubec nepranim.

MW
Člen | 626
+
0
-

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)

David Grudl
Nette Core | 8218
+
+2
-

ublaboo/datagrid: ^6.6 mi funguje s nette 3.1 v pohodě.

MW
Člen | 626
+
0
-

David Grudl napsal(a):

ublaboo/datagrid: ^6.6 mi funguje s nette 3.1 v pohodě.

Díky Davide, vyzkouším.

jAkErCZ
Člen | 322
+
0
-

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
+
0
-

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

David Grudl
Nette Core | 8218
+
+2
-

Tak tam asi spíš nechte nette/forms 3.0

David Grudl
Nette Core | 8218
+
0
-

Btw, projeví se to i s nette/forms 3.1-dev?

IJVo
Člen | 38
+
0
-

David Grudl napsal(a):

Btw, projeví se to i s nette/forms 3.1-dev?

@DavidGrudl ano chyba se projeví i s nette/forms 3.1-dev.

MW
Člen | 626
+
+1
-

David Grudl napsal(a):

Btw, projeví se to i s nette/forms 3.1-dev?

3.0.7 je OK.

MW
Člen | 626
+
0
-

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 | 1029
+
+1
-

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
+
0
-

jiri.pudil napsal(a):

Vyhazuje ti to skutečně tu výjimku, kterou máš v catch? Popř. máš v souboru s catchem 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)

radas
Člen | 224
+
0
-

Ahoj, nikde jsem to nenašel, ale pro jistotu se zeptám, dá se DataGrid nakonfigurovat tak, aby nezobrazoval žádné záznamy, pokud není nastaven alespoň jeden filtr? Díky.

Pavel Janda
Člen | 977
+
0
-

@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)

radas
Člen | 224
+
0
-

@PavelJanda Super, funguje to, díky moc.

lubos
Člen | 22
+
0
-

Lze nějakým způsobem použít vlastní latte filter v šabloně rozšíření sloupce ?
Aneb v basepresenteru addFilter a v default_datagrid.latte pokus použít v {define col-neco} ?

Pavel Janda
Člen | 977
+
0
-

@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
+
+3
-

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.

David Grudl
Nette Core | 8218
+
+1
-

Juchů!

Sami_
Člen | 15
+
0
-

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
+
0
-

$src je persistentní?

Sami_
Člen | 15
+
0
-

@KamilValenta ať už ho anotuju jako persistent nebo ne, chová se to stejně

Kamil Valenta
Člen | 815
+
0
-

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
+
0
-

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
+
0
-

Já bych si dal ten persistentní $src do té komponenty, ne do presenteru. Tak mi to funguje…

Sami_
Člen | 15
+
0
-

Kamil Valenta napsal(a):

Já bych si dal ten persistentní $src do té komponenty, ne do presenteru. Tak mi to funguje…

Jsem asi natvrdlý – jak to myslíš?
V presenteru vytvářím Ublaboo/Datagrid přes createComponentMyGrid. Jak ho vložím do komponenty?

Kamil Valenta
Člen | 815
+
0
-
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
+
0
-

@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
+
0
-

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
+
0
-

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
+
+1
-

Tak to možná zkuste uložit do session, to by mělo být celkem rychlé/snadné řešení.