DibiGrid – Nový DataGrid pro Dibi

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
knyttl
Člen | 196
+
0
-

Ahoj,

z hrátek posledních dní mi vyšel můj vlastní datagrid. Potřeboval jsem co nejvyšší konfigurovatelnost a aby se na každý pohled dalo jednoznačně odkazovat – na každý z nich lze vygenerovat url – všechny požadavky jsou pouze metodou GET. Během příštích dní dodělám inline editaci a filtr dle datumu.

Jinak tedy na: http://tabella.knyt.tl/ jsou tři příklady použití – basic, complex a editable. V komplexním je vidět téměř všechny možné vlastnosti –

  1. Vlastní element pro řádky
  2. Vlastní generování zobrazených dat
  3. Vlastní filtry
  4. Vlastní způsoby řazení

apod.

Zatím zkoušeno pouze na Safari, Chrome a Firefox.

Budu vděčný za všechny připomínky.

Editoval knyttl (4. 10. 2011 18:25)

Filip Procházka
Moderator | 4668
+
0
-

ten název bych ještě promyslel, jak už David jednou říkal, není dobré když někdo v názvu používá Nette, stejný problém určitě platí i pro dibi pravděpodobně :)

Honza Marek
Člen | 1664
+
0
-

Kdyby ses zapojil do vývoje datagridu Gridito, ocenil bych to víc :-D

knyttl
Člen | 196
+
0
-

HosipLan napsal(a):

ten název bych ještě promyslel, jak už David jednou říkal, není dobré když někdo v názvu používá Nette, stejný problém určitě platí i pro dibi pravděpodobně :)

Díky, beru na vědomí. Název změním.

knyttl
Člen | 196
+
0
-

Tak tedy přejmenováno na Tabella. Dopsal jsem inline editaci, je vidět v záložce „editable“.

Demo: http://tabella.knyt.tl/

TODO:

  1. přidávání nových položek
  2. mazání položek
  3. datetime manipulace

Mimochodem nefunguje info o zadávání nových doplňků (https://componette.org/search/?…).

Editoval knyttl (4. 10. 2011 18:26)

mm-marek
Člen | 61
+
0
-

vypadá to hezky, hlavně to běhá pod 5.2,což je fajn :)

Filip Procházka
Moderator | 4668
+
0
-

nový doplněk vytvoříš tak že přejdeš na url https://componette.org/search/?…, dáš vytvořit stránku a začneš psát :) (třeba já jsem okoukal dokumentaci jiných addonů)

až to máš hotové tak upravíš (pokud máš oprávnění) seznam doplňků a přidáš svůj tam kam si myslíš že patří

stačí umět Texy! :)

knyttl
Člen | 196
+
0
-

Nové vlastnosti Tabelly:

  1. Tlačítko na přidání nového řádku do db
  2. Tlačítko na vymazání řádku – volá se handler onDelete.
  3. Inline editace využívá plugin datePicker
  4. Pro nastavení třídy řádků přibyla vlastnost ‚rowClass‘, pro hlavičku sloupce ‚headerClass‘ a pro vlastní buňku ‚class‘

Testováno na Chrome a Safari.

Vše v příkladech na:

http://tabella.knyt.tl

Editoval knyttl (4. 10. 2011 18:26)

phx
Člen | 651
+
0
-

Zajimave. Jen mi opet chybi moznost vypsat data napr z pole. Osobne jsem si prekopal DataGrid tak ze akceptuje DataModel. Inspirovano hodne pristupem jako v Jave.

Dale by me zajimalo zda inline editace podporuje/bude podporovat editaci sloupecku, ktere nejsou soucasti viditelne tabulky. Vetsinou v systemech nezobrazuji vsechna pole.

Nevim zda to ma cenu nejak zverejnovat – dalsi datagrid. Urcite by bylo fajn mit 1 ale poradnej. Ale kterej? Osobne pokazde vyuziji pouze funkce pro hezke vypsani dat s moznosti razeni a strankovani. Ostatni jako filtrovani a editaci resim stejne jinde, protoze tam je pokazde neco specialniho. V tom se mozna lisi ten muj DG protoze nic vic neumi a bohate to staci. Ma to cenu zverejnovat?

Editoval phx (28. 9. 2010 22:13)

