Určení šablony komponenty z renderu
- Tomáš Votruba
- Moderator | 1114
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
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
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
- Tomáš Votruba
- Moderator | 1114
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
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
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í :)