[addon datagrid] DataGrid

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

Ano funguje.

Pari
Člen | 15
+
0
-

romansklenar napsal(a):

Ano funguje.

Zajímavé, mě pořád ne, s největší pravděpodobností je chyba ve mně, to přiznávám, ale zkusil jsem už ledacos. Níže dávám na stáhnutí zdrojáky, je to aktuální verze stáhnutá ze SVN akorát do souboru ExamplePresenter.php je doplněna ta funkce řádek 26 a pak callback na řádku 48. Co dělám špatně? :( Děkuji za pomoc a také za DataGrid který je opravdu povedený!

Stáhnutí: http://pari.cz/…datagrid.zip

romansklenar
Člen | 655
+
0
-

Chyba je jen v definici callbacku. Když tu funkci totiž máš součástí třidy presenteru, tak musí být takto:

$grid['city']->formatCallback[] = array($this, 'nejakaFunkce');

Další možnost je vyhodit ji z presenteru mimo třídu a bude ti fungovat i ten tvůj zápis.

Editoval romansklenar (10. 7. 2009 22:35)

romansklenar
Člen | 655
+
0
-

Chtěl bych poděkovat všem za pozitivní ohlasy, které mi došly na mail nebo tady zazněly. Do vývojové verze jsem zapracoval všechny bugfixy, o kterých jsem věděl nebo je někdo nahlásil a zároveň přibylo i pár nových featurek (a ještě nejspíš přibydou – ty nejvýznamnější jsou nejméně nápadně :)) z nápadů co se objevily tady na fóru a mě v mailech, takže díky všem za nápady :)

Momentální stav na SVN je, že nevím o žádné chybě. Takže by to mělo být použitelné i pro produkční nasazení. Než ale definitivně vydám novou verzi, aktualizuju demo, dokumentaci a archívy, rád bych nechal nějaký čas na otestování a dodělání ještě dalších věcí a ještě na pár nedořešených problémů v Nette + snippety v nových šablonách.

S klidem můžete aktualizovat, nekompatibility by být neměly a aspoň se to ověří v produkčním nasazení.

Editoval romansklenar (10. 7. 2009 23:10)

jarks
Člen | 94
+
0
-

Dobrý den, pár otázek:

1. do Datagridu přidám akci:

$grid->addAction('Detail', 'DetailPresenter:sablona', clone $icon->class('icon icon-detail'));

uživatel např. ze třetí stránky gridu klikne na ikonku Detail, prohlédne si detailní zobrazení a chce se vrátit zpět, což je v šabloně Detail.sablona.phtml zapsáno:

<a href="{plink Datagrid:default}">Zpět na přehled</a>

Datagrid se zobrazí, ale od začátku == strana 1.
Otázka: Dalo by se nějak zařídit, aby se vrátil zase na tu stránku odkud byl detail zavolán?


2. Nová verze Datagridu dovoluje uživateli pomocí roletky nastavovat počet zobrazených řádků. Zdá se, že to funguje jen v případě, že se z nastavení komponenty vynechá $grid->itemsPerPage = počet_řádků;.
Otázky: Dá se nějak ovlivnit, co bude obsahovat roletka? Aby tam např. nebylo „vše“? Dá se nastavit výchozí počet řádků?

Díky za Datagrid a předem za odpověď.

jarks
Člen | 94
+
0
-

jarks napsal(a):
Datagrid se zobrazí, ale od začátku == strana 1.
Otázka: Dalo by se nějak zařídit, aby se vrátil zase na tu stránku odkud byl detail zavolán?

Tak první část beru zpět. Nevím jak, ale už je to v pořádku. Možná nějaká nesrovnalost při kopírování nové verze ze SVN.

romansklenar
Člen | 655
+
0
-

1. Ano jde to – dokonce 2 způsoby (viz v tomto vlákně)

2.

$grid->itemsPerPage = 10; // výchozí počet řádků
$grid->displayedItems = array(10, 20, 50); // roletka

Stringové hodnoty v poli roletky jsou považovány za all/vše. Projevuje se ta chyba i s poslední revizí z SVN (r33)? V r30 jsem tuto chybu opravoval.

Ještě pozor na jednu věc! Pro všechny kdo používají vývojovou verzi z SVN ( >= r23 ), jsou zde nově závislosti na verzích Nette a dibi, takže:

Závislosti nové verze DataGridu:

Nette >= r356
dibi  >= r222