pekelnik
Člen | 462
+
0
-

Já používám původní DataGrid od Romana Sklenáře

  • s Majklem jsme dodělali podporu pro PHP 5.3 a různé druhy datasourců včetně například Doctrine 2
  • v současnosti existují dvě oblasti ve kterých by to ještě chtělo poladit…
    1. renderování (chceme to předělat na latte)
    2. vymyslet zkracování obsahu buňky pokud obsahuje HTML

Nevšiml jsem si že by některý z nových datagridů přišel s něčím novým… ale nijak jsem to nezkoumal.

Pokud je opak pravdou bylo by dobré kdyby to autoři vypíchli…

knyttl
Člen | 196
+
0
-

Dale by me zajimalo zda inline editace podporuje/bude podporovat editaci sloupecku, ktere nejsou soucasti viditelne tabulky. Vetsinou v systemech nezobrazuji vsechna pole.

Tohle vypadá, že bude umět komponenta Gridito od Honzy Marka. Nevím, jak by se to takhle do té inline editace dalo zakomponovat.

Nevšiml jsem si že by některý z nových datagridů přišel s něčím novým… ale nijak jsem to nezkoumal.

Tabellu jsem psal, protože jsem potřeboval možnost na každý pohled odkazovat v URL, potřeboval jsem komplexnější filtry a kvalitní inline editaci (vše je to vidět v tom komplexním příkladu – pokud to člověk nezkoumá, tak si toho nevšimne). Vypadá to, že Gridito by to mohlo všechno mít taky, jenže o jeho vývoji v tu dobu ještě nevěděl.

wise
Člen | 161
+
0
-

Je možné získat někde tabellu pro PHP5.2? Díky

knyttl
Člen | 196
+
0
-

Myslím, že pro PHP 5.2 tam je problém s těmi anonymními funkcemi: asi by se všechny musely oddělit. Na to ale čas bohužel nemám, omlouvám se.

wise
Člen | 161
+
0
-

Ok v pořádku. Děkuji a dobrá práce.

podolinek
Člen | 7
+
0
-

Zdarec.
Řešili jste formát DibiDateTime, který vrací dibi nad date sloupečkem?
Dibi totiž vrátí objekt a s tím si teď Tabella neporadí. Osobně jsem to vyřešil přidáním podmínky

<?php
	if($str instanceof DibiDateTime)
        	$str = $str->getTimestamp();
?>

do iterace v metodě renderBody.

knyttl
Člen | 196
+
0
-

Změny:

  1. Tabella nyní na GitHubu https://github.com/knyttl/Tabella
  2. Tabella při inline editaci reaguje na ESC/ENTER
  3. Přepsáno pro namespace
  4. Obrázky jsou přes data-uri přímo v CSS
  5. Spousta detailů

Editoval knyttl (4. 10. 2011 18:27)

Jack06
Člen | 168
+
0
-

Zajímalo by mě, zda se dají nějakým způsobem cachovat data, která tabella bere. Je to pěkné ta práce s dataSource, ale hodilo by se cachovat. Při rozsáhlejších datech je to rapidně znát. Nicméně dataSource pokud vím se cachovat nedá. Nějaký nápad?

spenat28
Člen | 9
+
0
-

Ahoj.

Upravil jsem Tabellu podle addonu Gridito. Netvrdím, že je lepší, ale hodila se mi. Vypadá tedy stejně, tudíž bere vzhled z jQuery UI, přidal jsem nějaké nastavení PK, i když zatím jen částečně (v JS se stále natvrdo odesílá pouze ‚id‘), ikony, ikony pro řazení, trochu jsem poupravil handler pro odesílání, předávám tedy celý model, aby nemusel být statický (používám modelLoader), atp.
Vyhodil jsem samostatný datepicker a použil nový z knihovny jQueryUI.

Chcete to někdo?

PS. latest verze dibi, nette, jQuery, jQueryUI

Editoval spenat28 (4. 10. 2011 18:16)

knyttl
Člen | 196
+
0
-

Tabella určitě není vzhled jQuery UI, ale náš originální design.

Nicméně to vypadá zajímavě, určitě to ukaž.

Editoval knyttl (4. 10. 2011 18:20)

spenat28
Člen | 9
+
0
-

