Gridito (falešný datagrid) – komponenta
- VaKvas
- Začátečník | 111
Jeste jsem narazil na jednu vec :
pridal jsem si do metody render() podminku pro vychozi razeni, ale rad bych, ale to pracovalo i s podbarvenim razeneho sloupce a znaky pro razeni.. lze to nejak jednoduse prosim?
if ($this->sortColumn && $this["columns"]->getComponent($this->sortColumn)->isSortable()) {
$this->model->setSorting($this->sortColumn, $this->sortType);
}
else {
$this->model->setSorting('name', 'desc');
}
- Kovik
- Člen | 10
Narazil jsem na požadavek výchozího řazení podobně jako VaKvas
výše…
Do column.php jsem si přidal metodu setDefaultSorting()
<?php
/**
* Set dafault sorting
* @param string asc, desc
* @return Column
*/
public function setDefaultSorting($sortType){
$grid = $this->getGrid();
if ($grid->sortColumn === null){
$grid->sortColumn = $this->getName();
$grid->sortType = $sortType;
}
return $this;
}
?>
Použití:
<?php
$grid->addColumn("order", "Pořadí")->setSortable(true)->setDefaultSorting("asc");
?>
Možná by něco podobného mohlo být přímo součástí Gridita :)
- VaKvas
- Začátečník | 111
Honza Marek napsal(a):
Editační formulář ve window buttonu mít jde, ale ten musí být definován klasicky v presenteru. Jinak se při odeslání nedá najít a proto neproběhne ta onSubmit akce.
<?php $presenter = $this; $grid->addToolbarWindowButton("create", "Přidat záznam")->setHandler(function () use ($presenter) { echo $presenter['addForm']; })->setIcon("ui-icon-newwin"); ?>
Nicméně bych to spíše nedoporučil. Pokud bude formulář obsahovat validaci, kterou nelze zkontrolovat javascriptem, při špatném odeslání se mi již formulář nezobrazí a přijdu o již vyplněná data.
Jen bych se zeptal, co se tedy doporucuje? Je lepsi odkazat na jinou sablonu
pres addButton ?
Ptam se mozna spatne, ale jen nevim, jak spravne poresit editaci..
Diky !
- JanBohac
- Člen | 5
Zdravím,
omlouvám se, jsem asi uplná lama, ale zkouším se rozjet Gridito a v addonech se teď nevím proč nezobrazujou source kody, když kliknu na jednotlivé příklady, takže prostě nevím, jak to implementovat do Nette, aby to v pohodě chodilo… Podle mě je chyba mezi židlí a stolem, ale nejspíš někde v namespace popř. v rozmístění jednotlivých komponent ze .zip balíčku co jsem sosnul do struktury složek… Ta je klasická:
app – controls, log, models, presenters, temp, templates, bootstrap, @layout
document_root – kde je index, js, css…
libs – dibi, Nette, mPDF, Gridito
V config.ini mám pak následující:
; services
service.Nette-Security-IAuthenticator = UsersModel
service.Nette-Loaders-RobotLoader.option.directory[] = %appDir%
service.Nette-Loaders-RobotLoader.option.directory[] = %libsDir%
service.Nette-Loaders-RobotLoader.option.directory[] = "%libsDir%/mPDF"
service.Nette-Loaders-RobotLoader.option.directory[] = "%libsDir%/Gridito"
service.Nette-Loaders-RobotLoader.run = TRUE
Do prezenteru jsem dodal tuto část:
<?php
protected function createComponentGrid($name)
{
$grid = new Grid($this, $name);
$db = dibi::connect(NEnvironment::getConfig('database'));
$grid->setModel(DibiFluentModel($db->select("*")->from("uzivatel")));
$grid->setItemsPerPage(10);
// columns
$grid->addColumn("id", "ID")->setSortable(true);
$grid->addColumn("username", "Uživatelské jméno")->setSortable(true);
$grid->addColumn("name", "Jméno")->setSortable(true);
$grid->addColumn("surname", "Surname")->setSortable(true);
}
?>
Vykreslení pak jen v template přes { control grid }
Omlouvám se za čas těch, kteří pomohou nebo alespoň odkážou někam jinam… Už jsem hledal tady na foru, Googlem i jsem projížděl nějaké zdrojáky na gidHubu a bez úspěchu. Díky za pomoc!
- bojovyletoun
- Člen | 667
funkční odkaz .
Ukazují se ti chybové hlášky? Tady bude chyba:
setModel(DibiFluentModel(...)
– má být new Dibi…
service.Nette-Loaders-RobotLoader.option.directory[] = "%libsDir%/Gridito"
, je zbytečné IMHO, protože %libsDir% se indexuje automaticky{control grid}
bez první mezery
- JanBohac
- Člen | 5
Díky za odkaz a za odpověď! Myslel jsem si, že je to ono (to rozložení), takže to jsem měl ok… zatím jsem zjistil, že jsem měl rozdílný kódování (utf-8), to už jsem také vyřešil… ten service, jsem vyhodil, ten control jasně, bez mezer u závorek, to jsem akorát blbě napsal…
Co se týče chyb, tak mi teď laděnka vyhazuje:
Parse Error
syntax error, unexpected T_STRING
<?php
2:
3: namespace Gridito;
4:
5: use NetteComponentModelContainer, NetteEnvironment, NetteUtilsPaginator;
6:
7: /**
8: * Grid
9: *
10: * @author Jan Marek
11: * @license MIT
12: */
.....
?>
A to na lajně 3 přímo v Grid.php, ale chápu, že to může mít zdroj uplně jinde, otázka je kde :-D… Proto jsem už v prvním postu usuzoval nad tím, že to bude mít co dočinění s namespace, popř. rozložením a komunikací mezi jednotlivými částmi Gridita… Díky za pomoc!
- JanBohac
- Člen | 5
iqtq napsal(a):
Nejedeš náhodou na PHP 5.2? Jestli ano, tak tam tuhle verzi Gridita bez úprav nezprovozníš, jelikož je to zjevně pro 5.3.
Ano, teď jsem to prověřil, já jedu pořád ve v. 5.2, ale myslel jsem, že na serveru, kde to bude běžet a testově běží je 5.3, tohle mě vůbec nenapadlo :-(… takže jaké úpravy je nutné udělat, jestli Tě s tím mohu otravovat? nebo jak z toho ven?
- iqtq
- Člen | 20
No, čistě teoreticky (nijak zvlášť jsem kód nestudoval) by mohlo
stačit zbavit se namespaces a use + v kódu odstranit lomítka (\\). Ovšem
pokud jsou tam někde anonymní funkce tak se to trochu komplikuje :)
Jestli ale na serveru kde to poběží je 5.3 a ty jedeš na 5.2 tak proč to
neděláš na 5.3 a Nette beta?
Editoval iqtq (14. 6. 2011 1:38)
- JanBohac
- Člen | 5
iqtq napsal(a):
No, čistě teoreticky (nijak zvlášť jsem kód nestudoval) by mohlo stačit zbavit se namespaces a use + v kódu odstranit lomítka (\\). Ovšem pokud jsou tam někde anonymní funkce tak se to trochu komplikuje :)
Jestli ale na serveru kde to poběží je 5.3 a ty jedeš na 5.2 tak proč to neděláš na 5.3 a Nette beta?
Původní přání zákazníka bylo to rozjet na 5.2, takže jsem celou aplikačku psal v tomto, ta je téměř hotové, ale nelíbí se výpis jen do normálních tabulek, tak jsem se snažil využít gridu, neuvědomil jsem si, že to jede pod 5.3 takže jsem to samozřejmě zvojtil a můžu výše uvedený komenty promazat, páč chyba byla u mě mezi žídlí a stolem :-X… Děkuji všem za pomoc a musím to hold nějak doformátovat sám či se poohlídnout po nějakém jiném addonu ;-)
- v6ak
- Člen | 206
Ještě je potřeba přejmenovat Button na např, Gridito_Button a upravit pár stringů, ve kterých je název třídy. Už jsem to kdysi na 5.2 rozjel, ale zatím jsem neměl moc důvodů upgradeovat Gridito, tak jsem tu starou verzi tam nechal a neměl jsem až tak velkou motivaci to automatizovat. A tehdy jsem to prostě potřeboval rychle rozjet. Ale mohl byvh někam nahrát tu (částečně automaticky) upravenou verzi, bude-li zájem.
- JanBohac
- Člen | 5
Zdravím, už jsem to nějak rozchodil, ale ještě když dávám parametry do array pro rozšíření parametrů sloupce (např. renderování true/false tick), tak se mi nedaří nacpat do to ho pole „function“, vyhazuje to:
syntax error, unexpected T_FUNCTION
takže chybka je někde v předání a zavolání funkce v jiné části kodu… V preseneteru:
<?php
grid->addColumn("active", "Active", array(
"renderer" => function ($row) {
Gridito\Column::renderBoolean($row->active);
},
?>
Chybka je ta function, jinak pro ty co budou radit, tak jedu na PHP5.2 viz výše ;-) Díky za info!
- v6ak
- Člen | 206
Ja: http://v6ak.com/…idito-52.zip
Nicméně:
- Je to starší verze.
- Má pár patchů (napadá mě NotORMModel a setTrClass).
- Asi to opravdu nebudu udržovat. PHP 5.3 k dispozici momentálně mám, akorát projekt byl psán pro 5.2, takže by to asi v budoucnu šlo vyřešit pomocí aliasů.
- EDIT: Jinak to vzniklo pomocí dříve uvedeného skriptu a několika ručníma úpravama, které byly nezbytné.
Editoval v6ak (22. 6. 2011 10:07)
- one-two
- Člen | 80
Nedaří se mi zprovoznit řazení :-/
v hlavičce mam přesně to co je v demu gridito
v presenteru toto:
protected function createComponentGrid($name) {
$grid = new \Gridito\Grid($this, $name);
$grid->setModel(new \Gridito\DibiFluentModel(\dibi::select('*')
->from('licence')));
$grid->setItemsPerPage(5);
$grid->addColumn("licence_id", "ID: ")->setSortable(true);
$grid->addColumn("title", "Název: ")->setSortable(true);
}
odezva v firebugu:
{"state":{"grid-page":null,"grid-sortColumn":"licence_id","grid-sortType":"asc"}}
fakt už nevim, kde by mohla být chyba, pokud dám pryč
$("a.ajax").live("click", function (event) {
event.preventDefault();
$.get(this.href);
});
tak to funguje samostatně bez ajaxu funguje
Editoval one-two (25. 6. 2011 13:47)
- Ot@s
- Backer | 476
Honza Marek napsal(a):
https://github.com/…tteModel.php
Ale zatím jsem nezkoušel.
Honzo, podle prvnich testu funguje! Moc diky!
- leumas
- Člen | 13
Zdrojáky k príkladom sú presunuté na https://github.com/…dito-sandbox
Pár rozšírení a zlepšení gridita som spáchal na https://github.com/hleumas/gridito
Konkrétne:
- pridaný NetteModel pre fungovanie s Nette databázovým rozhraním
- opravené XSS, (obsahy stĺpcov doteraz neboli escapované)
- Možnosť určiť maximálný počet znakov pre stĺpec, v prípade prekročenia dĺžky sa zobrazí časť stringu a celý string je možné vidieť v tooltipe.
- Možnosť určiť typ renderovania manuálne
- Nový typ renderovania Email
- Zápis confirmationquestions vo formáte: „Skutočne odstrániť zákazníka %meno% %priezvisko%?“, kde %meno% a %priezvisko% sa zasubstituujú $row[‚meno‘] a $row[‚priezvisko‘].
- Oddelenie css a javascriptu, pre pekný výzor už nie je potrebné mať povolený javascript, s týmto však pribúda závislosť na scss
Editoval leumas (9. 7. 2011 15:33)
- radikus
- Člen | 11
Ahoj, zkouším v Griditu naformátovat datum z datetime na např. d.m.Y, ale nějak se mi to nedaří.
<?php
// dibifluent mam klasicky
$att = array("action_id","name","place","text","dateTimeFrom");
$db = \dibi::select($att)->from("action");
// sloupec s datem se pokousim formatovat takto
$grid->addColumn("dateTimeFrom", "Datum")->setDateTimeFormat("d.m.Y");
?>
Můžete mi prosím poradit jak to naformátovat v Griditu, případně
v dibifluent? Ani jeden případ se mi nedaří rozjet.
Díky
- yngwie
- Člen | 4
Ahoj snazim sa rozbehnut si Gridito na Nette Framework 2.0-beta pro PHP 5.2,
cize bez mennych priestorov, lebo moj hosting ma iba PHP 5.2.9 a chcem si
skusit spravit v Nette male administracne rozhranie s Griditom ale akosi sa
nedari. Konkretne som sa dostal az k chybe, ktora sa objavi pri spracovani
sablony grid.phtml.
Invalid argument passed to foreach resp. NSmartCachingIterator; array or
Traversable expected, GriditoDibiModel given
Pri odstranovani mennych priestorov som postupoval tak, ze som stiahol poslednu verziu pre php 5.3 a zmazal som namespace a use, nahradil som vsetko nette prefixovanymi nazvami ako NObject atd. Triedy gridita som premenoval na Gridio_nazov_triedy, aby sa mi to nebilo s triedami v nette, to vyzera, ze je ok, ale evidentne nie vsetko. Pouzivam pre spojenie s db pouzivam dibi. Tak neviem uz som z toho bezradny, ale rad by som to rozchodil, lebo uz som nad tym stravil dost casu a vysledok nikde. Tak bude vdacny za kazdu radu, isto chyba bude medzi stolickou a klavesnicou som v Nette uplny novacik takze predpokladam, ze som nepochopil urcite suvislosti, ale v tom FOREACH v sablone mi to pri vypise pise, ze nepozna premennu $iterator, ale ked som si dal vypis $control->getModel tam data su, tak neviem proste predpokladam, ze neni co iterovat asi preto tam iterator neni definovany. Takto nejak vypada ten moj lepeny kod:
Toto mam ako sucast presenteru Admin_DashboardPresenter.php
protected function createComponentGrid($name)
{
$grid = new Gridito_Grid($this, $name);
$db = $this->context->database;
$model = new GriditoDibiModel($db);
if ($this->getParam('activeOnly')) {
$model->filterActiveOnly();
}
$search = $this->getParam('search', false);
if ($search) {
$model->filterSearch($search);
}
$grid->setModel($model);
$grid->setItemsPerPage(15);
$presenter = $this->presenter;
$grid->addColumn("id", "ID")->setSortable(true);
$grid->addColumn("login", "Jméno", array(
"renderer" => function ($row) use ($presenter) {
$presenter->link(':Admin:Dashboard', array( 'id' => $row->id));
},
"sortable" => true,
));
GriditoDibiModel.php
class GriditoDibiModel extends DibiFluentModel
{
public function __construct(DibiConnection $db)
{
parent::__construct($db->select("*")->from("user"));
}
public function filterActiveOnly()
{
$this->fluent->where("status= 1");
}
public function filterSearch($search)
{
$searchString = "%$search%";
$this->fluent->where(
"(login like %s or mail like %s)",
$searchString, $searchString
);
}
}
Inak v podstate je vsetko ostatne totozne s datami ku Griditu z gitHubu,
kde som akurat pridal prefixy
miesto mennych priestorov a pouzivam DibiFluentModel.php
Tabulka user v db ma atributy id,login,mail, pass a status.
Vopred dakujem za kazdu radu.
Editoval yngwie (5. 9. 2011 20:13)
- kybrex
- Člen | 4
Zdravím,
nikde jsem se nedočetl o nějaké podpoře pro Translator. Plánuje se něco(a
přehlédnul jsem to) nebo to gridito neumí a umět nebude? Hodilo by se, aby
gridito podporoval (třeba jako formuláře) setTranslator a při renderování
se automaticky volalo na všechny názvy sloupců a tlačítek
->translate().
- stefi023
- Člen | 71
Ahoj,
zacal jsem pouzivat Gridito spolu s Doctrine 2 (v obojim zacinam, pred tim byl mym dennim chlebem DataGrid a DibiFluent) a narazil jsem na problem pri spojovani „tabulek“ (v pripade Doctrine asi spise „entit“). Pokud vazba neni povinna, tzn cizi klic je NULL, tak gridito skonci s tim ze nemuze ziskat promennou neexistujiicho objektu (coz je asi samo spravne). Delam neco spatne (at uz s griditem ci doctrine), nebo to je drobna chybka?
Pomohl jsem si rychlou upravou v DoctrineQueryBuilderModel.php na r. 85 z:
<?php
$value = ObjectMixin::get($value, $getter);
?>
na:
<?php
$value = $value ? ObjectMixin::get($value, $getter) : '';
?>
nepo*to jsem touto upravou nekde neco jinde?
- matoni555
- Člen | 40
Zdravím,
stáhl jsem si Gridito odtud: https://github.com/hleumas/gridito
Nedaří se mi jej však nastylovat a propojit s jQuery UI. Nikde jsem
nenašel ani žádný ukázkový příklad.
Můžete mi poradit, co mám vše nalinkovat, aby se to nastylovalo? jQuery UI
nalinkované mám.
Díky
- bojovyletoun
- Člen | 667
no mělo by stačit, aby předaná hodnota byla instance DateTime. formát pak můžeš změnit přes Column::setDateTimeFormat.. tzn
$grid->addcolumn("date","datum")->setDatetim...
- bojovyletoun
- Člen | 667
Hlásím chybu „Possible CSRF attack“ – pravděpodobně za to může
filtrování číselných parametrů v URL:
url :
http://l/p/D/akce?1-token=e24...2&1-pk=108&grid-actions-1-token=e24...a92&grid-actions-1-pk=108&do=grid-actions-1-click
píšu ve spěchu, třeba to bude uplně banální problém
Source file ▼
File: C:\web\htdocs\libs\controls\Gridito\BaseButton.php Line: 149
139:
140: /**
141: * Handle click signal
142: * @param string $token security token
143: * @param mixed $pk
144: */
145: public function handleClick($token, $pk = null) {
146: $grid = $this->getGrid();
147:
148: if ($token !== $this->getGrid()->getSecurityToken()) {
149: throw new ForbiddenRequestException("Security token does not match. Possible CSRF attack.");
150: }
151:
152: call_user_func($this->handler, $grid->getModel()->processActionParam($pk));
153: }
Call stack ▼
1.
C:\web\htdocs\libs\controls\Gridito\WindowButton.php:20 source ► Gridito\BaseButton-> handleClick (arguments ►) $token NULL
$pk NULL
10: */
11: class WindowButton extends BaseButton {
12:
13: /**
14: * Handle click signal
15: * @param string $token security token
16: * @param mixed $pk primary key
17: */
18: public function handleClick($token, $pk = null) {
19: ob_start();
20: parent::handleClick($token, $pk);
21: $output = ob_get_clean();
22:
23: if ($this->getPresenter()->isAjax()) {
24: echo $output;
2.
inner-code Gridito\WindowButton-> handleClick (arguments ►) $token NULL
$pk NULL
3.
C:\web\htdocs\git\nette\Nette\Application\UI\PresenterComponent.php:99 source ► ReflectionMethod-> invokeArgs (arguments ►)
GET:
$_GET1-token "e2477264c9a2c6a8a604b5db90145a92" (32)
1-pk "108" (3)
grid-actions-1-token "e2477264c9a2c6a8a604b5db90145a92" (32)
grid-actions-1-pk "108" (3)
do "grid-actions-1-click" (20)
Editoval bojovyletoun (14. 2. 2012 16:22)
- muflix
- Člen | 92
jestli mohu, taky se hlásím o nějaký ukázkový příklad.. Gridito sem
rozchodil, ale vypsala se mi tabulka se stránkováním a sortování mi nejde
byť sem to do presenteru přidal
($grid->addColumn("id", "ID")->setSortable(true);)
a nevím
co všechno dokáže protože nikde neni ani dokumentace žádná ?:P
- repter
- Člen | 2
Zdravím, chcel by som sa spýtať, ako spraviť nasledovnú vec. Používam Doctrine a keď aplikujem filter a výsledkom je napr. 200 záznamov , a zobrazujú sa mi záznamy po 50 na stránku. Momentálne ked chcem prepnúť z prvej na druhú stránku tak ma presunie na druhú stránku so všetkých záznamov a nie z tých vyfiltrovaných. Ako sa to dá vyriešiť ? . Vďaka.
<?php
protected function createComponentGrid($name) {
$grid = new \Gridito\Grid($this, $name);
// filtrovanie
$magId = $this->getParam('magId', NULL); //id magazinu podla ktoreho sa filtruje
if ($magId) {
$em= $this->context->database;
$repository=$em->getRepository('\Release');
$qb=$repository->filterByMagazine($magId);
$model = new \Gridito\DoctrineQueryBuilderModel($qb);
}
else $model = $this->context->models_releaseModel;
$grid->setModel($model);
$grid->setItemsPerPage(50);
?>
- Bumerank
- Člen | 30
nedaří se mi spojit tabulky :( ..pokud v dotazu selectuju jen z jedné tabulky, tak v pohodě
<?php
// akce v presenteru
function actionDefault($id)
{
$this->processed_catalog_id = $id;
$this->model = new LabelsModel();
$this->processed_catalog_url = $this->model->getAllLabels($id);
$this->model->setPrimaryKey("er_catalog_id_catalog, er_insert_attribute_id_attribute"); // tabulka má složený primární klíč
}
?>
<?php
// model
function getAllLabels($id)
{
$id = 2216; // zatím statické ID pro testování
$this->fluent = $this->connection->query("
select
L.er_input_label_cycle,
L.er_input_label_required,
L.er_input_label_hidden_value,
A.er_insert_attribute_label
from
elpod_registrator_input_label as L
left join
elpod_registrator_insert_attribute as A on A.er_insert_attribute_id_attribute = L.er_insert_attribute_id_attribute
where
er_catalog_id_catalog = %id", $id);
}
?>
ztroskotá to tady (File: …\libs\dibi\libs\DibiFluent.php Line: 429):
<?php
425: public function count()
426: {
427: return (int) $this->query(array(
428: 'SELECT COUNT(*) FROM (%ex', $this->_export(), ') AS [data]'
429: ))->fetchSingle();
430: }
?>
- DavidD
- Člen | 2
Narazil jsem na problém při použití textového primárního klíče (jednoznačný název modulu). Chvíli jsem dubuggoval a dostal se do souboru DoctrineQueryBuilderModel.php, kde v metodě getItemByUniqueId($uniqueId) je explicitní přetypování $uniqueId na int. Nevím jestli jsem něco nepřehlédl, ale asi by bylo dobré, zavést nastavení typu primárního klíče a podle typu pak s daným primárním klíčem nakládat před vložením do dotazu.
- DavidD
- Člen | 2
Jsem si to samozřejmně upravil ;-) Jen jsem na to chtěl upozornit, kdyby se s tím taky někdo setkal. Jako taková blbost mi to zase nepřipadá. Nevím proč by nemohlo být jako primární klíč použito třeba nějaké sériové číslo, které obsahuje i písmena nebo u uživatele jeho unikátní uživatelské jméno. Samozřejmně přidat sloupec id typu int není problém, ale proč když už nějakou unikátní identifikaci mám.