Nextras\Datagrid – datagrid se vsim jak ma byt

sd
Člen | 87
+
0
-

Jo jo, to je nesjpíš ono. Děkuji moc. Jen to neumím zakomponovat.

v presenteru mám:

public function createComponentGrid(){
        $grid = new \Nextras\Datagrid\Datagrid;
        $grid->addColumn('id', 'ID')->enableSort();
        $grid->addColumn('name', 'Jméno')->enableSort();
        $grid->addColumn('specialization', 'Specializace');
        $grid->addColumn('experiences', 'Zkušenosti');
        $grid->addColumn('user', 'rz');

        $grid->setFilterFormFactory(function() {
            $form = new Nette\Forms\Container;

            $specializations = [
               '..' => '..',
               'Nějaké zaměření' => 'Nějaké zaměření', // blabla atd..
           ];

            $form->addSelect('specialization', 'Zamerenie', $specializations);
            $form->addText('experiences', 'Zkušenosti');

            // these buttons are not compulsory
            $form->addSubmit('filter', 'Filtrovať')->getControlPrototype()->class = 'btn btn-primary';
            $form->addSubmit('cancel', 'Zrušiť filtráciu')->getControlPrototype()->class = 'btn';

            return $form;
        });

        //$grid->setDataSourceCallback($this->getDataSource);

        $grid->setDatasourceCallback(function($filter, $order) {
            $filters = array();
            foreach ($filter as $k => $v) {
                if ($k == 'id' || is_array($v))
                    $filters[$k] = $v;
                else
                    $filters[$k. ' LIKE ?'] = "%$v%";
            }

            $selection = $this->database->table('market')->where($filters);

            if ($order[0])
                $selection->order(implode(' ', $order));

            return $selection;
        });

        $grid->addCellsTemplate(__DIR__ . '/../templates/@grid.latte');

        return $grid;
    }
  • @grid.latte
{define col-user}
    <td>
        {$row->user->firstName} {$row->user->lastName}
    </td>
{/define}

default.latte

...
{control grid}
...

sloupec ‚user‘ z tabulky ‚market‘ je propojen cizím klíčem na tabulku ‚users‘ (sloupec ‚id‘)

Nyní pokud tam pouze doplním jak psal @secmi, tak mi vypíše
>‚Trying to get propery of non-object‘

Neví někdo co s tím, prosím?

secmi
Člen | 19
+
0
-

Tady je problém v názvosloví, pokud chceš přistupovat k datům v cizí tabulce, nesmíš použít přesný název sloupce.

Řešení je nahradit definici v šabloně, například takto (použije se libovolná část názvu sloupce, která nekoliduje s jiným):

<?php
{define col-user}
    <td>
        {$row->use->firstName} {$row->use->lastName}
    </td>
{/define}
?>

A nebo změnit název sloupce v tabulce market na user_id a pak použít Tvoji variantu.

sd
Člen | 87
+
0
-

super, funguje. Děkuji moc! :)

Tirus91
Člen | 199
+
0
-

@hrach
Ahoj,
chtěl bych se optat, jak je to s podporou Doctrine dbal? Popř. jak bych mohl dbal implementovat a využívat pro tento datagrid?

hrach
Člen | 1834
+
0
-

@Tirus91 grid zadne adaptery nemá, takze ani zadna podpora pro doctrine neni a nebude. V podstate je nutne si rucne poresit jen filtrovani.

petrf
Člen | 15
+
0
-

Ahoj, poslední dobou řeším tento problém – rád bych udělal export dat z gridu do CSV, ale nevím, jak se k nim dostat – respektive dostat tak, aby byly zohledněny vybrané filtry a řazení, ale nebyl použit paginator. Nějak přes payload, či přes getData (která je protected, nevím jestli by pomohla), nebo jinak?
Koukal jsem, že ve dvou příspěvcích se nějaké filtry, order řešilo, ale nebyl jsem z toho jako spíše začátečník příšli moudrý – díky za rady.

petrf
Člen | 15
+
0
-

