[addon datagrid] DataGrid
- Honza Kuchař
- Člen | 1662
SparkCZ napsal(a):
Je mozne priradit k operaci nejake potvrzovani akce? Narazil jsem na ConfirmationDialog od DocX, ale je nejspis psany pro PHP 5.3 a ja pouzivam 5.2.x, navic stejne nejde stahnout archiv…
Zkus to na to navěsit pomocí JavaScriptu. A nebo přejdi na PHP 5.3. Ale pokud si správně pamatuji, tak se ConfirmationDialog dá používat i v PHP 5.2 (pokud si ho teda upravíš).
- Honza Kuchař
- Člen | 1662
Nástin na to na co chceš udělat potvrzení navěš
onclick="if(confirm()..."
. Zkus hledat, už se to tu řešilo
několikrát.
- Pavel S.
- Člen | 24
Zdravím,
existuje někdo, kdo verzi DataGridu pro Nette 0.9.3 přepsal tak, aby fungoval ve verzi PHP 5.3 se jmennými prostory? Nechce se mi věřit, že by se nikdo takový nenašel… Prosím případného dotyčného, kdyby byl tak moc hodný, jestli by se o svou úpravu podělil.
Editoval Pavel S. (9. 5. 2010 2:05)
- Glottis
- Člen | 129
nazdar lidi. ja na razil na problem a nevim jestli to je rukama nebo cim.
mam presenter treba clanek. vypisuju si seznam datagridem. ten fuguje bezvadne i ajaxove. pak si kliknu edit clanku (clanek/edit/1) a z sablony edit vykreslim jak formular tak datagrid. no a tady prestane ajax fungovat. nejde strankovat ani nic dalsiho. vyzkoumal jsem jen ze mu v odkazech prekazi ta akce edit. kdzy to v datagrid.js hacknu tak to funguje ale to se mi nelibi. delam neco spatne? bez ajaxu to normalne funguje. pres debuger jsem vypozoroval ze pri ajaxovem volani s emi vrati cela stranka znova ale uz se to nezobrazi. kdzy neni akce edit tak to krasne vraci json.
dik
Michal
- stefi023
- Člen | 71
Ahoj, mam dotaz…
Je mozne nejak pracovat s hodnotou z databaze, ktera je NULL?
Napriklad mam v DB DateTime sloupec, kde vychozi hodnota je NULL, tu chci
zobrazit pomoci DateColumn, ovsem pokud tato hodnota je NULL tak neprojde
podminkou v DataGridRenderer kolem radku 555 (nebo spis ji projde a vyhodi
vyjimku) (alespon v rev. 53)
if (!isset($data[$column->getName()])) {
Napadlo me to opravit zmenou na
if (!array_key_exists($column->getName(), $data)) {
ovsem nevim, zda to nevadi necemu jinemu, popr. zda nedelam neco blbe.
Diky moc
Editoval stefi023 (31. 5. 2010 23:08)
- blacksun
- Člen | 177
vlki napsal(a):
Aktuálně nic víc než DataSource neumí. Nemělo by ale být těžké vytvořit nějaký adaptér, který by šel nastavit podle potřeby. Respektive DataSource rozbít na jednotlivé operace
count($conds)
afetchAll($conds, $orderBy, $offset, $limit)
, které by šly odchytit na úrovni modelu.Osobně jsem si vytvořit DataSource, kterému předhodím pole. Funguje parádně až na filtr pomocí wildcard (*).
Ahoj,
nebyl by pls nějaký jednoduchý nástřel, jak na ten datasource z pole? Snažil jsem se o něco podobného, ale nakonec jsem to radši dal do db a četl z ní..
Díky předem :-)
M.
- Honza Kuchař
- Člen | 1662
Nejednoduší to bude Pole → sqlite → číst → smazat. Ale pokud budeš chtít použít opravdu pole, budeš si muset nejspíš napsat driver pro Dibi, který bude pracovat s polem jako s databází… Ale to je podle mě strašně moc práce = implementace jednoduchého db serveru na PHPkem… Uff… :-)
- mkoubik
- Člen | 728
Fajn by bylo rozhrani IDataSource
(pouze metody, ktere pouziva
datagrid), ale pak by se ho musel implementovat datasource z dibi, který nemá
s datagridem nic společného, což je fuj.
Nebo mít to rozhraní jenom v datagridu a zarovň tam mít wrapper pro dibi datasource, který by ho implementoval, ale dibi by vracelo ten svůj a muselo by se to wrapovat ručně, takže taky fuj.
- Ondřej Mirtes
- Člen | 1536
Upravil jsem Romanův DataGrid, aby přijímal a pracoval s IDataSource a naimplementoval jsem DoctrineDataSource (funkční na Doctrine 2 Beta 1), který v práci potřebujeme. Funguje to dobře :)
Až dovyřeším všechny problémy, tak možná požádám o svolení k uveřejnění na GitHubu, ať z toho taky něco máte :)
- Ondřej Mirtes
- Člen | 1536
Ahoj,
mám problém – filtrování mi funguje hezky, napíšu nějaký text (který
jde do LIKE dotazu), odenteruju a zobrazí se mi ty správné řádky.
Přepíšu input, odenteruju a zobrazí se mi zase ty správné řádky.
Problém mám s filtrováním pomocí checkboxu. Mám booleanovský sloupec a nad ním checkbox filtr – který ovšem na změnu reaguje jen jednou (po načtení stránky), na další odškrtávání/zaškrtávání už nijak Javascript nereaguje, nic se po serveru nežádá. V datagrid.js jde nejspíš o tyto řádky a žádnou chybu v nich nevidím (první – pro inputy – mi funguje, druhý pro checkboxy jen jednou):
// ajaxové filtrování formulářů datagridů po stisknutí klávesy <ENTER>
$("form.datagrid table.datagrid tr.filters input[type=text]").livequery("keypress", function (e) {
if (e.keyCode == 13) {
$(this).parents("form.datagrid").find("input:submit[name=filterSubmit]").ajaxSubmit();
return false;
}
});
// ajaxové filtrování formulářů datagridů pomocí změny hodnoty selectboxu nebo checkboxu
$("form.datagrid table.datagrid").find("tr.filters input:checkbox, tr.filters select").livequery("change", function (e) {
$(this).parents("form.datagrid").find("input:submit[name=filterSubmit]").ajaxSubmit();
return false;
});
Podle chování to vypadá na klasický bug s
$(document).ready();
, kdy DOM prvky ztratí navěšené události
poté, co jsou updatnuty ze serveru pomocí AJAXu, ale tady je vše navěšené
pomocí livequery, které tomuto chování zabraňuje, tak fakt nevím, kde
hledat chybu.
EDIT: Bylo to nekompatibilitou livequery a jQuery 1.4.
- MzK
- Člen | 127
Nefunguje mi přidání odkazu akce.
Odkaz by měl vypadat třeba takto:
/?co=nabidka&id=12&action=edit&presenter=admin
Bohužel se generuje toto:
?co=nabidka&id=12&action=%2F&presenter=admin
<?php
$grid->addAction('Edituj', $link, Html::el('span')->class('icon icon-edit'), $useAjax = false);
//…
$grid->addAction('Edituj', 'admin:edit, nabidky', Html::el('span')->class('icon icon-edit'), $useAjax = false);
//?id=1&action=edit%2C+nabidky&presenter=admin
?>
už jinak nevím jak tam nacpat ten odkaz s více parametry jinak.
Díky za radu :(
- despiq
- Člen | 320
odkaz by mela bejt jen nejaka fce, jako prvni parametr do ni dostanes id radky a jako druhy dostanes objekt s celou radkou z DB, to by ti melo stacit ne?
<?php
$grid->addAction('Edit', 'Customer:edit' ...
public function edit($id, $dibiobjectrow) // pokud pouzivas dibi
?>
aspon teda myslim ze to jako druhej posila celou radku z db
- 2bfree
- Člen | 248
Existuje nějaká možnost, kterak napojit tenhle parádní kus kódu na obyčejné pole (Array)?
Mám následujícím způsobem definované pole
<?php
$dataArray["nazev-sloupce-1"][0]="hodnota 1";
$dataArray["nazev-sloupce-2"][0]="hodnota 2";
$dataArray["nazev-sloupce-1"][1]="hodnota 3";
$dataArray["nazev-sloupce-2"][1]="hodnota 4";
?>
A chtěl bych získat tabulku:
nazev-sloupce-1 | nazev-sloupce-2 |
1 | 2 |
3 | 4 |
Pole získávám načítáním .ini souborů z jednotlivých adresářů, kde každý .ini soubor obsahuje data pro jeden řádek tabulky.
Momentálně to mám implementované po svém, ale tohle se mi líbí víc.
- blacksun
- Člen | 177
Narazil jsem na nějaké problémky s nepřekreslováním, ale zatím vše vyřešila 1.0-alpha verze Nette a 1.0-dev verze Datagridu.
Chtěl jsem se zeptat, jesli je nějak elegantně využít vlastnost „rememberState“ tak, aby se při prvním vykreslení datagridu natáhlo defaultní zobrazení, ale při přechodu akcí na nějakou stránku a návratu zpět jsem se vrátil tam, odkud jsem tou akcí odešel?
Tzn. takové zachvování i nezachovávání stavu :-) (jestli je tomu rozumět :-D)
- gonny
- Člen | 1
Ahoj,
dynamicky přidávám do operations a potřeboval bych, zda jde nějak odpálit
form events datagridu před samotnou inicializací datagridu. Jde o to, že se
operations přerenderují dříve, než se upraví obsah DB. (Zatím to řeším
tak, že si vezmu z POST data, provedu operace, zavedu datagrid)
Díky
- tom
- Člen | 171
Jakým způsobem vytvořím tlačitko pro přidávání záznamu (něco jako je tady to tlačítko „Přidat adresáta“)? Nepříjde mi úplně nejlepší mít to tlačítko pro nový záznam na každém řádku, tak bych ho chtěl mít globálně pro celý grid. Jestli jsem řešení někde přehlídl, tak se předem omlouvám. Díky
- romansklenar
- Člen | 655
$link = Html::el('a')->href($this->link('new!'))
->title("Přidat adresáta")
->setHtml("Přidat adresáta");
$renderer = $grid->getRenderer();
$renderer->footerFormat = $link . $renderer->footerFormat;
$grid->setRenderer($renderer);
- leumas
- Člen | 13
Zistil som, ze textovy column pri vkladani html elementu vymaze jeho vnutro a nahradi ho jeho textom, co je problem v pripade, ze dotycny element obsahoval dalsie elementy. Je to chyba columnu, alebo moja, ze pouzivam nespravny column?
Pouzivam najnovsiu vyvojovu verziu datagridu.
- mlha
- Člen | 58
Musel jsem si upravit DataGrid. Soubor dataGrid.php metoda render().
Na začátku metody testuji zda je Ajax a zároveň není požadavek na
překreslení DataGridu
<?php
if ($this->presenter->isAjax() && !$this->isControlInvalid()) {
echo '';
return;
}
?>
Toto ma zajistit, aby se nevolaly SQL dotazy v DataSource zbytečně.
Můžete na to kouknout, zda je to korektní? Díky
Editoval mlha (9. 8. 2010 21:51)
- blacksun
- Člen | 177
knyttr napsal(a):
Ahoj,
trochu bojuju s tim, ze razeni se resi pres params, tedy GET a filtry pres POST. Libilo by se mi, kdyby oboje mohlo byt GET, abych se mohl odkazovat primo na nejaky filtr.
Diky
Teoreticky by mělo stačit najít form, kterým se aplikují filtry, a změnit mu metodu na GET. Nevím, jak se na to bude tvářit nette obsluha, ale mělo by to šlapat.
- pjoter
- Člen | 118
Díky za super komponentu, narazil jsem na dva problémy:
- Nejde mi formátovat čas v ColumnDate resp. Hodiny jdou %H ale s minutama a vteřina mi to nefunguje (%s a %i)
- Tohle bude asi zádrhel ze strany jqueryui, když mám datetime a zadám stejné datum nenajde mi to nic, kdybych věděl kde se upravuje sql dotaz pro DateFilter tak bych si ho upravil aby hledal jen v roce mesici a dni.
Jinak jsem ještě chtěl řešit zakázání akce pro konkrétní záznam ale to jsem nakonec neřešil (je tam na to nějaká featura ?)
- mayo2000
- Člen | 7
Používam NetteFramework-0.9.6-PHP5.2-nonprefix a datagrid-0.9.4–0 (ktorý je vlastne rovnaký ako datagrid-1.0-alpha-0).
Nefungoval mi ajaxové volania. Pričom firebug ukazoval, že server posiela odpovede.
Debugovanim datagrid.js som si všimol, že riadok: $
(„#“ + id).fadeTo(„fast“, 0.3, function () {
sa jednoducho nespracuje pričom premmenná id mala hodnotu:
snippet-baseGrid-:grid
jQuery selector $(„#“ + ‚snippet-baseGrid-:grid‘) vracal jednoducho prádzny jQuery objekt.
Potom som jednoducho pridal na začiatok funkcie macroSnipper
v LatteMacros.php:
$content = str_replace(‚:‘, '', $content);
A voala. A ajax volania fungujú. Zbežne som pozeral LatteMacros.php vo verzii NetteFramework-2.0alpha-PHP5.2-nonprefix a vyzerá že David to tam tiež nejako rieši.
Dúfam, že toto niekomu pomôže a keď sa to tu už riešilo, tak sorry
- ondra310
- Člen | 25
Zdravim, mam problem, jakmile chci zapnout filtrovani nad sloupci v tabulce, tak mi to hodi chybu: „InvalidStateException – Component '' is not attached to ‚INamingContainer‘“. Nejak se mi to nedari vyresit, bo nevim presne z kama vitr vane. Jsem spise zacatecnik v Nette. Jestli pomuze zdrojak komponenty:
protected function createComponentGrid($name)
{
$this->dbConnect();
$grid = new DataGrid;
$grid->bindDataTable($this->model->showCustomerList());
$grid->itemsPerPage = 60;
$grid->displayedItems = array('all',15,30,60,90);
//ovlivneni globalniho vzhledu tabulky
$renderer = $grid->getRenderer();
$renderer->wrappers['datagrid']['container'] = 'table class=list_table';
//$renderer->onRowRender[] = array($this, 'gridOnRowRendered');
$grid->setRenderer($renderer);
$grid->keyName = 'id_zakaznik';
// přidáme sloupec pro akce (sloupců může být i více)
$grid->addActionColumn('Obsluha');
$grid->addAction('Editace', 'Customer:edit', NHtml::el('span','Vybrat'));
$grid->addColumn('nazev', 'Název');
$grid['nazev']->addFilter();
$grid->addColumn('kod_zakaznika', 'Kód zákazníka');
$grid->addColumn('ICO', 'Ičo');
$grid->addDateColumn('last_sync', 'Datum poslední synchronizace', '%d.%m.%Y %H:%m:%S'); // český formát: '%d.%m.%Y'
$grid['last_sync']->getHeaderPrototype()->style('width: 140px');
$grid->rememberState = TRUE; // povolí ukládání stavů komponenty do session
$grid->timeout = '+ 7 days';
$this->addComponent($grid, $name);
}//end createComponentGrid
Používám NetteFramework-0.9.6-PHP5.2, datagrid –0.9.4. Jestli se to řešilo někde jinde, tak prosím odkaz, ja jsme to nějak nenašel :-(. Díky
- mayo2000
- Člen | 7
Ak chcete používať datagrid pod Oraclom, možno sa hodí mnou upravený dibbi driver (oracle OCI8 nepozná seek). Stačí v config.ini nahradiť oracle driver za oraclex
<?php
require_once 'oracle.php';
/**
* This file is part of the "dibi" - smart database abstraction layer.
*
* Copyright (c) 2005, 2010 David Grudl (http://davidgrudl.com)
*
* This source file is subject to the "dibi license", and/or
* GPL license. For more information please see https://dibiphp.com
* @package drivers
*/
/**
* The eXtended dibi driver for Oracle database.
*
* Check DibiOracleDriver for reference
*
* Provides: experimental seek method (still waiting for OCI9 and scrollable cursors)
*
* Remark: seek method should work even without setting resultSet member,
* defined in ancestor class (because resultSet is just reference I guess),
* anyway I've added resultSet setter (hopefully it works)
*
* @author Marian Hello
* @package drivers
*/
final class DibiOracleXDriver extends DibiOracleDriver implements IDibiDriver, IDibiResultDriver, IDibiReflector {
/** @var string */
private $lastSql;
function __construct() {
parent::__construct();
}
public function setResultSet($resultSet) {
$this->resultSet = $resultSet;
}
public function getResultSet() {
return $this->resultSet;
}
public function query($sql) {
$this->lastSql = $sql;
return parent::query($sql);
}
/**
* Moves cursor position without fetching row.
* @param int the 0-based cursor pos to seek to
* @return boolean TRUE on success, FALSE if unable to seek to specified record
*/
public function seek($row) {
// try dibbi parent method first
try {
return parent::seek($row);
// if still not implemented go ahead with custom
} catch (NotImplementedException $e) {
// getting current resultSet
$resultSet = $this->getResultResource();
oci_cancel($resultSet);
// create fresh resultSet (meaning start from row 0)
$resultSet = $this->query($this->lastSql)->getResultResource();
// loop to required row
while (--$row >= 0) {
if (oci_fetch($resultSet)) {
}
else
return FALSE;
}
// :TODO: I should investigate if this really set resultSet!
$this->setResultSet($resultSet);
return TRUE;
}
}
// Warning: this function will replace your resultSet
// it should be called before begin transcation and after actual sql statement
public function getLocalTransactionId() {
$return = $this->query('SELECT dbms_transaction.local_transaction_id FROM dual')
->fetch(FALSE);
return $return[0];
}
}
?>
- jpo
- Člen | 2
Zdravim,
chcel som pouzit Datagrid v Nette 2.0, ako si som narazil na par problemov:
class DataGrid extends Control implements ArrayAccess, INamingContainer
Class ‚Control‘ not found, co zrovna nebol az taky problem, lebo to som premenoval na ‚NControl‘ a vsak ‚INamingContainter‘ uz po novom v adresari Nette/Forms ako jediny chyba. Budem rad, ak sa objavi aj nejaka verzia datagridu pre Nette 2.0.
Diky
- westrem
- Člen | 398
jpo napsal:
Budem rad, ak sa objavi aj nejaka verzia datagridu pre Nette 2.0.
To bude musiet najskor byt Nette 2.0 stable, nechapem co si vlastne ludia myslia. Ze autori doplnkov maju k dispozicii mocne orakulum a mozu hned pisat veci pod niecim co ani je released, alebo ze sprava ich doplnkov aby korespondovala s kazdym commitom v Nette je ich jediny job?!
Preberte sa ludkovia a trosku strpenia prosim ..
- Royce
- Člen | 15
Dobrý den, bobjuju s problémem jak zpracovat kliknutí na edit
v datagridu…
Mám seznam zpráv a chci mít možnost je upravit, takže mám ikonku
na úpravu
...
$grid->keyName = 'id_zpravy';
...
$grid->addAction('Upravit', 'Zpravy:edit', Html::el('span')->class('icon icon-edit'), $useAjax = FALSE);
a chci abych se po kliknutí dostal na formulář pro editaci těchto dat…
takže mám metodu renderEdit()
a k ní odpovídající šablonu..
ALE nevím jak do této šablony dostat to id_zpravy
. Ono je v URL
a můžu si pro něj šáhnout pomocí $_GET['id_zpravy']
ale to se
mi nezdá jako košér, musí to jít i jinak.. pomocí parametru ve funkci
renderEdit($id)
to nejde, tam se to nedostane…
Díky za radu
- Tracy
- Člen | 8
Cau, kdyz se k tomu nikdo nema tak ja ti ukazu jak to mam ja, ale s Nette sem jeste desna lamka, takze to nejspis neni uplne tak jak to ma bejt :) Nicmene to funguje…
$grid->addAction('Edit', 'new:edit', clone $icon->class('icon icon-edit'), FALSE, DataGridAction::WITH_KEY);
– na editaci a pridavani mam zvlast presenter a pouzil sem i definovani ze to ma bejt s klicem, pravdepodobne to tam bejt nemusi.
public function actionEdit($id) {
$values = dibi::fetch("SELECT * FROM xxx WHERE id=%i", $id);
$this['form']->setDefaults($values);
}
mega prasarna, nevyuziti modelu, ja vim, ted sem rad ze to funguje a to vyresim pozdejs :)
No a pak uz jen formular
public function createComponentForm($id) {
$form = new AppForm($this, $id);
Jestli sem ti cpal neco, cos vubec vedet nechtel tak se omlouvam a pak to vesele smazu :)
Editoval Tracy (10. 11. 2010 11:32)
- Royce
- Člen | 15
Tracy napsal(a):
Cau, kdyz se k tomu nikdo nema tak ja ti ukazu jak to mam ja, ale s Nette sem jeste desna lamka, takze to nejspis neni uplne tak jak to ma bejt :) Nicmene to funguje…
Jestli je to tak jak to má být neposoudím.. ale nakoplo mě to správným směrem.. takže mockrát díky
- mayo2000
- Člen | 7
V práci sme potrebovali zobraziť XLS zošit v gride. Napísal som teda niečo ako XLS datasource. Zatiaľ to má kopec obmedzení typu názvy stĺpcov musia byť povinne uvedené v prvom riadku XLS zošita a podobne. Pridávam to tu, nech môže niekto na tom zapracovať. Pravdepodobne to bude fungovať len s vývojovou verziou datagridu z gitu. Nakoľko tento datasource využíva knižnicu phpExcel, musí byť prítomná v libs a ďalej NetteFramework-0.9.7-PHP5.3
Ak má niekto voľný web server s PHP 5.3, tak by bolo aj live-demo.
Download: http://80.79.23.159/xlsgrid.zip
- xrep
- Člen | 51
Funguje toto pod PHP 5.3?
Snazim sa to rozbehat a cely cas problemy :(
Do bootstrapu som pridal RobotLoader, a zadefinoval namespace pre
RobotLoader,
teraz mi to hlasi „Class ‚Control‘ not found“ v subore
/components/DataGrid/DataGrid.php ..
Nema niekto spisany nejaky slusny navod na rozbehanie? Dakujem
- tom
- Člen | 171
Mám DataGrid ve kterém na řádku kliknu na akci „detail“, čímž se mi otevře detail dané položky. Tento detail by měl být zase další datagrid a nacházející se na adrese ../detail?id=2 (například). Pokud v tomto gridu kliknu opět na akci „detail“, dostanu se pak na adresu např. ../dalsidetail?id=1
Jak se však přes submit dostanu zpět na ten první detail? Jde mi o to, jak dostat ‚id‘ toho prvního detailu až do nějaké akce toho druhého abych při redirectu věděl kam se vracet …
Díky moc
- tom
- Člen | 171
mkoubik napsal(a):
Buď si toho předka vytáhni z db, nebo si jeho id ukládej do parametru.
aha s tou DB je to dobry napad, to zkusim…
pokousel jsem se pres parametr, ale nedari se mi sem dostat parametry
<?php
$grid->addAction('Detail', 'AdministraceArchitekturaPortfolio:detailSm1', NHtml::el('span')->class('icon icon-detail'), $useAjax = TRUE);
?>
nevis jak na to?
diky
- tom
- Člen | 171
Jak resite situaci, kdy editujete nejaky zaznam rekneme na druhe nebo treti strance vypisu. Kliknu na akci Edit, zobrazim si editacni formular, provedu pozadovane upravy. Jenze po odeslani se vratim na zacatek seznamu (na prvni stranku) ale potreboval bych se vratit na tu druhou nebo treti stranu, aby nebylo stale nutne strankovat … Jak predavat parametr grid-page?
Diky
- hajek-tadeas
- Člen | 4
Zdravím Vás,
chtěl jsem se zeptat na věc ohledně dat (časového určení) v datagridu.
Existuje nějaká horní hranice pro výpis? Pro datum 31.12.2040 mi tabulka
vypisuje hodnotu 1.1.1970. Nevíte čím to je, případně jak se to dá
vyřešit?
- kravčo
- Člen | 721
Tipol by som to na ohraničenie štandardného 32-bitovéto timestampu dňom 19.1.2038 niekedy nadránom. Ak ti vypíše dátum 31.12.2037 správne, chyba bude zrejme tam.