Grido – DataGrid pro Nette
- dj.kure
- Člen | 70
Já tu mám takový menší problém, nevím proč, ale Grido mi úplně
ignoruje parametr „ID“ v řazení.
Zde na obrázku je vidět, že v URL adresního řádku ID je (1) a v odkazu
sortu Gridu není :-( a já prostě nevím za boha proč.
Edit: A co tak koukám, tak Grido ignoruje naprosto všechny parametry.
Edit: Tak nakonec stačilo jen jednoduché řešení, proč mě to jen
nenapadlo dříve:
/** @persistent */
public $id;
Editoval dj.kure (21. 4. 2016 22:00)
- drick
- Člen | 61
Mam mensi problem, mozno mi bude vediet niekto poradit. Prednedavnom mi tu CzechBoy poradil vytvorit nejaky takyto selection pri vybere dat z viacerych tabuliek:
$selection = $this->database->table('profiles')->select('profiles' . '.*')->select('user' . '.*');
$grid->setModel($selection);
Funguje to dobre, no problem mam pri filtrovani. Dostavam ajax error – v konzole som si pozrel a problem je v tom, ze stlpec z tabulky users sa nenachadza v profiles. Ako by som to mohol fixnut? Da sa niekde v ->setFilterText() nastavit, z ktorej tabulky dany stlpec je?
- drick
- Člen | 61
Oli napsal(a):
Ukaž ještě jak vypadá definice toho tvýho sloupce. mozna by to slo i propojit jako
user.name
. Nebo pokud je ten sloupec v profiles i v user, tak si tam na něj vytvoř alias.
No profiles tabulka vyzera v skratke nejak takto: id, user_id, birth_date, avatar. Users vyzera: id, password, email
- cize prepojit sa to da v profiles iba cez user_id, ktore sa viaze v users na id
- vies mi prosim ta uviest priklad pod tym co myslis „vytvorit alias“?
Editoval drick (1. 5. 2016 22:39)
- drick
- Člen | 61
Oli napsal(a):
No já jsem spíš myslel jak ten slpuec vypadá v grido
$grido->addTextColumn()...
.
Ten alias pro tebe nemá smysl. myslel jsem normálně->select('name AS user_name')
pokud by jsi měl například sloupec name v obou tabulkách.
No ten stlpec vyzera uplne jednoducho:
$grid->addColumnText('name', 'Name')
->setFilterText()
->setSuggestion();
- Šaman
- Člen | 2659
Bower mi nechce naistalovat závislost
"grido": "git@github.com:o5/grido.git#ef677c3"
, tvrdí mi, že byl
přidán RSA klíč a že ‚permission denied (publickey)‘.
Edit: V příspěvku jsem upravil verzi. "grido": "2.1.0"
funguje, spouštěl jsem bower v jiném projektu. Ale nefunguje ve verzi,
která je uvedená když si composerem nainstaluji
grido-examples
.
Editoval Šaman (4. 5. 2016 21:02)
- o5
- Člen | 416
vymak napsal(a):
Lze u tohoto Gridu nějak odchytit, že uživatel změnil počet záznamů na stránku?
Přímo event tam na to není, ale pokud máš potomka hlavní třídy Grido, můžeš si to přidat někde tady.
Šaman napsal(a):
Proč Grido v composeru vyžaduje PHP 5.5?
PHP 5.4 už nyní nemá oficiálně ani security support. Do současné dev-verze mám v plánu přidat ještě dvě velké novinky a releasnu verzi 3.0.
Šaman napsal(a):
Bower mi nechce naistalovat závislost „grido“: „git@github.com:o5/grido.git#ef677c3“, tvrdí
mi, že byl přidán RSA klíč a že ‚permission denied (publickey)‘.
V Bower lze rovněž definovat závislost takto:
"grido": "https://github.com/o5/grido.git#1351b7978d4822197339c3b7da47e88ab80d4a22"
- Šaman
- Člen | 2659
@o5: No, to PHP 5.4 je ještě na velkém procentu serverů a i když sám vyvíjím na 5.6, tak nemám třeba v aktuální zakázce možnost ovlivnit PHP která běží na serveru. 5.4 je docela v pohodě, není to vyloženě archaická verze a je to také verze kterou podporuje Nette (a ještě dlouho bude). Takže by mě zajímalo, jestli a případně v čem Grido vyžaduje 5.5, abych věděl, že ho třeba občas nemohu použít. Zatím jsem nenarazil na problém, jen na tu podmínku v composeru.
Co se týče toho načítání, tak nemluvím o běžném použití Grida
(to jedu na stabilní verzi), ale mluvím o balíčku
grido-examples
, které ji využívá. Takže tohle nefunguje:
composer create-project grido-examples
cd grido-examples
bower install
Poslední řádek vyhodí chybu o které píšu. Pak jsem sice zjistil, že ty závislosti bowerem ani nejsou potřeba, ale i tak je to matoucí. Když už tam ten bower jednou je, tak má koukat aby byl. :)
O tom, proč jsem si instaloval grido-examples
se rozepíšu
v samostatném příspěvku, to vypadá na větší problém.
Editoval Šaman (9. 5. 2016 11:47)
- vymak
- Člen | 92
o5 napsal(a):
vymak napsal(a):
Lze u tohoto Gridu nějak odchytit, že uživatel změnil počet záznamů na stránku?
Přímo event tam na to není, ale pokud máš potomka hlavní třídy Grido, můžeš si to přidat někde tady.
Díky za nasměrování, zkoušel jsem ale stále to neřeší můj
problém.
Mám grid kde například nastavím
50 záznamů na stránce a stisknu tlačítko, které provede
AJAX aktualizaci gridu.
public function handleRefresh()
{
$this->redrawControl('grid');
}
Po aktualizaci mám ale nastavenu výchozí hodnotu bez ohledu na původní nastavenou hodnotu. Jak to co nejčistěji vyřešit?
- Marsme
- Člen | 75
Potřeboval bych trošku pomoct s gridem. Mám grid a data k němu z dibi. V modelu si vytáhnu data pro grid ale potřebuji jeden sloupeček jako multihodnotu (rozuměj třeba výpis 15, 16) s tím že ideálně aby 15 a 16 šly ještě upravit tak že to budou odkazy. Použil jsem pro to customRender a tam obalil čísla odkazem. Všechno v pohodě funguje až na jeden detail. Nefunguje nad takto vytvořeným sloupcem filtr.
Nějaký nápad jak ten filtr rozchodit? Kód je níže.
$grid->addColumnText('focus', $this->translator->translate('locale.focuses'))
->setCustomRender(function ($row) use ($order, $_this) {
$gridFocuses = $order->getOrderFocusesToGrid($row->id);
$data = '';
foreach ($gridFocuses as $gf) {
$data .= '<a href="' . $_this->presenter->link('Focus:edit', array('id' => $gf['focus_id'])) . '">' . $gf['focus_id'] . '</a>, ';
}
return $data;
})
->setSortable()
->setFilterText();
- Šaman
- Člen | 2659
Pošlu ti řešení, ale dlužíš mému klientovi pivo za proplacených minimálně 10 hodin, které jsem strávil nad tímto problémem :)
- Aby bylo možné používat SQL fci FIND_IN_SET (jiný způsob jsem
neobjevil), tak je potřeba mít množinu hodnot oddělených čárkou bez
mezery, tedy např
2,5,21,22
. - Proto mám pro práci s tímto připravený sql pohled, který mi z vazeb
vytvoří dva sloupce – jeden pro zobrazení (dejme tomu
CZ, SK, GB, ES
), druhý pro filtrování (1,5,21,22
). Odkazy jsem v tomto případě neřešil. - Připravím si pole pro filtr ve tvaru
$units = ['all' => "Všechno", 'none' => "Nic", '1' => "CZ", '2' => "PL" …]
- A pak přidám filtr na sloupec který zobrazuji (u mě
unit_code_list
), ale filtruji na úrovni SQL podle toho druhého, s IDčkama (unit_id_list
).
<?php
$grid->addFilterSelect('unit_code_list', "", $units)
->setWhere(function($value, DibiFluent $fluent){
if($value === 'all') {
return;
}
elseif($value === 'none') {
$fluent->where('[unit_id_list] IS NULL');
}
else {
$fluent->where('FIND_IN_SET(%s, [unit_id_list]) > 0', $value);
}
});
?>
P.S. Ukázka pracuje s odděleními, ale jejich kódy jsem nahradil
zkratkami zemí. Tak se tím nenech zmást :)
P.P.S. Když o tom tak uvažuji, možná by existovalo řešení bez těch
pomocných sloupců. K tomuto jsem se dopracoval když jsem zkoušel používat
zdokumentované fce Grida, ale až úplně nakonec jsem ze zdrojáků zjistil,
jak zapsat úplně vlastní podmínku, která nectí formát metody
setCondition
. Jenže tou dobou už jsem řešení založené na
pohledech.
Editoval Šaman (23. 5. 2016 11:24)
- destrosvet
- Člen | 2
Zdravím,
potřeboval bych trošku nakopnout při stylování filtrů grida. Mám je venku
Filter::RENDER_OUTER
a chtěl bych trošku přestylovat inputy,
případně tlačítka. Jsem schopný se dostat přes pole filtrů a
->controlPrototype->class[]
k inputům ale potřeboval bych
span nad tím. Přes $filter->getWrapperPrototype()
zase dostanu
th, i když jsem to zkoušel přepisovat, nějak se to nechtělo propagovat do
html.. takže nevím, je nějaká možnost?
Díky
- o5
- Člen | 416
@destrosvet: Použij vlastní šablonu a přepiš si blok outerFilterWrapper
@kedarus: Pokud vím, tak Nette 2.4 je stále v RC verzi a zatím jsem se ještě nedostal k testu. Shodou okolností jsem včera rozpracoval podporu modálních akcí a zbývá to už jen trochu poladit, tak možná tento nebo příští týden bych se mohl dostat na test s Nette 2.4 a vydat konečně Grido 3.0!
- destrosvet
- Člen | 2
Díky, taky mě to napadlo, ale než se do toho pustím, chtěl jsem vědět
jestli neexistuje ještě nějaká možnost ;)
Díky
o5 napsal(a):
@destrosvet: Použij vlastní šablonu a přepiš si blok outerFilterWrapper
- kolsi
- Člen | 131
Když něco napíšu do inner-filtru zmáčknu Enter, tak to sice odešle požadavek, ale filtr se neaplikuje. Zjistil jsem, že za to nejspíše může pořadí buttonů a při zmáčknutí Enteru ve filtru se odešle tlačítko „Items per page“ a nikoli „Search“.
Chtěl jsem ověřit, zda to dělá i v live demu, ale ten web
nefunguje.
Zdá se, že to dělá až od určité verze, protože v SW, kde máme starou
verzi Grida, to funguje.
- akadlec
- Člen | 1326
Nevím zda se to tu již neřešilo (nechce se mě prolézat 21 stránek) ale filtry mají jeden neduh :/ Pokud mám ve filtru dynamická data která se můžou v čase změnit (rozuměj smazat) a zároveň je filtr na ty data zapnut tak to lehne na nettím erroru že se pokouší pracovat s položkou selectu kterou nezná.
Nette\InvalidArgumentException: Value 'XX' is out of allowed set [YY,...]
- Oli
- Člen | 1215
Pokud edituju položku pomocí
->setEditableCallback(function ($id, $newValue) {}
je nějaká
možnost refreshnout celý grid, zobrazit flash zprávu nebo udělat cokoli by
uživatel viděl, kromě eidtace samotné buňky?
Mám grid, kde jen jedna položka může být aktivní a aktivování položky se ostatní položky zneaktivní. Problém je, že to uživatel nevidí a ani mu nemůžu napsat hlášku že si má refreshnout stránku…
- Ondris
- Člen | 37
Ahoj,
mám nastaveno několik filtrů a v jednom mám výchozí hodnotu nastavenou tímto způsobem:
$templateId = $this->getParameter("id");
$grid->addColumnNumber("templateId", "ID šablony")
->setFilterNumber()
->setDefaultValue($templateId);
Pokud vypnu ajax je vše v pořádku, ale při zapnutém ajaxu nastává jeden problém. Pokud u tohoto filtru hodnotu smažu a dám vyhledat, tak se posílá request i s tím výchozím parametrem. Pokud parametr změním na něco jiného, už je to zase v pořádku.
- Landsman
- Člen | 152
Hola,
taky mám dotaz.
Jak opodmínkovat toto:
$grid->addActionHref('delete', 'Smazat')
->setIcon('trash')
->setConfirm(function($item) {
return "Opravdu chcete odstranit rezervační formulář {$item->id} ?!";
});
aby se vyrenderovalo pouze pokud je $item->default null?
díky
Editoval Landsman (29. 8. 2016 20:41)
- stemba
- Člen | 20
Ahoj, mám problém se Editable sloupcem.
Aktivuji ho jako:
<?php
$statusPairs = array(
"user" => "Uživatel",
"admin" => "Administrator",
"redactor" => "Redaktor"
);
$selectBox = new \Nette\Forms\Controls\SelectBox(NULL, $statusPairs);
$grid->getColumn('status')->setEditable($storeChangeStatus, $selectBox);
?>
Potřeboval bych u každého záznamu měnit prvky $statusPairs
v select boxu na základě aktuální hodnoty v daném sloupci.
V podstatě, aby se u každého řádku mohli zobrazit jiné prvky
v selectboxu.
Díky
- libik
- Člen | 96
Ahoj,
mam u kazdeho radku nekolik tlacitek (edit/smazat/parametry apod.) a rozhoduju, jestli ho muzu zobrazit uzivateli dle jeho opravneni. Takze setDisable() u kazdeho tlacitka zjistuje, zda ho schovat nebo ne podle ID polozky a jeho prav. Lze nejak toto provest jen jednou v ramci radku pro vsechny tlacitka najednou?
Diky
- libik
- Člen | 96
Mno, mam grido 2.0.3 a callback mi vraci:
<?php
$disabled = function($row)
{
dump($row);
return true;
};
dump($disabled);
?>
<?php
Closure #8dae
file => ".........\MenuPresenter.php" (69)
line => 391
variables => array ()
parameters => "$row" (4)
?>
Pricemz dump v callbacku se nevypise vubec.
- black1101
- Člen | 21
Dobrý deň, prosím Vás mám problém s inline editáciou. Potreboval by som spraviť, aby po dvojkliknutí nevybehla klasická možnosť editovania pomocou textového inputu ale pomocou select boxu a po vybraní možnosti sa dáta aktualizujú.
Niečo podobné ako je pre checkbox:
$control = new \Nette\Forms\Controls\Checkbox;
$grid->getColumn('rep_option')->setEditableControl($control);
$grid->getColumn('rep_option')->setEditable()->setEditableCallback(function($id, $newValue, $oldValue, $column) {
return $this->usersRep->updateUser($id, $newValue, $column);
});
Je to možné urobiť nejakou jednoduchou cestou? Ďakujem veľmi pekne za Váš tip a pomoc. Prajem pekný deň.
- o5
- Člen | 416
libik napsal(a):
Tak jeste jinak, vetsinu podminek mam spolecnou, ale u nekterych tlacitek jeste neco navic. Muzu si teda tu vetsinu poresit jednou a vysledek predat v promenne do setDisable() a pouzit jako dalsi ‚return $disabled‘? Kdyz si predam ten callback tak tam vysledek neni.
Ty mas spis problem se samotnym pochopenim anonymnich fci v PHP.
<?php
$disabled = function($row)
{
dump($row);
return true;
};
dump($disabled);
?>
Nelze ocekavat vysledek prvniho dump
kdyz tu fci nevolas.
Editoval o5 (16. 9. 2016 11:00)
- cujan
- Člen | 410
aute snazim sa pouzit grido a mam nasledujucu chybu
callback() is deprecated; use native PHP callback.
komponent vytvaram takto…
public function createComponentStanovisteGrid($name) {
$grid=new \Grido\Grid();
$grid->setModel($this->database->table('stanoviste'));
$grid->addColumnText('nazov', 'nazov');
return $grid;
}
- cujan
- Člen | 410
Caute, ako zobrazit data slpca prepojeneho cez cudzi kluc? Konkretne idStanoviste mam prepojene na tabulku stanoviste
public function createComponentVcelstvoGrid(){
$grid = new \Grido\Grid();
$grid->setModel($this->database->table('vcelstvo')->where('idUsers', $this->user->getId()));
$grid->addColumnText('nazov', 'Názov');
$grid->addColumnText('idStanoviste', 'Stanovište');
$grid->addActionHref('edit', 'Edituj');
$grid->addActionHref('delete', 'Zmaž');
return $grid;
}
- cujan
- Člen | 410
CZechBoY napsal(a):
No ty asi nechceš idStanoviste, ale nějaký data z tabulky stanoviste, ne?
Takže něco jako$grid->addColumnText('stanoviste.nazov', 'Stanoviště');
super funguje to…este na ten predchadzajuci dotaz mi nevies poradit? Ze vramci detailu potrebujem vytiahnut grid vlastnosti podla id vyrobku ktoreho detail sa prave zobrazuje…
moj grid
public function createComponentLiecenieGrid($id){
$grid = new \Grido\Grid();
$grid->setModel($this->database->table('liecenie')->where('idVcelstvo',$id));
$grid->addColumnDate('datumLiecenia', 'Dátum liečenia');
$grid->addColumnText('idLiecivo', 'Názov liečiva')->setColumn(function($item){ return $item->liecivo->nazov;});
return $grid;
}
}
Vdaka
- CZechBoY
- Člen | 3608
@cujan
No buď si můžeš vzít parametr přímo z parametrů presenteru
$id = $this->getParameter('id');
nebo si ho v action metodě uložit někam do privátní třídní proměnný presenteru
class AbcPresenter extends Presenter
{
private $id;
public function actionDetail($id)
{
$this->id = $id;
...
}
protected function createComponentGrid()
{
$id = $this->id;
...
}
}
- cujan
- Člen | 410
CZechBoY napsal(a):
@cujan
No buď si můžeš vzít parametr přímo z parametrů presenteru$id = $this->getParameter('id');
nebo si ho v action metodě uložit někam do privátní třídní proměnný presenteru
class AbcPresenter extends Presenter { private $id; public function actionDetail($id) { $this->id = $id; ... } protected function createComponentGrid() { $id = $this->id; ... } }
super funguje, vdaka
este jedna otazka, da sa pouzit addActionEvent napr. na zmazanie konkretneho zaznamu? uvazujem, ze by som to pouzil napr. na priame mazanie zaznamov v DB…
- CZechBoY
- Člen | 3608
@cujan Přes custom render
$grid->addColumnXXX()
->setCustomRender(function($row) {
return Html::el('input', [
'type' => 'checkbox',
'disabled' => 'disabled',
'readonly' => 'readonly',
'onclick' => 'return false',
'checked' => $row['sloupec'] ? 'checked' : null
]);
});
Editoval CZechBoY (27. 10. 2016 22:51)
- cujan
- Člen | 410
CZechBoY napsal(a):
@cujan Přes custom render
$grid->addColumnXXX() ->setCustomRender(function($row) { return Html::el('input', [ 'type' => 'checkbox', 'disabled' => 'disabled', 'readonly' => 'readonly', 'onclick' => 'return false', 'checked' => $row['sloupec'] ? 'checked' : null ]); });
nevies precosom dostal chybovu hlasku
Call to undefined method Grido\Grid::addColumnXXX().