Nextras\Datagrid – datagrid se vsim jak ma byt
- n.u.r.v.
- Člen | 485
ahoj, tak po přidání @dev sice composer neřve, ale datagrid
nefunguje:
Dostávám chybu Thrown exception ‚Call to undefined method
Latte\Compiler::getTemplateId().
když dám
„nextras/datagrid“: „@dev",
"nextras/latte-macros“: „dev-master“
tak tím opravím latte-macros ale datagrid vyhazuje chybu při new Callback()
když dám
„nextras/datagrid“: „dev-master“,
„nextras/latte-macros“: "@dev"
tak datagrid je ok, ale latte-macros vyhazuje Thrown exception‚ Call to undefined method Latte\Compiler::getTemplateId()
- takže výsledek je že Nextras\Datagrid není kompatibilní s Nette 2.4
- Jan Tvrdík
- Nette guru | 2595
Zkoušel jsi
"nextras/datagrid": "@dev",
"nextras/latte-macros": "@dev"
?
- n.u.r.v.
- Člen | 485
ano, composer to sežere, ale dostanu chybu Thrown exception ‚Call to undefined method Latte\Compiler::getTemplateId() jakmile se pokusím nějaký datagrid zobrazit (chyba v nextras/latte-macros)
Edit, ještě jsem schválně stáhl nejdřív samostatné dev-master datagrid a pak ještě dev-master latte-macros a dal to do vendor pak ručně – to jsem se dostal do dalšího „levelu“ → chybu jsem dostal v souboru datagrid-src-Datagrid.latte–ca34421b9a.php přímo v temp/cache/latte/
už si nepamatuju co to bylo přesně – bylo to něco jako že chybí row->ID (zítra nasimuluji znova a upřesním)
Editoval n.u.r.v. (15. 8. 2016 23:33)
- MW
- Člen | 626
simPod napsal(a):
Ahoj, je mozne nejak jednoduse filtrovat i dle poli, ktera pak nejsou ve vypisu dat? Rekneme, ze vypisuju jen IDs objednavek, ale ja je chci filtrovat podle data vytvoreni, i presto, ze to datum pak uz nezobrazim. Diky
Já to řeším například takto v modelu prepareDataSource
if ($k == 'name' || is_array($v))
$filters[$k . ' LIKE ? OR desc LIKE ?'] = array("%$v%", "%$v%");
- MW
- Člen | 626
simPod napsal(a):
diky. tohle mi asi uz doctrine poresi. Jak ale v sablone zobrazim ten input na filtrovani fieldu, u ktereho nezobrazuju sloupec? Automaticky se mi nad sloupci zobrazuji prislusne filter fieldy. U toho datumu vytvoreni ale sloupec neexistuje
Ve filterFormFactory nadefinuješ formulář a pak vykreslíš
v šabloně:
např.
{define col-filter-since}
{input znakod}<br />
{input since size=>"8"}
{/define}
Editoval MW (1. 9. 2016 8:09)
- MW
- Člen | 626
Prosím, netvořil někdo něco podobného? Nemá někdo nějaký vzor jak na takové
multi-formuláře.
Zkouším to přes Multiplier dle
návodu, ale nemůžu tam to itemId dostat.
Form mám jako komponentu samostatně mimo presenter
protected function createComponentClientsServicesForm() {
return $this->clientServicesFormControlFactory->create();
}
Moc díky!
Editoval MW (5. 9. 2016 13:14)
- hitzoR
- Člen | 51
MW napsal(a):
Prosím, netvořil někdo něco podobného? Nemá někdo nějaký vzor jak na takové multi-formuláře.
Zkouším to přes Multiplier dle návodu, ale nemůžu tam to itemId dostat.Form mám jako komponentu samostatně mimo presenter
protected function createComponentClientsServicesForm() { return $this->clientServicesFormControlFactory->create(); }
Moc díky!
Presenter:
protected function createComponentClientsServicesForm() {
return new Multiplier(function ($itemId) {
return $this->clientServicesFormControlFactory->create($itemId);
}
}
Šablona:
{control clientServicesForm-$itemId}
Editoval hitzoR (5. 9. 2016 16:14)
- MW
- Člen | 626
Tak když to takto udělám, žádný parametr $itemId ve formuláři nemám.. Že by se to ztratilo někde v továrně na form?
Jediné co mohu použit ve formu je $this->name, kde je hodnota $itemId uložena..
Takže
Šablona:
{define col-services}
<td nowrap>
{control $presenter['ikonServicesFormInline-'.$row->id]}
</td>
{/define}
Presenter:
protected function createComponentIkonServicesFormInline() {
return new \Nette\Application\UI\Multiplier( function($itemId) {
return $this->ikonServicesFormControlFactory->create($itemId);
});
}
Továrnička:
interface IkonServicesFormControlFactory {
/**
* @return IkonServicesFormControl
*/
public function create();
}
a
final class IkonServicesFormControl extends Control {
...
protected function createComponentForm() {
$form = $this->formFactory->create();
$form->getElementPrototype()->class('ajax');
$form->addCheckboxList('ikonservices', 'Služby', $this->getPresenter()->getIkonServices());
dump($this->name); //tady je to $row->id
return $form;
}
...
}
Pokud to udělám přes „$this->name“ tak to formulář vykreslí ale jaksi bez <form> tagu a tedy je nefunkční.. nevim proc..
EDIT: Tak nefunkční je pouze první formulář na stránce! Ostatní jsou v pořádku.. nechapu proc první není obalený do <form></form.
EDIT 2 – Vyřešeno ALE ?
Tak problém je v tom, že formulář pro filtry je ukončen až pod gridem a
tedy v době vytvoření dalšího formu není ukončený tag <form>
Prozatím takto.. ale není to ono.
{define col-services}
<td>
</form>
{control $presenter['ikonServicesFormInline-'.$row->id]}
</td>
{/define}
Editoval MW (6. 9. 2016 13:09)
- hitzoR
- Člen | 51
Přesně tak, ztratilo se ti to v továrně, protože jsi tam ten parametr neuvedl.
interface IkonServicesFormControlFactory {
/**
* @return IkonServicesFormControl
*/
public function create($itemId);
}
A do konstruktoru formuláře si ten parametr taky musíš dát a uložit do property.
final class IkonServicesFormControl extends Control {
/** @var int */
private $itemId;
public function __construct($itemId)
{
parent::__construct();
$this->itemId = $itemId;
}
...
}
Tady to máš srozumitelně popsané, jak přesně to funguje. ;)
- simPod
- Člen | 383
MW napsal(a):
simPod napsal(a):
diky. tohle mi asi uz doctrine poresi. Jak ale v sablone zobrazim ten input na filtrovani fieldu, u ktereho nezobrazuju sloupec? Automaticky se mi nad sloupci zobrazuji prislusne filter fieldy. U toho datumu vytvoreni ale sloupec neexistuje
Ve filterFormFactory nadefinuješ formulář a pak vykreslíš v šabloně:
např.{define col-filter-since} {input znakod}<br /> {input since size=>"8"} {/define}
ted jsem to zkousel a nefunguje. koukal jsem do kodu a ani nemuze protoze v kodu se foreachuji columns a k nim dava filtr
{formContainer filter}
{foreach $columns as $column}
<th class="grid-col-{$column->name}">
{if isset($form['filter'][$column->name])}
{ifset #col-filter-{$column->name}}
{include #"col-filter-{$column->name}" form => $form, column => $column}
{else}
{include #col-filter form => $form, column => $column}
{/ifset}
{/if}
</th>
{/foreach}
<th class="grid-col-actions">
{include #global-filter-actions showCancel => $showFilterCancel, form => $form}
</th>
{/formContainer}
takze to asi uplne jednoduse nejde udelat. Leda ze by se to narvalo do
global-filter-actions
ale to uz je spis na prepsani celeho
bloku row-head-filter
- n.u.r.v.
- Člen | 485
Ahoj, zjistil jsem, že v nové verzi (dev-master) nějak nemůžu upravovat tag <tr>… Ve staré verzi jsem to měl takto a fungovalo to:
{redefine row}
<tr class="{if $iterator->even}even{else}odd{/if}">
{include #row-inner}
</tr>
{/redefine}
Teď ale {redefine row} nedělá nic… Jak můžu nastavit u tr class a taky zjistit sudost/lichost řádku? díky moc!
- ondrusu
- Člen | 118
Ahojte, měl bych dotaz. Umí tento datagrid i Doctrine 2?
Postupuji podle dokumentace, ale hlásí mi to chybu.
Result row does not have 'name' column. search
public function createComponentRenderCustomerList() {
$grid = new Datagrid();
$grid->addColumn('name', 'name')->enableSort();
$grid->setDataSourceCallback(function($filter, $order) {
return $this->facade->getList();
});
return $grid;
}
a v šabloně mám
<div class="table-responsive">
{control renderCustomerList}
</div>
Prosím pěkně co dělam špatně?
- MW
- Člen | 626
Prosím o radu,
Kromě gridu používám i Nextras/FormsExtensions a addDatePicker.
$form->addDatePicker();
Funguje v pohodě, jen ve filtru a tedy v $grid->setFilterFormFactory to nefunguje a musím definovat ručně.
{define col-filter-to}
{input to class => 'form-control input-small date'}
{/define}
Jinak na všech formulářích i na inline editačním formuláři to funguje dobře. Narazil na to někdo?
Díky!
- simPod
- Člen | 383
Neresil nekdo problem, kdy ve filtru chci mit textinput + checkbox?
Příklad použití by mohl být, že mám seznam subjektů, někteří mají
IČO. Textinput filtruje podle IČO, zakštnutí checkboxu by vyfiltrovalo
subjekty bez IČO. To bych si ohandloval v modelu, ale nejdřív tam ty hodnoty
potřebuju dostat a to se mi nedaří.
Mám grid column ico
. Zkoušel jsem do filter formu přidat
2 inputy
$form->addText('ico');
$form->addCheckbox('ico_none');
{define col-filter-ico}
{input $column->name}
{input $column->ico_none}
{/define}
Akorát pak datagrid vyžaduje i column ico_none
. Co jsem
koukal, tak je to postavený tak, že jeden input je vždy k jedné column
- hrach
- Člen | 1838
Grid jsem docela dost fixoval, aby fungoval pro Nette 2.4 (https://github.com/…mmits/master, https://github.com/…mmits/master), aktivne a poradne se mu ale, fnuk, nevenuju. Nicmene to neznamena, ze by byl vyvoj ukoncen. Skvele by bylo, kdyby nekdo, kdo ho aktivne pouziva, byl shopen udelat nejaky pull-request.
- hrach
- Člen | 1838
mohl by si se podívat zda by tam nešlo vrátit definici <tr>? Občas potřebuji nastavit řádku atribut data-xxx…Zmizelo to po opravě kompatibility s nette 2.4 Díky
Yes, strasne me to stve, ale bohuzel to neni easy ted udelat. Ale zkusim to, to je mj. duvod, proc jeste neni RC na aktualni verzi, ze bych to chtel zkusit vratit.
- hrach
- Člen | 1838
@n.u.r.v Pokud pridam row-actions treba pro tento datagrid, ktery nema filtering, etc, tak mi to funguje. https://github.com/…resenter.php
Tak uplne nevim, co s tim, hm? Co a kde a kdy ti presne nefunguje?
- hrach
- Člen | 1838
@n.u.r.v podporu pro block row jsem opet pridal :-) nakonec to slo
nejak nahackovat :) jak ted nato:
https://github.com/…blocks.latte#…
- n.u.r.v.
- Člen | 485
ahoj, narazil jsem teď na jeden problém – vložil jsem nextras datagrid do v šabloně mezi {form}{/form} a přestalo fungovat odesílání formuláře – místo toho se udělá jen refresh stránky…
Dá se to nějak vyřešit?
Není problém skrytě v html vygenerovat grid a jeho html pak třeba pomocí jquery překopírovat na správné místo do formuláře, ale když se tam vloží přímo {control grid}, tak je problém…
- sepo
- Člen | 69
hrach napsal(a):
muze to byt napriklad proto, ze vychozi hodnota filtru nejakou hodnotu ma, a jeji vynolovani je tedy treba poslat routerem; ale jinak nevim. muzu na to mrknout. verze 3?
verzia 3.0-dev
nie je to týmto ? „:https://github.com/…0f16bc488cc7“
- H0w4rd
- Člen | 96
Tak, dnes jsem se snazil upgradovat na Nette 2.4.
Verze 2.1
Thrown exception ‚Call to undefined method Latte\Compiler::getTemplateId().‘
in …/bootstrap-style/@bootstrap3.datagrid.latte:47
Ale to jsem ani necekal, ze by fungovalo.
Verze 3.0.0.rc1
Ta mi fungovala, ale bohuzel sem nedokazal rozchodit, aby fungoval ajaxove, po
kliknuti na strankovani/razeni/filtrovani se sice v ladence objevi radek AJAX,
ale grid se neprekresli.
Verze dev-master
Call to undefined method Nette\Forms\Container::getControl(), did you mean
getControls()?
Nejak nevim, jak docilit funkcniho stavu. Zatim nase aplikace jedou na 2.3.
Editoval H0w4rd (16. 3. 2017 14:57)
- H0w4rd
- Člen | 96
Na ajax pouzivam nette.ajax.js ve verzi 2.3.0.
Jak ti to muze fungovat? V tom demu máš 2.0.0. Bezi to na nette 2.4?
Volani getControl() je v nette cache.
Ja mam v latte toto:
{input $column->name class => "form-control input-sm"}
v cache je v odpovídajícím souboru
echo $_input->getControl()->addAttributes(['class' => "form-control input-sm"]) /* line 6 */ ?>
název souboru:
/data/src/nette-project/temp/cache/latte/datagrid-bootstrap-style-@bootstrap3.datagrid.latte--7acdf16479.php:104
Verze Nette nejnovější.
DODATEK
Teď jsem našel https://github.com/nittro/nittro
Píšou tam Support Nextras/Datagrid – to musím zkusit, ale to stejně
neřeší ten problém s tim getControl.
Editoval H0w4rd (30. 3. 2017 14:43)