@knyttl : já vím, že má váš design, ale nelíbí se mi a proto jsem si Tabellu přepsal tak aby jQueryUI používala, k čemuž jsem využil scriptů z Gridita a několik úprav. Nemám kde vystavovat, mohu někam poslat. Na githubu bohužel nejsem pošlu tar.gz nebo zip, s funkční ukázkovou app, pokud máš zájem.

knyttl
Člen | 196
+
0
-

spenat28 napsal(a):

@knyttl : já vím, že má váš design, ale nelíbí se mi a proto jsem si Tabellu přepsal tak aby jQueryUI používala, k čemuž jsem využil scriptů z Gridita a několik úprav. Nemám kde vystavovat, mohu někam poslat. Na githubu bohužel nejsem pošlu tar.gz nebo zip, s funkční ukázkovou app, pokud máš zájem.

Oukej :) Já jsem si asi špatně vyložil větu „Vypadá tedy stejně, tudíž bere vzhled z jQuery UI“.

Ideální by bylo někam dát funkční prezentovatelnou aplikaci – třeba bys zaujal více lidí, než jen mne :-)

spenat28
Člen | 9
+
0
-

knyttl napsal(a):

spenat28 napsal(a):

@knyttl : já vím, že má váš design, ale nelíbí se mi a proto jsem si Tabellu přepsal tak aby jQueryUI používala, k čemuž jsem využil scriptů z Gridita a několik úprav. Nemám kde vystavovat, mohu někam poslat. Na githubu bohužel nejsem pošlu tar.gz nebo zip, s funkční ukázkovou app, pokud máš zájem.

Oukej :) Já jsem si asi špatně vyložil větu „Vypadá tedy stejně, tudíž bere vzhled z jQuery UI“.

Ideální by bylo někam dát funkční prezentovatelnou aplikaci – třeba bys zaujal více lidí, než jen mne :-)

To je pravda, proto jsem psal, že bohužel nemám kde vystavovat, ovšem pokud to zaujme vás jako tvůrce, můžete úpravy buď použít nebo je alespoň někde vystavit vy. Udělal bych to, bohužel na to nemám čas. (Vím, že je to drobnost se někde zaregistrovat, atd. ovšem těchto miniúkonů mám stovky, a tenhle se mi tam nevejde.) Nemám vlastní server, a v tomto měsíci na to čas mít nebudu. Ovšem myslím si, že by stálo za to se na to podívat, jak říkám, rád vám to pošlu v zipu, databáze je stejná jako u vás v příkladové aplikaci, tedy stačí upravit si config aby se připojil ke správné databázi a můžete se podívat co jsem s tím provedl. Neříkám, že je všechno správně.

iguana007
Člen | 970
+
0
-

dej někam odkaz na ten zip a ja to hodím na github ať se můžou podívat ostatní

spenat28
Člen | 9
+
0
-

http://www.uloz.to/…spenat28-zip

heslo: jon,
db dump: v adresáři data

nutné upravit config.neon pro připojení k DB

PS. verze je funkční, ač pokračuji v úpravách, ty o kterých jsem psal zde jsou, něco jsou maličko prasárny a je tam pár zbytečností, ale pro inspiraci a snad postačí

PPS. nevím proč, ale v této verzi co jsem rychle vyrobil se nezobrazuje datepicker, v mé aplikaci kde to používám ano, žádná chyba nikde neskáče, spíš je někde vypnutý … nejsem si jistý. Možná jsem zapomněl nahrát správné jQueryUI js, omlouvám se, nemám bohužel čas to teď zjišťovat

Editoval spenat28 (5. 10. 2011 21:17)

iguana007
Člen | 970
+
0
-

tak jsem to hodil v tom stavu, jak bylo v zipu na github: https://github.com/…-for-PHP-5.3

spenat28
Člen | 9
+
0
-

iguana007 napsal(a):

tak jsem to hodil v tom stavu, jak bylo v zipu na github: https://github.com/…-for-PHP-5.3

Díky.
Teď dělám checkbox sloupec pro vícenásobné úpravy a tak podobně. Nicméně v průběhu úprav jsem začal spíše zvažovat, že upravit Gridito, které mi přijde napsané poněkud přehledněji a objektově (ne že by tabella nebyla, ale chybí class pro Column a podobné věci, kvůli kterým jsou v kódu použity switche a špatně se to rozšiřuje), bude smysluplnější. Nicméně to budu dělat asi až po úpravách tabelly, nechce se mi to už měnit v průběhu vývoje jedné aplikace.

