NiftyGrid – Datagrid pro Nette 2 s velkou škálou funkcí

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

Řeším jeden problém s NiftyGridem a nevím, jak na něj. Chci udělat knihovnu na půjčování knih. Databáze tedy vypadá podobně, jako v tomto článku (rozdíl je jen, že místo tags mám categories):
https://doc.nette.org/cs/database

No a chtěl bych, aby v jednom sloupci byl tedy vypsaný seznam tagů oddělený čárkami. To ještě není problém, ale problém je, když chci podle toho sloupce filtrovat.

Aktuálně předávám toto jako dibiDatasource do Gridu:

<?php
$this->dibi->select("books.id AS books_id, title, author, GROUP_CONCAT(categories.name SEPARATOR ', ') AS categories ")
->from($this->getTableName())
->leftJoin("books_categories")->on("books_categories.books_id = books.id")
->leftJoin("categories")->on("books_categories.categories_id = categories.id")
->groupBy("books.id");
?>

To funguje s výpisem bez filtrování, jak potřebuju. Ale při pokusu o filtrování přes categories to vygeneruje chybný dotaz:

SELECT COUNT(*) AS `count`
FROM `books`
LEFT JOIN `books_categories` ON books_categories.books_id = books.id
LEFT JOIN `categories` ON books_categories.categories_id = categories.id
WHERE (`categories` LIKE '%prog%')
GROUP BY `books`.`id`

(Unknown column ‚categories‘ in ‚where clause‘)

  1. Dá se toto nějak řešit?
  2. Pokud ano, šlo by to i náhodou řešit bez použití dibi, ale s použitím NetteDatabase? Osobně jsem měl problém s tím, že NetteDatabase zdá se není stavěná na dělání JOINů, protože NotORM přístup funguje právě na principu vynechávání JOINů kvůli úspornosti přenášených dat…

Editoval Leinad (23. 10. 2012 11:10)

Leinad
Člen | 23
+
0
-

Tak aktuálně jsem se to rozhodl vyřešit děděním DibiDataSource. Teda, musel se ještě DibiDataSource upravit, protože potřebuji, aby atribut „private fluent“ byl protected:

<?php
class BookDibiDataSource extends DibiFluentDataSource{
	public function filterData(array $filters) {
		foreach ($filters as $key => $filter) {
			if($filter["column"] == "categories"){
				$this->fluent->having("GROUP_CONCAT(categories.name SEPARATOR ', ') LIKE %s", $filter["value"]);
				unset($filters[$key]);
			}
		}
		parent::filterData($filters);
	}
}
?>
Oli
Člen | 1215
+
0
-

Ahoj, mam asi stupidni dotaz, ale jak se joinujou tabulky v tomhle gridu? Se selectem me to fungovalo tak jak melo, ale kdyz jsem si vytahl data z modelu tak nevim jak mam propojit tabulky. Mam to takhle:

//model
public function getUsers()
{
    $users = $this->_db->table("users");
    return $users;
}

//grid
$source = new \NiftyGrid\DataSource\NDataSource($this->database->getUsers());
$this->setDataSource($source);

$this->addColumn('role_id', 'Oprávnění')
    //->setTableName("role.role_name")
    ->setTextFilter()
    ->setAutocomplete(5);

V tabulce users mám sloupec role_id, který odkazuje na roles, kde je sloupec id a role_name. Jak dostanu do tyhle tabulky to role_name?

Diky moc za kazdou radu!

David Zadražil
Člen | 62
+
0
-

@Andrasin napsal(a):

V pohodě, já jen pro jistotu to píšu, kdyby to někoho nenapadlo. Jinak díky ještě jednou, jde to dobře.

Leinad
Člen | 23
+
0
-

Oli napsal(a):

Nešlo by prostě upravit model? Tedy přidat tam např. metodu

<?php
public function getFullUsers()
{
    $users = $this->_db->table("users")->select("users.*, roles.role_name");
    return $users;
}
?>

Když tam předáš neúplný model (obsahující pouze data users a nikoliv roles), tak myslím, že aktuálně není v silách toho Gridu si ho doplnit.

Filip111
Člen | 244
+
0
-