Editoval romansklenar (13. 7. 2009 12:09)

timbulko
Člen | 85
+
0
-

Zdravím,
ako by sa dal spraviť v datagride stĺpec s odkazom, kde by bolo nejako uvedené aj ID daného riadka? Je to vôbec možné?

$grid['name']->formatCallback[] = function($value) {
	return \Nette\Web\Html::el("a", $value)->href( ??? );
};

Vďaka.

David Grudl
Nette Core | 8139
+
0
-

Tohle asi bude vyžadovat úpravu DataGridu

romansklenar
Člen | 655
+
0
-

Proto se nejdříve zeptám – musí být ty metody implementující rozhraní ArrayAccess v Controlu final?
Nedokážu si moc totiž představit jak bych měl DataGrid přepsat, abych zachoval přístup ke sloupcům podobně jako ve formulářích $grid['sloupec']. Nedědit z Controlu a jít v nejnižším společném jmenovateli na PresenterComponent a pak tam toho půltuctu metod znovu dopisovat je jako drbání levou rukou za pravým uchem :(

Editoval romansklenar (14. 7. 2009 1:27)

David Grudl
Nette Core | 8139
+
0
-

Z hlediska návrhu by měly být final, ale aby to fungovalo, tak final dočasně odstraním.

PetrP
Člen | 587
+
0
-

timbulko napsal(a):

Zdravím,
ako by sa dal spraviť v datagride stĺpec s odkazom, kde by bolo nejako uvedené aj ID daného riadka? Je to vôbec možné?

$grid['name']->formatCallback[] = function($value) {
	return \Nette\Web\Html::el("a", $value)->href( ??? );
};

Vďaka.

Na to samé jsem se ptal v prvním příspěvku, byli mi odpovězeno že si mám přepsat datagrid ;]

Jinak pokuď nepotřebuješ ten name tak to můžeš obejít cca takto:

$sql = 'SELECT id as name ...';
$grid['name']->formatCallback[] = function($value) {
	return \Nette\Web\Html::el("a", 'odkaz, ale nemuzu ho pojmenovat podle radku ;/')->href(Environment::getApplication()->getPresenter()->link('this',array('id'=>$value)));
};

Editoval PetrP (14. 7. 2009 10:11)

jarks
Člen | 94
+
0
-

Šlo by obarvit řádek podle stavu sloupce?
Např. pokud tabulka faktury obsahuje uhrazena = 0, příslušný řádek se obarví červeně.
Dalo by se nějak použít pole $renderer->wrappers?

Jod
Člen | 701
+
0
-

Ja som nato vo svojom gride používal udalosti typu onRowRender. Potom by to mohlo volať metódu ktorej by sa predali referencie na DataRow a GridRowPrototype, či niečo také a tak by sa to dalo v pohode meniť. V romanovom datagride som si to nevšimol zatiaľ, možno to bude na feature request :) .

romansklenar
Člen | 655
+
0
-

Tak jste mě ukecali – máte to tam ;)

PetrP & timbulko:

Nyní se do callbacku posílá i celý DibiRow, takže z něj můžete tahat potřebná data. Vyžádalo si to ale zpětnou nekompatibilitu u callbacků, které mají 2 a více parametrů, jako byl třeba v demu použitý TemplateHelpers::bytes($bytes, $precision = 2).

$grid['name']->formatCallback[] = function($value, DibiRow $data) { ... };

Jod & jarks:

Do vykreslovače jsem přidal události onRowRender a onCellRender, které slouží jako možnost úpravy Html objektů buňek a řádků tabulky. Ukázka je zase v demo aplikaci.

PetrP napsal(a):

… taky bych potřeboval někdy úplně zrušit možnost změnit řazení …

Nyní má DataGrid možnost řazení globálně vypnout:

$grid->disableOrder = TRUE;

Editoval romansklenar (14. 7. 2009 19:32)

timbulko
Člen | 85
+
0
-

Nyní se do callbacku posílá i celý DibiRow, takže z něj můžete tahat potřebná data. Vyžádalo si to ale zpětnou nekompatibilitu u callbacků, které mají 2 a více parametrů, jako byl třeba v demu použitý TemplateHelpers::bytes($bytes, $precision = 2).

podobným spôsobom som si už včera datagrid upravil (verzia pre php 5.3), ale aj tak díky :-)

jarks
Člen | 94
+
0
-

romansklenar napsal(a):
Do vykreslovače jsem přidal události onRowRender a onCellRender

