NiftyGrid – Datagrid pro Nette 2 s velkou škálou funkcí
- PaajaE
- Člen | 5
Ahoj, prosím o radu:
Mám problém se získáním dat s využitím DibiFluentDataSource z oracle db (Nette 2.0.4, Dibi 2.0). Dotaz na počet záznamů v tabulce se vykoná správně, ale následný dotaz, který by měl natáhnout prvních dvacet záznamů se už neprovede a zahlásí:
oci_execute(): ORA-00933: příkaz SQL není řádně ukončen
SQL příkaz, který se posílá, vypadá takto:
SELECT * FROM "AREALY" LIMIT 20 OFFSET 0
Můj grid vypadá takto:
<?php
use \NiftyGrid\Grid;
class ArealyGrid extends Grid{
private $db;
public function __construct(\DibiConnection $connection)
{
parent::__construct();
$this->db = $connection;
}
protected function configure($presenter)
{
$fluent = $this->db->select('KODAREALU, NAZEVAREALU, DATUM_EDITACE, NAZ_SO, NAZ_MC')->from('AREALY');
$dataSource = new \NiftyGrid\DibiFluentDataSource($fluent, 'KODAREALU');
// $dataSource = new \NiftyGrid\DibiFluentDataSource($this->db->select('*')->from('AREALY'), 'kodarealu');
$this->setDataSource($dataSource);
$this->addColumn('KODAREALU', 'Titulek', '250px');
$this->addColumn('NAZEVAREALU', 'Autor', '100px');
$this->addColumn('DATUM_EDITACE', 'Datum', '100px');
$this->addColumn('NAZ_SO', 'Status', '100px');
$this->addColumn('NAZ_MC', 'Zobrazení', '100px');
}
}
?>
Nemohu objevit chybu, ale jsem začátečník a řešení jsem nikde nenašel.. Díky za pomoc nebo navedení :-)
- Nifty
- Člen | 45
Ahoj, popravdě mě moc nenapadá, kde by mohl být problém.
Schválně to zkus vypsat někam mimo grid, jestli to bude fungovat.
Ten název tabulky v dotazu, kterej ti to vytvoří, by asi neměl být
v uvozovkách a vybírá ti to všechny sloupce(*), i když si tam v selectu
vyjmenoval, které chceš.
S dibi ani s oracle jsem nikdy moc nepracoval, ale nemohl by být problém
třeba ve velkých písmenech tabulek/sloupců? Popř. problém v dibi driveru
pro oracle?
Třeba někdo moudřejší poradí :)
- PaajaE
- Člen | 5
Nifty napsal(a):
Ahoj, popravdě mě moc nenapadá, kde by mohl být problém.
Schválně to zkus vypsat někam mimo grid, jestli to bude fungovat.
Ten název tabulky v dotazu, kterej ti to vytvoří, by asi neměl být v uvozovkách a vybírá ti to všechny sloupce(*), i když si tam v selectu vyjmenoval, které chceš.
S dibi ani s oracle jsem nikdy moc nepracoval, ale nemohl by být problém třeba ve velkých písmenech tabulek/sloupců? Popř. problém v dibi driveru pro oracle?
Třeba někdo moudřejší poradí :)
Díky za odpověď.
Kombinaci dibi a oraclu už mám vyzkoušenou, malá/velká písmena u sloupců
by neměly být problém, naopak u tabulky musí být velká. Tabulka
v uvozovkách snad také pro oracle není problém.. Ohledně toho výpisu (*)
je to moje chyba – vypsal jsem špatnou chybovou hlášku.. Správně mělo
být:
SELECT kodarealu, nazevarealu, datum_editace, naz_so, naz_mc FROM "AREALY" LIMIT 20 OFFSET 0
Mně to přijde, že se špatně vyskládá sql dotaz – měla by tam asi být
nějaká where podmínka pro ten limit a offset namísto
LIMIT 20 OFFSET 0
Leč bohužel netuším, jak tu chybku
odstranit…
- Nifty
- Člen | 45
Dotaz se vyskládá správně. V základnim stavu gridu nejsou žádné
podmínky nutné. Limit 20 je defaultní hodnota, takže to tam je také
správně.
Chyba vzniká na straně SQL serveru, takže problém bude někde mezi
datasource/dibi/oracle. Jestli oraclu nevadí název tabulky v uvozovkách, tak
nevim, co se tomu na tom dotazu nelíbí.
Tady jsem sepsal, co se postupně s tim fluentem děje
//vytvoření a předání zdroje dat
$fluent = $this->db->select('KODAREALU, NAZEVAREALU, DATUM_EDITACE, NAZ_SO, NAZ_MC')->from('AREALY');
$dataSource = new \NiftyGrid\DibiFluentDataSource($fluent, 'KODAREALU');
$this->setDataSource($dataSource);
DibiFluentDataSource
class DibiFluentDataSource extends Nette\Object implements IDataSource
{
//zdroj dat
public $fluent;
//primární klíč
public $pKeyColumn;
//v konstruktoru se fluent naklonuje a uloží
public function __construct(DibiFluent $fluent, $pKeyColumn)
{
$this->fluent = clone $fluent;
$this->pKeyColumn = $pKeyColumn;
}
//z gridu se zavolá limitování počtu řádků
public function limitData($limit, $offset)
{
$this->fluent->limit($limit)->offset($offset);
}
//Potom se už jen předá do gridu
public function getData()
{
return $this->fluent->fetchAssoc($this->pKeyColumn);
}
}
Zjednodušeně se provede jen toto
$fluent = $this->db->select('KODAREALU, NAZEVAREALU, DATUM_EDITACE, NAZ_SO, NAZ_MC')->from('AREALY');
$fluent->limit(20)->offset(0);
$fluent->fetchAssoc('KODAREALU');
Už mě vubec nenapadá, co by mohlo být špatně, je to záhada :)
Editoval Nifty (22. 8. 2012 16:08)
- PaajaE
- Člen | 5
Ještě je zajímavé, že mi to hlásí pouze warning.. Nikoli error..
Tady je warning:
File: ...\libs\dibi\drivers\oracle.php Line: 106
oci_execute($res, $this->autocommit ? OCI_COMMIT_ON_SUCCESS : OCI_DEFAULT);
Callstack vypadá takto:
…\libs\dibi\drivers\oracle.php:106 source ► oci_execute (arguments ►)
…\libs\dibi\libs\DibiConnection.php:343 source ► DibiOracleDriver-> query (arguments ►)
…\libs\dibi\libs\DibiConnection.php:261 source ► DibiConnection-> nativeQuery (arguments ►)
…\libs\dibi\libs\DibiFluent.php:439 source ► DibiConnection-> query (arguments ►)
…\libs\dibi\libs\DibiFluent.php:379 source ► DibiFluent-> query (arguments ►)
…\libs\NiftyGrid\DataSource\DibiFluentDataSource.php:58 source ► DibiFluent-> fetchAssoc (arguments ►)
…\libs\NiftyGrid\Grid.php:869 source ► NiftyGrid\DibiFluentDataSource-> getData ()
…\temp\cache\_Nette.FileTemplate\_Homepage.default.latte-e653fe012b94307998fa03d3498ac8ba.php:14 source ► NiftyGrid\Grid-> render ()
…\libs\Nette\Latte\Macros\UIMacros.php:468 source ► _lb2ae51c8d4f_content (arguments ►)
…\temp\cache\_Nette.FileTemplate\_templates._layout.latte-1c3100889014a17f83abea3e932269ea.php:73 source ► Nette\Latte\Macros\UIMacros:: callBlock (arguments ►)
…\libs\Nette\Utils\LimitedScope.php:73 source ► include (arguments ►)
…\libs\Nette\Templating\FileTemplate.php:119 source ► Nette\Utils\LimitedScope:: load (arguments ►)
…\temp\cache\_Nette.FileTemplate\_Homepage.default.latte-e653fe012b94307998fa03d3498ac8ba.php:36 source ► Nette\Templating\FileTemplate-> render ()
…\libs\Nette\Utils\LimitedScope.php:73 source ► include (arguments ►)
…\libs\Nette\Templating\FileTemplate.php:119 source ► Nette\Utils\LimitedScope:: load (arguments ►)
…\libs\Nette\Application\Responses\TextResponse.php:59 source ► Nette\Templating\FileTemplate-> render ()
…\libs\Nette\Application\Application.php:142 source ► Nette\Application\Responses\TextResponse-> send (arguments ►)
…\app\bootstrap.php:41 source ► Nette\Application\Application-> run ()
…\www\index.php:16 source ► require (arguments ►)
Editoval PaajaE (22. 8. 2012 16:43)
- PaajaE
- Člen | 5
Tady je Odkaz na laděnku
SNad jsem zvládnul všechno upravit a snad to opravdu uvidíš zvenčí.. Mizím na prodloužený víkend, tak ted nebudu moct reagovat.. Každopádně díky za pomoc..
- thunderbuff
- Člen | 164
Callbacky a anonymní funkce v php moc neznám, obracím se na vás s prosbou o radu:
Lze toto upravit tak, abych do té funkce mohl předat vlastní parametr (Například formát data na základě uživatelova nastavení)?
<?php
$this->addColumn('published', 'Datum', '100px')
->setRenderer(function($row){return date('j.n.Y', strtotime($row['published']));})
?>
Zjistil jsem, že $row se do té funkce cpe z templatu a vlastní logiku dělají dvě funkce z Column.php, ale nejsem z toho moc chytrý…
- thunderbuff
- Člen | 164
Děkuji Nifty :-) Po třech dnech tvorby vlastního gridu jsem se rozhodl použít ten Tvůj. Je opravdu EPICKÝ
- Milo
- Nette Core | 1283
PaajeE: Chyba je v SQL dotazu. Oracle nezná klauzule
LIMIT
a OFFSET
. Vyzkoušej upravený
datasource. Nemám poruce Oracle, netestoval jsem.
Editoval Milo (23. 8. 2012 14:44)
- Nifty
- Člen | 45
Saja
V současné verzi to nejde, ale píšu si na seznam TODO :)
muflix
Ty zdrojové kódy demo stránky jsou už z dost staré verze(jinak se tam
pracuje se sloupcema). Ukázková aplikace ke stažení pod dokumentací
nestačí? Je tam využito všechno, co v tom demu. Akorát tam chybí
přidávání globálních tlačítek a přidávání řádků(návod najdeš
v tomto tématu), to je zatím pouze na githubu.
Editoval Nifty (28. 8. 2012 11:13)
- rp
- Člen | 20
Pěkná komponenta. Chybí mi možnost uchovat stav:
protected function configure($presenter)
{
...
$this->rememberState = TRUE;
$this->rememberTimeout = '+ 2 minutes';
}
Zkoušel jsem to tak, že při každém požadavku na vykreslení ukládám odkaz na komponentu:
if($this->rememberState)
{
// save state to session
$this->remember('state', $presenter->link('//this'));
}
což je funkční a opravdu ukládá odkaz na aktuální stav (absolutní URL) do session. Problém je v obnovení – redirectu na URL. Při připojování komponenty do presenteru (metoda attached) se pokouším o:
protected function attached($presenter)
{
...
$state = $this->recall('state');
$this->redirectUrl($state);
...
}
Absolutní URL ze session vytáhnu úspěšně, ale redirectUrl nefunguje – k přesměrování nedochází. To se asi nedělá přesměrovávat v attached, že? Kde to ale správně udělat? Nebo na to jít úplně jinak?
- thunderbuff
- Člen | 164
Lze nějak nastavit omezení pro konkrétní položky v addButton? Mám například tabulku s uživateli, jako admin se mohu za nějakého z nich přihlásit, ale u řádku se svým záznamem ikonku „Login User“ nechci. Je to nějak jednoduše proveditelné?
<?php
$this->addButton("edit", "Login user")
->setClass("loginicon smallicon")
->setLink(function($row) use ($presenter) {
return $presenter->link("Users:Loginuser", $row['userid']);
})
->setAjax(FALSE);
?>
Editoval thunderbuff (29. 8. 2012 19:47)
- Nifty
- Člen | 45
rp
V attached by měl jít redirect. Např. v metodě filterData, která je
volaná z attached, je redirect a funguje. Nenapadá mě, co by tam mohlo být
za problém.
thunderbuff
Tuto úpravu už navrhoval Kurtas, dokonce poslal i pull request, ale já na to
zapomněl :)
https://github.com/…Grid/pull/12
Parametrem je callback, který má vracet boolean hodnotu a podle toho se button
vykreslí/nevykreslí.
Akorát přemýšlím, jestli místo setShow() by nebylo vhodnější např.
setVisibility().
- kubiq
- Člen | 6
Ahoj,
Ve třídě DoctrineDataSource chybí implementace metody getPrimaryKey z interfacu IDataSource:
Class NiftyGrid\DoctrineDataSource contains 1 abstract method and must therefore be declared
abstract or implement the remaining methods (NiftyGrid\IDataSource::getPrimaryKey)
Nejsem si uplně jistý jesti to je chyba u mě, nebo někde jinde, ale přijde mi logické ji tam implementovat.
Editoval kubiq (30. 8. 2012 14:56)
- Nifty
- Člen | 45
Ahoj, DoctrineDataSource je už z trochu starší verze gridu, tak je
možné, že tam něco chybí. Sice nejsem autor, ale snad poradím.
Mělo by stačit přidat:
public function getPrimaryKey()
{
return $this->primary;
}
Kdyžtak dej vědět, jestli to funguje a hodim to na github.
Editoval Nifty (30. 8. 2012 16:26)
- Nifty
- Člen | 45
Stačí přidat k definici sloupce setBooleanEditable() a zapnout řádkovou editaci.
Pokud ti jde o to vidět ten checkbox i mimo editaci, použij metodu setRenderer() a pomocí \Nette\Utils\Html::el() tam ten checkbox dej. Ale myslim si, že to bude akorát zbytečně plést uživatele (ledaže by byl checkbox disabled).
$this->addColumn('published', 'Publikováno?')
->setRenderer(function($row){
return \Nette\Utils\Html::el('input')
->type('checkbox')
->disabled('disabled')
->checked((boolean) $row['published']);
})
//checkbox můžeme zarovnat na střed
->setCellRenderer("text-align:center;");
Editoval Nifty (31. 8. 2012 17:45)
- marten_cz
- Člen | 10
Komponenta vypada opravdu dobre a pracuje i rychle. Mel bych jen par otazek:
- Je mozne volat dalsi akce pri zmene group akce? Tedy chci hromadne zmenit autora zaskrtnutych clanku, kdyz kliknu na „Zmena autora“, rad bych po prave strane ukazal dalsi selectbox s autorama.
- Nebylo by spatne pridelat validaci na radkovou editaci. Tedy napr. kdyz se nepovede ulozit do DB, nemam moznost dat o otm vedet uzivateli jinak nez pres flash message, coz je nepohodlne.
- David Ďurika
- Člen | 328
nema niekto spravene tie templaty do bootstrapu ?
Editoval achtan (8. 9. 2012 10:25)
- Nifty
- Člen | 45
ZZromanZZ
Mělo by stačit přidat handler v js souboru při startu a na konci ajaxu. Do
oficiální verze to zatim neplánuju.
TheNEoo
Odkaz na se generuje v třídě Button v metodě render. Buttony jsou
koncipovány jako obrázková tlačítka, takže bez zásahu do kódu to lehce
provést asi nepůjde. Do budoucna bych to možná předělal, aby se s tim
dalo lépe manipulovat.
marten_cz
1)To je docela komplexní požadavek, myslim že bez vlastního rozšíření to
nepůjde.
2)Mělo by to jít takhle
$this['gridForm'][$this->name]['rowForm']['columnName']->addRule(..);
V šabloně ale bude potřeba přidat výpis pro chyby z formuláře. V dalším updatu bych to tam přidal, možná i zjednodušil ten přístup k formulářovým prvkům.
Saja
Překlady ještě nejsou v oficiálni verzi. Kurtas poslal pull request na
přidání podpory translatu i šablonu (nemusí být z aktuální
verze), ale ještě jsem se k tomu nedostal.
achtan
Tady jsou nějaké
úpravy pro bootstrap (nezkoušel jsem). O ničem jiném nevim.
- David Ďurika
- Člen | 328
Nifty napsal(a):
Tady jsou nějaké úpravy pro bootstrap (nezkoušel jsem). O ničem jiném nevim.
a nechcel by si mergnut tie commity vyzera to dobre… a nebudes musiet robit vlastne css, bootstrap uz aj tak pouziva skoro kazdy…
- ZZromanZZ
- Člen | 87
Nifty,
jenom drobný dotaz, proč je konfigurace gridu v metodě configure a předává se do ní aktuální presenter ?
Nešlo by to řešit takto ?
<?php
class NejakyPresenter extends \Nette\Aplication\UI\Presenter
{
protected function createComponentGrid($name)
{
return new \Nekde\Nejaky\Grid($this, $name)
}
}
?>
A v samotném gridu by funkce configure vůbec nemusela být…
<?php
class Grid extends \Nïfty\Grid
{
public function __construct($parent, $name)
{
__parent::construct($parent, $name);
// zbytek konfigurace primo v konstruktoru...
// nebo zavolame primo $this->configure();
}
}
?>
Bylo by to myslím víc nette-way a nemuselo by se to řešit metodou attached
Editoval ZZromanZZ (10. 9. 2012 19:26)
- Skippous
- Člen | 21
achtan napsal(a):
Nifty napsal(a):
Tady jsou nějaké úpravy pro bootstrap (nezkoušel jsem). O ničem jiném nevim.a nechcel by si mergnut tie commity vyzera to dobre… a nebudes musiet robit vlastne css, bootstrap uz aj tak pouziva skoro kazdy…
Souhlasím a připojuji se k prosbě, bootstrap je dle mého nejlepší řešení pro backend.
- talpa
- Člen | 44
suprove napsany jen v textinput filtru je problem se sirkou ktera vzdy zmeni sirku pole, maly patch :)
/**
* @return Column
*/
public function setTextFilter()
{
$this->parent['gridForm'][$this->parent->name]['filter']->addText($this->name, $this->label.":")->setAttribute('style', array('width'=>$this->width));
$this->filterType = FilterCondition::TEXT;
return $this;
}
/**
* @return Column
*/
public function setNumericFilter()
{
$this->parent['gridForm'][$this->parent->name]['filter']->addText($this->name, $this->label.":")->setAttribute('style', array('width'=>$this->width));
$this->filterType = FilterCondition::NUMERIC;
return $this;
}
Editoval talpa (14. 9. 2012 19:11)
- talpa
- Člen | 44
jak je to s podminenym zobrazenim edit buttonu, prestavoval bych si neco
podobneho co renderuje polozky,
strilim to od boku tak me nekamenujte
$this->addButton("edit", "Upravit Návštěvu")
->setClass("edit")
->setLink(function($row) use ($presenter){
return $presenter->link("visit:edit", $row['id']);})
->setAjax(FALSE)
->setRenderer(function($row){
$inv=\Model\Visit::getVisitStatus();
return $row['status']=="editovatelny"?($control):null;
});
--/
Editoval talpa (14. 9. 2012 19:19)
- Nifty
- Člen | 45
Přidán callback pro zobrazení/schování buttonu nebo subgridu na jednotlivých řádcích:
$this->addButton("publish", "Publikovat")
->setShow(function($row){
return $row['status'] == 'Publikované' ? FALSE : TRUE;
});
$this->addSubGrid("comments", "Zobrazit komentáře k článku")
->setGrid(new CommentGridByArticleId($comments, $this->activeSubGridId))
//$row['comments'] je boolean hodnota z db, povolené - nepovolené komentáře
->setShow(function($row){
return $row['comments'];
});
Přidána podpora pro validaci řádkového formuláře a formuláře pro přidávání řádků.
$this->getColumnInput('title')->addRule(...);
Přidána podpora pro textová tlačítka
$this->addButton('delete', 'Smazat')
//může být i callback
->setText('Smazat')
->setClass('delete-textual');
U hromadných akcí lze nyní vypnout ajax. Například pro zobrazení detailů u vybraných produktů:
$this->addAction('detail', 'Zobrazit detaily')
->setAjax(FALSE)
->setCallback(function($rows) use ($presenter){
return $presenter->redirect('Products:details', array('rows' => $rows));
});
k bootstrapu:
Asi bych to přidal jako druhou šablonu. Nebo se to nevylučuje? S bootstrapem
jsem si zatim moc nehrál, máte někdo funkční ukázku?
ZZromanZZ
Myslim, že je to víceméně jedno. Takhle by si zase musel psát v gridu
novou metodu pro předání modelu nebo přenášet 3 a víc parametrů
(parent, name, model, subGridId, ..).
talpa
Moc jsem nepochopil, co je tam přesně za problém. S tvojí úpravou i bez
se mi to zobrazuje stejně. Můžeš to kdyžtak rozepsat? Podmíněné buttony
viz nahoře tohoto příspěvku.
Editoval Nifty (15. 9. 2012 16:35)
- Andrasin
- Člen | 29
Parádní komponenta, díky za ní, obzvlášť za ty nejnovější změny.
Jen takový nápad, možná by bylo dobré dát do řádkové editace možnost
místo text inputu zvolit textareu. V některých případech by to bylo dost
užitečné.
Jako je to například v editaci hodnot tabulek v Admineru od
Jakuba Vrány.
EDIT: Ještě jsem teď našel bug, pokud odešlu řádkovou editaci v subgridu a v nadřazeném gridu jsou definovány nějaké validační pravidla pro řádkovou editaci, validace se v něm spustí také. Pokud je tam pak nějaké pravidlo setRequired, formulář ze subgridu se neodešle.
Editoval Andrasin (18. 9. 2012 3:53)
- talpa
- Člen | 44
jedna vec, jak filtrovat podle group pole tj. napr.
$this->addColumn('celkem', 'Celkem', '70px')
->setTableName('count(companies_id)')
->setTextFilter();
primlouval bych se dat u setTableName parametr, ktery by rikal jestli to
cirou nahodou neni HAVING tj. ze nema byt ve WHERE :)
Hlavne ne vnorene selecty apod.
- Pingy
- Člen | 6
Aby mi fungovalo správně nejenom filtrování, ale i řazení u sloupců s nastaveným setTableName(), tak jsem upravil Grid.php a přidal tam do metody orderData() [583] podmínku která mi i řadí dle zadané tabulky.
if(!empty($this['columns-'.$order[0]]->tableName)){
$order[0] = $this['columns-'.$order[0]]->tableName;
}
Je řazení podle výchozí tabulky bug, nebo feature?
- Pingy
- Člen | 6
Přidal jsem si metodu setTarget($target), protože potřebuju některé action posílat do nového okna/panelu. Pokud by to využil i někdo jiný, tak si myslím, že není tak špatné to implementovat. Jedná se o celkem primitivní změnu v Button.php
Edit: ne addTarget, ale setTarget($target)
Editoval Pingy (22. 9. 2012 21:51)
- muflix
- Člen | 92
Ahoj, řeším určitě jednoduchou věc, mám tabulku a rád bych po kliku na tlačítko vygeneroval fakturu. Používám doplněk generátor faktur který mi při odkazu v .latte
<a n:href="Eciovni:generate">Vygenerovat fakturu</a>
normálně funguje.
nevím ale jak odkaz přidat do nifty tabulky, zkoušel jsem něco takového
$this->addButton("pdf", "Vygenerovat PDF")
->setClass("pdfikonka")
->setLink(function($row) use ($self){return $self->link("Eciovni:generate");});
//->setLink("http://example.cz/Eciovni/generate");
//->setLink(function($row) use ($self){return $self->link("Eciovni:generate"/*, $row['id']*/);});
//->setAjax(FALSE);
ale už při generování stránky mi to napíše
Nette\InvalidArgumentException
Component with name 'Eciovni' does not exist.
u přímého odkazu mi to zase pošle na pozadí (pro uživatele se nic neděje) GET požadavek jehož odezvou je zdrojový kód vygenerované faktury ale stejně nevím jak bych tam nacpal $row[‚id‘] :-)
->setAjax se zdá nemá na tohle asi vliv :P
rád bych aby se po kliku na ikonku, uživateli nabídla faktura ke stáhnutí, nevíte jak na to ?:-)
Editoval muflix (23. 9. 2012 14:00)
- Pingy
- Člen | 6
muflix napsal(a):
Ahoj, řeším určitě jednoduchou věc, mám tabulku a rád bych po kliku na tlačítko vygeneroval fakturu. Používám doplněk generátor faktur který mi při odkazu v .latte
<a n:href="Eciovni:generate">Vygenerovat fakturu</a>
normálně funguje.
nevím ale jak odkaz přidat do nifty tabulky, zkoušel jsem něco takového
$this->addButton("pdf", "Vygenerovat PDF") ->setClass("pdfikonka") ->setLink(function($row) use ($self){return $self->link("Eciovni:generate");}); //->setLink("http://example.cz/Eciovni/generate"); //->setLink(function($row) use ($self){return $self->link("Eciovni:generate"/*, $row['id']*/);}); //->setAjax(FALSE);
ale už při generování stránky mi to napíše
Nette\InvalidArgumentException Component with name 'Eciovni' does not exist.
u přímého odkazu mi to zase pošle na pozadí (pro uživatele se nic neděje) GET požadavek jehož odezvou je zdrojový kód vygenerované faktury ale stejně nevím jak bych tam nacpal $row[‚id‘] :-)
->setAjax se zdá nemá na tohle asi vliv :P
rád bych aby se po kliku na ikonku, uživateli nabídla faktura ke stáhnutí, nevíte jak na to ?:-)
Sám používám na generování faktur upravené Eciovni na tcpdf + spousta ještě jiných změn, ale prakticky by to mělo fungovat stejně.
$this->addButton("pdf", "Stáhnout pdf")
->setClass("gridIcon-pdf")
->setLink(function($row) use ($presenter) {
return $presenter->link("Invoices:detail", $row['number']);
})
->setAjax(false);
Já osobně to mám udělané tak, že abych šetřil zdroje, ukládám
faktury na serveru v nepřístupné složce už při tvorbě objednávky. Pak
pomocí třídy Invoices kontroluju jestli má daný uživatel právo k dané
faktuře a pokud ano, tak je předána ke stažení pomocí FileResponse. To je
v podstatě to, co mi dělá Invoices:detail.
Při tomto nastavení mi to nefungovalo bez vypnutého Ajaxu.
Zkusil bych něco ve stylu
$this->addButton("pdf", "Vygenerovat PDF")
->setClass("pdfikonka")
->setLink(function($row) use ($presenter) {
return $presenter->link("Eciovni:generate", $row["id"]);
})
->setAjax(false);
s tím, že bych Eciovni:generate upravil tak aby bral $id a podle toho
generoval danou fakturu, nebo to udělal stylem jakým to mám já (tzn.
ukládání pdf faktur na server a pak jen jejich nabízení pomocí
FileResponse) a nebo si vytvořil nějakou třídu která bude brát parametr
$id a bude odkazovat na Eciovni tak, aby se Eciovni nemusel upravovat…
Snad jsem trochu pomohl a není to napsané moc zmatečně, píšu to
v nedostatku času.
- Nifty
- Člen | 45
Andrasin
S tou textareou je to dobrý nápad. Asi bych to přidal jako nepovinný
parametr pro setTextEditable.
Ohledně té řádkové editace – na subgridy jsem uplně zapomněl :)
Bude s tim asi trochu problém, ale mělo by to jít vyřešit. Příští
víkend bych se na to podíval.
talpa
Tohle v původní verzi fungovalo, ale byl tam velký problém ohledně
rychlosti gridu při většim množství záznamů. Využívaly se tam aliasy,
ale složitě se tam počítaly záznamy, takže se to předělalo na
setTableName a tohle je asi jediná nevýhoda nové verze.
Pingy
Order – je to bug. V nejbližší době to opravim, díky.
Ohledně targetu to není vůbec špatný nápad. Mohl by si poslat pull request?
muflix
Předpokládám, že $self = $this, takže to je grid.
Ty potřebuješ odkaz z presenteru, takže:
$this->addButton("pdf", "Vygenerovat PDF")
->setClass("pdfikonka")
->setAjax(FALSE)
->setLink(function($row) use ($presenter){
return $presenter->link("Eciovni:generate", $row['id']);
});
EDIT: Pingy mě předběhnul :)
Editoval Nifty (23. 9. 2012 14:25)