K mému dotazu – zatím jsem si grid podědil, udělal fci getExportData podobnou funkci getData, z níž vyházel paginator, a handleExport zpracující export. Do šablony global-action odkaz {link export!}
A jen doufám, že je to správná cesta :)

Azathoth
Člen | 495
+
0
-

@Tirus91 k té doctrine: doporučuji naklikat si nějaké filtry, stránkování a řazení a pak si dumpnout parametry, se kterými se volá callback dataSource (nebo jak se to jmenuje). no a u svou metodu na získání dat si upravíš tak, aby filtrovala a řadila data podle filtru, orderby a paginatoru. já používám kdyby doctrine a jako zdroj dat mi stačí u entityrepository metoda findby, jen musím některé parametry z toho datagridu trochu přeskládat.

sd
Člen | 87
+
0
-

secmi napsal(a):

Myslíš něco v tomhle smyslu:

<?php
$grid->addColumn('user_id', 'rz');
?>

kde sloupec user_id je odkazem na cizí tabulku a pak v šabloně

<?php
{define col-user_id}
<td>
    {$row->user->name} {$row->user->surname}
</td>
{/define}
?>

Ještě si nevím rady, jak vyřešit pokud chci vypsat více sloupců z tabulky odkazované cizím klíčem. (Tedy ne jen jméno a příjmení, ale i další údaje).
Stejný název použít nemohu, a například místo user_id jsem zkoušel user, data se mi vypsat podařilo způsobem výš uvedemým (jen místo $row->user->... je $row->us->...).
Ale nefunguje řazení a vyhledávání. Vypíše chybu:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'us' in 'where clause'

Děkuji za radu.

secmi
Člen | 19
+
0
-

Můžeš prosím ukázat jak máš řazení řešeno.

Tirus91
Člen | 199
+
0
-

@Azathoth
Diky za radu. Nejak jsem se s tim chvilinku pral. Normalne by nemel byt problem u Doctrine dbal ne?

Azathoth
Člen | 495
+
0
-

@Tirus91 neměl, jen si s tím možná budeš muset trochu pohrát. a čistě ze z ědavosti, proč používáš dbal a ne rovnou orm?

Azathoth
Člen | 495
+
0
-

@Tirus91 já to mám takhle:

	/**
	 * @param array $filter
	 * @param array $order
	 * @param Paginator $paginator
	 * @return Entity\User[]
	 */
	public function getUsers($filter = [], $order = [], Paginator $paginator = NULL)
	{
		foreach ($filter as $field => $value) {	//přechod z přesné shody na LIKE
				$filter["$field LIKE"] = "%$value%";	//jestli tam všude nejsou stringy, tak je lepší to oifovat, já tam mám všude textinputy, tak všude narvu LIKE
				unset($filter[$field]);
		}


		if (count($order) > 0) {		//přijde mi to jako ['field', 'hodnota'] a já chci ['field' => 'hodnota']
			$order[$order[0]] = $order[1];
			unset($order[0]);
			unset($order[1]);
		}

		if ($paginator != NULL) {
			return $this->userRepository->findBy($filter, $order, $paginator->getItemsPerPage(), $paginator->getOffset());
		}
		return $this->userRepository->findBy($filter, $order);
	}

Editoval Azathoth (4. 9. 2015 19:22)

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

Ahoj, zkoušel jsem u datagridu filtrování a stránkování, ale nepřišel jsem zatím na to, jak změnit popisek v tlačítkách – filter, cancel, First, Previous, Next, Last. Čekal jsem něco v to stylu jako např. $grid->setButtonFilterLabel("") ale to tam není.

Díky za nakopnutí

Azathoth
Člen | 495
+
0
-

u nás jsme to řešili tím, že jsem udělal custom template, kam jsem vykopírovalten paginator a upravil jsem si ho dle libosti. to mi umožnilo tak dát dokonce úplně jinak vypadající paginator. jinak se podívej do souboru datagrid.latte, jak se ro vykresluje. možná to jde přes translator, který by ti asi mohl pomoct, ale nejsem si jistý.

MW
Člen | 615
+
0
-

