2014-11-12 07:33:58 +11:00
|
|
|
<?php namespace Backend\Classes;
|
|
|
|
|
|
|
|
use Str;
|
|
|
|
use IteratorAggregate;
|
|
|
|
use ArrayIterator;
|
|
|
|
use ArrayAccess;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Form Tabs definition
|
|
|
|
* A translation of the form field tab configuration
|
|
|
|
*
|
|
|
|
* @package october\backend
|
|
|
|
* @author Alexey Bobkov, Samuel Georges
|
|
|
|
*/
|
|
|
|
class FormTabs implements IteratorAggregate, ArrayAccess
|
|
|
|
{
|
|
|
|
const SECTION_OUTSIDE = 'outside';
|
|
|
|
const SECTION_PRIMARY = 'primary';
|
|
|
|
const SECTION_SECONDARY = 'secondary';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @var string Specifies the form section these tabs belong to.
|
|
|
|
*/
|
|
|
|
public $section = 'outside';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @var array Collection of panes fields to these tabs.
|
|
|
|
*/
|
|
|
|
public $fields = [];
|
|
|
|
|
2015-03-14 17:06:03 +11:00
|
|
|
/**
|
|
|
|
* @var string Default tab label to use when none is specified.
|
|
|
|
*/
|
|
|
|
public $defaultTab = 'backend::lang.form.undefined_tab';
|
|
|
|
|
2014-11-12 07:33:58 +11:00
|
|
|
/**
|
|
|
|
* @var bool Should these tabs stretch to the bottom of the page layout.
|
|
|
|
*/
|
|
|
|
public $stretch = null;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @var boolean If set to TRUE, fields will not be displayed in tabs.
|
|
|
|
*/
|
|
|
|
public $suppressTabs = false;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @var string Specifies a CSS class to attach to the tab container.
|
|
|
|
*/
|
|
|
|
public $cssClass;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Constructor.
|
|
|
|
* Specifies a tabs rendering section. Supported sections are:
|
|
|
|
* - outside - stores a section of "tabless" fields.
|
|
|
|
* - primary - tabs section for primary fields.
|
|
|
|
* - secondary - tabs section for secondary fields.
|
|
|
|
* @param string $section Specifies a section as described above.
|
|
|
|
* @param array $config A list of render mode specific config.
|
|
|
|
*/
|
|
|
|
public function __construct($section, $config = [])
|
|
|
|
{
|
|
|
|
$this->section = strtolower($section) ?: $this->section;
|
|
|
|
$this->config = $this->evalConfig($config);
|
|
|
|
|
|
|
|
if ($this->section == self::SECTION_OUTSIDE) {
|
|
|
|
$this->suppressTabs = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Process options and apply them to this object.
|
|
|
|
* @param array $config
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
protected function evalConfig($config)
|
|
|
|
{
|
2015-03-14 17:06:03 +11:00
|
|
|
if (array_key_exists('defaultTab', $config)) {
|
|
|
|
$this->defaultTab = $config['defaultTab'];
|
|
|
|
}
|
|
|
|
|
2014-11-12 07:33:58 +11:00
|
|
|
if (array_key_exists('stretch', $config)) {
|
|
|
|
$this->stretch = $config['stretch'];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (array_key_exists('suppressTabs', $config)) {
|
|
|
|
$this->suppressTabs = $config['suppressTabs'];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (array_key_exists('cssClass', $config)) {
|
|
|
|
$this->cssClass = $config['cssClass'];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-02-12 08:37:24 +11:00
|
|
|
/**
|
|
|
|
* Add a field to the collection of tabs.
|
|
|
|
* @param string $name
|
|
|
|
* @param FormField $field
|
|
|
|
* @param string $tab
|
|
|
|
*/
|
|
|
|
public function addField($name, FormField $field, $tab = null)
|
|
|
|
{
|
|
|
|
if (!$tab) {
|
2015-03-14 17:06:03 +11:00
|
|
|
$tab = trans($this->defaultTab);
|
2015-02-12 08:37:24 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
$this->fields[$tab][$name] = $field;
|
|
|
|
}
|
|
|
|
|
2015-02-07 19:52:34 +10:00
|
|
|
/**
|
|
|
|
* Remove a field from all tabs by name.
|
|
|
|
* @param string $name
|
2015-02-12 08:37:24 +11:00
|
|
|
* @return boolean
|
2015-02-07 19:52:34 +10:00
|
|
|
*/
|
|
|
|
public function removeField($name)
|
|
|
|
{
|
|
|
|
foreach ($this->fields as $tab => $fields) {
|
|
|
|
foreach ($fields as $fieldName => $field) {
|
|
|
|
if ($fieldName == $name) {
|
|
|
|
unset($this->fields[$tab][$fieldName]);
|
|
|
|
|
2015-06-18 14:44:43 +10:00
|
|
|
if (!sizeof($this->fields[$tab])) {
|
|
|
|
unset($this->fields[$tab]);
|
|
|
|
}
|
|
|
|
|
2015-02-07 19:52:34 +10:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2014-11-12 07:33:58 +11:00
|
|
|
/**
|
|
|
|
* Returns an array of the registered fields, without tabs.
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
public function getFields()
|
|
|
|
{
|
|
|
|
$tablessFields = [];
|
|
|
|
|
|
|
|
foreach ($this->getTabs() as $tab) {
|
|
|
|
$tablessFields += $tab;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $tablessFields;
|
|
|
|
}
|
|
|
|
|
2014-11-12 07:39:42 +11:00
|
|
|
/**
|
|
|
|
* Returns true if any fields have been registered for these tabs
|
|
|
|
* @return boolean
|
|
|
|
*/
|
2014-11-12 07:33:58 +11:00
|
|
|
public function hasFields()
|
|
|
|
{
|
|
|
|
return count($this->fields) > 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2014-11-12 07:39:42 +11:00
|
|
|
* Returns an array of the registered fields, including tabs.
|
2014-11-12 07:33:58 +11:00
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
public function getTabs()
|
|
|
|
{
|
|
|
|
return $this->fields;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get an iterator for the items.
|
|
|
|
* @return ArrayIterator
|
|
|
|
*/
|
|
|
|
public function getIterator()
|
|
|
|
{
|
|
|
|
return new ArrayIterator($this->suppressTabs
|
|
|
|
? $this->getFields()
|
|
|
|
: $this->getTabs()
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ArrayAccess implementation
|
|
|
|
*/
|
|
|
|
public function offsetSet($offset, $value)
|
|
|
|
{
|
|
|
|
$this->fields[$offset] = $value;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ArrayAccess implementation
|
|
|
|
*/
|
|
|
|
public function offsetExists($offset)
|
|
|
|
{
|
|
|
|
return isset($this->fields[$offset]);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ArrayAccess implementation
|
|
|
|
*/
|
|
|
|
public function offsetUnset($offset)
|
|
|
|
{
|
|
|
|
unset($this->fields[$offset]);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* ArrayAccess implementation
|
|
|
|
*/
|
|
|
|
public function offsetGet($offset)
|
|
|
|
{
|
|
|
|
return isset($this->fields[$offset]) ? $this->fields[$offset] : null;
|
|
|
|
}
|
2015-01-03 12:41:23 +01:00
|
|
|
}
|