Nextras\Datagrid – datagrid se vsim jak ma byt

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

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

Zkoušel jsi

"nextras/datagrid": "@dev",
"nextras/latte-macros": "@dev"

?

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

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)

simPod
Člen | 383
+
0
-

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

MW
Člen | 626
+
0
-

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%");
CZechBoY
Člen | 3608
+
0
-

@MW tam vidim potentionální díru, nemáš tam escapování pro LIKE (které je navíc pro různé databáze různé).

simPod
Člen | 383
+
0
-

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

MW
Člen | 626
+
+1
-

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

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

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

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

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. ;)

MW
Člen | 626
+
0
-

Díky!

simPod
Člen | 383
+
0
-

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

hrach
Člen | 1838
+
0
-

@simPod no, musis mit aspon ten jeden input pojmeneovanej podle toho column, coz vyse zminena ukazka od MW splnuje, ale muzeme vymyslet, ze by se ta podminka splnila, pokud existuje onen block.

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

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!

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

Ahoj, přišel už někdo na to jak redefinovat řádek tabulky (tr)? díky

Editoval n.u.r.v. (17. 10. 2016 15:19)

ondrusu
Člen | 118
+
0
-

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

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

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

MW
Člen | 626
+
0
-

Jak to prosím vypadá s tímto bugem?

Díky!

Lazius
Člen | 9
+
0
-

Nevíte někdo proč mi nejde definovat vlastní šablona?

Příklad: vložím do vlastního souboru toto

{define table-open-tag}
    <table id="neco">
{/define}

ale nic se nezmění. Když ale smažu tento block v hlavní šabloně Datagrid.latte, tak se použije z mé šablony.

Dík za případné rady

MW
Člen | 626
+
+2
-

Zdravím, věnuje se prosím někdo ještě tomuto gridu nebo je již vývoj ukončen?
Grid je super a je krásně modifikovatelný, ale přecejen má nějaké chybky.

Díky!

Editoval MW (6. 2. 2017 9:25)

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

j, taky by mě to zajímalo…

hrach
Člen | 1838
+
0
-

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

Problem s razenim jsem opravil :-)

MW
Člen | 626
+
0
-

hrach napsal(a):

Problem s razenim jsem opravil :-)

Super, moc díky !

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

nevím která aktualizace to způsobila, ale najednou mi nefunguje {redefine row-actions}
sloupec se vůbec nevygeneruje

hrach
Člen | 1838
+
0
-

:| @n.u.r.v. to bude asi vcera, dropnul jsem nutnost pro redefine. ale ocividne to je i bc break; kdyz to zamenis za define, tak to funguje? Asi bych to tak nechal, abychom nemuseli porad hackovat latte.

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

Myslim ze define taky nešlo, až budu u PC tak vyzkouším…

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

nn, tak {define row-actions}…{/define} taky nefunguje… :-(

hrach
Člen | 1838
+
0
-

Aha, spatne jsem cetl, jde jen o row-actions :| Bohuzel az o vikendu muzu na to mrknout.

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

dobře díky… dočasně jsem nouzově přidal $grid->addColumn(‚actions‘, ' ');
Když už na tom budeš dělat, 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

hrach
Člen | 1838
+
0
-

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

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

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

Ahoj, díky moc za opravy – dnes začalo fungovat {redefine row-actions} i

{redefine row}
<tr data-id="{$row->ID}">
    {include #row-inner row => $row}
</tr>
{/redefine}
hrach
Člen | 1838
+
0
-

@n.u.r.v: jeste je treba pridat atribut id={$rowId}

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

ok, přidám, ale funguje to i tak…

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

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…

hrach
Člen | 1838
+
0
-

@n.u.r.v no, to teda nevim, problem je hlavne v html, ze mas form ve formu. To podle me moc resit nejde.

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

ahoj, tohle je jen jednoduchý grid bez formu – bez editace – pouze výpis dat a řazení… Asi to nahradím nějakou normální html tabulkou protože tady je datagrid zbytečný… jen mi to chování přišlo zvláštní, tak jsem to sem dal…

hrach
Člen | 1838
+
0
-

@n.u.r.v v tom pripade zkus to oddebugovat a poslat PR :-) by se hodilo :) diky

sepo
Člen | 69
+
0
-

Ahoj

prečo datagrid posiela aj prázdne filtre ?

?datagrid-filter%5Bfirstname%5D=&datagrid-filter%5Bsurname%5D=&datagrid-filter%5Bgender%5D=male
hrach
Člen | 1838
+
0
-

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?

sepo
Člen | 69
+
0
-

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

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)

hrach
Člen | 1838
+
0
-

@H0w4rd

  • co pouzivas na ajax? muzes mknout na github.com/nextras/datagrid-demo – tam ajax funguje :X
  • dev-master – a kde se getControl() vola? mozna zaloz issue, ale neni to issue u tebe?
H0w4rd
Člen | 96
+
0
-

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)