Jde to. Jednak od určité verze funguje Translator. Ja na jedné starší verzi to nastavuji takto :

$grid->setFilterFormFactory(function() {
            $form = new Nette\Forms\Container;
            $form->addText('name');
            $form->addSubmit('filter', 'Filtrovat')->getControlPrototype()->class = 'btn btn-primary';
            $form->addSubmit('cancel', 'Zrušit filtr')->getControlPrototype()->class = 'btn';
            return $form;
        });

Editoval MW (7. 10. 2015 8:46)

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

Díky, sice jsem v kodu to použití translatoru našel (mám nejnovější verzi datagridu), ale vůbec nevím jak to použít – my v projektu používáme kdyby/translation…

Zkusím tedy tu tvojí starší metodu…

Azathoth
Člen | 495
+
0
-

použití je jednoduché. musíš se podívat do kódu datagridu, jaké překladové texty se tam používají. a pode toho s napíšeš ty překlady do neonu. protože to, myslím, nepoužívá žádný domain (překlady jsou tam jednoslovné, bez tečky), doporučuji si u kdyby translation udělat třeba datagrid.cs.neon a do něj to házet. a do datagtidu poslat PrefixedTranslator toho datagridu takhle: $this->translator->domain(‚datagrid‘);

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

Azathoth: Díky za radu, ale nějak jsem se zasekl:

1)k již existujícím slovníkům jsem přidal datagrid.cs.neon (kdyby-translator slovník načetl)
2)chtěl jsem zkusit např. přeložit tlačítko pro filtrování „Filter“ – dal jsem tedy do neonu: Filter: „Filtrovat“
3)předal jsem datagridu translator: $grid->setTranslator($this->translator); – $this->translator je \Kdyby\Translation\Translator

Ale jaksi to nic neudělalo jen mi to v debug baru u translatoru vypsalo chyby (chybí překlda filter a dalších položek zobrazených datagridu)

Problém asi je, že se nějak musí předat ten slovník, ale jak? V datagridu jsem žádnou vhodnou metodu nenašel…(samotný translator si slovník našel – je zobrazen v seznamu Loaded resources)..

díky za pomoc

Edit: aha, tak jsem zkusil dát $grid->setTranslator($this->translator->domain(‚datagrid‘)) a už to začíná překládat – jen to do tlačítka před ten překlad dalo ještě datagrid. – takže např. datagrid.Filtrovat

Editoval n.u.r.v. (7. 10. 2015 15:23)

artemevsin
Člen | 61
+
0
-

ahoj,
před chvíli jsem na to taky narazil – jde o to, že do row-actions se nemá psát tag <td></td>, stačí jen <button>Tlačítko</button>.
Kdyby to třeba někomu pomohlo

kikinet napsal(a):

MW napsal(a):

kikinet napsal(a):

Nemůžu to nikde najít, snad se nebudu opakovat.

no přesně tak {define row-actions}

To ale není to co chci. {define row-actions} vytvoří NOVÝ sloupec s tlačítky. Já chci dát tlačítka do sloupce grid-col-actions, který se vytvoří při nastavení filtru.

Ukázka na kódu. Grid pouze s filtrem.

<thead>
	<tr class="grid-columns">
		<th class="grid-col-username">Username</th>
		<th class="grid-col-actions"></th>
	</tr>
	<tr class="grid-filters">
		<th class="grid-col-username"><input type="text"></th>
		<th class="grid-col-actions"><input type="submit" value="Filter"></th> //Btn Filter
	</tr>
</thead>
<tbody>
	<tr>
		<td>A</td>
		<td class="grid-col-actions"></td>  //Prázdná buňka
	</tr>
	<tr>
		<td>B</td>
		<td class="grid-col-actions"></td>  //Prázdná buňka
	</tr>
	<tr>
		<td>C</td>
		<td class="grid-col-actions"></td>  //Prázdná buňka
	</tr>
</tbody>

Ukázka na kódu. Grid s filtrem a přidaným {define row-actions}.