Díky moc, funguje to perfektně!

V příkladu je jen obarvování buněk, tak obarvování celých řádků asi nějak takhle:

V definici komponenty:

$renderer->onRowRender[] = array($this, 'customersGridOnRowRendered');

k tomu příslušná metoda:

public function customersGridOnRowRendered(Html $row, $value) {
    if ($value->typ == 'faktura') $row->addClass('faktura'); // v css např.:.faktura {background-color: #fffacd !important;}
    elseif ($value->typ == 'dodacilist') $row->addClass('dodacilist');
    return $row;
}
jasir
Člen | 746
+
0
-

romansklenar napsal(a):

Proto se nejdříve zeptám – musí být ty metody implementující rozhraní ArrayAccess v Controlu final?
Nedokážu si moc totiž představit jak bych měl DataGrid přepsat, abych zachoval přístup ke sloupcům podobně jako ve formulářích $grid['sloupec']. Nedědit z Controlu a jít v nejnižším společném jmenovateli na PresenterComponent a pak tam toho půltuctu metod znovu dopisovat je jako drbání levou rukou za pravým uchem :(

David Grudl napsal(a):

Z hlediska návrhu by měly být final, ale aby to fungovalo, tak final dočasně odstraním.

Romane, přemýšlel jsem o tomto problému a o jeho řešení. Koukal jsem do tvých zdrojáků (ne nijak urputně, takže je možné, že píšu blbosti), a zdá se mi, že problém leží v tom, že ty do stromu component přidáváš 3 nové ComponentContainery – columns,actions,filters. Pak máš ArrayAccess, kde manipuluješ pouze s ‚columns‘. Nestačilo by tedy:

– použít Datagrid->components (myslím tím úložiště komponent datagridu) jen pro sloupce (a pak by se prostě použila výchozí implementace ArrayAccess z Control) – přístup na sloupce datagridu by tedy zůstal stejný jako nyní, analogický k FormContainer

– pro actions a filters použít vlastní stromy komponent (nepřidávat je tedy do stromu komponent Datagridu)

Tedy v konstrukturu nějak tak:

<?php
	$this->addComponent(new ComponentContainer, 'columns');
	$this->filtersContainer = new ComponentContainer, 'filters');
	$this->actionsContainer = new ComponentContainer, 'actions');
?>

Pak by „teoreticky“ stačilo přepsat místa, kde se přistupuje k filters a actions (změna z $this->getComponent('filter') na $this->filtersContainer) a také místa kde se používá $this['filters'] na $this->getFilters().Analogicky pro actions.

A možná by to při tom chtělo vyřešit mírnou nekonzistenci v tom, že DataGrid::$filters je public persistent string, ale getFilters() vrací strom komponent. (Přejmenovat proměnnou?)

Editoval jasir (17. 7. 2009 1:59)

romansklenar
Člen | 655
+
0
-

Taky jsem nad tím přemýšlel a z hlediska čistoty návrhu to udělám v duchu tohoto příspěvku jak už jsem kdysi uvažoval. ActionColumn si tedy bude držet u sebe svou akci, ostatní sloupce zase u sebe své filtry.

Čeho se ale bojím je to, že se to projeví na rychlosti, protože tak nepůjde využívat vlastností ComponentContaineru (InstanceFilterIterator), ale bude se muset procházet cyklem.

Konkrétně implementace DataGrid::getFilters() by se z tohoto:

return $this->getComponent('filters', TRUE)->getComponents(FALSE, 'IDataGridColumnFilter');

musela změnit na toto:

		$filters = new ArrayObject();
		foreach ($this->getColumns() as $column) {
			if ($column->hasFilter()) {
				$filters->append($column->getFilter());
			}
		}
		return $filters->getIterator();

a implementace DataGrid::getActions() by se z tohoto:

return $this->getComponent('actions', TRUE)->getComponents(FALSE, 'IDataGridAction');

musela změnit na toto:

		$actions = new ArrayObject();
		foreach ($this->getColumns() as $column) {
			if ($column instanceof ActionColumn) {
				$actions->append($column->getAction());
			}
		}
		return $actions->getIterator();
jasir
Člen | 746
+
0
-

romansklenar napsal(a):

Čeho se ale bojím je to, že se to projeví na rychlosti, protože tak nepůjde využívat vlastností ComponentContaineru (InstanceFilterIterator), ale bude se muset procházet cyklem.