Jack06
Člen | 168
+
0
-

Prosímtě, můžeš někde uvést co a jak jsi všecho změnil. Zajímala by mě inicializace oproti původní tabelle. Třeba původní tabella používá datasource, ale jak toho dosáhnu u toho předělaného? Jaksi se tmu nechce. :-) Díky

spenat28
Člen | 9
+
0
-

Jack06 napsal(a):

Prosímtě, můžeš někde uvést co a jak jsi všecho změnil. Zajímala by mě inicializace oproti původní tabelle. Třeba původní tabella používá datasource, ale jak toho dosáhnu u toho předělaného? Jaksi se tmu nechce. :-) Díky

Tohle také používá dibi datasource, jen ho odesílám z metody modelu až uvnitř komponenty, to proto, že komponentě posílám celý model, potřebuji volat z handleru pro send a delete jeho metody a nemám metody statické. Tedy proto. S modelem který je v aplikaci co jsem dělal přítomen to funguje.

Pro porovnání změn Ti stačí diff mezi původní verzí dokumentu Tabella.php a tou která je v mém projektu.

Změn v kódu nebylo moc a nejsou nijak zásadní. Už jsem mezi tím udělal další změny, které jsem nikam neposílal… nicméně ani tech není mnoho.

Editoval spenat28 (19. 10. 2011 14:27)

Jack06
Člen | 168
+
0
-

Technická, proč onDelete v té anonymní funkci jako $id posílá celý Object of class Addons\Tabella?

Asi moc nechápu, jak mám pak volat metodu delete($id), když $id je celý objekt a ne jen to id.

Díky za rady:

public function createComponentCategoryList($name) {
    $presenter = $this->presenter;
    $grid = new Tabella($this->model->category, array(
                "order" => "id",
                "limit" => 15,
                "onDelete" => function( $id ) use ($presenter) {
                        $presenter->model->category->delete( $id );
                }
                    ), 'CategoryList');

    $grid->addColumn("ID", "id", array("width" => 50));
    $grid->addColumn("TYP", "typ", array("width" => 60));
    $grid->addColumn("NÁZEV", "nazev", array(
        "renderer" => function( $row ) use ($presenter) {
            // can be a link within the application
            return \Nette\Utils\Html::el("td class=al")->add(\Nette\Utils\Html::el('a target=_blank')
                                    ->href($presenter->link(":Admin:Category:update", array("id" => $row->id)))
                                    ->add($row->nazev));
            return $td;
        }
    ));
    $grid->addColumn('<span class="ui-icon ui-icon-circle-plus"></span>', Tabella::ADDTEXT, array(
        "type" => Tabella::DELETE
    ));

    $this->addComponent($grid, $name);
}
jeremy13
Člen | 18
+
0
-

Můj problém souvisí s persistentními parametry v presenteru. Jakmile provedu v komponentě s tabellou například nějaké filtrování, nebo třeba přidání řádku, tak se mi ztratí všechny parametry presenteru.

Jelikož pak podle těchto parametrů při vytváření komponenty s tabbelou vybírám jen určité řádky s datasource tabelly, tak mi datasource nic nevrátí (jelikož jsou parametry null).

Neví prosím někdo co s tím. Případně nemá někdo příklad, kdy používá tabellu v komponentě a předává této komponentě nějaký například cizí klíč, který použije například ve where datasource?

knyttl
Člen | 196
+
0
-

Já to pak nějak zkoušel řešit – nevím, jestli ti to pomůže, ale změnil jsem způsob, jak se drží parametry, zatím jen jako gist:

https://gist.github.com/1336142

Prakticky jsem začal používat persistentní parametry, místo těch svých.

Editoval knyttl (3. 11. 2011 10:40)

Jack06
Člen | 168
+
0
-

A odpověď na mou otázku? :-D Já jen že takto nejde mazat. :-D

knyttl
Člen | 196
+
0
-

Jack06 napsal(a):

A odpověď na mou otázku? :-D Já jen že takto nejde mazat. :-D

Nevím, ale tohle řešení by mělo počítat i s pers. parametry mimo tabellu.

