Komponenty s objekty s vlastním renderováním

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

Zdravím
dotaz ohledně komponent. Pokud v komponentě potřebuji vytvořit další objekt, u kterého bych potřeboval, aby měl vlastní render a vlastní šablonu, jak toho nejlépe docílit.

Zatím se stále učím a zkouším si napsat vlastní komponentu DataGrid. Rád bych každý sloupec udělal jsko vlastní objekt, který budu moci v šabloně jednoduše vypsat …

Díky za info.

Aurielle
Člen | 1281
+
0
-

V komponentách lze klasicky tvořit další komponenty pomocí továrniček, tzn. metod createComponentNazevKomponenty. Používají se úplně stejně jako v presenterech.

Hauron
Člen | 26
+
0
-

Aha, dobrá. A je možno nějak vytvořit komponentu dynamicky ? Jde mi o to že budu mít cca. něco takového :

<?php

class DbfView extends NControl
{

    private $cols = false;

    ......

    public function AddColumn($name, $source)
	{
		$this->$cols[] = new Column($name, $source);
	}

    public function render()
	{
		.......
	}

}

class Column extends NControl
{
	private $sablona = 'data';

    public function __construct($name,$source ,$type='data')
    {
        parent::__construct();

	......
    }

	public function render()
	{	//Podle typu dat se zvolí šablona
	        $this->template->setFile(dirname(__FILE__) . '/sablona_'.$this->sablona.'.latte');
		.......
	}

}

?>

A jde mi o to, abych nemusel vytvářet komponenty továrničkama, ale dynamicky … Aby byla komponenta trochu universálníí, nevím kolik bude mít sloupců .....

Díky za info.

Editoval Hauron (14. 10. 2011 12:35)

Filip Procházka
Moderator | 4668
+
0
-

Co takto?

class Grid extends Nette\Application\UI\Control
{
	public function __construct()
	{
		parent::__construct();
		$this['columns'] = new Nette\ComponentModel\Container;
	}

	public function addColumn($name, $title)
	{
		$column = new Column($title);
		$this['columns']->addComponent($column, $name);
		return $column;
	}
}

class Column extends Nette\Application\UI\PresenterComponent
{
	private $title;

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

	public function getTitle()
	{
		return $this->title;
	}
}

protected function createComponentGrid()
{
	$grid = new Grid();
	$grid->addColumn('name', 'Jméno');

	return $grid;
}

Jako studýjní materiál by ti mohlo posloužit Gridito, Grinder, nebo prvotní DataGrid

Editoval HosipLan (14. 10. 2011 12:45)

Hauron
Člen | 26
+
0
-

Díky, začnu se tím prokousávat .....

dost by ještě pomohlo, kdyby jsi ukázal použití v šablonách , ale i takhle to snad bude stačit (doufám že se v tom nějak vyznám :D ).

Díky za pomoc.