Konkrétně implementace DataGrid::getFilters() by se z tohoto:

return $this->getComponent('filters', TRUE)->getComponents(FALSE, 'IDataGridColumnFilter');

musela změnit na toto:

		$filters = new ArrayObject();
		foreach ($this->getColumns() as $column) {
			if ($column->hasFilter()) {
				$filters->append($column->getFilter());
			}
		}
		return $filters->getIterator();

Co ti brání v tom, aby $filters byl sám o sobě ComponentContainer a ne ArrayObject?
Pak využiješ jeho vlastností a rychlosti, ne?

romansklenar
Člen | 655
+
0
-

Musel bych $filters stejně naplnit a ComponentContainer::addComponent() bude mít určitě větší režii než přidávání prvku do pole / ArrayObjectu.

romansklenar
Člen | 655
+
0
-

Tak je to přepsáno. Metody umožňující ArrayAccess v Controlu mohou být zase final. Akorát pozoruju, že je datagrid najednou o dost pomalejší…

Editoval romansklenar (18. 7. 2009 0:08)

David Grudl
Nette Core | 8139
+
0
-

Ok, vracím final. Počkej, a je pomalejší nebo ne?

romansklenar
Člen | 655
+
0
-

Po nahrání na server jsem zjistil, že není (maximálně pár ms). Můžeš se mrknout sám – předpo.

Honza Kuchař
Člen | 1662
+
0
-

Ahoj,
myslím, že by se měla vyhodit výjimka – místo toho se dočkám pár noticů z DataGridRenderer.php.

$grid->addColumn('Nazev', 'Název')->addFilter();

Ale sloupeček „Nazev“ v databázi neexistuje. Nebo to má nějaký důvod proč se výjimka nevyhazuje?

P.S.: DataGrid je opravdu perfektní a moc na za něj děkuji. ;)

Editoval honzakuchar (19. 7. 2009 19:22)

jarks
Člen | 94
+
0
-

Dobrý den,
pravděpodobně jsem zaznamenal chybu: Datagrid si mezi stránkami nepamatuje stav filtru, ani počet stránek nastavený roletkou.

Původně jsem myslel, že je to tím, že jsem musel použít novější Nette, ale dělá to i demo stažené ze SVN r36.
Postup: zadám do filtru text, použiju filtr (enter nebo ikona), aktuální stránka se správně zobrazí, ale po kliknutí na šipečku Next, je další stránka opět nefiltrovaná. Totéž s počtem stránek.

Zkoušeno na Mandriva Linuxu, Firefox 3.0.11 a 3.5.1.

romansklenar
Člen | 655
+
0
-

honzakuchar napsal(a):

Ahoj,
myslím, že by se měla vyhodit výjimka – místo toho se dočkám pár noticů z DataGridRenderer.php.

$grid->addColumn('Nazev', 'Název')->addFilter();

Ale sloupeček „Nazev“ v databázi neexistuje. Nebo to má nějaký důvod proč se výjimka nevyhazuje?

Nemá to žádný důvod. Při vykreslování je na výjimku podle mě pozdě, takže by to chtělo nějak ošéfovat už při vytváření sloupců… jenže mě nenapadá žádný čistý způsob jak oveřit, je-li v datasourcu daný sloupec. Ale pořád lepší než noticka, takže to tam přidám.

jarks napsal(a):

Dobrý den,
pravděpodobně jsem zaznamenal chybu: Datagrid si mezi stránkami nepamatuje stav filtru, ani počet stránek nastavený roletkou.

Původně jsem myslel, že je to tím, že jsem musel použít novější Nette, ale dělá to i demo stažené ze SVN r36.
Postup: zadám do filtru text, použiju filtr (enter nebo ikona), aktuální stránka se správně zobrazí, ale po kliknutí na šipečku Next, je další stránka opět nefiltrovaná. Totéž s počtem stránek.

Zkoušeno na Mandriva Linuxu, Firefox 3.0.11 a 3.5.1.

Nic takového u sebe nepozoruju. Zde je aktuální revize na serveru. Zdá se mi tam vše v pořádku se zaplým i vyplým JS.

jarks
Člen | 94
+
0
-

romansklenar napsal(a):
Nic takového u sebe nepozoruju…

Na Vašem odkazu to skutečně funguje v pořádku, u mě ale ne.