Ahoj,
používám DoctrineDataSource a zajímalo by mě jakým způsobem lze použít setTableName(„category.name“) pro definování referenční tabulky u sloupců, které mají jen id?

Našel jsem ukázky pro Nette Database ale pro doctrine nikoliv. Použití mám podle https://forum.nette.org/…kalou-funkci#…

Díky.

Semik
Backer | 135
+
0
-

Zdravím.
Mám dotaz ohledně persistentní proměnné perPage. Nemá nastavenou žádnou výchozí hodnotu, resp. se bere jako výchozí první hodnota z pole perPageValues.

Pokud běží ajax tak při změně počtu prvků na stránku např. na 50 je odkaz na aktuální stránku gridu v pořádku. Avšak, když poté opět změním počet prvků na stránku na původní, první hodnotu pole, která by měla být výchozí, je součástí URL i když by „neměla“. Je to nejspíš tím, že perPage nemá pevnou výchozí hodnotu.

Problém se projevuje pouze při ajaxu a i na examplech.

thorewi
Člen | 84
+
0
-

Já jsem zase objevil problém, že mi niftygrid přestal fungovat s PHP 5.4.7 při pokusu o filtrování dat. Hlásilo to chybu

Invalid value for persistent parameter 'filter' in 'tutorsGridControl', expected scalar.

Opravil jsem to tak, že jsem v souboru Grid.php upravil

public $filter;

na

public $filter = array();

Tak třeba to někomu pomůže.

Editoval thorewi (28. 10. 2012 0:39)

romiix.org
Člen | 343
+
0
-

Zdravím,
riešil niekto filter výberu rozmedzia medzi dvomi dátumami pri stĺpcoch typu date(+time)?

Predstavujem si to tak, že nad takýmto stĺpcom by sa zobrazili dva inputy s výberom dátumu a v GRID-e by sa zobrazili dáta vyhovujúce rozmedziu.

Dá sa to nejak elegantne s Niftygrid-om vyriešiť?

Semik
Backer | 135
+
0
-

romiix.org napsal(a):

Zdravím,
riešil niekto filter výberu rozmedzia medzi dvomi dátumami pri stĺpcoch typu date(+time)?

Predstavujem si to tak, že nad takýmto stĺpcom by sa zobrazili dva inputy s výberom dátumu a v GRID-e by sa zobrazili dáta vyhovujúce rozmedziu.

Dá sa to nejak elegantne s Niftygrid-om vyriešiť?

Nejspíš by se musel rozšířit filtr.

romiix.org
Člen | 343
+
0
-

Semik napsal(a):

romiix.org napsal(a):

Zdravím,
riešil niekto filter výberu rozmedzia medzi dvomi dátumami pri stĺpcoch typu date(+time)?

Predstavujem si to tak, že nad takýmto stĺpcom by sa zobrazili dva inputy s výberom dátumu a v GRID-e by sa zobrazili dáta vyhovujúce rozmedziu.

Dá sa to nejak elegantne s Niftygrid-om vyriešiť?

Nejspíš by se musel rozšířit filtr.

Napadlo mi, že by sa na to dalo využiť http://jqueryui.com/datepicker/#… .
Žiaľ teraz neviem ako by sa to tam dalo zakomponovať. Preto sa pýtam ak to už niekto spravil…

Nifty
Člen | 45
+
0
-

Přidal jsem na github zatím branch pro bootstrap. Můžete psát nedostatky/problémy.

Button se vytváří zhruba takto:

$this->addButton('edit', 'Editovat')})
	->setClass('btn-info') //může být i callback
	->setIcon('icon-edit') //může být i callback
	->setAjax(FALSE)
	->setLink(function($row) use ($presenter){
		return $presenter->link('edit', $row['id']);
	});

Podobně je to i u globálního tlačítka.

achtan
Už jsem psal, že tu šablonu z pull requestu jsem měl nějak rozházenou. Ptal jsem se, jestli to někomu funguje správně a nikdo se neozval. Proto jsem to nemergnul.

Semik:
Ohledně té proměnné perPage – vim o tom, ale v současné době to neni ani tak na škodu.
Bez té proměnné by tam nefungoval ajax ve většině případů.