Jack06
Člen | 168
+
0
-

Jakože si mám stáhnout to co jsi teď dal na gist?

Ne že by se mi to chtělo zase přepisovat do JqueryUI, jelikož to stylování se mi náramě hodí a líbí.. :-D

knyttl napsal(a):

Jack06 napsal(a):

A odpověď na mou otázku? :-D Já jen že takto nejde mazat. :-D

Nevím, ale tohle řešení by mělo počítat i s pers. parametry mimo tabellu.

Editoval Jack06 (3. 11. 2011 11:48)

knyttl
Člen | 196
+
0
-

Jo sorry, ten můj gist řeší nějaké problémy v mojí Tabelle, ne v té upravené.

Jack06
Člen | 168
+
0
-

A tak proč to nenahodíš na tom upraveném.. Nevídím v tom zas až tolik rozdílů, které by měli zasahovat do funkcionality tvé původní tabelly.

Mě jde jen o to, jak docílit toho, aby mi šlo na onDelete mazat :-D

Editoval Jack06 (3. 11. 2011 11:50)

jeremy13
Člen | 18
+
0
-

Hm, tak dík, ale bohužel mi to problém nevyřešilo. Stále, jakmile třeba provedu filtrování, tak se všechny persistentní parametry ztratí.

Konkrétně mám komponentu:

use Addons\Tabella;

class Grid extends \Nette\Application\UI\Control {

    /** @persistent */
    public $foreign_id;

    public function render() {
	$template = $this->template;
	$template->setFile(dirname(__FILE__) . '/grid.latte');
	$template->render();
    }
    public function setId($foreign_id) {
	$this->foreign_id=$foreign_id;
    }

    public function createComponentItemsGrid($name) {
	$foreign_id=$this->foreign_id;
	$grid=new Tabella(MF::getModel('items')->dataSource()->where('foreign_id=%i', $foreign_id),
			array(
			    "onSubmit" => function( $post ) use ($foreign_id) {
				$post['foreign_id'] = $foreign_id;
				MF::getModel('items')->save($post, $post['id']);
			    }
			)
	);
	$grid->addColumn ...
	...
	$this->addComponent($grid, $name);
    }
}

a pak v presenteru mimo jiné:

/** @persistent */
public $foreign_id = NULL;

public function renderItems($foreign_id) {
	$this['grid']->setId($foreign_id);
}
protected function createComponentGrid($name) {
	$grid = new Grid($this, $name);
	return $grid;
}

V šablonách pak jen vytvářím control. Když se stránka vytvoří, tak je vše v pořádku, stejně tak, když dám například položky seřadit, ovšem jakmile použiji třeba filtrování, tak se provede požadavek již bez persistentních parametrů a tím pádem mám tabellu prázdnou, jelikož se foreign_id používá v datasource.
Jediný způsob, jak jsem docílil toho co jsem chtěl, je to, když si do šablony presenteru to id předávám a vytvořím komponentu {control grid$foreign_id} a komponentu v presenteru vytvářím pomocí createComponent($name) a foreign_id si pak z názvu komponentu vytáhnu. To mi ovšem nepřijde jako vůbec šťastné řešení. Jen se v tomto případě obejdou persistentní parametry v presenteru a díky toho to funguje …

Jakékoliv lepší řešení jen s radostí uvítám :)

Editoval jeremy13 (3. 11. 2011 21:59)

JoeKE
Člen | 7
+
0
-

Cavte rad by som sa spytal ako pridam stlpec bez toho aby mi bralo zoradenie a chem pridat do toho stlpca nejaky <a href=„{link }“> </a> ??
dakujem

knyttl
Člen | 196
+
0
-

JoeKE napsal(a):

Cavte rad by som sa spytal ako pridam stlpec bez toho aby mi bralo zoradenie a chem pridat do toho stlpca nejaky <a href=„{link }“> </a> ??
dakujem

