marc-leopold/server/plugins/rainlab/builder/classes/ControlLibrary.php

313 lines
14 KiB
PHP

<?php namespace RainLab\Builder\Classes;
use Event;
use Lang;
/**
* Manages Builder form control library.
*
* @package rainlab\builder
* @author Alexey Bobkov, Samuel Georges
*/
class ControlLibrary
{
use \October\Rain\Support\Traits\Singleton;
const GROUP_STANDARD = 0;
const GROUP_WIDGETS = 1;
const DEFAULT_DESIGN_TIME_PROVIDER = 'RainLab\Builder\Widgets\DefaultControlDesignTimeProvider';
protected $controls = [];
protected $groupedControls = null;
/**
* Returns a list of all known form controls grouped by control groups.
* @param boolean $returnGrouped Indicates whether controls should be grouped in the result.
* @return array
*/
public function listControls($returnGrouped = true)
{
if ($this->groupedControls !== null) {
return $returnGrouped ? $this->groupedControls : $this->controls;
}
$this->groupedControls = [
$this->resolveControlGroupName(self::GROUP_STANDARD) => [],
$this->resolveControlGroupName(self::GROUP_WIDGETS) => []
];
Event::fire('pages.builder.registerControls', [$this]);
foreach ($this->controls as $controlType=>$controlInfo) {
$controlGroup = $this->resolveControlGroupName($controlInfo['group']);
if (!array_key_exists($controlGroup, $this->groupedControls)) {
$this->groupedControls[$controlGroup] = [];
}
$this->groupedControls[$controlGroup][$controlType] = $controlInfo;
}
return $returnGrouped ? $this->groupedControls : $this->controls;
}
/**
* Returns information about a control by its code.
* @param string $code Specifies the control code.
* @return array Returns an associative array or null if the control is not registered.
*/
public function getControlInfo($code)
{
$controls = $this->listControls(false);
if (array_key_exists($code, $controls)) {
return $controls[$code];
}
return [
'properties' => [],
'designTimeProvider' => self::DEFAULT_DESIGN_TIME_PROVIDER,
'name' => $code,
'description' => null,
'unknownControl' => true
];
}
/**
* Registers a control.
* @param string $code Specifies the control code, for example "codeeditor".
* @param string $name Specifies the control name, for example "Code editor".
* @param string $description Specifies the control descritpion, can be empty.
* @param string|integer $controlGroup Specifies the control group.
* Control groups are used to create tabs in the Control Palette in Form Builder.
* The group could one of the ControlLibrary::GROUP_ constants or a string.
* @param string $icon Specifies the control icon for the Control Palette.
* @see http://octobercms.com/docs/ui/icon
* @param array $properties Specifies the control properties.
* The property definitions should be compatible with Inspector properties, similarly
* to the Component properties: http://octobercms.com/docs/plugin/components#component-properties
* Use the getStandardProperties() of the ControlLibrary to get the standard control properties.
* @param string $designTimeProviderClass Specifies the control design-time provider class name.
* The class should extend RainLab\Builder\Classes\ControlDesignTimeProviderBase. If the class is not provided,
* the default control design and design settings will be used.
*/
public function registerControl($code, $name, $description, $controlGroup, $icon, $properties, $designTimeProviderClass)
{
if (!$designTimeProviderClass) {
$designTimeProviderClass = self::DEFAULT_DESIGN_TIME_PROVIDER;
}
$this->controls[$code] = [
'group' => $controlGroup,
'name' => $name,
'description' => $description,
'icon' => $icon,
'properties' => $properties,
'designTimeProvider' => $designTimeProviderClass
];
}
public function getStandardProperties($excludeProperties = [], $addProperties = [])
{
$result = [
'label' => [
'title' => Lang::get('rainlab.builder::lang.form.property_label_title'),
'type' => 'builderLocalization',
'validation' => [
'required' => [
'message' => Lang::get('rainlab.builder::lang.form.property_label_required')
]
]
],
'oc.comment' => [
'title' => Lang::get('rainlab.builder::lang.form.property_comment_title'),
'type' => 'builderLocalization',
],
'oc.commentPosition' => [
'title' => Lang::get('rainlab.builder::lang.form.property_comment_position'),
'type' => 'dropdown',
'options' => [
'above' => Lang::get('rainlab.builder::lang.form.property_comment_position_above'),
'below' => Lang::get('rainlab.builder::lang.form.property_comment_position_below')
],
'ignoreIfEmpty' => true,
],
'span' => [
'title' => Lang::get('rainlab.builder::lang.form.property_span_title'),
'type' => 'dropdown',
'default' => 'full',
'options' => [
'left' => Lang::get('rainlab.builder::lang.form.span_left'),
'right' => Lang::get('rainlab.builder::lang.form.span_right'),
'full' => Lang::get('rainlab.builder::lang.form.span_full'),
'auto' => Lang::get('rainlab.builder::lang.form.span_auto')
]
],
'placeholder' => [
'title' => Lang::get('rainlab.builder::lang.form.property_placeholder_title'),
'type' => 'builderLocalization',
],
'default' => [
'title' => Lang::get('rainlab.builder::lang.form.property_default_title'),
'type' => 'builderLocalization',
],
'cssClass' => [
'title' => Lang::get('rainlab.builder::lang.form.property_css_class_title'),
'description' => Lang::get('rainlab.builder::lang.form.property_css_class_description'),
'type' => 'string'
],
'disabled' => [
'title' => Lang::get('rainlab.builder::lang.form.property_disabled_title'),
'type' => 'checkbox'
],
'hidden' => [
'title' => Lang::get('rainlab.builder::lang.form.property_hidden_title'),
'type' => 'checkbox'
],
'required' => [
'title' => Lang::get('rainlab.builder::lang.form.property_required_title'),
'type' => 'checkbox'
],
'stretch' => [
'title' => Lang::get('rainlab.builder::lang.form.property_stretch_title'),
'description' => Lang::get('rainlab.builder::lang.form.property_stretch_description'),
'type' => 'checkbox'
],
'context' => [
'title' => Lang::get('rainlab.builder::lang.form.property_context_title'),
'description' => Lang::get('rainlab.builder::lang.form.property_context_description'),
'type' => 'set',
'items' => [
'create' => Lang::get('rainlab.builder::lang.form.property_context_create'),
'update' => Lang::get('rainlab.builder::lang.form.property_context_update'),
'preview' => Lang::get('rainlab.builder::lang.form.property_context_preview')
],
'default' => ['create', 'update', 'preview'],
'ignoreIfDefault' => true
]
];
$result = array_merge($result, $addProperties);
$advancedProperties = [
'defaultFrom' => [
'title' => Lang::get('rainlab.builder::lang.form.property_default_from_title'),
'description' => Lang::get('rainlab.builder::lang.form.property_default_from_description'),
'type' => 'dropdown',
'group' => Lang::get('rainlab.builder::lang.form.property_group_advanced'),
'ignoreIfEmpty' => true,
'fillFrom' => 'form-controls'
],
'dependsOn' => [
'title' => Lang::get('rainlab.builder::lang.form.property_dependson_title'),
'description' => Lang::get('rainlab.builder::lang.form.property_dependson_description'),
'type' => 'stringList',
'group' => Lang::get('rainlab.builder::lang.form.property_group_advanced'),
],
'trigger' => [
'title' => Lang::get('rainlab.builder::lang.form.property_trigger_title'),
'description' => Lang::get('rainlab.builder::lang.form.property_trigger_description'),
'type' => 'object',
'group' => Lang::get('rainlab.builder::lang.form.property_group_advanced'),
'ignoreIfPropertyEmpty' => 'field',
'properties' => [
[
'property' => 'action',
'title' => Lang::get('rainlab.builder::lang.form.property_trigger_action'),
'type' => 'dropdown',
'options' => [
'show' => Lang::get('rainlab.builder::lang.form.property_trigger_show'),
'hide' => Lang::get('rainlab.builder::lang.form.property_trigger_hide'),
'enable' => Lang::get('rainlab.builder::lang.form.property_trigger_enable'),
'disable' => Lang::get('rainlab.builder::lang.form.property_trigger_disable'),
'empty' => Lang::get('rainlab.builder::lang.form.property_trigger_empty')
]
],
[
'property' => 'field',
'title' => Lang::get('rainlab.builder::lang.form.property_trigger_field'),
'description' => Lang::get('rainlab.builder::lang.form.property_trigger_field_description'),
'type' => 'dropdown',
'fillFrom' => 'form-controls'
],
[
'property' => 'condition',
'title' => Lang::get('rainlab.builder::lang.form.property_trigger_condition'),
'description' => Lang::get('rainlab.builder::lang.form.property_trigger_condition_description'),
'type' => 'autocomplete',
'items' => [
'checked' => Lang::get('rainlab.builder::lang.form.property_trigger_condition_checked'),
'unchecked' => Lang::get('rainlab.builder::lang.form.property_trigger_condition_unchecked'),
'value[somevalue]' => Lang::get('rainlab.builder::lang.form.property_trigger_condition_somevalue'),
]
]
]
],
'preset' => [
'title' => Lang::get('rainlab.builder::lang.form.property_preset_title'),
'description' => Lang::get('rainlab.builder::lang.form.property_preset_description'),
'type' => 'object',
'group' => Lang::get('rainlab.builder::lang.form.property_group_advanced'),
'ignoreIfPropertyEmpty' => 'field',
'properties' => [
[
'property' => 'field',
'title' => Lang::get('rainlab.builder::lang.form.property_preset_field'),
'description' => Lang::get('rainlab.builder::lang.form.property_preset_field_description'),
'type' => 'dropdown',
'fillFrom' => 'form-controls'
],
[
'property' => 'type',
'title' => Lang::get('rainlab.builder::lang.form.property_preset_type'),
'description' => Lang::get('rainlab.builder::lang.form.property_preset_type_description'),
'type' => 'dropdown',
'options' => [
'url' => 'URL',
'file' => 'File',
'slug' => 'Slug',
'camel' => 'Camel'
]
]
]
],
'attributes' => [
'title' => Lang::get('rainlab.builder::lang.form.property_attributes_title'),
'description' => Lang::get('rainlab.builder::lang.form.property_attributes_description'),
'type' => 'dictionary',
'group' => Lang::get('rainlab.builder::lang.form.property_group_advanced'),
],
'containerAttributes' => [
'title' => Lang::get('rainlab.builder::lang.form.property_container_attributes_title'),
'description' => Lang::get('rainlab.builder::lang.form.property_container_attributes_description'),
'type' => 'dictionary',
'group' => Lang::get('rainlab.builder::lang.form.property_group_advanced'),
]
];
$result = array_merge($result, $advancedProperties);
foreach ($excludeProperties as $property) {
if (array_key_exists($property, $result)) {
unset($result[$property]);
}
}
return $result;
}
protected function resolveControlGroupName($group)
{
if ($group === self::GROUP_STANDARD) {
return Lang::get('rainlab.builder::lang.form.control_group_standard');
}
if ($group === self::GROUP_WIDGETS) {
return Lang::get('rainlab.builder::lang.form.control_group_widgets');
}
return Lang::get($group);
}
}