Teď mě napadlo podívat se na domácím serveru na Requirements Checker a zjistil jsem, že hlásí jeden jediný warning a to je Reflection phpDoc. Jde o persistentní parametry. Mohlo by to být ono? Rád bych to napravil, ale nemůžu zjistit jak. Je to modul, nebo nastavení v konfiguraci?

romansklenar
Člen | 655
+
0
-

Řešení je zde.

Do DataGridu se přidá tato metoda:

	public static function getPersistentParams()
	{
		return array('page', 'order', 'filters', 'itemsPerPage');
	}

A jelikož jsou v DataGridu parametry jasně dané, nemám problém s tím to tam přidat. Revize 38 to tedy bude mít.

Editoval romansklenar (19. 7. 2009 13:04)

jarks
Člen | 94
+
0
-

Díky, pořád jsem hledal, jak to zapnout a nakonec jsem zjistil, že kromě řešení, které uvádíte, také stačí vypnout eAccelator a už to jede.


Narazil jsem ještě na další problém: Během stránkování se mi ztrácí parametr předaný modelu. Vypadá to takto:

Datagrid má zobrazovat buď položky právě přihlášeného uživatele (to je výchozí, jeho ID je v $this->prihlaseny), nebo všechny položky, pokud se klikne na odkaz.

V šabloně se volá takto:

<a href="{plink Pokusny:default}">[ položky uživatele ]</a>
<a href="{plink Pokusny:default,'0'}">[ všechny položky]</a>

Presenter s vytvářením Datagridu:

class PokusnyPresenter extends BasePresenter {

    protected $user = 0; //<< pomocná proměnná

    // tato metoda se volá ze šablony bez parametru, nebo s parametrem 0:
    public function renderDefault($user) {
        if(!isset($user)) $this->user = $this->prihlaseny; //<< číslo přihlášeného uživatele
        $this->template->dokonceneGrid = $this->getComponent('pokusnyGrid');
    }

    // továrnička, kde se zavolá model (`getPolozky`)s parametrem:
    protected function createComponent($name) {
        switch ($name) {
            case 'pokusnyGrid':
                //...kód...
                $grid->bindDataTable($model->getPolozky($this->user)); // volá se metoda modelu s parametrem
                //...kód...
                $this->addComponent($grid, $name);
                return;
        }
    }
}

Příslušná metoda v modelu:

public function getPolozky($user=0) {
    $dotaz = 'SELECT * FROM polozky';
    // jestli je v parametru ID, doplníme ho k dotazu jako podmínku:
    if($user!=0) $dotaz.= ' AND id ='.$user;
    return $this->connection->dataSource($dotaz);
}

Na první stránce výpisu se správně zobrazí jen položky uživatele, to znamená parametr se použije. Na další, ale grid „zapomene“ a zobrazí všechny položky. Dělám prosím nějakou chybu?

romansklenar
Člen | 655
+
0
-

Tipoval bych, že ten pomocný parametr se nemá kudy přenášet, přenášel bych ho teda v URL:

/** @persistent int */
public $user = 0;

Editoval romansklenar (19. 7. 2009 14:44)

ales.kafka
Člen | 34
+
0
-

Co když chci přidat sloupec, kterému budu pomocí callbacku předávat jen takovou obrázek šipky (pro usnadnění řazení), který bude stejný bez závislosti na jakoukoliv hodnotu z dataSource? Dá se to bez vnitřního zásahu nějak elegantně vyřešit?

romansklenar
Člen | 655
+
0
-

V dotazu datasourcu udělat alias k nějakému atributu, třeba primárnímu klíči (id AS order) a na něm vytvořit sloupec poděděný od třídy DataGridColumnu (nebo i od jiných) a napsat si svou implementaci. Jako příklad může posloužit PositionColumn.

jarks
Člen | 94
+
0
-

romansklenar napsal(a):
Tipoval bych, že ten pomocný parametr se nemá kudy přenášet…

Ano, bylo to tak a po pár úpravách to už funguje. Už jsem to předtím zkoušel, ale ve spojitosti s nefunkčními persistentními parametry, jsem se do toho nějak zamotal. Dík.

norbe
Backer | 405
+
0
-

Chci se zeptat, jestli by datagrid nešel rozšířit o nějaké tlačítko, které by uživatelem upravené filtrování odstranilo (př. nastavilo na defaultní hodnoty)? Prostě něco jako $grid->addResetFilterButton();. Myslím, že hlavně ve spojením s $grid->rememberState = TRUE; by se tato vlastnost mohla uživatelům hodit. Datagrid již podobnou funkci má :)