Viz ten komplexní příklad. Jen poznamenejme, že jsem Tabellu přepsal (http://tabella.knyt.tl), aby respektovala DI a místo DataSource používá teď dibiFluent. Stejný přístup, jako je ale v následujícím příkladu by měl fungovat i na té staré Tabelle, jen místo $context se k presenteru musí dostat přes Environment.

<?php

$grid->addColumn('Surname', 'surname', array(
	'renderer' => function($row) use ($context) {
		return Html::el('td')->add(Html::el('a')
			->href($context->application->presenter
				->link('this', array(
					'complexTabella-filter' => array('id' => $row->id))))
			->setText($row->surname));
		},
	'order' => false, // zakázání řazení
	'filter' => false // zakázání filtrů
));
?>

Editoval knyttl (20. 12. 2011 1:00)

JoeKE
Člen | 7
+
0
-

knyttl napsal(a):

JoeKE napsal(a):

Cavte rad by som sa spytal ako pridam stlpec bez toho aby mi bralo zoradenie a chem pridat do toho stlpca nejaky <a href=„{link }“> </a> ??
dakujem

Viz ten komplexní příklad. Jen poznamenejme, že jsem Tabellu přepsal (http://tabella.knyt.tl), aby respektovala DI a místo DataSource používá teď dibiFluent. Stejný přístup, jako je ale v následujícím příkladu by měl fungovat i na té staré Tabelle, jen místo $context se k presenteru musí dostat přes Environment.

<?php

$grid->addColumn('Surname', 'surname', array(
	'renderer' => function($row) use ($context) {
		return Html::el('td')->add(Html::el('a')
			->href($context->application->presenter
				->link('this', array(
					'complexTabella-filter' => array('id' => $row->id))))
			->setText($row->surname));
		},
	'order' => false, // zakázání řazení
	'filter' => false // zakázání filtrů
));
?>

Dakujem funguje to aj v tej starej verzii cez Environment

JoeKE
Člen | 7
+
0
-

Ahoj knyttl, rad by som sa spytal na 1 otazku ked mozem. Kedby som chcel nieco take ze vyber poloziek z tabulky cize ked kliknem na dany riadok z tabulky tak sa mi zapise do nejake session u. Sice ono to funguje lebo jednoducho som pridal dalsi stlpec do tabely ako si mi poradil mam to trosku inak
->href( Environment::getApplication()->getPresenter()
->link( „page“, array(„do“ ⇒ „lala-pridat“, „lala-id“ ⇒ $row->id)))
ono to funguje ale ja by som potreboval funkciu ‚pridat‘ volat ajax-ovo, lebo ked spravim nejaky vyber (do kolonky meno zadam ‚a‘ stlacim enter, teda vyfitrujem mocou tabely) a stlacim ‚pridat‘ tak sa mi dany riadok prida do session-u ale refresne sa cela stranka a zrusi sa vyber. pritom presentery je zapnuty ajax.

ps: potrebujem to len na skolske ucely

za pochopenie dakujem

knyttl
Člen | 196
+
0
-

JoeKE napsal(a):

Ahoj knyttl, rad by som sa spytal na 1 otazku ked mozem. Kedby som chcel nieco take ze vyber poloziek z tabulky cize ked kliknem na dany riadok z tabulky tak sa mi zapise do nejake session u. Sice ono to funguje lebo jednoducho som pridal dalsi stlpec do tabely ako si mi poradil mam to trosku inak
->href( Environment::getApplication()->getPresenter()
->link( „page“, array(„do“ ⇒ „lala-pridat“, „lala-id“ ⇒ $row->id)))
ono to funguje ale ja by som potreboval funkciu ‚pridat‘ volat ajax-ovo, lebo ked spravim nejaky vyber (do kolonky meno zadam ‚a‘ stlacim enter, teda vyfitrujem mocou tabely) a stlacim ‚pridat‘ tak sa mi dany riadok prida do session-u ale refresne sa cela stranka a zrusi sa vyber. pritom presentery je zapnuty ajax.

ps: potrebujem to len na skolske ucely

za pochopenie dakujem

Ahoj, no pokud tomu dobře rozumím, tak by Ti mělo stačit používat ten klasický Nette ajax javascript a pak ten <a> vytvořit jako

<?php
Html::el('a')->href(...)->class('ajax');
?>

Pokud to nestačí, tak upřesni proč.

Vojta

Editoval knyttl (30. 12. 2011 15:31)

JoeKE
Člen | 7
+
0
-

knyttl napsal(a):

JoeKE napsal(a):

Ahoj knyttl, rad by som sa spytal na 1 otazku ked mozem. Kedby som chcel nieco take ze vyber poloziek z tabulky cize ked kliknem na dany riadok z tabulky tak sa mi zapise do nejake session u. Sice ono to funguje lebo jednoducho som pridal dalsi stlpec do tabely ako si mi poradil mam to trosku inak
->href( Environment::getApplication()->getPresenter()
->link( „page“, array(„do“ ⇒ „lala-pridat“, „lala-id“ ⇒ $row->id)))
ono to funguje ale ja by som potreboval funkciu ‚pridat‘ volat ajax-ovo, lebo ked spravim nejaky vyber (do kolonky meno zadam ‚a‘ stlacim enter, teda vyfitrujem mocou tabely) a stlacim ‚pridat‘ tak sa mi dany riadok prida do session-u ale refresne sa cela stranka a zrusi sa vyber. pritom presentery je zapnuty ajax.

ps: potrebujem to len na skolske ucely

za pochopenie dakujem

Ahoj, no pokud tomu dobře rozumím, tak by Ti mělo stačit používat ten klasický Nette ajax javascript a pak ten <a> vytvořit jako

<?php
Html::el('a')->href(...)->class('ajax');
?>

Pokud to nestačí, tak upřesni proč.

Vojta

hmm ono to funguje ale nie tak ako som si to predstavoval :). Potreboval by som nieco take ako ma tabella Editable. Ked zeditujes nejaky riadok tabulky a nasledne ho uloziz (fajkou co je na konci) tak sa resresne tabela, ale dajme tomu ze si na 9 strane tak po zeditvani tam aj zostanes. To chcem aj ja dosiahnut nech mi refresne tabellu ale nech zostane na tej 9 strane a nasledne tr sa nastavi na class=oznacene dajme tomu.
tymto ->class(‚ajax‘) om som dosiahol ze sa mi nerefresne stranka ale ani tabella tak nie je videt ktore riadky mam vybrate

knyttl
Člen | 196
+
0
-

Asi už chápu. No asi bys musel tu Tabellu podědit a ten handler té akce přidat přímo do ní, aby tam zůstavaly ty persistentní parametry. Tzn. něco jako (platí pro tu novou, ale pro tu plvodní je to to samé):

<?php
use Maite\Tabella,
	Nette\Utils\Html;

class DuplicatesTabella extends Tabella {

	public function __construct($context) {

		parent::__construct(array(
			'context'  => $context,
			'source'   => $context->model->duplicates->source(),
			'order'    => 'id',
			'sorting'  => 'desc',
			'onDelete' => function($id) use ($context) {
				$context->dibi->delete('duplicates')->where('id = %i', $id)->execute();
			}));

		$this->addColumn('ID', 'id', array(
				'width'   => 20,
				'class'   => 'center'
			));

		...
	}

	public function handleMyAction() {
		...
	}
?>

Ale nevím, jen myslím, že by to mělo fungovat :-) Cíl prostě je, aby ti tam zůstaly ty persistentní parametry, jako je stránka, řazení apod.

Editoval knyttl (30. 12. 2011 17:10)

JoeKE
Člen | 7
+
0
-

knyttl napsal(a):

Asi už chápu. No asi bys musel tu Tabellu podědit a ten handler té akce přidat přímo do ní, aby tam zůstavaly ty persistentní parametry. Tzn. něco jako (platí pro tu novou, ale pro tu plvodní je to to samé):

<?php
use Maite\Tabella,
	Nette\Utils\Html;

class DuplicatesTabella extends Tabella {

	public function __construct($context) {

		parent::__construct(array(
			'context'  => $context,
			'source'   => $context->model->duplicates->source(),
			'order'    => 'id',
			'sorting'  => 'desc',
			'onDelete' => function($id) use ($context) {
				$context->dibi->delete('duplicates')->where('id = %i', $id)->execute();
			}));

		$this->addColumn('ID', 'id', array(
				'width'   => 20,
				'class'   => 'center'
			));

		...
	}

	public function handleMyAction() {
		...
	}
?>

Ale nevím, jen myslím, že by to mělo fungovat :-) Cíl prostě je, aby ti tam zůstaly ty persistentní parametry, jako je stránka, řazení apod.

A ako ma teraz byt ten stlpec co je buton pridat ?

<?php

 $this->addColumn( "", "select", array(
        "renderer" => function( $row ) {
            return Html::el( "td align=center" )
                ->add( Html::el( 'a class=botton')
                ->href( Environment::getApplication()->getPresenter()
                    ->link( "page", array("do" => "text", "text" => $row->id)))
                ->setText('pridat')
                ->class('ajax')
                        );
                },
           "width" => 20,
           'order' => false, // zakázání řazení
           'filter' => false // zakázání filtrů
    ));
));
?>
knyttl
Člen | 196
+
0
-

