Určení šablony komponenty z renderu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tomáš Votruba
Moderator | 1114
+
0
-

Používám automatické určení šablony pro komponentu dle jejího názvu (MyControl.php → MyControl.latte) od Honzy Tvrdíka.

/**
 * Derives template path from class name
 * @return string
 */
protected function getTemplateFilePath()
{
	$reflection = $this->getReflection();
	$dir = dirname($reflection->getFileName());
	$filename = $reflection->getShortName() . ".latte";

	return $dir . \DIRECTORY_SEPARATOR . $filename;
}

Chtěl bych to posunou dál a automaticky detekovat název šablony dle přídomku renderu. Tedy:

{control myControl} <!-- aktuální stav: zavolá šablonu myControl.latte -->
{control myControl:mini} <!-- nově: zavolá šablonu myControlMini.latte -->

Netuším, kde detekovat název renderu (v tomto případě renderMini), po jeho zavolání.
Díky za rady.

bojovyletoun
Člen | 667
+
0
-
class UPresenter{
	function actionRender__call()
	{
		$this['ale'] = new DickControl();
		$this->template->setSource('{control ale:ne, jo}');
	}

}



class DickControl extends \Nette\Application\UI\Control
{
	function __call($name, $args)
	{
		if (preg_match('/render/Ai', $name)) {
			echo substr($name, 6);
			dump($args);
		}
		// else return ...
	}
}

Editoval bojovyletoun (20. 6. 2012 10:39)

Tomáš Votruba
Moderator | 1114
+
0
-

Tak změna, __call nefunguje, pokud takováto metoda v komponentě existuje.

Potřebuji mít v komponentě např. medotu renderSmall(), která do $this->template načte šablonu název třídy + small

jtousek
Člen | 951
+
0
-

Neměl by to řešit předek komponenty v metodě render?

class BaseControl {
	public function render() {
		//detekce + set template file
	}
}

class MyControl extends BaseControl {

	public function renderSmall() {
		parent::render();
		//...
	}

}
Tomáš Votruba
Moderator | 1114
+
0
-

Zkouším teď detekci v render() BaseControlu, ale nevím jak získat název funce, z které byl parent::render() volán.

jtousek
Člen | 951
+
0
-

To je vlastně pravda. Co nějak takhle?

class BaseControl {
        public function useTemplate($name) {

        }
}

class MyControl extends BaseControl {

        public function renderSmall() {
                parent::useTemplate('small');
                //...
        }

}

Další možnost je udělat renderSmall protected a chytat to přes __call.

Tomáš Votruba
Moderator | 1114
+
0
-

Díky, to už by šlo. __call jsem nyní zkoušel a dost si zahrává s logikou controlu.
Jelikož chci, aby šlo o maximálně automatizovanou záležitost, ideální (za současných omezení) by bylo:

parent::render(__FUNCTION__);

Tvé řešení je transparentní, to se také hodí :)