Nextras\Datagrid – datagrid se vsim jak ma byt

Kakaku
Člen | 27
+
0
-

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?

jAkErCZ
Člen | 322
+
0
-

Zdravím, mám dotaz je možné nějak v datagridu udělat že když kliknu na ID jednoho datagridu přenese se to ID do vyhledávání toho druhého?

Díky moc za rady.

MW
Člen | 626
+
0
-

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
+
0
-

@MW imho ten spatny where tam davas ty, nextras/datagrid to nedela. nevolas nad tim getData jeste neco?

MW
Člen | 626
+
0
-

No podle mě ten inline si pouzije getData() a zavola nad tim WHERE primary …

Nebo se pletu? Toto chování bych právě potřeboval nějak upravit..

Ale možná jsem mimo :)

Díky !

David Matějka
Moderator | 6445
+
0
-

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
+
0
-

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
+
0
-

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.

MW
Člen | 626
+
0
-

Zdravím,

chystám se na jednom projektu, kde je velké množství těchto gridů, je aktualizovat. Je tam verze 2.1. Gridy tam jsou dělané jako samostatné komponenty přes továrny.

Mohl by mě někdo prosím nastínit, jak moc velké změny mě čekají? Dělal to někdo?

Díky

David Matějka
Moderator | 6445
+
+1
-

@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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

@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
+
0
-

@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)

David Matějka
Moderator | 6445
+
0
-

@MW nepridavas sloupecky nejak pozde? treba az v render nebo tak?

MW
Člen | 626
+
0
-

@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
+
0
-

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
+
0
-

@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
+
+1
-

@MW ten sloupecek musis pridat pod spravnym klicem do $this->columns https://github.com/…Datagrid.php#L110

MW
Člen | 626
+
0
-

@DavidMatějka
Předtím to valilo… tuto změnu jsem úplně přehlédl.

Moc díky !!!

ondrejd
Člen | 22
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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ěď.

n.u.r.v.
Člen | 485
+
0
-

Ahoj, dá se nějak (a jak) v datagridu použít vlastní latte filtr, který používám v ostatních šablonách a je nyní definovaný v BasePresenteru v beforeRender jako $this->template->addFilter(‚nazev_filtru‘, function ($text) {…

Díky

MasterPK
Člen | 6
+
0
-

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
+
0
-

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
+
0
-

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.

galab
Backer | 74
+
+1
-

@grovik Nevím, jak je tento projekt udržován a jestli tvůrce bude řešit. Mohl bys to (myslím) vyřešit úpravou JS, aby se event navázal na nějaký nadřazený prvek, který se nemění.

místo $(‚.clickableRow‘) něco jako $(‚table‘).on(‚click‘, ‚clickableRow‘, function(…))

grovik
Člen | 69
+
0
-

Problém vyřešen:

{define table-close-tag}
    </table>
    <script>
    $(document).on('click','.clickableRow', {} ,function(e){window.location.href = {link Course:detail} + "?courseId=" + $(this).attr("id"); });
    </script>
 {/define}

Editoval grovik (10. 2. 2022 14:17)