<thead>
	<tr class="grid-columns">
		<th class="grid-col-username">Username</th>
		<th class="grid-col-actions"></th>
	</tr>
	<tr class="grid-filters">
		<th class="grid-col-username"><input type="text"></th>
		<th class="grid-col-actions"><input type="submit" value="Filter"></th> //Btn Filter
	</tr>
</thead>
<tbody>
	<tr>
		<td>A</td>
		<td class="grid-col-actions"></td>  //Pořád prázdná buňka
		<td>Update</td>  					//DALŠÍ buňka
	</tr>
	<tr>
		<td>B</td>
		<td class="grid-col-actions"></td>  //Pořád prázdná buňka
		<td>Update</td>  					//DALŠÍ buňka
	</tr>
	<tr>
		<td>C</td>
		<td class="grid-col-actions"></td>  //Pořád prázdná buňka
		<td>Update</td>  					//DALŠÍ buňka
	</tr>
</tbody>

Chci, aby se „DALŠÍ buňka“ nevytvářela a „Update“ se vložil do „Pořád prázdná buňka“

Azathoth
Člen | 495
+
0
-

n.u.r.v. napsal(a):

Azathoth: Díky za radu, ale nějak jsem se zasekl:

1)k již existujícím slovníkům jsem přidal datagrid.cs.neon (kdyby-translator slovník načetl)
2)chtěl jsem zkusit např. přeložit tlačítko pro filtrování „Filter“ – dal jsem tedy do neonu: Filter: „Filtrovat“
3)předal jsem datagridu translator: $grid->setTranslator($this->translator); – $this->translator je \Kdyby\Translation\Translator

Ale jaksi to nic neudělalo jen mi to v debug baru u translatoru vypsalo chyby (chybí překlda filter a dalších položek zobrazených datagridu)

Problém asi je, že se nějak musí předat ten slovník, ale jak? V datagridu jsem žádnou vhodnou metodu nenašel…(samotný translator si slovník našel – je zobrazen v seznamu Loaded resources)..

díky za pomoc

Edit: aha, tak jsem zkusil dát $grid->setTranslator($this->translator->domain(‚datagrid‘)) a už to začíná překládat – jen to do tlačítka před ten překlad dalo ještě datagrid. – takže např. datagrid.Filtrovat

to s tím přidáním datagrid., koukni se, jestli to správně překládá. to už není otázka datagridu, ale kdyby translation. koukni se, co ti jde do překladu a na co se to přeloží.

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

Mno, koukal jsem do datagridu a některé položky (např. paginaotr) je překládán až v latte šabloně datagrid.latte a některé jsou překládány v Datagrid.php (např. formulářové prvky)

Ty texty co se překládají v latte jsou přeloženy správně, ale ty co jsou v tom Datagrid.php mají přidáno do překladu ten název slovníku…

Nevím čím to je… Jediný co jsem našel, tak je u tebou doporučované metody translator->domain() napsáno v komentáři toto: messagePrefix – tak jestli to nemá sloužit k nějakému přidávání textu k překladu…

Edit: Tak změna – už to začíná fungovat, stačilo přidat do filterFormFactory toto:

$form->addSubmit('filter', 'Filter')->getControlPrototype()->class = 'btn btn-next btn-sm';
$form->addSubmit('cancel', 'Cancel')->getControlPrototype()->class = 'btn btn-prev btn-sm';

A pak už to šlo.

Ale je tu ještě jeden problém – u filtru mám jeden selectbox kam načítám hodnoty DB a ty tedy nemůžu mít přeloženy (text vkládá do db user). U těchto položek se mi pořád vkládá před text slovo datagrid.

Je nějak možné vypnout u konkrétního prvku překlad?

Editoval n.u.r.v. (12. 10. 2015 14:34)

PetrHH
Člen | 49
+
+1
-

Je nějak možné vypnout u konkrétního prvku překlad?

Ano, lze to.

		$form->addRadioList('cenysdph','',array(
			0 => "bez DPH",
			1 => "s DPH"
		))->setTranslator(NULL);
n.u.r.v.
Člen | 485
+
0
-