thorewi
Mergnuto, díky!

romiix.org
Jedině přes rozšíření, nebo použít dva sloupce.

romiix.org
Člen | 343
+
0
-

Ak by som si vo FilterCondition rozšíril metódu prepareFilter a predal jej schopnosť spracovať nový typ filtrovania napr. DATERANGE tak to by mi postačilo na spracovanie. Ešte by som nejak musel priohnúť grid na vykreslenie špeciálneho druhu vstupného pola pre dátum (nejaký nápad? ešte neviem ako) a to by bolo všetko. Nie?
Pýtam sa, aby som vedel či idem aspoň dobrým smerom:)

Vďaka

David Ďurika
Člen | 328
+
0
-

treba zjednotit typ premennej $row v callback-och

<?php
		$source = new \NiftyGrid\DataSource\DoctrineDataSource($this->repository->getDataSource(), 'e_id');
		//Předáme zdroj
		$this->setDataSource($source);

		$this->addColumn('e_supported', 'Supported')
			->setRenderer(function($row){return $row->e_supported ? 'YES' : 'NO';})
			->setCellRenderer(function($row){return $row['e_supported'] ? "background-color:#E4FFCC" : "background-color:#FFCCCC";});
?>

v jedom callbacku je $row objekt (presnjsie stdClass) a v druhom pripade je to pole

idealne by bolo keby to vracia entity v pripade doctrinu alebo activeRow v pripade NDB, nestudoval som kod tak neviem ci to je mozne…

Editoval achtan (29. 10. 2012 13:40)

blacksun
Člen | 177
+
0
-

Ještě jednou díky za tento skvělý grid.

Chci se zeptat – neřešil někdo překlad gridu pomocí https://componette.org/search/?… ?

Semik
Backer | 135
+
0
-

blacksun napsal(a):

Ještě jednou díky za tento skvělý grid.

Chci se zeptat – neřešil někdo překlad gridu pomocí https://componette.org/search/?… ?

NiftyGrid podporuje translator od commitu asi před 14 dny.

Editoval Semik (29. 10. 2012 20:17)

blacksun
Člen | 177
+
0
-

Super, tak to já jsem použil verzi co jsem měl staženou možná o něco déle a defakto jsem došel skoro k tomu samému :-D

Příště checknout poslední stav na githubu. #noteToMyself

Semik
Backer | 135
+
0
-

Komponentu jsem si rozšířil o vícesloupcové řazení, kdyby byl zájem tak bych třeba udělal pull request.

David Ďurika
Člen | 328
+
0
-

Semik napsal(a):

Komponentu jsem si rozšířil o vícesloupcové řazení, kdyby byl zájem tak bych třeba udělal pull request.

urcite posli pull

a este by bolo hajn kedy sa po 3. kliknuti na stlpec zoradovanie vyplo, lebo teraz ked klikas na stlpec tak sa zoraduje ASC → DESC → ASC a jednoducho to zoradovanie nevies vypnut… idealne by bolo ASC → DESC → ziadne → ASC

Semik
Backer | 135
+
0
-

achtan napsal(a):

urcite posli pull

a este by bolo hajn kedy sa po 3. kliknuti na stlpec zoradovanie vyplo, lebo teraz ked klikas na stlpec tak sa zoraduje ASC → DESC → ASC a jednoducho to zoradovanie nevies vypnut… idealne by bolo ASC → DESC → ziadne → ASC

Funguje mi to přesně tak. Jen co bude čas tak to udělám (nejspíš během zítřka).

Editoval Semik (30. 10. 2012 9:42)

MW
Člen | 626
+
0
-

Zdravím,

poraďte prosím, jak nejlépe přidat SUM sloupce..

Moc díky

Semik
Backer | 135
+
0
-

MW napsal(a):

Zdravím,

poraďte prosím, jak nejlépe přidat SUM sloupce..

Moc díky

Nejspíš běžná akce, která to provede nad vybranými řádky resp. vybráním všech řádků aktuálního stavu gridu.

MW
Člen | 626
+
0
-

Tak jsem to zatim poresil takto:

grid:

