This repository has been archived on 2024-06-20. You can view files and clone it, but cannot push or open issues or pull requests.
peryoudow/vendor/league/plates/docs/engine/extensions.md
2020-01-06 14:23:12 +01:00

3 KiB

layout permalink title
default engine/extensions/ Extensions

Extensions

Creating extensions couldn't be easier, and can really make Plates sing for your specific project. Start by creating a class that implements \League\Plates\Extension\ExtensionInterface. Next, register your template functions within a register() method.

Simple extensions example

use League\Plates\Engine;
use League\Plates\Extension\ExtensionInterface;

class ChangeCase implements ExtensionInterface
{
    public function register(Engine $engine)
    {
        $engine->registerFunction('uppercase', [$this, 'uppercaseString']);
        $engine->registerFunction('lowercase', [$this, 'lowercaseString']);
    }

    public function uppercaseString($var)
    {
        return strtoupper($var);
    }

    public function lowercaseString($var)
    {
        return strtolower($var);
    }
}

To use this extension in your template, simply call your new functions:

<p>Hello, <?=$this->e($this->uppercase($name))?></p>

They can also be used in a batch compatible function:

<h1>Hello <?=$this->e($name, 'uppercase')</h1>

Single method extensions

Alternatively, you may choose to expose the entire extension object to the template using a single function. This can make your templates more legible and also reduce the chance of conflicts with other extensions.

use League\Plates\Engine;
use League\Plates\Extension\ExtensionInterface;

class ChangeCase implements ExtensionInterface
{
    public function register(Engine $engine)
    {
        $engine->registerFunction('case', [$this, 'getObject']);
    }

    public function getObject()
    {
        return $this;
    }

    public function upper($var)
    {
        return strtoupper($var);
    }

    public function lower($var)
    {
        return strtolower($var);
    }
}

To use this extension in your template, first call the primary function, then the secondary functions:

<p>Hello, <?=$this->e($this->case()->upper($name))?></p>

Loading extensions

To enable an extension, load it into the engine object using the loadExtension() method.

$engine->loadExtension(new ChangeCase());

Accessing the engine and template

It may be desirable to access the engine or template objects from within your extension. Plates makes both of these objects available to you. The engine is automatically passed to the register() method, and the template is assigned as a parameter on each function call.

use League\Plates\Engine;
use League\Plates\Extension\ExtensionInterface;

class MyExtension implements ExtensionInterface
{
    protected $engine;
    public $template; // must be public

    public function register(Engine $engine)
    {
        $this->engine = $engine;

        // Access template data:
        $data = $this->template->data();

        // Register functions
        // ...
    }
}