Mesour DataGrid v3 – DataGrid ne jenom pro Nette

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
mesour
Nette Blogger | 236
+
+5
-

Po delší odmlce jsem se konečně dostal k vydání verze Mesour DataGridu 3.0@beta. A tak jsem sepsal pár základních změn a novinek :)

Demo

http://grid.mesour.com/version3/demo/

Co se změnilo od verze 2

  1. Vlastně úplně všechno, ale ± API zůstalo
  2. Závislý pouze na PHP 5.5+
  3. Pro Nette je možné stáhnout bridge, o kterých píši níže
  4. Balíček má v sobě interface IExtension pro možnost úpravy současného nebo vytvoření vlastního rozšíření pro DataGrid: http://grid.mesour.com/…/extensions/
  5. Metody začínající enable jako například DataGrid::enablePager, DataGrid::enableFilter apod. vracejí vždy instanci daného rozšíření.
  6. Přibylo více interfaců pro sloupce a implementace vlastního sloupce je nyní hračka
  7. Snížení velikosti Javascriptů z 230kb na necelých 60kb
  8. Javascripty pro grid je možné načítat kdekoliv ve stránce nezávisle na renderování gridu
  9. Přibyla možnost mít inline filter
  10. U subitemů lze bez problému přidat další grid s veškerou funkcionalitou (dříve bylo omezeno)
  11. Přibyla nová možnost renderování všech součástí zvlášť: http://grid.mesour.com/…3/rendering/#…

Nette bridge

V Nette rádi vytváříme komponenty přes továrničky, k tomuto účelu je tu DataGridControl.

Sandbox

Pro Nette project:

composer create-project mesour/nette-sandbox -s beta

V nadpisu píši „DataGrid ne jenom pro Nette“: DataGrid totiž rozjedete samostatně na čistém PHP 5.5 s ext-json rozšířením, ostatně zde je sandbox pouze pro čisté PHP :)

composer create-project mesour/datagrid-sandbox -s beta

Ještě nějaké novinky

Do gridu přibylo dost malých drobností, kterých si třeba ani na první pohled nevšimnete, ale jsou tam :)

  • Pokud je zapnutý export a row selection, pak je možné exportovat pouze zaškrtnuté řádky
  • Pokud se použije sloupec status a row selection, pak u main checkboxu nahoře v levo v dropdownu přibude možnost vybrat třeba pouze aktivní
  • A mnoho dalších takových drobností, napíši pak někdy zvlášť ;-)
  • Testované pro PHP 5.6 a 7

Translator

  • Od minulé verze byly odstraněny soubory s překlady, všechno jde nyní přes Mesour\Components\Localization\ITranslator.
  • Pokud používáte na překlady klíče, pak lze využít tohoto GridTranslator: http://grid.mesour.com/…n3/localize/#…. Na této stránce jsou také dole všechny překlady gridu

Autorizace

Co se překládá?

  1. Veškeré textové vstupy, které se pak vypisují (nadpisy sloupců, text v buttonech, názvy statusů…)
  2. Některé HTML atributy jako např: (title, placeholder…) Je možné nastavit při přidání atributu, zda bude či nebude přeložený

Data sourcy

  • Přibyl data source pro Doctrine 2
  • Co se týká nemotorné metody setRelated, byla odstraněna a vznikl DataStructure, který už pokrývá celou strukturu se všemi relacemi

Proč použít

  1. Množství rozšíření, které se pořád vylepšují
  2. Rozšiřitelnost a customizace
  3. Rozpad na Mesour Components http://components.mesour.com/ dal možnost vytvořit v podstatě celou administraci na základě komponent

Komponent bude do budoucna přibývat a už teď jsou použitelné samostatně, některé mají i Javascriptové API

Ještě k renderování

Nyní je možné na DataGridu změnit snad úplně vše jak HTML tak attirbuty a to i na základě dat (data attributy s id, disabled button pro určitý řádek apod).

Vlastně plánuji napsat o tomhle nějaký článek, kde bude možné se dočíst jak na to :)

