Vegas CMF forms in version 1.1 are using decorating system that allows you to easily change element view
without making changes in PHP code. Each Vegas\Forms\Element has new method: renderDecorated().
namespace Foo\Forms;
use Vegas\Forms\Element\Datepicker;
class Bar extends \Vegas\Forms\Form
{
public function initialize()
{
$date = new Datepicker('date');
// DI is set automatically when form is initialized but you can pass DI on your own
$date->getDecorator()->setDI($this->getDI());
// set absolute or relative path to your template directory
$date->getDecorator()->setTemplatePath($this->view->getPartialsDir().'myCustomDir'.DIRECTORY_SEPARATOR);
// set template name (excluding extension)
$date->getDecorator()->setTemplateName('myCustomTemplateName');
$this->add($date);
// ...
}
}
This date picker will use /yourPartialDir/myCustomDir/myCustomTemplateName.[available_extension] view.
Template for this element may look as follows:
{% do assets.addCss('assets/css/custom-datepicker.css') %}
{% do assets.addJs('assets/js/custom-datepicker.js') %}
<input type="text"{% for key, attribute in attributes %} {{ key }}="{{ attribute }}"{% endfor %} value="{{ value }}" custom-tag-or-something />
For this configuration calling {{ form.get('date').renderDecorated() }} will return
code above filled with all attributes like name and id.
Calling {{ form.get('date').render() }} will return simple input field same
as \Phalcon\Forms\Element\Text::render() method.
You may want to create your custom form element that will also use decorators. To obtain default decorator class
and renderDecorated() method use Vegas\Forms\Decorator\DecoratedTrait. Notice that
implementing Vegas\Forms\Decorator\DecoratedInterface allows form to automatically inject DI to
your element.
namespace Vegas\Forms\Element;
use Vegas\Forms\Decorator;
class Colorpicker extends \Phalcon\Forms\Element\Text implements Decorator\DecoratedInterface
{
use Decorator\DecoratedTrait;
public function __construct($name, $attributes = null)
{
$templatePath = implode(DIRECTORY_SEPARATOR, [dirname(__FILE__), 'Colorpicker', 'views', '']);
$this->setDecorator(new Decorator($templatePath));
parent::__construct($name, $attributes);
}
}
To unify form rendering you can also use Vegas\Forms\Decorator\UnDecoratedTrait to obtain
renderDecorated() method without creating decorators at all (default render() result
will be returned).
namespace Vegas\Forms\Element;
use Vegas\Forms\Decorator\UnDecoratedTrait;
class Text extends \Phalcon\Forms\Element\Text
{
use UnDecoratedTrait;
}
In this case both render() and renderDecorated() will print default input tag for
Phalcon\Forms\Element\Text.