public function render()
{
...

	If(in_array('costs', $this->getColumnNames())) {
		$this->template->sumcost = $rows->sum('costs');
	}
...
}

a do grid.latte jsem si pridal:

{if isSet($sumcost)}Náklady celkem: {$sumcost}{/if}

Neni to presne ono. Urcite by to slo udelat elegantneji… Ted to potrebuju jen na jednu tabulku, ale asi by se hodilo, to udelat universalne…

Editoval MW (30. 10. 2012 15:45)

Semik
Backer | 135
+
0
-

Zdravím,

nalezl jsem problém při použití subgridu.

V případě, že se v subgridu joinuje tabulka, tak pak logicky klekne select na nejasném id, protože neví, ze které je tabulky.

Edit: Vyřešeno, chyba v db. dotazu.

Editoval Semik (31. 10. 2012 0:37)

Stopka
Člen | 4
+
0
-

Zdravím,
neřešil tu někdo možnost k hromadným operacím nad řádky přidat další parametr? Představuju si to tak, že nad tabulkou uživatelů zvolím akci přidat do skupiny a v selectu ještě zvolím do které.

muflix
Člen | 92
+
0
-

Ahoj, snažím se v jednořádkové editaci mít selectBox z databáze, ale nevím si rady. Koukal jsem se do ukázkového příkladu a tam je
DB tabulky:

article(user_id,...)
user(id, username)

a v ArticleGrid.php

$source = new \NiftyGrid\NDataSource($this->articles->select('article.id, title, status, published, views, category.name AS category, user.username, user.id AS user_id'));
...
$this->addColumn('username', 'Autor', '90px')
			->setTableName("user.username")
			->setTextFilter()
			->setAutocomplete(5)
			->setRenderer(function($row) use ($presenter){return \Nette\Utils\Html::el('a')->setText($row['username'])->href($presenter->link("user",$row['user_id']));})
			->setSelectEditable($presenter->context->database->table('user')->fetchPairs('id','username'));

nerozumím tomu jak to funguje, magie asi bude v tom user.id AS user_id, ale zároveň mám trošku jinou situaci, mám tabulku kategorie_zbozi(id,id_kategorie_zbozi,nazev…) kde ta tabulka má cizí klíč sama na sebe, tj hlavní kategorie mají id_kategorie_zbozi NULL a ostatní odkazují na id existující kategorie (tím se označuje nadkategorie)

a já mám vypsanou nifty tabulku, s výpisem kategorií, u kterých bych chtěl nadkategorii měnit.

zatím to mám zhruba takto

$this->addColumn('nazev', 'Název', '100px');

$this->addColumn('id_kategorie_zbozi', 'Nadkategorie', '100px')
     ->setRenderer(function($row) use ($presenter){return $presenter->context->kategorieZbozi->getKategorii($row['id_kategorie_zbozi']);})
     ->setSelectEditable($this->kategorieZbozi->selectKategorii());

...model...
public function selectKategorii(){
     return $this->db->query('SELECT * FROM kategorie_zbozi')->fetchPairs('id','nazev');
}
public function getKategorii($id){
     return $this->db->fetchSingle("SELECT nazev FROM kategorie_zbozi WHERE id=$id");
}

kde id_kategorie_zbozi je hodnota, kterou chci změnit na základě selectBoxu, který má pole (id, nazev)
vrací mi to teď ale chybu v SQL, protože to asi nezná $row[‚id_kategorie_zbozi‘], nevím si moc rady, za pomoc předem děkuji :-)

Editoval muflix (1. 11. 2012 15:11)

cafesk8
Člen | 103
+
0
-

Zdravím,
pokud se to již řešilo, tak se omlouvám, ale nemůžu řešení nikde najít.

HomepagePresenter.php

<?php
private $clankyRepository;

public function inject(ClankyRepository $clankyRepository) {
	$this->clankyRepository = $clankyRepository;
}

protected function createComponentArticleGrid()	{
	return new ArticleGrid($this->clankyRepository->getTable());
}
?>

ArticleGrid.php

<?php
namespace AdminModule;
use \NiftyGrid\Grid;

class ArticleGrid extends Grid {
	protected $articles;