PetrHH: Myslím, že jsem toto zkoušel a dostal jsem chybu, že metoda setTranslator neexistuje. Ale zkusím to ještě jednou, možná se pletu…

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

PetrHH: Díky moc, funguje to!! – asi jsme to původně cpal jinam…

jukie
Člen | 5
+
0
-

Zdravím, nenašel jsem možnost výběru počtu položek na stránku v šabloně. Pokud není, má to někdo rozpracované?

Efault
Člen | 2
+
0
-

Zdravim,

mohl by mi nekdo poradit, jak u datagridu dosahnout jevu z Full dema, kdy pri stisnuti tlacitka EDIT dojde k vyfiltrovani jen konkretniho radku?
Muj kod v zasade nevybocuje ze zdrojaku full dema na githubu .

class DatagridPresenter extends BasePresenter
{

    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }

    public function createComponentGrid()
    {
        $grid = new Nextras\Datagrid\Datagrid;
        $grid->addColumn('id')->enableSort();
        $grid->addColumn('name', 'Jméno')->enableSort();
        $grid->addColumn('email')->enableSort();

 		$grid->setPagination(3, $this->getDataSourceSum);
        $grid->setDatasourceCallback($this->getDataSource);
        $grid->setEditFormFactory($this->editData);

        $grid->setFilterFormFactory(function() {
                $form = new Nette\Forms\Container;
                $form->addText('name');
                return $form;
        });

    $grid->setEditFormCallback($this->saveData);
        return $grid;
    }

    public function getDataSourceSum($filter, $order)
    {
            return $this->prepareDataSource($filter, $order)->count('*');
    }

    public function getDataSource($filter, $order, Paginator $paginator = NULL)
    {
            $selection = $this->prepareDataSource($filter, $order);
            if ($paginator) {
                    $selection->limit($paginator->getItemsPerPage(), $paginator->getOffset());
            }
            return $selection;
    }

    public function prepareDataSource($filter, $order)
    {
    $filters = array();
    foreach ($filter as $k => $v) {
        if ($k == 'id' || is_array($v))
            $filters[$k] = $v;
        else
            $filters[$k. ' LIKE ?'] = "%$v%";
    }

    $selection = $this->database->table('datagrid')->where($filters);
    if ($order[0])
        $selection->order(implode(' ', $order));

    return $selection->order('id ASC');
    }

    public function editData($row) {
                $form = new Nette\Forms\Container;
                $form->addText('name');
                $form->addText('email');
                !$row ?: $form->setDefaults($row);
                return $form;
    }

    public function saveData(Nette\Forms\Container $form)
    {
        $data = $form->getValues();
        $this->database->table('datagrid')->where('id', $data->id)->update($data);
    }


}
MW
Člen | 615
+
0
-

Zdravím a prosím o radu.

Mám grid, kde mám mimo jiné sloupec USERS_ID a také EDITOR.
V tabulce ukládám obojí jako ID z tabulky USERS.

Jako Datasource pro grid mám

public function getData() {
	return $this->database->table('bankaccess');
    }

Přeložit si v gridu ID na jméno jde krásně u USERS_ID přímo v šabloně gridu:

{define col-users_id}
<td>
    {$row->users->name}
</td>
{/define}

Toto funguje podle kliče nazvu sloupce users_id a tabulky users, kde je name, ale jak toto udělám pro sloupec EDITOR, který potřebuju joinovat ze stejné tabulky USERS?

Moc díky !

EDIT:
prozatím takto, ale nelíbí se mi to:

public function getData() {
	return $this->database->table('bankaccess')->select('bankaccess.*, (SELECT name FROM users WHERE users.id = bankaccess.created_by) AS editor');
    }

a

{define col-created_by}
<td>
    <i>{$row->editor}</i>
</td>
{/define}

Editoval MW (1. 12. 2015 14:59)

MW
Člen | 615
+
0
-

Ještě prosím jedna věc:

pokud si manuálně vykresluji filtr pro sloupec:

{define col-filter-users_name}
        {input users_id, class => 'input-sm form-control'}
{/define}