Aktuální plány

  1. Dokončit implementaci inline editace Chybí buttony pro remove, edit a add u ManyToMany a OneToMany
  2. Implementovat mesour/template pro sloupec template a TemplateSubItem
  3. Upgradovat filtr, nejspíš přibude varianta simple/advanced (možná s možností přepnutí přímo na frontu)

InlineEdit

Inline edit je zvlášť použitelná komponenta

Info zde: https://forum.nette.org/…odalnim-okne

Permissions

Je implementované rozhraní IAutorizator s metodou isAllowed, jak jsme zvyklí z Nette. Všechny komponenty, kde to má smysl mají setPermission. DataGridu lze skrýt sloupce, extensiony a také akce

Zde dokumentace: http://grid.mesour.com/…thorization/

Testy

Vše se testuje pro PHP 5.6 a 7. Ve stable komponentách byly doplněny zatím alespoň základní testy.

Závěrem

Pár odkazů:

Užívejte života :)

Editoval mesour (1. 5. 2016 12:51)

Pavel Janda
Člen | 977
+
0
-

Datasource: For nette/database – ve skutečnosti nepoužívá Nette\Database, ale Nette\Database\Table. Stejně tak je nevhodné pojmenování Mesour\DataGrid\Sources\NetteDbGridSource, mělo by být NetteDbTableGridSource.

Lidé by pak mohli věřit, že dokážeš používat jako datasource i ResultSet, což je nesmysl.

Ale to píšu proto, že jsem hnidopich a všiml jsem si toho, klidně to ignoruj. :D

Editoval Pavel Janda (18. 3. 2016 10:51)

mesour
Nette Blogger | 236
+
0
-

Pavel Janda napsal(a):

Datasource: For nette/database – ve skutečnosti nepoužívá Nette\Database, ale Nette\Database\Table. Stejně tak je nevhodné pojmenování Mesour\DataGrid\Sources\NetteDbGridSource, mělo by být NetteDbTableGridSource.

Lidé by pak mohli věřit, že dokážeš používat jako datasource i ResultSet, což je nesmysl.

Ale to píšu proto, že jsem hnidopich a všiml jsem si toho, klidně to ignoruj. :D

Ahoj, určitě to neignoruji, jasně takovéhle věci se budou přejmenovávat :) V konstruktoru ale vyžaduje Nette\Database\Table\Selection, takže to každému snad zatím dojde.

Teď je nejdůležitější aby si to nějací lidé vyzkoušeli, já dodělal ještě nějaké drobnosti a mohla se vydat stable verze :)

Díky za upozornění :)

Editoval mesour (18. 3. 2016 13:43)

FJP
Člen | 124
+
0
-

Musim, říct, že stáhnout to je peklo :) … nebo nevim co dělám blbě.

Editoval FJP (29. 4. 2016 11:32)

mesour
Nette Blogger | 236
+
0
-

Ahoj, já vím, myslím že to vzniklo optionem prefer-stable :/ Poslední týden dávám většinu balíčků stable, chybí mi ještě implementovat do gridu pár drobností, ale asi to vydám zatím bez těch drobností. Tzn: zatím nepůjde inline editovat ManyToMany a OneToMany, jinak ostatní jede :)

Takže přes víkend se pokusím dát vše do pucu :-) Pak už bude pouze DataGrid a filter beta (filter budu upgradovat a možná bude mít simple/advanced variantu. A Array-manager bude ještě beta (dokud se tam nedodělají testy).

GEpic
Člen | 562
+
0
-

Jen rychlý dotaz. Mám například tabulku smlouvy, mám u ní ID klienta, jak udělám, abych místo ID klienta vypsal jméno a příjmení a z tohoto záznamu následně udělal odkaz do nového okna? :)

mesour
Nette Blogger | 236
+
0
-

FJP napsal(a):

Musim, říct, že stáhnout to je peklo :) … nebo nevim co dělám blbě.

Fixed :-)

mesour
Nette Blogger | 236
+
0
-

GEpic napsal(a):

