winter/modules/backend/classes/FormTabs.php

238 lines
5.7 KiB
PHP
Raw Normal View History

<?php namespace Backend\Classes;
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 = [];
/**
* @var string Default tab label to use when none is specified.
*/
public $defaultTab = 'backend::lang.form.undefined_tab';
/**
* @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;
/**
* @var array Specifies a CSS class to an individual tab pane.
*/
public $paneCssClass;
/**
* 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)
{
if (array_key_exists('defaultTab', $config)) {
$this->defaultTab = $config['defaultTab'];
}
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'];
}
if (array_key_exists('paneCssClass', $config)) {
$this->paneCssClass = $config['paneCssClass'];
}
}
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) {
$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 18:46:03 +10:00
/*
* Remove empty tabs from collection
*/
if (!count($this->fields[$tab])) {
unset($this->fields[$tab]);
}
2015-02-07 19:52:34 +10:00
return true;
}
}
}
return false;
}
2014-11-12 07:39:42 +11:00
/**
* Returns true if any fields have been registered for these tabs
* @return boolean
*/
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.
* @return array
*/
public function getFields()
{
return $this->fields;
}
/**
* Returns an array of the registered fields, without tabs.
* @return array
*/
public function getAllFields()
{
$tablessFields = [];
foreach ($this->getFields() as $tab) {
$tablessFields += $tab;
}
return $tablessFields;
}
/**
* Returns a tab pane CSS class.
* @param string $index
* @param string $label
* @return string
*/
public function getPaneCssClass($index = null, $label = null)
{
if ($index !== null && isset($this->paneCssClass[$index])) {
return $this->paneCssClass[$index];
}
if ($label !== null && isset($this->paneCssClass[$label])) {
return $this->paneCssClass[$label];
}
}
/**
* Get an iterator for the items.
* @return ArrayIterator
*/
public function getIterator()
{
return new ArrayIterator($this->suppressTabs
? $this->getAllFields()
: $this->getFields()
);
}
/**
* 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
}