tak musím přesto mít ve setFilterFormFactory alespoň
$form->addHidden(‚users_name‘) jinak se me nic nevykresli… přesto že tam mám

form->addSelect('users_id', 'Uživatel', $this->bankModel->getUsers())->setPrompt('Zvolte');

nebo dělám něco blbe?

Díky !

MW
Člen | 615
+
0
-

Napadá vás někoho, jak udělat export do csv tak jak je grid vizualizovaný? Tedy vč. aplikovaných formátů..

Když to udělam přes $this->getData(); tak je do dotaz do db ale pokud tam mam třeba formáty v latte jako
{$cell|date:‚Y-m-d‘}
nebo cizi tabulku …

Lze si nějak sáhnout na vyrendrovaná data?

Přes JS se mě to moc nelíbí…

Díky!

Editoval MW (8. 1. 2016 9:57)

IlCommendatore
Člen | 8
+
0
-

Šlo by nějak do headeru přidat css třídu?

<th class=„col-name hidden-xs“>Title</th>

(jinak než jQuery)

Editoval IlCommendatore (22. 1. 2016 15:52)

hury
Člen | 56
+
0
-

Aloha,

par otazek, prosel jsem diskusi a nenasel odpoved, mozna jsem to prehlidl

  • jak udelam externi filter? (abych mohl filter zobrazit nad gridem, nikoli u jeho sloupcu)
  • jak mohu jednoduse filtrovat z jednoho inputu pres vice sloupcu z DB (input, do krereho neco napisu a hleda to jmeno OR prijmeni OR adresa OR jina_tabulka.email)
  • jak nastavim template celemu gridu? (ten co je v defaultu Datagrid.latte)
  • je tento projekt jeste zivy?

diky za info :-)

H0w4rd
Člen | 94
+
0
-

Azathoth napsal(a):

když si stahnete nejnovější verzi datagridu, najdete tam event onRender. Ten se spustí před vykreslením, tedy hned po připojení do stromu komponent. Tehdy už je datagrid inicializovaný a template k dispozici. tak proměnnou do template pošlete v callbacku, který dáte do eventu onRender. asi takhle:

$grid = new Datagrid();
...
$grid->onRender[] = function(Datagrid $datagrid) {
    $datagrid->template->stavy = $this->stavy;
}

řešení je rychlé a elegantní. v dokumentaci tenhle event není, protože je z mého asi týden starého pullrequestu.
@petrf @H0w4rd udělejte to takhle, je to čisté a leší než statická proměnná.

Ještě dodatečně díky za ten onRender, který je už nějakou dobu v nové verzi 2.1.3.
Podařilo se mi tímhle docílit plno skvělých featur :)
A taky jsem mohl konečně zrušit statické prasárny.

pfilipek
Člen | 25
+
0
-

Zdravím,

chtěl jsem se zeptat, zda je to bug nebo je to tak správně.
Jako model používám Nextras/ORM a mám entitu Test, která má virtuální property test a pokud ji chci dát na první pozici v tabulce tak mi to vyhodí chybu: Result row does not have ‚test‘ column., ale když dám na první pozici id, tak to funguje. Více napoví následující ukázky kódů.

Funkční řešení:

<?php
    protected function createComponentTable() {
      $grid = $this->getDataGrid();

      $grid->addColumn('id', '#');
      $grid->addColumn('test', 'Test');
      $grid->addColumn('name', 'Název');

      $grid->addCellsTemplate(__DIR__ . '/templates/Extension/table.columns.latte');

      $grid->setDatasourceCallback(function($filter, $orders) {
        $extensions = $this->orm->tests->findAll($filter);

        return $extensions;
      });

      return $grid;
    }
?>

Nefunkční řešení:

<?php
    protected function createComponentTable() {
      $grid = $this->getDataGrid();

      $grid->addColumn('test', 'Test');
      $grid->addColumn('id', '#');
      $grid->addColumn('name', 'Název');

      $grid->addCellsTemplate(__DIR__ . '/templates/Extension/table.columns.latte');

      $grid->setDatasourceCallback(function($filter, $orders) {
        $extensions = $this->orm->tests->findAll($filter);

        return $extensions;
      });

      return $grid;
    }
