580 lines
11 KiB
PHP
580 lines
11 KiB
PHP
<?php
|
|
/**
|
|
* @package FrameworkOnFramework
|
|
* @subpackage form
|
|
* @copyright Copyright (C) 2010-2016 Nicholas K. Dionysopoulos / Akeeba Ltd. All rights reserved.
|
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
*/
|
|
// Protect from unauthorized access
|
|
defined('F0F_INCLUDED') or die;
|
|
|
|
/**
|
|
* An interface for F0FFormHeader fields, used to define the filters and the
|
|
* elements of the header row in repeatable (browse) views
|
|
*
|
|
* @package FrameworkOnFramework
|
|
* @since 2.0
|
|
*/
|
|
abstract class F0FFormHeader
|
|
{
|
|
/**
|
|
* The description text for the form field. Usually used in tooltips.
|
|
*
|
|
* @var string
|
|
* @since 2.0
|
|
*/
|
|
protected $description;
|
|
|
|
/**
|
|
* The SimpleXMLElement object of the <field /> XML element that describes the header field.
|
|
*
|
|
* @var SimpleXMLElement
|
|
* @since 2.0
|
|
*/
|
|
protected $element;
|
|
|
|
/**
|
|
* The F0FForm object of the form attached to the header field.
|
|
*
|
|
* @var F0FForm
|
|
* @since 2.0
|
|
*/
|
|
protected $form;
|
|
|
|
/**
|
|
* The label for the header field.
|
|
*
|
|
* @var string
|
|
* @since 2.0
|
|
*/
|
|
protected $label;
|
|
|
|
/**
|
|
* The header HTML.
|
|
*
|
|
* @var string|null
|
|
* @since 2.0
|
|
*/
|
|
protected $header;
|
|
|
|
/**
|
|
* The filter HTML.
|
|
*
|
|
* @var string|null
|
|
* @since 2.0
|
|
*/
|
|
protected $filter;
|
|
|
|
/**
|
|
* The buttons HTML.
|
|
*
|
|
* @var string|null
|
|
* @since 2.0
|
|
*/
|
|
protected $buttons;
|
|
|
|
/**
|
|
* The options for a drop-down filter.
|
|
*
|
|
* @var array|null
|
|
* @since 2.0
|
|
*/
|
|
protected $options;
|
|
|
|
/**
|
|
* The name of the form field.
|
|
*
|
|
* @var string
|
|
* @since 2.0
|
|
*/
|
|
protected $name;
|
|
|
|
/**
|
|
* The name of the field.
|
|
*
|
|
* @var string
|
|
* @since 2.0
|
|
*/
|
|
protected $fieldname;
|
|
|
|
/**
|
|
* The group of the field.
|
|
*
|
|
* @var string
|
|
* @since 2.0
|
|
*/
|
|
protected $group;
|
|
|
|
/**
|
|
* The form field type.
|
|
*
|
|
* @var string
|
|
* @since 2.0
|
|
*/
|
|
protected $type;
|
|
|
|
/**
|
|
* The value of the filter.
|
|
*
|
|
* @var mixed
|
|
* @since 2.0
|
|
*/
|
|
protected $value;
|
|
|
|
/**
|
|
* The intended table data width (in pixels or percent).
|
|
*
|
|
* @var mixed
|
|
* @since 2.0
|
|
*/
|
|
protected $tdwidth;
|
|
|
|
/**
|
|
* The key of the filter value in the model state.
|
|
*
|
|
* @var mixed
|
|
* @since 2.0
|
|
*/
|
|
protected $filterSource;
|
|
|
|
/**
|
|
* Is this a sortable column?
|
|
*
|
|
* @var bool
|
|
* @since 2.0
|
|
*/
|
|
protected $sortable = false;
|
|
|
|
/**
|
|
* Method to instantiate the form field object.
|
|
*
|
|
* @param F0FForm $form The form to attach to the form field object.
|
|
*
|
|
* @since 2.0
|
|
*/
|
|
public function __construct(F0FForm $form = null)
|
|
{
|
|
// If there is a form passed into the constructor set the form and form control properties.
|
|
if ($form instanceof F0FForm)
|
|
{
|
|
$this->form = $form;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Method to get certain otherwise inaccessible properties from the form field object.
|
|
*
|
|
* @param string $name The property name for which to the the value.
|
|
*
|
|
* @return mixed The property value or null.
|
|
*
|
|
* @since 2.0
|
|
*/
|
|
public function __get($name)
|
|
{
|
|
switch ($name)
|
|
{
|
|
case 'description':
|
|
case 'name':
|
|
case 'type':
|
|
case 'fieldname':
|
|
case 'group':
|
|
case 'tdwidth':
|
|
return $this->$name;
|
|
break;
|
|
|
|
case 'label':
|
|
if (empty($this->label))
|
|
{
|
|
$this->label = $this->getLabel();
|
|
}
|
|
|
|
return $this->label;
|
|
|
|
case 'value':
|
|
if (empty($this->value))
|
|
{
|
|
$this->value = $this->getValue();
|
|
}
|
|
|
|
return $this->value;
|
|
break;
|
|
|
|
case 'header':
|
|
if (empty($this->header))
|
|
{
|
|
$this->header = $this->getHeader();
|
|
}
|
|
|
|
return $this->header;
|
|
break;
|
|
|
|
case 'filter':
|
|
if (empty($this->filter))
|
|
{
|
|
$this->filter = $this->getFilter();
|
|
}
|
|
|
|
return $this->filter;
|
|
break;
|
|
|
|
case 'buttons':
|
|
if (empty($this->buttons))
|
|
{
|
|
$this->buttons = $this->getButtons();
|
|
}
|
|
|
|
return $this->buttons;
|
|
break;
|
|
|
|
case 'options':
|
|
if (empty($this->options))
|
|
{
|
|
$this->options = $this->getOptions();
|
|
}
|
|
|
|
return $this->options;
|
|
break;
|
|
|
|
case 'sortable':
|
|
if (empty($this->sortable))
|
|
{
|
|
$this->sortable = $this->getSortable();
|
|
}
|
|
|
|
return $this->sortable;
|
|
break;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Method to attach a JForm object to the field.
|
|
*
|
|
* @param F0FForm $form The JForm object to attach to the form field.
|
|
*
|
|
* @return F0FFormHeader The form field object so that the method can be used in a chain.
|
|
*
|
|
* @since 2.0
|
|
*/
|
|
public function setForm(F0FForm $form)
|
|
{
|
|
$this->form = $form;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Method to attach a F0FForm object to the field.
|
|
*
|
|
* @param SimpleXMLElement $element The SimpleXMLElement object representing the <field /> tag for the form field object.
|
|
* @param mixed $value The form field value to validate.
|
|
* @param string $group The field name group control value. This acts as as an array container for the field.
|
|
* For example if the field has name="foo" and the group value is set to "bar" then the
|
|
* full field name would end up being "bar[foo]".
|
|
*
|
|
* @return boolean True on success.
|
|
*
|
|
* @since 2.0
|
|
*/
|
|
public function setup(SimpleXMLElement $element, $value, $group = null)
|
|
{
|
|
// Make sure there is a valid JFormField XML element.
|
|
if ((string) $element->getName() != 'header')
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Reset the internal fields
|
|
$this->label = null;
|
|
$this->header = null;
|
|
$this->filter = null;
|
|
$this->buttons = null;
|
|
$this->options = null;
|
|
$this->value = null;
|
|
$this->filterSource = null;
|
|
|
|
// Set the XML element object.
|
|
$this->element = $element;
|
|
|
|
// Get some important attributes from the form field element.
|
|
$class = (string) $element['class'];
|
|
$id = (string) $element['id'];
|
|
$name = (string) $element['name'];
|
|
$filterSource = (string) $element['filter_source'];
|
|
$tdwidth = (string) $element['tdwidth'];
|
|
|
|
// Set the field description text.
|
|
$this->description = (string) $element['description'];
|
|
|
|
// Set the group of the field.
|
|
$this->group = $group;
|
|
|
|
// Set the td width of the field.
|
|
$this->tdwidth = $tdwidth;
|
|
|
|
// Set the field name and id.
|
|
$this->fieldname = $this->getFieldName($name);
|
|
$this->name = $this->getName($this->fieldname);
|
|
$this->id = $this->getId($id, $this->fieldname);
|
|
$this->filterSource = $this->getFilterSource($filterSource);
|
|
|
|
// Set the field default value.
|
|
$this->value = $this->getValue();
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Method to get the id used for the field input tag.
|
|
*
|
|
* @param string $fieldId The field element id.
|
|
* @param string $fieldName The field element name.
|
|
*
|
|
* @return string The id to be used for the field input tag.
|
|
*
|
|
* @since 2.0
|
|
*/
|
|
protected function getId($fieldId, $fieldName)
|
|
{
|
|
$id = '';
|
|
|
|
// If the field is in a group add the group control to the field id.
|
|
|
|
if ($this->group)
|
|
{
|
|
// If we already have an id segment add the group control as another level.
|
|
|
|
if ($id)
|
|
{
|
|
$id .= '_' . str_replace('.', '_', $this->group);
|
|
}
|
|
else
|
|
{
|
|
$id .= str_replace('.', '_', $this->group);
|
|
}
|
|
}
|
|
|
|
// If we already have an id segment add the field id/name as another level.
|
|
|
|
if ($id)
|
|
{
|
|
$id .= '_' . ($fieldId ? $fieldId : $fieldName);
|
|
}
|
|
else
|
|
{
|
|
$id .= ($fieldId ? $fieldId : $fieldName);
|
|
}
|
|
|
|
// Clean up any invalid characters.
|
|
$id = preg_replace('#\W#', '_', $id);
|
|
|
|
return $id;
|
|
}
|
|
|
|
/**
|
|
* Method to get the name used for the field input tag.
|
|
*
|
|
* @param string $fieldName The field element name.
|
|
*
|
|
* @return string The name to be used for the field input tag.
|
|
*
|
|
* @since 2.0
|
|
*/
|
|
protected function getName($fieldName)
|
|
{
|
|
$name = '';
|
|
|
|
// If the field is in a group add the group control to the field name.
|
|
|
|
if ($this->group)
|
|
{
|
|
// If we already have a name segment add the group control as another level.
|
|
$groups = explode('.', $this->group);
|
|
|
|
if ($name)
|
|
{
|
|
foreach ($groups as $group)
|
|
{
|
|
$name .= '[' . $group . ']';
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$name .= array_shift($groups);
|
|
|
|
foreach ($groups as $group)
|
|
{
|
|
$name .= '[' . $group . ']';
|
|
}
|
|
}
|
|
}
|
|
|
|
// If we already have a name segment add the field name as another level.
|
|
|
|
if ($name)
|
|
{
|
|
$name .= '[' . $fieldName . ']';
|
|
}
|
|
else
|
|
{
|
|
$name .= $fieldName;
|
|
}
|
|
|
|
return $name;
|
|
}
|
|
|
|
/**
|
|
* Method to get the field name used.
|
|
*
|
|
* @param string $fieldName The field element name.
|
|
*
|
|
* @return string The field name
|
|
*
|
|
* @since 2.0
|
|
*/
|
|
protected function getFieldName($fieldName)
|
|
{
|
|
return $fieldName;
|
|
}
|
|
|
|
/**
|
|
* Method to get the field label.
|
|
*
|
|
* @return string The field label.
|
|
*
|
|
* @since 2.0
|
|
*/
|
|
protected function getLabel()
|
|
{
|
|
// Get the label text from the XML element, defaulting to the element name.
|
|
$title = $this->element['label'] ? (string) $this->element['label'] : '';
|
|
|
|
if (empty($title))
|
|
{
|
|
$view = $this->form->getView();
|
|
$params = $view->getViewOptionAndName();
|
|
$title = $params['option'] . '_' .
|
|
F0FInflector::pluralize($params['view']) . '_FIELD_' .
|
|
(string) $this->element['name'];
|
|
$title = strtoupper($title);
|
|
$result = JText::_($title);
|
|
|
|
if ($result === $title)
|
|
{
|
|
$title = ucfirst((string) $this->element['name']);
|
|
}
|
|
}
|
|
|
|
return $title;
|
|
}
|
|
|
|
/**
|
|
* Get the filter value for this header field
|
|
*
|
|
* @return mixed The filter value
|
|
*/
|
|
protected function getValue()
|
|
{
|
|
$model = $this->form->getModel();
|
|
|
|
return $model->getState($this->filterSource);
|
|
}
|
|
|
|
/**
|
|
* Return the key of the filter value in the model state or, if it's not set,
|
|
* the name of the field.
|
|
*
|
|
* @param string $filterSource The filter source value to return
|
|
*
|
|
* @return string
|
|
*/
|
|
protected function getFilterSource($filterSource)
|
|
{
|
|
if ($filterSource)
|
|
{
|
|
return $filterSource;
|
|
}
|
|
else
|
|
{
|
|
return $this->name;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Is this a sortable field?
|
|
*
|
|
* @return boolean True if it's sortable
|
|
*/
|
|
protected function getSortable()
|
|
{
|
|
$sortable = ($this->element['sortable'] != 'false');
|
|
|
|
if ($sortable)
|
|
{
|
|
if (empty($this->header))
|
|
{
|
|
$this->header = $this->getHeader();
|
|
}
|
|
|
|
$sortable = !empty($this->header);
|
|
}
|
|
|
|
return $sortable;
|
|
}
|
|
|
|
/**
|
|
* Returns the HTML for the header row, or null if this element should
|
|
* render no header element
|
|
*
|
|
* @return string|null HTML code or null if nothing is to be rendered
|
|
*
|
|
* @since 2.0
|
|
*/
|
|
protected function getHeader()
|
|
{
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Returns the HTML for a text filter to be rendered in the filter row,
|
|
* or null if this element should render no text input filter.
|
|
*
|
|
* @return string|null HTML code or null if nothing is to be rendered
|
|
*
|
|
* @since 2.0
|
|
*/
|
|
protected function getFilter()
|
|
{
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Returns the HTML for the buttons to be rendered in the filter row,
|
|
* next to the text input filter, or null if this element should render no
|
|
* text input filter buttons.
|
|
*
|
|
* @return string|null HTML code or null if nothing is to be rendered
|
|
*
|
|
* @since 2.0
|
|
*/
|
|
protected function getButtons()
|
|
{
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Returns the JHtml options for a drop-down filter. Do not include an
|
|
* empty option, it is added automatically.
|
|
*
|
|
* @return array The JHtml options for a drop-down filter
|
|
*
|
|
* @since 2.0
|
|
*/
|
|
protected function getOptions()
|
|
{
|
|
return array();
|
|
}
|
|
}
|