A ještě bych dotaz týkající se screenu z první stránky. To co je tam vidět již je součástí datagridu, nebo ne? Př. jakým způsobem můžu umístit na datagrid tlačítko pro přidání nové položky(to které je vidět na screenu v pozadí) a jak nastavit editační formulář?

Editoval norbe (20. 7. 2009 23:12)

romansklenar
Člen | 655
+
0
-

Jo to tlačítko by asi přišlo vhod no… Zatím je tam prvek, který vyresetuje komplet celý stav komponenty, tzn. že včetně stránkování a řazení. Není problém tam přidělat i takové tlačítko, spíš je problém, že nevím kde už ty další a další inputy a buttony nacpat :)

To součástí datagridu jako třídy nebude. Bude to jen součástí demo aplikace.

Tlačítko se dá dostat do footeru nějak takto:

$title = "Přidat osobu";
$span = Html::el('span')->class("ui-icon ui-icon-newwin");
$link = Html::el('a')->href($this->link('nova!'))
	->title($title)->setHtml($span . $title)
	->class("dialog-link ui-state-default ui-corner-all");

$renderer = $grid->getRenderer();
$renderer->footerFormat = $link . $renderer->footerFormat;
$grid->setRenderer($renderer);

Editoval romansklenar (20. 7. 2009 23:11)

kutilm
Člen | 21
+
0
-

Ahoj,
můžete mi poradit. Mám komponentu (MyControl) a v ní teprve komponentu DataGrid. (Oboje komponenty dělám pomocí „nové“ továrničky). Jak mám přidat sloupec s posunem a k tomu metodu (signál)?

Zkusil jsem: (EDIT: Doplnil jsem deklaraci objektu)

<?php
class MyControl extends Control
{
// ...
  protected function createComponentSubAddress()
  {
    $grid = new DataGrid();
    //...
    $pos = array('up' => 'Nahoru', 'down' => 'Dolu');
    $grid->addPositionColumn('order', 'Position', 'positionMove!', $pos);
    //...
    return $grid;
  }
  public function handlePositionMove($key, $dir)
  {
  // ...
  }
// ...
}
?>

ale na stránce se mi generuje jen odkaz: error: Unknown signal 'PagePresenter:positionMove!'.

Používám verzi ze SVN.
Jo ještě jsem narazil na tohle, pokud volám:

<?php
$grid->addPositionColumn('order', 'Position', NULL, $pos)
?>

tak v souboru PositionColumn to na řádku 58 vyhazuje chybu, asi tam chybí závorky za getName.

Dík Michal

Editoval kutilm (26. 7. 2009 4:21)

romansklenar
Člen | 655
+
0
-

Je třeba mít metodu pro obsluhu signálu v podkomponentě.

Jojo chybička se vloudila a závorky někam utekly :) zatím uváděj signál explicitně

kutilm
Člen | 21
+
0
-

To jsem myslel, že mám tu funkci handlePositionMove($key, $dir), deklarovanou hned pod tou továrničkou (viz. ten ne moc dobrý fragment kódu – doplnil jsem tam deklaraci objektu). To ji mám přidat přímo do toho DataGridu?

romansklenar
Člen | 655
+
0
-

Ne to určitě ne, tam žádné uživatelské handlery nepatří.

Díval jsem se na to a našel jsem chybku v třídě toho sloupce. V poslední revizi je to opraveno.

kutilm
Člen | 21
+
0
-

Ne to určitě ne, tam žádné uživatelské handlery nepatří.

Já si to myslel ;-)
Jinak teď to funguje, pěkně. Dík.

Ještě jedna FeatureRequest, mohlo by být hezké si positionColumn udělat z libovolného sloupce, např. nějak takto:

<?php
$grid->addColumn('name', 'Uživatel')->addPosition('positionkey', 'positionMove!', ...);
// hodnota z positionkey by se pak předala do handlePositionMove().
?>

Dík Michal

Jakub Šulák
Člen | 222
+
0
-

Jen bych se rád zeptal, nepočítáš náhodou do budoucna, že by jsi přidal do datagridu funkci uživatelské změny řazení drag&drop? Tím myslím například použití na e-shopu, kde jsou produkty na úvodní straně a já si chci seřadit, který bude první atd. Nyní možné řešit šipkama nahoru/dolů. Ale ideální by byla možnost drag&drop.

romansklenar
Člen | 655
+
0
-

