Mesour DataGrid v3 – DataGrid ne jenom pro Nette
- mesour
- Nette Blogger | 236
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
- Vlastně úplně všechno, ale ± API zůstalo
- Závislý pouze na PHP 5.5+
- Pro Nette je možné stáhnout bridge, o kterých píši níže
- 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/
- Metody začínající enable jako například DataGrid::enablePager, DataGrid::enableFilter apod. vracejí vždy instanci daného rozšíření.
- Přibylo více interfaců pro sloupce a implementace vlastního sloupce je nyní hračka
- Snížení velikosti Javascriptů z 230kb na necelých 60kb
- Javascripty pro grid je možné načítat kdekoliv ve stránce nezávisle na renderování gridu
- Přibyla možnost mít inline filter
- U subitemů lze bez problému přidat další grid s veškerou funkcionalitou (dříve bylo omezeno)
- 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.
- Odkaz na Nette bridge a ukázku použití: http://components.mesour.com/…idges/nette/
- Mesour\Bridges\Nette\DataGridControl – http://apis.mesour.com/…Control.html
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
- Všechny možnosti zde: http://grid.mesour.com/…thorization/
Co se překládá?
- Veškeré textové vstupy, které se pak vypisují (nadpisy sloupců, text v buttonech, názvy statusů…)
- 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
- Množství rozšíření, které se pořád vylepšují
- Rozšiřitelnost a customizace
- 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
- Dokončit implementaci inline editace Chybí buttony pro remove, edit a add u ManyToMany a OneToMany
- Implementovat mesour/template pro sloupec template a TemplateSubItem
- 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ů:
- Dokumentace GRID: http://grid.mesour.com/
- Dokumentace Components: http://components.mesour.com/
- Nette bridge: http://components.mesour.com/…idges/nette/
- API: http://apis.mesour.com/…onets-3.0.1/
- GitHub: https://github.com/mesour?…
- Packagist: https://packagist.org/…ages/mesour/
Užívejte života :)
Editoval mesour (1. 5. 2016 12:51)
- Pavel Janda
- Člen | 977
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
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ýtNetteDbTableGridSource
.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)
- mesour
- Nette Blogger | 236
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).
- mesour
- Nette Blogger | 236
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
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
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
@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)