geoproject-app/public/kirby/src/Form/FieldClass.php

216 lines
4.6 KiB
PHP
Raw Normal View History

<?php
namespace Kirby\Form;
use Kirby\Cms\HasSiblings;
use Kirby\Toolkit\I18n;
/**
* Abstract field class to be used instead
* of functional field components for more
* control.
*
* @package Kirby Form
* @author Bastian Allgeier <bastian@getkirby.com>
* @link https://getkirby.com
* @copyright Bastian Allgeier
* @license https://getkirby.com/license
*
* @use \Kirby\Cms\HasSiblings<\Kirby\Form\Fields>
*/
abstract class FieldClass
{
use HasSiblings;
use Mixin\After;
use Mixin\Api;
use Mixin\Autofocus;
use Mixin\Before;
use Mixin\Help;
use Mixin\Icon;
use Mixin\Label;
use Mixin\Model;
use Mixin\Placeholder;
use Mixin\Translatable;
use Mixin\Validation;
use Mixin\Value;
use Mixin\When;
use Mixin\Width;
protected bool $disabled;
protected string|null $name;
protected Fields $siblings;
public function __construct(
protected array $params = []
) {
$this->setAfter($params['after'] ?? null);
$this->setAutofocus($params['autofocus'] ?? false);
$this->setBefore($params['before'] ?? null);
$this->setDefault($params['default'] ?? null);
$this->setDisabled($params['disabled'] ?? false);
$this->setHelp($params['help'] ?? null);
$this->setIcon($params['icon'] ?? null);
$this->setLabel($params['label'] ?? null);
$this->setModel($params['model'] ?? null);
$this->setName($params['name'] ?? null);
$this->setPlaceholder($params['placeholder'] ?? null);
$this->setRequired($params['required'] ?? false);
$this->setSiblings($params['siblings'] ?? null);
$this->setTranslate($params['translate'] ?? true);
$this->setWhen($params['when'] ?? null);
$this->setWidth($params['width'] ?? null);
if (array_key_exists('value', $params) === true) {
$this->fill($params['value']);
}
}
public function __call(string $param, array $args): mixed
{
if (isset($this->$param) === true) {
return $this->$param;
}
return $this->params[$param] ?? null;
}
/**
* Returns optional dialog routes for the field
*/
public function dialogs(): array
{
return [];
}
/**
* If `true`, the field is no longer editable and will not be saved
*/
public function disabled(): bool
{
return $this->disabled;
}
/**
* Returns optional drawer routes for the field
*/
public function drawers(): array
{
return [];
}
protected function i18n(string|array|null $param = null): string|null
{
return empty($param) === false ? I18n::translate($param, $param) : null;
}
public function id(): string
{
return $this->name();
}
public function isDisabled(): bool
{
return $this->disabled;
}
public function isHidden(): bool
{
return false;
}
/**
* Returns the field name
*/
public function name(): string
{
return $this->name ?? $this->type();
}
/**
* Returns all original params for the field
*/
public function params(): array
{
return $this->params;
}
/**
* Define the props that will be sent to
* the Vue component
*/
public function props(): array
{
return [
'after' => $this->after(),
'autofocus' => $this->autofocus(),
'before' => $this->before(),
'default' => $this->default(),
'disabled' => $this->isDisabled(),
'help' => $this->help(),
'hidden' => $this->isHidden(),
'icon' => $this->icon(),
'label' => $this->label(),
'name' => $this->name(),
'placeholder' => $this->placeholder(),
'required' => $this->isRequired(),
'saveable' => $this->hasValue(),
'translate' => $this->translate(),
'type' => $this->type(),
'when' => $this->when(),
'width' => $this->width(),
];
}
protected function setDisabled(bool $disabled = false): void
{
$this->disabled = $disabled;
}
protected function setName(string|null $name = null): void
{
$this->name = strtolower($name ?? $this->type());
}
protected function setSiblings(Fields|null $siblings = null): void
{
$this->siblings = $siblings ?? new Fields([$this]);
}
protected function siblingsCollection(): Fields
{
return $this->siblings;
}
/**
* Parses a string template in the given value
*/
protected function stringTemplate(string|null $string = null): string|null
{
if ($string !== null) {
return $this->model->toString($string);
}
return null;
}
/**
* Converts the field to a plain array
*/
public function toArray(): array
{
$props = $this->props();
ksort($props);
return array_filter($props, fn ($item) => $item !== null);
}
/**
* Returns the field type
*/
public function type(): string
{
return lcfirst(basename(str_replace(['\\', 'Field'], ['/', ''], static::class)));
}
}