	public function __construct($articles) {
		parent::__construct();
		$this->articles = $articles;
	}

	protected function configure($presenter) {
		$source = new \NiftyGrid\NDataSource($this->articles->select('clanky.id, nazev'));

		$this->setDataSource($source);
		$this->addColumn('nazev', 'Titulek', '210px', 30)
			->setTextEditable()
			->setTextFilter()
			->setAutocomplete(5);
	}
}
?>

Laděnka na mě však křičí
Declaration of AdminModule\ArticleGrid::configure() should be compatible with that of NiftyGrid\Grid::configure()
na řádku class ArticleGrid extends Grid {

Nevíte někdo v čem by mohl být problém?

Předem díky za odpověďi

Semik
Backer | 135
+
0
-

Myslím, že máš špatně use.
Místo

use \NiftyGrid\Grid;

jen

use NiftyGrid\Grid;

cafesk8
Člen | 103
+
0
-

Žádná změna.

bkv
Člen | 4
+
0
-

Odstranit

<?php
namespace AdminModule;
?>

v ArticleGrid.php

cafesk8
Člen | 103
+
0
-

Taky nepomohlo, nechápu, proč by namespace mělo mít na funkčnost vliv.

cafesk8
Člen | 103
+
0
-

Opravdu nikdo nevíte, v čem by mohl být problém. V čem je ten můj kód nekompatibilní s metodou NiftyGrid\Grid::configure() … vždyť ta je prázdná a je tam jenom //should be overridden

Casper
Člen | 253
+
0
-

Zdravím,
prvně chci pochválit parádní doplněk! Nicméně při $this->paginate = FALSE; nefunguje zavírání subgridu. Příčiny jsem nezkoumal, nicméně odpověď od serveru vůbec nepřijde v JSON formátu (přijde HTML celé stránky, jako kdyby se nevolalo invalidateControl).

MW
Člen | 626
+
0
-

Je prosím nějaka možnost, aby validace na vkladaní/editaci probihala stejně, jako u klasickeho formu?
Tedy aby se nezaviral form, jen to vyhodilo hlasku? Ted me to dela to, ze to zavre form a do flashmsg to vypise, ze jste nezadali, ale ostatni spravne vyplneny pole jsou taky pryc…

Pouzivam to takto:

$this->getColumnInput('name')->addRule(\Form::FILLED, 'Nezadali jste název.');

Diky !

jiri.sykora83
Člen | 2
+
0
-

Snažil jsem se zprovoznit poslední verzi doplňku a nějaký se mi to nedaří. Postupoval jsem takto.
Nakopíroval jsem složku NiftyGrid do /libs
Resources do /www
Resources připojil v do AdminModule/templates/@layout.latte (chci ho používat asi pouze v administraci)
Vytvořil si složku AdminModule/grids
- vytvořil menuGrid.php
V presenteru kde to chci použít přidal metodu
protected function createComponentMenuGrid()
{
return new \MenuGrid($this->menuRepository);
}
MenuGrid.php
use \NiftyGrid\Grid;

class MenuGrid extends Grid{

--composer
{

„config“: {
„vendor-dir“: „libs“
},
„require“: {
„php“: „>= 5.3.0“,
„nette/nette“: „>= 2.0.5“
„nifty/nifty-grid“: „*“
 }
}

A skončím na erroru: Class ‚MenuGrid‘ not found
Snad jsem popsal všechny kroky. Mám pocit že se doplněk vůbec nenačte.

romiix.org
Člen | 343
+
0
-

romiix.org napsal(a):

Zdravím,
riešil niekto filter výberu rozmedzia medzi dvomi dátumami pri stĺpcoch typu date(+time)?

Predstavujem si to tak, že nad takýmto stĺpcom by sa zobrazili dva inputy s výberom dátumu a v GRID-e by sa zobrazili dáta vyhovujúce rozmedziu.

Zatiaľ to nikto nepotreboval? :)

vojty
Člen | 19
+
0
-

Ahoj,

narazil jsem na problém s DibiFluent datasource. Pokud mám dvě tabulky které mají stejně pojmenovaný sloupec (v mém případě Item.created a User.created) a chci je podle něj filtrovat dostanu vyjímku: Column ‚created‘ in where clause is ambiguous. Funkce getCount() totiž seskládá podmínku takto: WHERE (DATE( created ) = DATE( ‚2012–11–19‘ )).
Narazil už na tom někdo? Napadá zkušenějšího nějaké rozumné řešení?
Díky V.

Editoval vojty (19. 11. 2012 21:21)

MW
Člen | 626
+
0
-

Zkus:

->setTableName("tabulka.sloupec")
vojty
Člen | 19
+
0
-

MW napsal(a):

Zkus:

->setTableName("tabulka.sloupec")

Funguje:). Díky moc. Nějak jsem to v popisu komponenty přehlídl.

