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
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;
|
|
}
|
|
}
|