A ako ma teraz byt ten stlpec co je buton pridat ?

<?php

 $this->addColumn( "", "select", array(
        "renderer" => function( $row ) {
            return Html::el( "td align=center" )
                ->add( Html::el( 'a class=botton')
                ->href( Environment::getApplication()->getPresenter()
                    ->link( "page", array("do" => "text", "text" => $row->id)))
                ->setText('pridat')
                ->class('ajax')
                        );
                },
           "width" => 20,
           'order' => false, // zakázání řazení
           'filter' => false // zakázání filtrů
    ));
));
?>

Teď nechápu jaký sloupec přidat? Minimálně ale neděláš dobře Html::el(‚a class=button‘)->class(‚ajax‘). Asi spíš chceš Html::el(‚a‘)->class(‚button ajax‘).

Editoval knyttl (30. 12. 2011 18:52)

JoeKE
Člen | 7
+
0
-

knyttl napsal(a):

A ako ma teraz byt ten stlpec co je buton pridat ?

<?php

 $this->addColumn( "", "select", array(
        "renderer" => function( $row ) {
            return Html::el( "td align=center" )
                ->add( Html::el( 'a class=botton')
                ->href( Environment::getApplication()->getPresenter()
                    ->link( "page", array("do" => "text", "text" => $row->id)))
                ->setText('pridat')
                ->class('ajax')
                        );
                },
           "width" => 20,
           'order' => false, // zakázání řazení
           'filter' => false // zakázání filtrů
    ));
));
?>

