Grido – DataGrid pro Nette
- Pavel Kravčík
- Člen | 1195
@o5: Super. Já už to rozchodil na ~2.0, co jsem potřeboval. Ale chtěl jsem to jen napsat, že by to mohlo do budoucna někomu pomoci. Jinak Grido je super! GJ
- mbskot
- Člen | 42
Zdravím,
nevieš v čom môže byť chyba, ak sa v gride prekladá len „Grido.Items“? Používam Kdyby/Translation a vytvoril som si pre ten Tvoj grid slovník Grido.sk.neon, do ktorého som nakopíroval všetky preklady z Tvojho súboru sk.php.
Grid vytváram takto:
protected function createComponentUserGrid()
{
$grid = new UserGrid($this->userDao);
$grid->setTranslator($this->translator);
return $grid;
}
Používam najnovšiu verziu dev-master.
Ďakujem za odpoveď.
- Oli
- Člen | 1215
Tak to by neměl být problém ne? Celou definici sloupce obalíš nějakým ifem, kde ověříš, jestli aktuální uživatel má práva ten sloupec vidět. Nebo tam je nějaká záludnost, kterou nevidím? Takhle například řeším jazyky. Pro některé projekty je podpora jazyků vypnutá a existuje jen jeden, v takovém případě sloupec s jazyky skryju.
- Desttro
- Člen | 126
Nesetkal se někdo prosím s takovém problémem? V topicu jsou tam 2,
děkuji:
https://forum.nette.org/…razeni-nazvu
- Pavel Kravčík
- Člen | 1195
@o5: Ještě jedna věc. Nezkoušel si suggestion na case-sensitive znaky? Přijde mi, že to hledá jen podle velikosti. Třeba ‚Kravčík‘ to nenabídne pokud napíšeš velké ‚Č‘. Stejné chování je v ~2.0 i ~1.3.
Je to drobnost, ale asi nad tím strávím ke konci týdne nějaký čas, aby se to opravilo. Může to být matoucí pro „hloupější“ uživatele. Takže neřešil už někdo?
- o5
- Člen | 416
@kzk_cz: pokud myslíš ArraySource, tak to v současné době je
case-sensitive case-insensitive, ale nic nebrání tomu to
implementovat. Zkusíš? Testy jsou, takže není třeba se čeho bát :)
V ostatních případech je to věc správného nastavení collation v DB.
Editoval o5 (1. 2. 2015 11:26)
- matopeto
- Člen | 395
Neviem ci niekto z vas mal problem s memory limitom (nad 128MB) pri exporte
velkej tabulky (tak 30000 riadkov) Ak ano, moze pouzit tento upraveny export
(Funguje iba ak je datasource selection), co to exportuje po malych davkach.
(jediny problem je ze dopredu nevieme velkost suboru, takze downloader ma tam
nekonecny loading:))
https://gist.github.com/…8532e8026be1
- Pavel Kravčík
- Člen | 1195
@o5: Pokud se povede, rád to poskytnu. Takže vyzkouším, ale uvidím, jestli na to moje mozková kapacita bude stačit. Díky za info.
- o5
- Člen | 416
@matopeto: Super, díky za zveřejnění! Zadal jsem na to issue, ale chtělo by to vyřešit nějak komplexně napříč všemi datasources.
Nevím kdy se k tomu dostanu, protože dosavadní práce na tomto projektu mě stála obrovské množství času a jediné co z toho mám, je nepoměr hvězdiček na githubu / počet stažení přes composer :)
- Pavel Kravčík
- Člen | 1195
@o5: Jelikož jsem programátorská nula (rozchození Gitu jest úkolem nadlidským), tak jsem to vyřešil hloupě a možná i neefektivně. Ale je to srozumitelné, funkční a do budoucna rozšířitelné pro Norštinu, takže to používám.
Asi by to pole šlo skládat snadněji (přes key(), array_in()) a vyhnout se opakování zápisu (i závorek a |), ale tohle mi přišlo rychlejší.
V ArraySource (já používám rozšíření pro uestlovu kvaziORM) si definuji znaky, které PHP není schopno zpracovat v preg_quote/match.
class ArraySourceYetORM extends \Grido\DataSources\ArraySource
{
static $czechChars =array(
'Á'=>'(á|Á)','á'=>'(á|Á)',
'Č'=>'(č|Č)','č'=>'(č|Č)',
'Ď'=>'(ď|Ď)','ď'=>'(ď|Ď)',
'É'=>'(é|É)','é'=>'(é|É)',
'Ě'=>'(ě|Ě)','ě'=>'(ě|Ě)',
'Ň'=>'(ň|Ň)','ň'=>'(ň|Ň)',
'Í'=>'(í|Í)','í'=>'(í|Í)',
'Ó'=>'(ó|Ó)','ó'=>'(ó|Ó)',
'Ř'=>'(ř|Ř)','ř'=>'(ř|Ř)',
'Š'=>'(š|Š)','š'=>'(š|Š)',
'Ť'=>'(ť|Ť)','ť'=>'(ť|Ť)',
'Ú'=>'(ú|Ú)','ú'=>'(ú|Ú)',
'Ů'=>'(ů|Ů)','ů'=>'(ů|Ů)',
'Ý'=>'(ý|Ý)','ý'=>'(ý|Ý)',
'Ž'=>'(ž|Ž)','ž'=>'(ž|Ž)');
A do funkce compare a LIKE podmínky si dám jednoduchý nahrazovač:
public function compare()
{
if ($cond === 'LIKE') {
$pattern = str_replace('%', '(.|\s)*', preg_quote($expected, '/'));
/* Replace char in pattern with (char|CHAR) */
foreach(self::$czechChars as $key => $value)
{
if(strpos($pattern, $key))
{
$pattern = str_replace($key, $value, $pattern);
}
}
return (bool) preg_match("/^{$pattern}$/i", $actual);
} elseif ($cond === '=') {
}
Třeba to někomu pomůže, než to vyřeší někdo chytřejší. :)
- Šaman
- Člen | 2659
Ahoj, jak rozchodit události navěšené na enteru ve vyhledávacích (filtrovacích) polích a na selectu s počtem záznamů? Když si doplním
$(function(){
$('.grido').grido();
});
tak to funguje jen na poprvé a bez toho vůbec (ač to podle kódů live ukázky vypadá, že by mělo).
Další problém nastal když jsem hledal jak to vyřešit a nakonec jsem si
i nainstaloval aktuální grido-sandbox. Nainstaloval jsem ho normálně
composerem (composer create-project o5/grido-sandbox grido
),
doplnil do www grido.css a grido.js, ale pořád tomu chybí mrtě souborů. Ty
se mají nainstalovat Bowerem, nebo kde je mám vzít? V repozitáři vůbec
nejsou.
- o5
- Člen | 416
@Šaman Do aktuálního grido-sandbox se nic doplňovat nemusí. Spustíš composer create-project o5/grido-sandbox a díky post-install-cmd se i spustí bower up. A pak už je to jen o správném nalinkování.
Ty se mají nainstalovat Bowerem, nebo kde je mám vzít? V repozitáři vůbec nejsou
Tohle by ti mělo odpovědět. Je to teďka takový workaround, protože ta master verze ještě není zralá na otagování.
- Šaman
- Člen | 2659
o5 napsal(a):
@Šaman Do aktuálního grido-sandbox se nic doplňovat nemusí. Spustíš composer create-project o5/grido-sandbox a díky post-install-cmd se i spustí bower up. A pak už je to jen o správném nalinkování.
Ty se mají nainstalovat Bowerem, nebo kde je mám vzít? V repozitáři vůbec nejsou
Tohle by ti mělo odpovědět. Je to teďka takový workaround, protože ta master verze ještě není zralá na otagování.
Tohle mi napovědělo, že to asi bude potřebovat bower. Ale já ho
nainstalovaný nemám, takže ani ten post-install-cmd
mi
nefungoval (ale myslel jsem že to nějak souvisí se symfony, nebo co to tam
taky psalo).
Takže – Grido mi funguje, jen nevím jak zařídit, aby mi i po prvním překreslení nadále fungovalo nastavení počtu stránek (tam není ani viditelné tlačítko, takže to pálí víc) a ideálně i ty filtrovací inputy. Bude to něco s JS, ale s těmi se nekamarádím. Jinak nette.ajax, jquery a bootstrap mám nainstalované ručně, tak předpokládám, že mi žádná důležitá závislost nechybí.
- o5
- Člen | 416
@Šaman Fůůůk :) Ten post-install-cmd asi nebyl dobrej nápad, myslel jsem si, že Bower už je dnes standart. Dopíšu requires Bower do readme, protože nedokážu si moc představit nový projekt co vzniká bez Bower-u. Ale dík za upozornění.
Každopádně Bower za tebe řeší tu otročinu a to stahovat nějaký klientský knihovny ručně a dávat je do www/js apod, ale jestli to používat nechceš, tak si to samozřejmě dotahej a naházej do www/js ručně.
- Šaman
- Člen | 2659
Já jsem jen backenďák, takže žádné kupy js neřeším :)
Ale co jsem probral ty tvoje importovaný scripty, tak jsou to všechno jen
ozdobný serepetičky. Plus datetime picker, ale ten jsem teď neřešil.
Z kódu mi vyplývá, že pokud používám nette.ajax, tak vůbec neimportuju main.js?
<script n:if="!$ajax" src="{$baseUri}/js/main.js{scache}"></script>
V tom případě nevim, co mi rozchodí události navěšené třeba na ten selecbox s počtem stran. Když ten soubor přilinkuju, tak to jednou projde, po ajaxovém překreslení už pak ne (ztratí se ta navěšená událost).
GRRR! Už jsem na to přišel. Jedná se o tenhle
soubor. ALE nevím proč není composerem stažený společně s ostatními
soubory. Ani když si composerem přidám Grido, dokonce ani v
grido-sandbox
není. Dá se k němu dostat jen stažením celého
repozitáře, což mě dlouho nenapadlo (u ostatních projektů composer
stahuje všechno).
Jestli se můžu přimluvit, tak to přidej, ve vendoru někde pod gridem
v podsložce client-side
to ničemu nevadí a kdo nepoužívá
bower (z backanďáků, které znám, tak nikdo) to tam najde a načte si ho
ručně. Takhle při stažení composerem chybí některé soubory, aniž by
o nich někde byla zmínka.
- o5
- Člen | 416
ALE nevím proč není composerem stažený společně s ostatními soubory
Tohle je divný, protože composer stáhne celý repozitář, tedy i client-side složku. Teď jsem si to ověřil u projektu kde mám Grido přes composer loadnutý.
- Pavel Kravčík
- Člen | 1195
@o5 @Šaman: grido.ajax.js tam bylo, ale ručně je potřeba stáhnout typeahead.js a history.js a samozřejmě nette.ajax.js. Pro začátečníka bez firebugu to může být trošku zdlouhavé a matoucí, co mu kde chybí.
- Šaman
- Člen | 2659
Opravdu nikoliv. Tohle se mi stane, když nemám bower. Vyzkoušeno naposledy během psaní příspěvku.
composer create-project o5/grido-sandbox grido-sandbox
- Ve složce
grido-sandbox\vendor\o5\grido\client-side\
jsou právě jen dva soubory –grido.css
agrido.js
. Kdyby tam byly i ty pluginy, tak by mě to trklo hned při prvních pokusech.
IMHO tobě ten soubor stahuje bower, ne?
- Šaman
- Člen | 2659
Záhada odhalena. Grido-sandbox si neříká o @dev verzi, tak dostane poslední stabilní 2.0.8
- strunc
- Člen | 7
Prosím, potřebuji přednastavit nějakou podmínku pro výběr dat do gridu. Tato podmínka se bude z vnějšku měnit, takže to nemohu nastavit staticky v ‚Model‘. Zkouším metodu ‚setDefaultFilter‘, ale nenašel jsem nikde správný tvar jak pole, které je parametrem pro ‚setDefaultFilter‘ má mít strukturu. Jako DB mám MySQL. Děkuji za radu.
- o5
- Člen | 416
@strunc $grid->setDefaultFilter() nastaví výchozí (gridem definované) filtry, přičemž parametrem je pole ve formátu [<název_filtru> ⇒ <výchozí_hodnota>].
Pokud chceš nastavit nějakou jinou podmínku, tak bys to měl asi dělat v modelu. Třeba nějak takto:
//ArticlePresenter.php
function createComponentGrid($name)
{
$grid = new Grid($this, $name);
$grid->setModel($this->articleModel->getList($where));
}
//ArticleModel.php
function getList(array $where = array())
{
$list = $this->database->table($this->tableName);
foreach ($where as $condition => $value) {
$list->where($condition, $value);
}
return $list;
}
Editoval o5 (23. 1. 2015 17:36)
- Desttro
- Člen | 126
Zdravím,
nechápu proč Grido mi vyhazuje u tohoto kódu tohle:
Warning
strtoupper() expects parameter 1 to be string, object given
$grid->addFilterSelect('supplier_id', 'Dodavatel', HomepagePresenter::getSuppliers());
zde je metoda:
public function getSuppliers()
{
$row = $this->database->table('supplier')
->select('id, name')
->order('name ASC')
->fetchPairs('id', 'name');
return ($row) ? $row : NULL;
}
Děkuji za radu
zdeje celý můj HomepagePesenter
class HomepagePresenter extends BasePresenter
{
/** @var Nette\Database\Context @inject */
public $database;
public function getSuppliers()
{
$row = $this->database->table('supplier')
->select('id, name')
->order('name ASC')
->fetchPairs('id', 'name');
return ($row) ? $row : NULL;
}
protected function createComponentGrid($name)
{
$grid = new \Grido\Grid($this, $name);
$grid->model = $this->database->table('manufacturing');
//$row = $this->database->table('manufacturing')->fetch();
//dump($row->suppliers->name);
$grid->addColumnText('supplier_id', 'Dodavatel')
->setSortable()
//->setColumn(function($item){return $item->supplier->name;});
->setColumn(function($item){return $item->supplier->name;});
$grid->addColumnText('order_id', 'č. o.')
->setSortable()
->setFilterText()
->setSuggestion();
$grid->addColumnText('orderp', 'č. p. o.')
->setSortable()
->setFilterText()
->setSuggestion();
$grid->addColumnText('material', 'Materiál')
->setSortable()
->setFilterText()
->setSuggestion();
$grid->addColumnText('dimension', 'Rozměr')
->setSortable()
->setFilterText()
->setSuggestion();
$grid->addColumnDate('required_date', 'Požd. term.', \Grido\Components\Columns\Date::FORMAT_DATE)
->setSortable()
->setFilterDate();
$grid->addColumnDate('confirmed_date', 'Potvrz. term.', \Grido\Components\Columns\Date::FORMAT_DATE)
->setSortable()
->setFilterDate();
$grid->addColumnDate('delivery_date', 'Term. dodání', \Grido\Components\Columns\Date::FORMAT_DATE)
->setSortable()
->setFilterDate();
$grid->addColumnText('delivered', 'Dodáno')
->setSortable()
->setFilterText()
->setSuggestion();
$grid->addColumnText('note', 'Poznámka');
$grid->addFilterSelect('supplier_id', 'Dodavatel', HomepagePresenter::getSuppliers());
$grid->addActionHref('edit', 'Edit')
->setIcon('pencil');
$grid->addActionHref('delete', 'Delete')
->setIcon('trash')
// ->setConfirm(function($item) {
// return "Are you sure you want to delete {$item->firstname} {$item->surname}?";
// })
;
$grid->filterRenderType = $this->filterRenderType;
$grid->setExport();
}
}
Editoval Desttro (26. 1. 2015 8:44)
- Pavel Kravčík
- Člen | 1195
Proč vlastně tu metodu voláš přes ::? Stačí $this->.
Jinak asi si zkoušel smazat ten řádek s filtrem jestli to funguje předpokládám. A co když tam to pole vložíš ručně? Tohle je zvláštní chyba. Možná bude dobrá nápad pokusit se tu chybu zduplikovat na sandboxu Nette v nových verzích.
- Desttro
- Člen | 126
Zkouším takto, jako je kód dole ale furt:
Warning
strtoupper() expects parameter 1 to be string, object given
$grid->addColumnText('order_id', 'č. o.');
$grid->addFilterSelect('supplier_id', 'Dodavatel', array(
'' => '',
'Firma1' => 'Firma1',
'Firma2' => 'Firma2',
'Firma3' => 'Firma3'
));
Verzi Nette mám poslední stabilní, no škoda, Grido se mi honě líbí ale asi budu muset použít něco jiného
- Desttro
- Člen | 126
o5 napsal(a):
Desttro napsal(a):
no škoda, Grido se mi honě líbí ale asi budu muset použít něco jiného
Nevyhrožuj a klidně něco jiného použij :) Ono stejnak ty příspěvky co jsi tady psal, nemají s Grido nic společného.
Nevyhrožuju :D já bych moc rád Grido používal, ale potřebuju aby to fungovalo a nemůžu přijít na to, kde ta chyba je. Moc rád bych byl za pomoc. Kde teda chyba může být? Dělám něco špatně? Určitě bude problém mezi monitorem a židlí, ale nevím kde dělám chybu.
Děkuji
Editoval Desttro (27. 1. 2015 13:22)
- o5
- Člen | 416
Desttro napsal(a):
ale potřebuju aby to fungovalo a nemůžu přijít na to, kde ta chyba je.
Slyšel jsi někdy o tzv. debugování? Ono totiž ta chyba co si tady posílal obsahuje ještě jednu docela užitečnou věc a to je název souboru a dokonce i číslo řádku, kde ten problém nastal. Takže si prostě otevřeš ten soubor a podíváš se tam! Z toho co si sem poslal ti nikdo nedokáže poradit, protože zřejmě posíláš něco co s tím absolutně vůbec nesouvisí.
- Desttro
- Člen | 126
o5 napsal(a):
To už je lepší, pošli klikatelnou laděnku.
Nechápu proč, ale když použiju tohle:
$grid->addColumnText('supplier_id', 'Dodavatel')
->setColumn($this->getSuppliers());
tak to vyhodí tuto chybu: http://petrsabrnak.eu/…/chyba1.html
edit: s vypnutým debuggem:
http://petrsabrnak.eu/…eption1.html
když to předělám takhle, tak to funguje:
$grid->addColumnText('supplier_id', 'Dodavatel')
->setColumn(function($item){return $item->supplier->name;});
No, ale když vyberu select např. na Firma1, tak to vyhodí tuto chybu:
http://petrsabrnak.eu/…/chyba2.html
edit: s vypnutým debuggem:
http://petrsabrnak.eu/…eption2.html
Zde je celý kód:
namespace App\Presenters;
use Nette,
App\Model;
class HomepagePresenter extends BasePresenter
{
/** @var Nette\Database\Context @inject */
public $database;
public function getSuppliers()
{
$row = $this->database->table('supplier')
->select('id, name')
->order('name ASC')
->fetchPairs('id', 'name');
return ($row) ? $row : NULL;
}
protected function createComponentGrid($name)
{
$grid = new \Grido\Grid($this, $name);
$grid->model = $this->database->table('manufacturing');
//$grid->addColumnText('supplier_id', 'Dodavatel')
// ->setColumn($this->getSuppliers());
$grid->addColumnText('supplier_id', 'Dodavatel')
->setColumn(function($item){return $item->supplier->name;});
$grid->addFilterSelect('supplier_id', 'supplier_id', array(
'' => '',
'Firma1' => 'Firma1',
'Firma2' => 'Firma2',
'Firma3' => 'Firma3'
));
}
Děkuji za pomoc
Editoval Desttro (27. 1. 2015 15:53)
- Desttro
- Člen | 126
Tak už jsem to nějak rozchodil, ale narazil jsem na další problém, se kterým si nevím rady (mám tam i funkční odkaz na laděnku) https://forum.nette.org/…rray-problem#…
Děkuji za radu
- Pavel Kravčík
- Člen | 1195
Desttro napsal(a):
Tak už jsem to nějak rozchodil
Bylo by fajn popsat problém, ukázat řešení, třeba to někomu pomůže. :)
- Desttro
- Člen | 126
kzk_cz napsal(a):
Desttro napsal(a):
Tak už jsem to nějak rozchodil
Bylo by fajn popsat problém, ukázat řešení, třeba to někomu pomůže. :)
To máš pravdu, bohužel řešení bylo, že jsem to udělal znova a
fungovalo to – nechápu proč.
U obou řešení je ta stejná databáze i stejný postup:
$grid->addColumnText('suppliers_id', 'Dodavatel')
->setSortable();
->setColumn('suppliers.name');
U prvního to vyhodí tuto chybu:
Nette\MemberAccessException
Cannot read an undeclared column ‚suppliers.name‘.
laděnka: http://uoerebor.cz/…tabulka.html
druhý funguje bez problému – nechápu.
První generuje tento SQL dotaz:
SELECT `id`, `suppliers_id`, `order_id`, `orderp`, `material`, `dimension`, `required_date`,
`confirmed_date`, `delivery_date`, `delivered`, `note`
FROM `manufacturing`
LIMIT 4
druhý (funkční) generuje tohle:
SELECT `id`, `supplier_id`, `suppliers_id`, `order_id`, `orderp`, `material`, `dimension`,
`required_date`, `confirmed_date`, `delivery_date`, `delivered`, `note`
FROM `manufacturing`
LIMIT 4
nechápu, proč ten jede a ten ne – dělal jsem stejný postup
Editoval Desttro (28. 1. 2015 11:37)
- Desttro
- Člen | 126
Zdravím,
řešil někdo duplikaci/kopírování řádku? Např. checkboxy vyberu
5 položek vyberu přes selectbox operation a vyberu duplikovat – zduplikuje
to přesně ty vybrané řádky ale samozřejmě s jiným ID.
Nebo ještě přes tlačítko „duplikovat“
Takhle jsem vyřešil mazání, ale nemohu přijít na duplikaci.
public function actionDelete()
{
$id = $this->getParameter('id');
$id_out = is_array($id) ? implode(', ', $id) : $id;
$this->database->table('manufacturing')->where('id', $id)->update(array('trash' => '1'));
$this->flashMessage("Action '$this->action' for row with id: $id_out done.", 'success');
$this->redirect('default');
}
ve skutečnosti nemažu ale jenom nastavuju sloupeček trash na 1 a v modelu mám ať vypíše pouze s „trash“ kde je 0
děkuji za rady
- orion05
- Člen | 9
Ahojte,
vybral som si tento datagrid, pretože zo všetkých odskúšaných bol pre mňa najvhodnejší aj kvôli existujúcemu API
Čo však neviem zakomponovať, teda možno už je na to niekde odpoveď, len tú som nenašiel, je aby sa pri zmene hodnoty jedného filtra zmenili hodnoty v selecte aj pre druhy filter. Funkcie vracajuce pole pre select mam spravene, grido funguje ajaxovo. tu je ukazka kodu:
<?php
protected function createComponentGrid($name)
{
$grid = new \Grido\Grid($this, $name);
$basePath = $this->template->basePath;
$repository = $this->database->getRepository('App\Geocaching');
$model = new \Grido\DataSources\Doctrine(
$repository->createQueryBuilder('a')
->addSelect('c')
->innerJoin('a.country', 'c')
->innerJoin('a.type','b'),array('country' => 'c.country','type' => 'b.name'));
$grid->model = $model;
$grid->setDefaultSort(array('added' => 'desc'));
$grid->setFilterRenderType(\Grido\Components\Filters\Filter::RENDER_INNER);
$grid->addColumnText('id', 'ID')
->setSortable();
$grid->addColumnText('country', 'Krajina')
->setCustomRender(function($item) use ($basePath){
$img = Html::el('img')->src("$basePath/images/flags/shiny/16/".$item->country->image);
return "$img".$item->country->country;
})
->setSortable()
->setColumn('country')
->setFilterSelect($this->getCountryFilter());
$grid->addColumnText('type', 'Typ')
->setCustomRender(function($item) use ($basePath){
$img = Html::el('img')->src("$basePath/images/gcTypes/".$item->type->image);
return "$img".$item->type->name;
})
->setSortable()
->setFilterSelect($this->getTypeFilter());
$grid->addColumnText('name', 'Názov')
->setSortable();
$grid->addColumnText('region', 'Región')
->setSortable();
$grid->addColumnText('district', 'Okres')
->setSortable()
->setFilterSelect();
$grid->addColumnText('town', 'Mesto')
->setSortable()
->setFilterSelect();
$grid->addColumnText('altitude', 'Výška')
->setSortable()
->cellPrototype->class[] = 'center';
//FILTERS SET
$filter = $grid->getActualFilter();
$grid->getFilter('country')->setColumn('c.id');
$grid->getFilter('type')->setColumn('b.id');
}
?>
Proste a jednoducho ked zmenim filter krajiny na konkretnu krajinu, ajaxovo sa vykreslia vysledky podla krajiny, len chcem este k tomu zmenit filter regionov aby boli na vyber regiony z konkretnej krajiny
- v6ak
- Člen | 206
Nedávno jsem narazil na tento commit:
daaf5ed6a3c58b278d6d1b973b69b800e1048521
:
DataSources\DibiFluent: Fixed possible SQL injection
Je určitě fajn, že jsi to opravil. Bude k tomu i nějaké upozornění, že je v případě používání DibiFluent potřeba upgradovat?
- o5
- Člen | 416
@v6ak: uff, tos mě dostal, díky za připomínku. Přiznám se, že dibi už nepoužívám a vycházel jsem z toho, že podobná věc už v Grido bude téměř rok.
- Pavel Kravčík
- Člen | 1195
Funguje Grido v multiplieru? Nějak se mi to nedaří rozjet. Ať zkouším, co zkouším stále se mi to nedaří. Pokud vyměním Grido za UI/Form tak mi to funguje.
public function createComponentGrid($name)
{
return new Multiplier(function ($itemId) use ($name) {
$grid = new \Grido\Grid($this, $name);
return $grid;
}
}
- Oli
- Člen | 1215
Ahoj,
jakým způsobem můžu vykreslit po editaci to co bylo před editací? Mě to
vždycky vrátí ty data, která byla uložena do db. Pokud edituju pomocí
selectboxu tak mě to vrátí ID, pokud edituju odkaz, tak mě to vrátí plain
text. Používám doctrine a mám to takhle:
odkaz
$grid->addColumnText('name', 'name')
->setCustomRender(function ($row) {
return \Nette\Utils\Html::el('a')
->href($this->presenter->link('Schools:edit', [$row->id]))
->setText($row->name);
})
->setEditableCallback(function ($id, $newValue) {
$school = $this->schoolsDao->findById($id);
$school->name = $newValue;
$this->schoolsDao->save($school);
return true;
})
->setEditableRowCallback(function($id, $column) {
// zkoušel jsem i return $this->schoolsDao->findById($id);
$row = $this->schoolsDao->findById($id);
return \Nette\Utils\Html::el('a')
->href($this->presenter->link(':Admin:Schools:edit', [$row->id]))
->setText($row->name);
})
->setFilterText()
->setColumn('name')
->setSuggestion();
select
$grid->addColumnText('schoolType', 'schoolType')
->setColumn('schoolType.id')
->setEditable()
->setEditableControl(new \Nette\Forms\Controls\SelectBox(NULL, $array))
->setEditableCallback(function ($id, $newValue, $oldValue, $column) {
$school = $this->schoolsDao->findById($id);
$type = $this->schoolsDao->fetchSchoolType($newValue);
$school->schoolType = $type;
$this->schoolsDao->save($school);
return true;
})
->setEditableRowCallback(function($id, $column) {
return $this->schoolsDao->findById($id);
})
->setCustomRender(function ($row) {
return $row->schoolType->type;
})
->setFilterSelect($array))
->setColumn('u.schoolType');
edit: měl jsem starý grido.js. S novým to už funguje tak jak má
Editoval Oli (6. 2. 2015 11:20)
- Pavel Kravčík
- Člen | 1195
@pepakriz Díky. Já jsem to samozřejmě zkoušel bez jména komponenty. Ale házelo mi to chybu. To s jménem byla až asi čtvrtá verze. Každopádně to už funguje. Asi cache nebo jsem se někde přehlédl. What kind of sorcery is this. :)
- Martk
- Člen | 661
@o5 přidal by jsi do csv exportu nastavení delimeter a enclosure ? Možná se bude pro ostatní hodit nastavit tyto dvě proměnné.
- o5
- Člen | 416
@kybrex: Je tam taková věc (už od začátku), že aby v url nebyl balast, tak po filtrování se provede navíc ještě jeden request, který zmínený balast odstraní. Taky se mi to (už) nelíbí, protože místo jednoho requestu jsou dva, ale jinak to v non-ajax módu řešit IMO nejde. Při zapnutém ajax módu, se provádí jeden request a přes HTML5 history API se do url doplní pouze ty parametry, které jsou potřeba. Napadá mě, že máš nějak blbě nabindovaný ajax extension, protože v demu to funguje.
@Antik: V exportu je aktuálně bug s memory limitem, takže to tam možná přidám až se dostanu k té opravě. Stejnak ale nechápu moc potřebu měnit separátor, je to CSV (comma-separated values), ale když ta fputcsv() fce ty parametry má, tak asi jo.