Už mě to napadlo, ale podporu pro jQuey UI Sortable si nechávám si to asi někdy do budoucna na neurčito stejně jako napovídání při vyhledávání a schovávání sloupců.

Bojím se ale, že to bude pomalé (invalidace komponenty po každém přesunu?), takže se bude muset zvážit, jestli tam invalidaci při přesouvání dávat (jsem spíše toho názoru, že ne). Pak je třeba při chybě třeba nějak zareagovat (což není problém a mám už to vymyšlené).

Ale nejvíce se bojím, že to zvedne vlnu dotazů, kdy to lidi nebudou umět rozchodit. Už i za momentálního stavu kdy je datagrid docela jednoduchý na zprovoznění a obsahuje i funkční demo aplikaci, se fórum i můj mailbox plní dotazy s implementací (tohle vlákno je OK – řeší se tu bugy a featury, zběžní uživatelé ví, že existují diskuse ke stránkám v nette wiki, ti méně zběhlí ale zakládají nová vlákna, kde se řeší problémy typu nejede mi to ajaxově apod).

Editoval romansklenar (28. 7. 2009 19:10)

timbulko
Člen | 85
+
0
-

Je nejaká možnosť ako nastaviť, aby sa napríklad odkaz v thead, podľa ktorého sa momentálne usporiadávajú riadky nejako zvýraznil (napr. aby sa tam pridal nejaky class – asc/desc)? Alebo aby sa tam zobrazovala iba jedna šípka? Myslím, Že v staršej verzii DataGridu to takto funguje, ale v tejto neovej neviem prísť na to ako to tam nastaviť. Diky.

romansklenar
Člen | 655
+
0
-

Šipce (asc/desc) sloupce, podle které se řadí je přiřazena třída active, která ji zvýrazní. Doporučuju průběžně aktualizovat nejen php soubory, ale i css a js.

na1k
Člen | 288
+
0
-

Rychlý dotaz – je možné nějak skrýt selectbox pro počet zobrazovaných řádků (v patičce) ?

Nikde jsem žádné „vypínátko“ nenašel. V demu to sice není, ale mám podezření, že se tahle funkce objevila až v pozdější revizi a demo není aktualizované.

A ještě jsem nestihl poděkovat, takže neskonalé díky za tuhle komponentu. Je to rozhodně letošní komponenta roku :))

romansklenar
Člen | 655
+
0
-
$renderer = $grid->getRenderer();
$renderer->infoFormat = 'Záznamy %from% - %to% z %count% | %reset%'; // zde upravovat dle libosti
na1k
Člen | 288
+
0
-

Skvělé, moc díky :)

timbulko
Člen | 85
+
0
-

romansklenar napsal(a):

Šipce (asc/desc) sloupce, podle které se řadí je přiřazena třída active, která ji zvýrazní. Doporučuju průběžně aktualizovat nejen php soubory, ale i css a js.

Áno, viem, že sa do šípky podľa ktorej sa zoraďuje pridáva trieda active a takisto mám aj stiahnuté najnovšie súbory zo SVN, ale ja navrhujem, aby sa pridala aj nejaká trieda asc/desc do bunky tabuľky (do th) – takto podobne to fungovalo v starších verziách.

Potreboval by som totiž napríklad zmeniť farbu pozadia v celej bunke, podľa ktorej sa usporiadava. Teraz je to možné jedine pomocou javascriptu, na ktorom sa snažím byť nezávislý, alebo manuálnou úpravou DataGridu.

Díky.

marek.dusek
Člen | 99
+
0
-

Ahoj,

jen dve drobnosti:

  1. slo by zaridit, aby checkbox column podporoval callback pro format?
  2. sla by zaridit lepsi podpora pro filtrovaci konstrukce, napr. pro vyber (NOT) NULL hodnot – napr. v klasicke text column by pribylo neco jako
public function applyFilter($value)
{
	...
	} else if ($value = 'NULL') {
			$cond[] = array("[$column] IS NULL");
	} else {
	....
}

(potreboval jsem zaridit, abych mohl nad datetime sloupcem vybrat ‚vse‘, ‚je tam nejake datum‘, ‚je tam NULL‘ – pokud jsem pouzil date column, jde filtrovat jen dle shody; pokud text column, neslo zadat tu IS NULL podminku; pokud checkbox, IS NULL jde, ale zase neslo namisto checkboxu zobrazit hodnotu :-)