Teď nechápu jaký sloupec přidat? Minimálně ale neděláš dobře Html::el(‚a class=button‘)->class(‚ajax‘). Asi spíš chceš Html::el(‚a‘)->class(‚button ajax‘).

tak pridal som funkciu do tabeli priamo len abz som to vedel odskusat nejaka hendle funkcia.
ako zavolam tu funkciu nejakym butonom, buton pridat.
este raz su stlpce

meno priezvisko trieda rocnik / a pridat stlpec kde bude button „pridat“ co zavola tu moju funkciu
to zanamena ze si toho ziaka prida do pola nasledne sa refresne tabella ale strana zostane taka ista cize presne to co si pisal

ako ma teda vizerat stlpec „pridat“ $this->addColumn() ??

knyttl
Člen | 196
+
0
-

Tak tohle by mělo být správně, co na tom nefunguje? Jen pokud se jedná o poděděnou Tabellu, tak bys tam spíš měl mít něco jako:

<?php
	$thisTabella = $this;
	'renderer' => function($row) use ($thisTabella) {
		return Html::el('a')->href($thisTabella->link('text!', array('text' => $row->id))))
		...
	}
?>

Protože chceš odkazovat na signál v té poděděné Tabelle a ne v prezenteru.

fistaro
Člen | 2
+
0
-

Ahoj, zkousel jsem rozchodit tabellu z noveho gitu jak tabelly, nette i dibi a nemuzu se dostat za
Call to undefined method DibiDataSource::offset()

Deklarace gridu v presenteru

$grid = new Tabella( array( 'context' => $this->context,
                            'source' => UserManager::dataSource()));

class UserManager

public static function dataSource() {

        return dibi::dataSource('SELECT *
                                  FROM [users] U
                                  WHERE deleted=0 '
                                  );


    }

Netusite nekdo co s tim? Co jsem hledal, tak datasource nema ani offset ani orderBy, ktery je zminen hned po offset

$this->source
				->offset(($this->params['offset']-1)*$this->params['limit'])->limit($this->params['limit'])
				->orderBy($this->params['order'], $this->params['sorting'])->fetchAll();

edit: aha uz to vidim → dibifluent …

Editoval fistaro (7. 1. 2012 0:21)