Nextras\Datagrid – datagrid se vsim jak ma byt
- Kakaku
- Člen | 27
Zdravím, mám problém s řešením následujícího problému:
Používám chartJS koláčové grafy a v něm mám zákazníky roztřízených
do různých kategorií. Po kliknutí na koláč se mi vygeneruje url adresa,
něco ve stylu
domena.cz/ukazVsechnyZakazniky/?mnozina=ObchodniZastupce&typ=A kde tímto
datagridem tahám data.
V presenteru bych si natahnul GET parametry a pomocí podmínek zobrazil jen správné zákazníky. Co je problém, že při stránkování či řazení v URL nebudu mít ty get parametry (množina a obchodní zástupce). Nenapadá vás, jak to vyřešit?
- MW
- Člen | 626
Prosím o radu. Mám grid a posílám tam ale tento zdroj:
public function getData() {
return $this->database->table('it_devices')->select('it_devices.*,
(SELECT users.name FROM users WHERE users.id = it_devices.edited_by) AS edited_by');
}
co potřebuji ale, je inline editace a to mě ale bohužel hlásí chybu při získávání dat pro form :
Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous
a to vygeneruje toto:
SELECT `it_devices`.*,
(
SELECT `name`
FROM `users`
WHERE `users`.`id` = `it_devices`.`edited_by`) AS `edited_by`
FROM `it_devices`
LEFT JOIN `users` ON `it_devices`.`users_id` = `users`.`id`
WHERE (`id` IN (NULL))
LIMIT 25
Poradíte prosím, jak poskládat dotaz do db nebo nastavit primary pro grid?
Díky!
- David Matějka
- Moderator | 6445
@MW imho ten spatny where tam davas ty, nextras/datagrid to nedela. nevolas nad tim getData jeste neco?
- David Matějka
- Moderator | 6445
no vzhledem k tomu, ze nextras/datagrid zabudovanou inline editaci nema a vzhledem k tomu, ze nema zadne adaptery na databazove vrstvy (pouze vracis iterable data), tak to ten grid sam delat nemuze :)
- MW
- Člen | 626
Zabudovanou inline editaci má a na několika gridech mě jede. Ted mám tento grid jako komponentu a Joinovaný dotaz a ne a ne to rozchodit..
Dyt ten dotaz je getData() + id pro jeden záznam.. Potřebuji mu nějak nacpat, aby se dotazoval na tabulka.id a ne jen na id.. coz se me nedaří ani přes setRowPrimary…
EDIT:
Omlouvám se, v šabloně gridu jsem předlédl render sloupce
{$row->users->name} .
Tedy se to automaticky joinovalo na tabulku users podle ID.
ŘEŠENÍ
Přidání dalšího subselectu a ruční render:
public function getData() {
return $this->database->table('it_devices')->select('it_devices.*,
(SELECT users.name FROM users WHERE users.id = it_devices.edited_by) AS edited_by,
(SELECT users.name FROM users WHERE users.id = it_devices.users_id) AS user');
}
Editoval MW (19. 7. 2017 15:41)
- kolsi
- Člen | 131
Tento problém s „Column ‚id‘ in where clause is ambiguous“ vidím jako docela zásadní. Začne se objevovat v podstatě kdykoli je jako model nastaveno spojení více tabulek a následně grid seřazen, filtrován, editován atd. Sice se to dá „vyřešit“ tím, že se při tvoření sloupců uvede celý název sloupce včetně tabulky, ale to trochu postrádá logiku. Je trochu postavené na hlavu, abych v presenterech a controlech měl zadané názvy DB tabulek.
Nedá se toto řešit už na úrovni Nette? Donutit ho, aby tam ty názvy tabulek doplňovalo automaticky?
„Ambiguous“ sice znamená, že není zřejmé jakou tabulku použít, což ale může platit na úrovni MySQL, ale už nikoli na úrovni Nette, kde je ten dotaz tvořen právě nad „$this->database->table(xxx)“ a je tedy jasné, jakou tabulku použít.
- David Matějka
- Moderator | 6445
@MW kdyz se kouknes do release notes, tak skoro zadne, asi jen sablony a zmena redefine makra na define (a plus samozrejme to, ze nova verze vyzaduje nove nette)
- MW
- Člen | 626
David Matějka napsal(a):
@MW kdyz se kouknes do release notes, tak skoro zadne, asi jen sablony a zmena redefine makra na define (a plus samozrejme to, ze nova verze vyzaduje nove nette)
Díky moc… Nebyl jsem si jistý.. abych to neupgradoval a pak přepisoval všechny gridy nějak zásadně… Je jich tam asi 50 :)
- vymak
- Člen | 92
Ahoj,
měl bych dotaz ohledně toho, zda je úplně možné skrýt tlačítko
(i sloupec) Filter viz image.
Nyní mám v tabulce tlačítko pro filtrování, nicméně pod tímto
tlačítkem úplně chybí sloupce a je tam jen bílé místo.
Chtěl bych tedy Filter odstranit, jelikož filtrování funguje automaticky
po změně.
Definice je následující:
{define table-open-tag}
<div class="table-responsive">
<table class="table table-bordered table-striped" style="padding: 10px">
{/define}
{define table-close-tag}
</table>
</div>
{/define}
{define global-actions}
<div class="grid-global-actions pull-left" n:ifset="$form[actions]">
<div class="input-group">
{input $form[actions][action] class => 'form-control'}
<span class="input-group-btn">
{input $form[actions][process] class => 'btn btn-primary'}
</span>
</div>
</div>
{/define}
{define global-filter-actions}
{input filter class => "btn btn-primary btn-sm"}
{if $showCancel}
{input cancel class => "btn btn-default btn-sm"}
{/if}
{/define}
{define col-filter}
{input $column->name class => "input-sm form-control"}
{/define}
{define row-actions-edit}
{input save class => "btn btn-primary btn-xs"}
{input cancel class => "btn btn-default btn-xs"}
{/define}
{define row-actions-edit-link}
<a href="{link edit! $primary}" data-datagrid-edit class="ajax btn btn-primary btn-xs">{_'Upravit'}</a>
{/define}
{define pagination}
<ul class="pagination">
{if $paginator->isFirst()}
<li class="disabled"><a>« {_'První'}</a></li>
<li class="disabled"><a>« {_'Předchozí'}</a></li>
{else}
<li><a href="{link paginate!, 'page' => 1}" class="ajax">« {_'První'}</a></li>
<li><a href="{link paginate!, 'page' => $paginator->page - 1}" class="ajax">« {_'Předchozí'}</a></li>
{/if}
<li class="active">
<a><strong>{$paginator->page}</strong> / {$paginator->pageCount}</a>
</li>
{if $paginator->isLast()}
<li class="disabled"><a>{_'Další'} »</a></li>
<li class="disabled"><a>{_'Poslední'} »</a></li>
{else}
<li><a href="{link paginate!, 'page' => $paginator->page + 1}" class="ajax">{_'Další'} »</a></li>
<li><a href="{link paginate!, 'page' => $paginator->pageCount}" class="ajax">{_'Poslední'} »</a></li>
{/if}
</ul>
{/define}
Když jsem zkusil
{define global-filter-actions}
{/define}
prázdný sloupec stále přetrvává.
Nette 2.4
PHP 7.2.2
Datagrid 3.0.1
Díky.
Libor
- MW
- Člen | 626
Zdravím,
updatoval jsem na verzi 3.0.1 a NETTE 2.4.
Vše jsem rozchodil až na dvě věci, třeba se s tím někdo setkal:
1/ kam se poděl dřívější blok global-action vpravo nahoře ? Dával jsem tam např. tisk, export atd.. Nyní je to vázané na hasGlobalActionColumn – hromadné akce? Musím to dostat do šablony ručně nebo je za to nějaká náhrada ?
2/ Nefunguje mě vůbec řazení. V url vidím správný odkaz, ale stále to řadí podle primary klíče a do modelu mě $order chodí s hodnotou NULL.
Narazil na toto někdo? Nemusím mít na NETTE 2.4 @dev verzi?
Díky
- hrach
- Člen | 1838
@MW
1/ Tim, ze byla pridana podpora pro globalni akce, tak obecne to bylo movnuto
dolu. Asi by nebylo od veci vratit moznost si definovat toto policko vpravo
nahore. Jde ti o pozici? Commit zde: https://github.com/…c584a2bb7c19#…
2/ O tom nic nevim, kdy se ti to podaril onejak oddebugovat, budu rad.
- MW
- Člen | 626
@hrach
2/ O tom nic nevim, kdy se ti to podaril onejak oddebugovat, budu rad.
Jakou má mít funkci toto :
if (!$this->data) {
...
if ($this->orderColumn !== NULL && !isset($this->columns[$this->orderColumn])) {
$this->orderColumn = NULL;
}
...
}
v datagrid.php v metodě getData() ?
Protože když to dám pryč, vše funguje jak má.. Ted otázka na co to tam je? Nebo kde mám já naopak co blbě :)
Díky !
Editoval MW (1. 8. 2018 21:52)
- MW
- Člen | 626
@DavidMatějka
Klasicky přes továrnu, a svoji třídu, kde rozšiřuji původní Datagrid a zde přepisuji Render(). Ale i bez přepisování Renderu se to chová stejně. Sloupečky ale v Render metodě přidává samotný grid.
Hlavně vše funguje, kromě řazení.. leda by se mě někde ztratily $this->data .. viz ten kod nahoře, protože bez toho
if ($this->orderColumn !== NULL && !isset($this->columns[$this->orderColumn])) {
$this->orderColumn = NULL;
to vše jede jak ma…
- MW
- Člen | 626
Tak jsem na to přišel, ale nevím jak to správně vyřešit, moc prosím o radu:
ve své třídě, kterou dědím od Datagrid, přepisuji metodu AddColumn :
public function addColumn($name, $label = NULL) {
if (!$this->rowPrimaryKey) {
$this->rowPrimaryKey = $name;
}
$label = $label ? $this->translate($label) : ucfirst($name);
return $this->columns[] = new ExtColumn($name, $label, $this);
}
a to proto, že si přidávám svůj typ sloupce a tedy volám ExtColumn, což je třída, která rozšiřuje Column :
final class ExtColumn extends \Nextras\Datagrid\Column {
/** @var string */
protected $sum = FALSE;
/** @var string */
public $col = NULL;
// add sum column
public function enableSum($col = NULL) {
If($col) $this->col = $col;
$this->sum = TRUE;
return $this;
}
public function isSum() {
return $this->sum;
}
}
A tady musím mít něco blbě, protože když toto osdstraním, jede grid ja má.. Nevidíte někdo nějakou chybu prosím?
Editoval MW (2. 8. 2018 9:38)
- David Matějka
- Moderator | 6445
@MW zkratka to vypada, ze ve chvili, kdy se vola tenhle kus kodu, tak neexistuji vsechny sloupecky (respektive alespon ten, kde ktereho radis). takze si oddebuguj, kdy se to vola a jakto, ze neexisutje
- David Matějka
- Moderator | 6445
@MW ten sloupecek musis pridat pod spravnym klicem do
$this->columns
https://github.com/…Datagrid.php#L110
- ondrejd
- Člen | 22
Dobrý den, chtěl bych se zeptat, když u datagridu použiju filter, jde
nějak zakázat, aby se přidal nový sloupec pro tlačítka submit/cancel
filter?
Buď bych je potřeboval přesunout do již existujícího sloupce „actions“
nebo ty tlačítka (VČETNĚ vytvořeného nadbytečného sloupce) úplně
odstranit a ponechat odesílání filtru jen přes JavaScript.
Děkuji předem.
- ondrejd
- Člen | 22
ondrejd napsal(a):
Dobrý den, chtěl bych se zeptat, když u datagridu použiju filter, jde nějak zakázat, aby se přidal nový sloupec pro tlačítka submit/cancel filter?
Buď bych je potřeboval přesunout do již existujícího sloupce „actions“ nebo ty tlačítka (VČETNĚ vytvořeného nadbytečného sloupce) úplně odstranit a ponechat odesílání filtru jen přes JavaScript.
Děkuji předem.
Tak už není třeba, vyřešil jsem si sám.
- pazuzu
- Člen | 29
Zdravim, mam dotaz. V latte kdyz vykreslim radky tabulky, tak si muzu
ukladat ruzne hodnoty (napr aktualni sumu hodnot v radku) a podle toho pak
delat nejake podminky, jde tohle i tady?
zkousel jsem si tam hrat s ruznym {var} v definici table-open-tag, ale na
radcich na to pak nevidi.
Diky
- Sitole
- Člen | 39
Ahoj,
chystám se na jednom mém projektu použít Nextras Datagrid. Implementace byla
prozatím jednoduchá a vše funguje s minimálním nastavením. Záznamy
v gridu chci editovat pomocí inlne řešení, což datagrid podporuje (metoda
setEditFormFactory) a funguje to výborně, ale problém nastává
v případě, kdy chci data vytvářet. Ideálně bych chtěl nějaké
tlačítko, které mi přidá prázdný řádek a zobrazí (asi) editační
formulář. Metoda „setEditFormFactory“ dokonce obsahuje proměnnou $row
u které se kontroluje její existence, takže předpokládám že řešení
o které se snažím grid podporuje. Můžete mě prosím nasměrovat? Byl bych
moc vděčný.
- d_hodza
- Člen | 4
Ahoj, rád bych překreslil filtr datagridu ve chvíli, kdy kliknu na tlačítko „Filtrovat“. Mám ve filtru na sobě závislé dva SELECTy. Po kliknutí na tlačítko se překreslí pouze datagrid a filtr zůstane. Řešil toto někdo? Je možné provést render samotného filtru? Děkuji za odpověď.
- MasterPK
- Člen | 6
Ahoj, mám datagrid, který má u každého řádku v posledním pravém sloupci tlačítko na inline editaci. To funguje perfektně, ale chtěl bych tam přidat další tlačítko pro odkaz jinam s tím, že se přenese id řádku. Takže bych vygeneroval pro každý řádek tlačítko s odkazem a předáním id, jenže custom šablona, kterou pro datagrid používám, není připojená na můj presenter a tudíž nemá přístup k proměnným a já tam nemám možnost dostat žádnou proměnnou ani odkaz.
{define row-actions}
<a href="{link edit! $primary}" data-datagrid-edit class="ajax btn btn-primary btn-sm">{_edit}</a>
<a href="{link :Main:Manager:assignRfidToUser $primary}" class="btn btn-primary btn-sm">{_assignRfid}</a>
{/define}
Konkrétně to vypíše chybu: Component name must be non-empty alphanumeric string, '' given.
Odkaz je v pořádku, testoval jsem ho v jiné šabloně.
Dá se to nějak propojit?
Děkuji za odpověď.
EDIT:
Tak stačilo změnit link na plink a funguje to. Nechám to zde, kdyby měl někdo podobný problém :)
Editoval MasterPK (31. 5. 2020 2:28)
- grovik
- Člen | 69
Při opravě chyby v jednom starším projektu jsem narazil na problém, kdy po změně řazení (například podle data vytvoření). Přestane fungovat kliknutí na řádek. <tr> je stále ClickableRow. Na první pohled není vidět proč by to nemělo fungovat.
Nějaký nápad kde by mohl být problém?
Editoval grovik (24. 1. 2022 15:37)
- grovik
- Člen | 69
grovik napsal(a):
Při opravě chyby v jednom starším projektu jsem narazil na problém, kdy po změně řazení (například podle data vytvoření). Přestane fungovat kliknutí na řádek. <tr> je stále ClickableRow. Na první pohled není vidět proč by to nemělo fungovat.
Nějaký nápad kde by mohl být problém?
Provedl jsem důkladnou analýzu toho co se tam děje.
Tahle část mající na starost fungování položek v tabulce jako
klikacích odkazů
`<script>
$(„.clickableRow“).click(function () {
window.location.href = {link Course:detail} + „?courseId=“ +
$(this).attr(„id“);
});
</script>`
K tomu se váže ještě tohle
`{define row}
<tr class=‚clickableRow‘ id={$row->id}>
{include #row-inner row ⇒ $row}
</tr>
{/define}`
Jenže po vykreslení tabulky kdy se změní obsah (právě například po
seřazení v podle jiného sloupečku) tahle funkce nenajde třídy
clickableRow a tím ana ně nenaváže Eventy. Hezky je to vidět například ve
Firefoxu.
Tzn. bylo by dobré tuhle funkci navázat například na nějaký CallBack
který se spustí po načtení nového obsahu tabulky.
Tady ovšem moje zkušenosti končí a nevím jak na to. Kudy to tam
přilepit.
Předem díky za nápady a rady.