You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
3.1 KiB
PHP

<?php
namespace Artmark\Forms;
use Illuminate\Support\Facades\Blade;
/**
* Description of FormRenderer
*
* @author Andrey Pokidov <pokidov@e-traffic.ru>
*/
class FormRenderer
{
/**
*
* @var FormRenderer
*/
private static $renderer = null;
private static $registered = false;
private function __construct()
{
}
/**
*
* @return FormRenderer
*/
public static function instance()
{
if (is_null(self::$renderer)) {
self::$renderer = new FormRenderer();
}
return self::$renderer;
}
public static function register()
{
if (self::$registered) {
return;
}
self::$registered = true;
Blade::directive('form_begin', function ($expression) { return '<?php echo \Artmark\Forms\FormRenderer::instance()->beginForm(' . $expression . '); ?>'; });
Blade::directive('form_end', function ($expression) { return '<?php echo \Artmark\Forms\FormRenderer::instance()->endForm(' . $expression . '); ?>'; });
Blade::directive('form_label', function ($expression) { return '<?php echo \Artmark\Forms\FormRenderer::instance()->renderLabel(' . $expression . '); ?>'; });
Blade::directive('form_field', function ($expression) { return '<?php echo \Artmark\Forms\FormRenderer::instance()->renderField(' . $expression . '); ?>'; });
Blade::directive('form_error', function ($expression) { return '<?php echo \Artmark\Forms\FormRenderer::instance()->renderError(' . $expression . '); ?>'; });
}
public function beginForm(Form $form)
{
return '<form' . $this->encodeHtmlAttributes($form->getAssociativeAttributes()) . ">\n";
}
public function renderLabel(AbstractField $field, $suffix = ':')
{
return '<label' . $this->encodeHtmlAttributes($field->label()->getAssociativeAttributes()) . '>' . e($field->label()->text()) . $suffix . '</label>';
}
public function renderField(AbstractField $field)
{
return view('accessories.forms.' . $field->type(), [
'renderer' => $this,
'field' => $field,
]);
}
public function renderError(AbstractField $field, $template = '')
{
if (!$field->hasErrors()) {
return '';
}
if (is_string($template) && !empty($template)) {
$correctTemplate = $template;
}
else {
$correctTemplate = 'error';
}
return view('accessories.forms.' . $correctTemplate, [
'renderer' => $this,
'field' => $field,
]);
}
public function endForm()
{
return "</form>\n";
}
public function encodeHtmlAttributes(array $attributes)
{
$html = '';
foreach ($attributes as $name => $value)
{
$html .= ' ' . e($name);
if (!is_null($value)) {
$html .= '="' . e($value) . '"';
}
}
return $html;
}
}