Jen rychlý dotaz. Mám například tabulku smlouvy, mám u ní ID klienta, jak udělám, abych místo ID klienta vypsal jméno a příjmení a z tohoto záznamu následně udělal odkaz do nového okna? :)

1. Přes callback nebo sloupec template

<?php
$dataStructure = $source->getDataStructure();

// clients = skutečný název tabulky nastavený automaticky ze struktury DB
$dataStructure->renameColumn('clients', 'client');

$grid->addText('client_id', 'Client')
	->setCallback(
		function (\Mesour\DataGrid\Column\Text $column, $data) {
			$anchor = Html::el('a', [
				'href' => '/client/detail/' . $data['client']['id'],
				'target' => '_blank',
			]);
			$anchor->setText($data['client']['name'] . ' ' . $data['client']['surname']);
			return $anchor;
		}
	);
?>

2. Přes DataStructure

<?php
$dataStructure = $source->getDataStructure();

// clients = skutečný název tabulky nastavený automaticky ze struktury DB
$dataStructure->renameColumn('clients', 'client');

/** @var \Mesour\Sources\Structures\Columns\ManyToOneColumnStructure $clientStructureColumn */
$clientStructureColumn = $dataStructure->getColumn('client');
$clientStructureColumn->setPattern('<a href="/client/detail/{id}">{name} {surname}</a>');

$grid->addText('client', 'Client');
?>

Editoval mesour (1. 5. 2016 12:17)

Phalanx
Člen | 310
+
0
-

Mohl by mi prosím někdo pomoct se zprovozněním s Doctrine?

<?php
use Kdyby\Doctrine\EntityRepository;
use Mesour\DataGrid\Sources\DoctrineGridSource;


class Email_Template_Repository extends EntityRepository
{

	/**
	 * @param $filter
	 * @return DoctrineSource
	 */
	public function getDatagridSource($filter)
	{
		$metadata = $this->getClassMetadata();
		$qb = $this->getEntityManager()->createQueryBuilder();
		$qb->select('w')->from($this->getEntityName(), 'w');

		$source = new DoctrineGridSource(
			$this->getEntityName(),
			$metadata->getSingleIdentifierColumnName(),
			$qb
		);


		return $source;
	}

// a entita je navázaná správně na repository
 * @ORM\Entity(repositoryClass="\App\Repository\Email_Template_Repository")
 */
class EmailTemplate

?>

Ale hází mi to tuto chybu:
Mesour\Sources\InvalidStateException Entity App\Entity\EmailTemplate must have method toArray.

S Doctrine (a Kdyby/Doctrine) se teprve seznamuju.

mesour
Nette Blogger | 236
+
0
-

Phalanx napsal(a):

Mohl by mi prosím někdo pomoct se zprovozněním s Doctrine?

Ale hází mi to tuto chybu:
Mesour\Sources\InvalidStateException Entity App\Entity\EmailTemplate must have method toArray.

S Doctrine (a Kdyby/Doctrine) se teprve seznamuju.

Ahoj, tohle není věc Doctrine ani kdyby/doctrine. Jde o to, že grid k datům přistupuje jako pole, proto je třeba aby tvá entita App\Entity\EmailTemplate implementovala public metodu toArray, která bude vracet pole :-)

Phalanx
Člen | 310
+
0
-

@mesour Díky moc. Mohl bys být prosím konkrétnější?
Našel jsem něco tady – https://forum.nette.org/…tity-na-pole ale to je hodně složité

<?php
/*
 * @ORM\Entity(repositoryClass="\App\Repository\Email_Template_Repository")
 */
class EmailTemplate {
	public function toArray()
	{
		return array(
			'id' => $this->getId(),
			'name' => $this->getName(),
			'from_email' => $this->getFromEmail(),
			'to' => $this->getTo(),
			'subject' => $this->getSubject(),
			'added_when' => $this->getAddedWhen(),
		);
	}
}
?>

edit: přidal jsem to takhle, ale je to značně nepraktické psát do každé entity. Kdyby někdo věděl jak se to dá obejít, tak mi sem prosím napište. Děkuji

Editoval Phalanx (7. 3. 2017 17:35)