multiple template directories
- tomcat4x
- Member | 22
Hi,
first of all congratulations to this framework.
But i am not sure, if this framework fulfill my requirements.
.
I am looking for a solution to have multiple template sets. All the templates
should be stored in one directory with subdirectorties which are named
different.
/wwwroot
/templates
/templateset1
/templateset2
Dependend on a parameter (from neon or later from database) nette should chose the corresponding templateset
Is this possible with nette? If yes, whats the best way?

- Šaman
- Member | 2668
Templates are finded by formatTemplateFiles()
and formatLayoutTemplateFiles() methods in Presenter.
Overwrite that methods in your BasePresenter and change directory as
you can.
Last edited by Šaman (2. 7. 2015 11:51)
- tomcat4x
- Member | 22
Here is my solution:
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
private $templateName ="default";
public function formatLayoutTemplateFiles()
{
$this->setTemplateName();
$name = $this->getName();
$presenter = substr($name, strrpos(':' . $name, ':'));
$layout = $this->layout ? $this->layout : 'layout';
$dir =$_SERVER['SCRIPT_FILENAME'];
$dir = is_dir("$dir/templates") ? $dir : dirname($dir);
$list = array(
"$dir/templates/" . $this->templateName . "/$presenter/@$layout.latte",
"$dir/templates/" . $this->templateName . "/$presenter.@$layout.latte",
);
do {
$list[] = "$dir/templates/" . $this->templateName . "/@$layout.latte";
$dir = dirname($dir);
} while ($dir && ($name = substr($name, 0, strrpos($name, ':'))));
return $list;
}
/**
* Formats view template file names.
* @return array
*/
public function formatTemplateFiles()
{
$this->setTemplateName();
$name = $this->getName();
$presenter = substr($name, strrpos(':' . $name, ':'));
//$dir = dirname($this->getReflection()->getFileName());
$dir =$_SERVER['SCRIPT_FILENAME'];
$dir = is_dir("$dir/templates") ? $dir : dirname($dir);
return array(
"$dir/templates/" . $this->templateName . "/$presenter/$this->view.latte",
"$dir/templates/" . $this->templateName . "/$presenter.$this->view.latte",
);
}
private function setTemplateName(){
// using the templateName from neon config name
//$templateName = $this->context->getParameters()['templateName'];
// getting the template name from the default database in table templates
$context = $this->context->getService('database.default.context');
$selection = $context->table('templates')
->where('default = 1');
// TODO check if query has a result
// TODO check if the directory exsits
$this->templateName = $selection[0]->name;
}
}
I overwrite the two functions formatTemplateFiles() and formatLayoutTemplateFiles() and added a private function setTemplateName() which is called at the beginning of the two overwritten functions.
The function setTemplateName() is getting the default database connection from the context, makes a query on the table “templates” and overwrites the private property $templateName.
The two functions formatTemplateFiles() and formatLayoutTemplateFiles() are now looking for a directory under the base www directory where the index.php is located ($_SERVER[‘SCRIPT_FILENAME’]) for a directory /templates/templateName.
I know, that there are some things to improve but it works.
Last edited by tomcat4x (2. 7. 2015 14:36)

- alnux
- Member | 139
hi there, on this proyect the system select template automatically by country (github file)