?>

Můžete mi někdo poradit co dělám špatně?

petrknap
Člen | 6
+
0
-

Zdravím,

mám relativně jednoduchý grid s filtrem a potřebuji dostat svůj obsah pod tlačítko filter.

+---------+------+----------+
| sloupec | akce |          |
| [input] |      | [filter] |
+---------+------+----------+
| A       | edit |          |
| B       | edit |          |
+---------+------+----------+

Napadlo mne editovat bloky col-filter-*, ale ty jsou určeny k editaci hlavičky. Zatím nejblíže jsem se dostal skrz prázdný sloupec, {define col-}{/define} a {redefine row-actions}Edit{/redefine}, ale to je žalostné řešení.

+---------+-+----------+
| sloupec | |          |
| [input] | | [filter] |
+---------+-+----------+
| A       | | edit     |
| B       | | edit     |
+---------+-+----------+

Nevíte někdo jak toto spáchat?

igor.pocta
Člen | 100
+
0
-

Ahoj, nemáte někdo tento Datagrid napojen na Nextras/Orm a vyřešené filtrování s LIKE?

Já už si nějak spáchal stránkování, inline editaci ale s tím filtrem mám problém :/

public function createComponentGrid()
{
    $grid = new Datagrid();
    $grid->addCellsTemplate(__DIR__ . '/../templates/Grid/@bootstrap3.datagrid.latte');

    $grid->addColumn('id')->enableSort();
    $grid->addColumn('vorna')->enableSort();
    $grid->addColumn('nachn')->enableSort();
    $grid->setPagination(10, function($filter, $order) {
        $selection = $this->prepareData($filter, $order);
        return $selection->count();
    });
    $grid->setRowPrimaryKey('id');

    $grid->setDatasourceCallback(function($filter, $order, $page) {
        return $this->prepareData($filter, $order, $page);
    });


    $grid->setEditFormFactory(function($row) {
        $form = new Container;
        //$form->addDateTimePicker('created_time');
        $form->addText('vorna')
            ->setRequired();
        $form->addText('nachn')
            ->setRequired();
        // set your own conditions

        // set your own fileds, inputs

        // these buttons are not compulsory
        $form->addSubmit('save', 'Save data')->getControlPrototype()->class = 'btn btn-primary';
        $form->addSubmit('cancel', 'Cancel editing')->getControlPrototype()->class = 'btn';

        if ($row) {
            $form->setDefaults($row->toArray());
        }
        return $form;
    });

    $grid->setEditFormCallback(function(Container $form){
        $values = $form->getValues();
        /** @var \App\Model\Employee $employee */
        $employee = $this->orm->employees->getById($values["id"]);
        $employee->nachn = $values["nachn"];
        $employee->vorna = $values["vorna"];
        $this->orm->employees->persistAndFlush($employee);
    });

    return $grid;
}

private function prepareData($filter, $order, $page = null) {
    // Active users only
    $selection = $this->orm->employees->findBy(["active" => 3]);

    // Paginator
    if($page)
        $selection = $selection->limitBy($page->itemsPerPage, $page->page * $page->itemsPerPage);

    // Order
    if($column = $order[0]) {
        if($order[1] == 'ASC') {
            $selection = $selection->orderBy($column, ICollection::ASC);
        } else {
            $selection = $selection->orderBy($column, ICollection::DESC);
        }

    }
    return $selection;
}

Editoval igor.pocta (18. 6. 2016 20:19)

ViPEr*CZ*
Člen | 811
+
0
-

Je v plánu fix deprecated hlášek pro verzi 2.4 v nejbližší době? Nebo to mám případně fixnout? Mergne to někdo a vydá novou verzi pro composer?

hrach
Člen | 1834
+
0
-

@ViPEr*CZ* mergnu a vydam verzi :) Posli.

ViPEr*CZ*
Člen | 811
+
0
-

hrach napsal(a):

@ViPEr*CZ* mergnu a vydam verzi :) Posli.

