Latte Filters #
Filters are functions that change or format the data to a form we want. Problem is how to register these filters automatically to all of your latte templates.
This chapter will navigate you to create these files:
app/
|-- Filters/
| |-- AbstractFilter.php
| |-- FormFilter.php
|-- Services/
| |-- LatteFilterInstaller.php
Automatic Filter Registration #
All your global filters should be located in app/Filters directory.
Here you can create file AbstractFilter.php with code:
<?php
declare(strict_types=1);
namespace App\Filters;
use Latte;
abstract class AbstractFilter
{
abstract public function install(Latte\Engine $engine): void;
}
This is our basic interface to define all filters in the future.
You will also need some service to install all found filters in your latte engine.
This service shows also how to handle global variables inside your latte templates.
In this case, variable $debugMode will be registered.
<?php
declare(strict_types=1);
namespace App\Services;
use App\Filters\AbstractFilter;
use Latte;
use Nette\Bridges\ApplicationLatte\Template;
use Nette\Bridges\ApplicationLatte\TemplateFactory;
use Nette\Utils\ArrayHash;
final class LatteFilterInstaller
{
private bool $debugMode;
/** @var AbstractFilter[] */
private array $filters;
/**
* @param bool $debugMode
* @param AbstractFilter[] $filters
*/
public function __construct(bool $debugMode, array $filters)
{
$this->debugMode = $debugMode;
$this->filters = $filters;
}
public function install(Latte\Engine $engine): void
{
foreach ($this->filters as $filter) {
$filter->install($engine);
}
}
public function setDebugMode(TemplateFactory $templateFactory): void
{
$templateFactory->onCreate[] = function (Template|ArrayHash $template): void {
$template->debugMode = $this->debugMode;
};
}
}
To handle automatic registration of all filters, append this to your configuration:
search:
filters:
in: %appDir%/Filters
files: *Filter.php
services:
latte.installer: App\Services\LatteFilterInstaller(%debugMode%)
latte.latteFactory:
setup:
- @latte.installer::install(@self)
latte.templateFactory:
setup:
- @latte.installer::setDebugMode
Form Filters #
Here is FormFilter with two methods:
captionto generate automatic name of form elements – when you are working with translator, you can generate keys automatically,inputClassto handle classes in your inputs – you can define it in your form factory or in your latte template, so it can be merged.
<?php
declare(strict_types=1);
namespace App\Filters;
use Contributte\Translation\Wrappers\NotTranslate;
use Latte;
use Nette\Forms\Container;
use Nette\Forms\Controls\BaseControl;
use Nette\Utils\Strings;
final class FormFilter extends AbstractFilter
{
public function install(Latte\Engine $engine): void
{
$engine->addFilter('caption', [$this, 'caption']);
$engine->addFilter('inputClass', [$this, 'inputClass']);
}
/**
* @param BaseControl|Container $component
* @param string|null $caption
* @return NotTranslate|string
*/
public function caption(BaseControl|Container $component, ?string $caption = null): NotTranslate|string
{
if ($component instanceof BaseControl) {
if ($component->caption instanceof NotTranslate || is_string($component->caption)) {
return $component->caption;
}
}
$formName = Strings::replace($component->form->name, '~Form$~');
if ($formName === 'form') {
$parentName = $component->form->parent->name ?? null;
if ($parentName !== null) {
$formName = Strings::replace($parentName, '~Form$~');
}
}
return sprintf('form.%s.%s', $formName, $caption ?? $component->name);
}
/**
* @param BaseControl $input
* @return string[]
*/
public function inputClass(BaseControl $input): array
{
$class = $input->getControlPrototype()->class;
if (is_string($class)) {
return [$class];
}
if (is_array($class)) {
return $class;
}
return [];
}
}