Komponenta jako základ pro ostatní komponenty

Danny
Člen | 146
+
0
-

Zdravím,
potřeboval bych poradit. Používám ublaboo dataGrid a mám ho jako komponentu takto:

class EmailGridFactory extends UI\Control {

	public function __construct()
	{
	}

	public function render() {
		$template = $this->template;
		$template->setFile(__DIR__ . '/grid.latte');
		$template->render();
	}


	public function createComponentEmailLogGrid($name)
	{
		DataGrid::$icon_prefix = 'icon-';
		$grid = new \Ublaboo\DataGrid\DataGrid($this, $name);

		/**
		 * Localization
		 */
		$translator = new \Ublaboo\DataGrid\Localization\SimpleTranslator([
			'ublaboo_datagrid.no_item_found_reset' => 'Žádné položky nenalezeny. Filtr můžete vynulovat',
			'ublaboo_datagrid.no_item_found' => 'Žádné položky nenalezeny.',
			'ublaboo_datagrid.here' => 'zde',
			'ublaboo_datagrid.items' => 'Položky',
			'ublaboo_datagrid.all' => 'všechny',
			'ublaboo_datagrid.from' => 'z',
			'ublaboo_datagrid.reset_filter' => 'Resetovat filtr',
			'ublaboo_datagrid.group_actions' => 'Hromadné akce',
			'ublaboo_datagrid.show_all_columns' => 'Zobrazit všechny sloupce',
			'ublaboo_datagrid.hide_column' => 'Skrýt sloupec',
			'ublaboo_datagrid.action' => 'Akce',
			'ublaboo_datagrid.previous' => 'Předchozí',
			'ublaboo_datagrid.next' => 'Další',
			'ublaboo_datagrid.choose' => 'Vyberte',
			'ublaboo_datagrid.execute' => 'Provést',
			'ublaboo_datagrid.per_page_submit' => 'Změnit',

			'Name' => 'Jméno',
			'Inserted' => 'Vloženo'
		]);

		$grid->setTranslator($translator);
		$grid->setDefaultPerPage(15);
		$grid->setItemsPerPageList([15, 50, 100]);

		// atd

		return $grid;

	}

}

Ale nechci u každého gridu definovat translations, default per page atd, chtěl bych to mít někde na 1 místě kde bych si to definoval a ostatní gridy by to používali. Chtěl sem udělat 1 komponentu v kterých bych si toto nastavil a ostatní z ní dědili ale nevim jak na to. Poradil by mi někdo?

Moc díky :-)

Milo
Nette Core | 1283
+
0
-

Napiš si továrnu na Ublaboo datagrid (v ní uděláš potřebný setup), zaregistruj ji do DI kontejneru a v EmailGridFactory ji vyžaduj v konstruktrou. EmailGridFactory tak už dostane nastavený objekt.

Danny
Člen | 146
+
0
-

Super díky moc za nakopnutí. Vyřešil jsem to tedy takto:

Továrna:

<?php

namespace App\FrontendModule\Components\Grids;

class GridFactory extends Control {

	public function create()
	{
		$grid = new DataGrid();
		$grid->setDefaultPerPage(15);
		$grid->setItemsPerPageList([15, 50, 100]);
		$grid->setTemplateFile(__DIR__ . '/grid.my.blocks.latte');
		$grid->setTranslator(new SimpleTranslator([
			'ublaboo_datagrid.no_item_found_reset' => 'Žádné položky nenalezeny. Filtr můžete vynulovat',
			'ublaboo_datagrid.no_item_found' => 'Žádné položky nenalezeny.',
			'ublaboo_datagrid.here' => 'zde',
			'ublaboo_datagrid.items' => 'Položky',
			'ublaboo_datagrid.all' => 'všechny',
			'ublaboo_datagrid.from' => 'z',
			'ublaboo_datagrid.reset_filter' => 'Resetovat filtr',
			'ublaboo_datagrid.group_actions' => 'Hromadné akce',
			'ublaboo_datagrid.show_all_columns' => 'Zobrazit všechny sloupce',
			'ublaboo_datagrid.hide_column' => 'Skrýt sloupec',
			'ublaboo_datagrid.action' => 'Akce',
			'ublaboo_datagrid.previous' => 'Předchozí',
			'ublaboo_datagrid.next' => 'Další',
			'ublaboo_datagrid.choose' => 'Vyberte',
			'ublaboo_datagrid.execute' => 'Provést',
			'ublaboo_datagrid.per_page_submit' => 'Změnit',
			'Name' => 'Jméno',
			'Inserted' => 'Vloženo'
		]));
		return $grid;
	}

}

A pak si to jednoduše injectnu v komponentě a volám

$grid = $this->gridFactory->create();
$grid->addColumnText('name', 'název')
	->setSortable()->setFilterText();
// atd
Milo
Nette Core | 1283
+
+2
-

Jop. Jen ta GridFactory nemusí být potomkem Control.