bumprask
Člen | 59
+
0
-

Jak by šlo zabránit, aby se při odeslání formuláře subgridu nevalidovala i pravidla definovaná u formuláře nadřazeného gridu? Pravděpodobně jde o bug, má někdo nějaký nápad, jak by se to teoreticky dalo upravit, aby to validovalo jen daný subgrid?

Editoval bumprask (21. 11. 2012 11:20)

MW
Člen | 626
+
0
-

bumprask napsal(a):

Jak by šlo zabránit, aby se při odeslání formuláře subgridu nevalidovala i pravidla definovaná u formuláře nadřazeného gridu? Pravděpodobně jde o bug, má někdo nějaký nápad, jak by se to teoreticky dalo upravit, aby to validovalo jen daný subgrid?

je to bug, Nifty pred casem rikal, ze se na to podiva…

nn2
Člen | 9
+
0
-

Prosím o radu.

Mám podle návodu zprovozněný grid, ale nedaří se mi odelat hodnotu z in-line editace.

<?php
public function createComponentUserGrid($name) {
	return new UserGrid($this->context->userModel->userDetailsFull('all'));
}

protected function configure($presenter) {
...
$this->paginate = false;
$this->setRowFormCallback(function($values) use ($self, $presenter){
	//db update, flash message, ..
	NDebugger::barDump($values);
	$self->flashMessage(var_export($values));
	exit;
	}
); //toto se mi nevolá
$this->addButton(Grid::ROW_FORM, __('Quick edit'))
	->setClass("icon icon-pencil")
	->setAjax(true);
?>

Na tlačítko se zobrazí editovací formulář, ale na uložit se zobrazí zase. Použitý grid je aktuální (cca 14 dní starý z GitHubu), PHP je 5.3, Nette 2.0.5 Prefixová verze pro 5.2.

Přijde mi, že někde není nastavený onSubmit callback?
Příklad volá http://www.grid.jakubholub.cz/editable?…, mě to volá users?userGrid-id=12userGrid-perPage=20&do=userGrid-showRowForm na stisk Uložit.

Moc díky za radu, kam se kouknout.

nn2
Člen | 9
+
0
-

Odpovím si sám. Dříve jsem si toho nevšiml. Je třeba form definovat jako NAppForm, ne jako NForm. Moje blbost, ale někomu to může ušetřit trochu času s hledáním ;)

Editoval nn2 (22. 11. 2012 21:50)

fekete
Člen | 4
+
0
-

mam dotaz z ktorym neviem pohnut,
ako naplnit niftygrid datami (pouzivam nette\db) z M:N vztahu? Mam tabulku produkty,dodavatelia a produktyDodavatelia kde je id produktu, id dodavatela a cena. Pri kazdom produkte chcem v jednom stlpci vypisat zhustenou formou vsetkych dodavatelov a ceny.

Zatial tam mam