OK. Mrknu se na to… jak to poupravím pošlu.
PS: možná mi pomůžeš… nemám s tím zkušenost… když si k sobě na disk naklonuju repo datagridu, upravím, tak jak to pak přes git můžu poslat zpět jako pull request, aby jsi to mohl mergnout?
Zatím jsem si s tím moc neměl možnost pohrát… naposledy to po mě chtělo heslo a samozřejmě přes můj účet mi to akorát řeklo, že nemůžu zapisovat. Jde to přímou editací přes www rozhranní, ale to je samozřejmě nepohodlné.
Za případné nakopnutí díky.

hrach
Člen | 1834
+
0
-

@ViPEr*CZ* forkni na githubu, fork naklonuj, vytvor novou vetev, commitni, pushni do sveho forku a odtama vytor PR do masteru.

Editoval hrach (15. 7. 2016 14:55)

ViPEr*CZ*
Člen | 811
+
0
-

Achaaa… perfekt, tak to uz bych mel zvladnout… velmi dekuji.
Uz to mam dokonce opravene na lokalhoste, takze pro malou do skolky a jdu to vyzkouset rovnou.
Perfektni. :-)

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

ahoj, chtěl bych se jen zeptat jak to vypadá s opravou? Momentálně dostávám chybu Variable $template is deprecated.

Díky

hrach
Člen | 1834
+
0
-

Máš master? Zahnutý na stable to ještě není.

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

díky, neměl jsem master, po změně jsem se vyhrabal z této chyby a dostal jsem novou:

Thrown exception 'Call to undefined method Latte\Compiler::getTemplateId().

Prohledal jsem celou složku vendor a jediné místo kde se volá getTemplateId() je v RedefineMacro.php zde

hrach
Člen | 1834
+
0
-

@n.u.r.v – upravy redefine macra jsem mergnul do masteru: https://github.com/…acros/pull/8.

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

díky, tak tuhle chybu to vyřešilo, teď dostávám tuto noticku přímo v souboru datagrid-src-Datagrid.latte–ca34421b9a.php přímo v temp/cache/latte/
cache jsem smazat zkoušel…

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

Ahoj, mám ještě problém s aktualizací přes composer

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for nextras/datagrid dev-master -> satisfiable by nextras/datagrid[dev-master].
    - nextras/datagrid dev-master requires nextras/latte-macros ~1.1.0 -> satisfiable by nextras/latte-macros[v1.1.0, v1.1.1, v1.1.2] but these conflict with your requirements or minimum-stability.

V json mám toto:

{
	"name": "nette/web-project",
	"description": "Nette: Standard Web Project",
	"type": "project",
	"license": ["MIT", "BSD-3-Clause", "GPL-2.0", "GPL-3.0"],
	"require": {
		"php": ">= 5.6.0",
		"nette/application": "^2.4",
		"nette/bootstrap": "^2.4",
		"nette/caching": "^2.4",
		"nette/database": "^2.4",
		"nette/di": "^2.4",
		"nette/finder": "^2.4",
		"nette/forms": "^2.4",
		"nette/http": "^2.4",
		"nette/mail": "^2.4",
		"nette/robot-loader": "^2.4",
		"nette/safe-stream": "^2.3",
		"nette/security": "^2.4",
		"nette/utils": "^2.4",
		"latte/latte": "^2.4",
		"tracy/tracy": "^2.4",
		"nextras/datagrid": "dev-master",
		"nextras/latte-macros": "dev-master"
	}
}

Prosím o radu co s tím. díky

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

Opravdu zatím neexistuje řešení? Kvůli datagridu nemůžu aktualizovat na nette 2.4 :-(

simPod
Člen | 383
+
0
-

n.u.r.v. napsal(a):

Opravdu zatím neexistuje řešení? Kvůli datagridu nemůžu aktualizovat na nette 2.4 :-(

myslim, ze ti bude stacit pridat do composeru napr "minimum-stability" : "RC"

Jan Tvrdík
Nette guru | 2595
+
+1
-

@simPod měnit minimum-stability je skoro vždycky chyba; stačí když tam místo dev-master dá @dev