new \NiftyGrid\DataSource\NDataSource($this->connection->table("produkty")->select('produkty.*,produktyDodavatelia:*,dodavatelia.*')

ale neviem uplne ako pridat do $this->addColumn() dodavatel=>cena,dodavatel2=>cena2,… viem ze tam bude pravdepodobne ->setRenderer ale neviem co v nom, ako vytiahnut data

Editoval fekete (26. 11. 2012 10:06)

Semik
Backer | 135
+
0
-

Všiml jsem si, že stránky, které obsahují NiftyGrid při načítání bliknou. Registroval to někdo taky ??

llsm
Člen | 121
+
0
-

fekete napsal(a):

mam dotaz z ktorym neviem pohnut,
ako naplnit niftygrid datami (pouzivam nette\db) z M:N vztahu? Mam tabulku produkty,dodavatelia a produktyDodavatelia kde je id produktu, id dodavatela a cena. Pri kazdom produkte chcem v jednom stlpci vypisat zhustenou formou vsetkych dodavatelov a ceny.

Zatial tam mam

new \NiftyGrid\DataSource\NDataSource($this->connection->table("produkty")->select('produkty.*,produktyDodavatelia:*,dodavatelia.*')

ale neviem uplne ako pridat do $this->addColumn() dodavatel=>cena,dodavatel2=>cena2,… viem ze tam bude pravdepodobne ->setRenderer ale neviem co v nom, ako vytiahnut data

Naspojuj si vysledky uz v dotazu do databaze, pro MySQL funkci GROUP_CONCAT() v kombinaci s GROUP BY

bumprask
Člen | 59
+
0
-

Přidal jsem si do Column.php metodu ->setFileEditable(), která přidá formulářový prvek ->addUpload(). V gridu nadefinuji sloupec tímto typem, prvek pro upload se zobrazí, ovšem při odeslání nastává problém při zpracování dat z formuláře, laděnka hlásí, že daný název sloupce (index v poli $values) není definován.
Prosím, věděl by někdo co způsobí, že se proměnná se souborem nedostane ke zpracování?

Edit: Je možné, že addUpload nelze zpracovat ajaxem? (lze vypnout zpracování gridu ajaxem)

Editoval bumprask (30. 11. 2012 12:10)

Nevinho
Člen | 77
+
0
-

Zdarec, dělám si niftyGrid a používám verzi z doplňků na nette.org.

Mám ovšem jeden problém, nebo spíše dva..

  1. Když si udělám subgrid, tak po kliknutí na ten zelený křížek se nic nestane subgrid se vůbec nevykreslí, jako kdyby se nevykonala žádná akce, a za druhé, nemůžu přijít na to jak smazat záznam(jednotlivý řádek), po kliknutí na křížek se pouze zobrazí hláška, jestli chci smazat záznam a po kliknutí na ok se zase nic neprovede.

KontaktSubGrid:

<?php
use \NiftyGrid\Grid;

class KontaktSubGrid extends Grid
{
    protected $kontakt;

    protected $pobocky_id;

    public function __construct($kontakty, $pobocky_id)
    {
        parent::__construct();
        $this->kontakt = $kontakty;
        $this->pobocky_id = $pobocky_id;
    }

    protected function configure($presenter)
    {
        $source = new \NiftyGrid\NDataSource($this->kontakt->select('kontakty.id, telefon,mail,fax,www, pobocky.id')->where('pobocky_id = ?', $this->pobocky_id));

        $this->setDataSource($source);


        $this->addColumn('telefon', 'Telefon', '200px')
             ->setTextFilter()
             ->setTextEditable()
             ->setAutocomplete(5);

        $this->addColumn('email', 'E-mail', '80px')
             ->setTextFilter()
             ->setTextEditable()
             ->setAutocomplete(5);

        $this->addColumn('fax', 'Fax', '200px')
             ->setTextFilter()
             ->setTextEditable()
             ->setAutocomplete(5);

        $this->addColumn('www', 'Webové stránky', '150px')
             ->setTextFilter()
             ->setTextEditable()
             ->setAutocomplete(5);




       $self = $this;


        $this->setRowFormCallback(function($values) use ($self, $presenter){
                $vals = array(
                    "id" => $values["id"],
                    "telefon" => $values["telefon"],
                    "email" => $values["email"],
                    "fax" => $values["fax"],
                    "www" => $values["www"]

                );
                $presenter->context->database->table('kontakty')->where("id", $vals["id"])->update($vals);
                $self->flashMessage("Záznam byl úspěšně uložen.","grid-successful");
            }
        );

        $this->addButton(Grid::ROW_FORM, "Editace")
            ->setClass("fast-edit");


        $this->addButton("delete", "Smazat")
            ->setClass("delete")
            ->setLink(function($row) use ($self){return $self->link("delete!", $row['id']);})
            ->setConfirmationDialog(function($row){return "Určitě chcete smazat tento záznam?";});


}


             public function handleDelete($id)
    {
        $this->flashMessage("Tato funkce zatím nefunguje", "grid-info");
    }

    }

?>

PobockyGrid

<?php

<?php
use \NiftyGrid\Grid;

class PobockyGrid extends Grid
{
    protected $pobocky;

    public function __construct($pobocky)
    {
        parent::__construct();
        $this->pobocky = $pobocky;
    }

    protected function configure($presenter)
    {
        $source = new \NiftyGrid\NDataSource($this->pobocky->select('pobocky.id,typ,ulice, psc, mesto, kraj, firmy.nazev_firmy'));

        $this->setDataSource($source);

        $this->setWidth("800px");


        $this->addColumn('nazev_firmy', 'Firma', '100px')
             ->setTableName("firmy.nazev_firmy")
             ->setTextFilter()
             ->setAutocomplete(5);


        $this->addColumn('typ', 'Typ', '80px')
             ->setTextFilter()
             ->setTextEditable()
             ->setAutocomplete(5);

        $this->addColumn('ulice', 'Ulice', '200px')
             ->setTextFilter()
             ->setTextEditable()
             ->setAutocomplete(5);

        $this->addColumn('psc', 'PSÄŚ', '100px')
             ->setTextFilter()
             ->setTextEditable()
             ->setAutocomplete(5);

        $this->addColumn('mesto', 'Město', '200px')
             ->setTextFilter()
             ->setTextEditable()
             ->setAutocomplete(5);

        $this->addColumn('kraj', 'Kraj', '100px')
             ->setTextFilter()
             ->setTextEditable()
             ->setAutocomplete(5);


       $self = $this;


        $this->setRowFormCallback(function($values) use ($self, $presenter){
                $vals = array(
                    "id" => $values["id"],
                    "ulice" => $values["ulice"],
                    "psc" => $values["psc"],
                    "mesto" => $values["mesto"],
                    "kraj" => $values["kraj"]

                );
                $presenter->context->database->table('pobocky')->where("id", $vals["id"])->update($vals);
                $self->flashMessage("Záznam byl úspěšně uložen.","grid-successful");
            }
        );

        $this->addButton(Grid::ROW_FORM, "Editace")
            ->setClass("fast-edit");


        $this->addButton("delete", "Smazat")
            ->setClass("delete")
            ->setLink(function($row) use ($self){return $self->link("delete!", $row['id']);})
            ->setConfirmationDialog(function($row){return "Určitě chcete smazat tento záznam?";});


        $this->addSubGrid("kontakt", "Zobrazit kontakty na poboÄŤku")
			->setGrid(new KontaktSubGrid($presenter->context->database->table('kontakty'), $this->activeSubGridId))
			->settings(function($grid){
				$grid->setWidth("800px;");
			})
			->setCellStyle("background-color:#f6f6f6; padding:20px;");

}


             public function handleDelete($id)
                 {
                 $this->finance->find('id', $id)->delete();
                 $this->flashMessage("Záznam byl smazán", "grid-info");
    }
}
?>

za jakoukoli pomoc předem díky..

romiix.org
Člen | 343
+
0
-

Nevinho napsal(a):

Je to strašne dlhé, fakt sa mi to nechcelo celé lúštiť.
Rozhodne ale odporúčam v prípade nejakého takéhoto problému vypnúť JS a neboj, vyskočí ti ladenka s ktorou už budeš vedieť debugovať.

kedrigern
Člen | 102
+
0
-

Zdravím,

snažil jsem se NiftyGrid nainstalovat skrze Compozer, nicméně dle packagist.org jsou zde závislosti nette/addon-installer: , nette/extras a ty mi nechodí. Pochopil jsem, že je to díky jejich experimentálnímu stavu.

Lze toto řešit? Než jsem začal používat composer, tak NiftyGrid chodil. Jsou tedy doopravdy tyto balíky potřeba? Lze to nějak rozumně obejít?

PS: S Compozerem začínám a u zbylých balíků jsem neměl problém, tak se ptám zde. Možná blbě.