| Current Path : /proc/1908984/root/proc/1908984/root/home/digilove/www/41423/ |
| Current File : //proc/1908984/root/proc/1908984/root/home/digilove/www/41423/Field.tar |
Password.php 0000644 00000006003 15235524365 0007070 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('password');
/**
* Form Field class for the FOF framework
* Supports a one line text field.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Password extends \JFormFieldPassword implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? 'id="' . $fieldOptions['id'] . '" ' : '';
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
return '<span ' . ($id ? $id : '') . 'class="' . $class . '">' .
htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8') .
'</span>';
}
}
Plugins.php 0000644 00000006041 15235524365 0006711 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('plugins');
/**
* Form Field class for FOF
* Plugins installed on the site
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Plugins extends \JFormFieldPlugins implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? 'id="' . $fieldOptions['id'] . '" ' : '';
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
return '<span ' . ($id ? $id : '') . 'class="' . $class . '">' .
htmlspecialchars(GenericList::getOptionName($this->getOptions(), $this->value), ENT_COMPAT, 'UTF-8') .
'</span>';
}
}
Checkboxes.php 0000644 00000006431 15235524365 0007351 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use FOF30\Utils\StringHelper;
use JText;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('checkboxes');
/**
* Form Field class for FOF
* Supports a list of checkbox.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Checkboxes extends \JFormFieldCheckboxes implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? 'id="' . $fieldOptions['id'] . '" ' : '';
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
$translate = StringHelper::toBool($this->element['translate']) ? true : false;
$html = '<span ' . ($id ? $id : '') . 'class="' . $class . '">';
foreach ($this->value as $value) {
$html .= '<span>';
if ($translate == true)
{
$html .= JText::_($value);
}
else
{
$html .= $value;
}
$html .= '</span>';
}
$html .= '</span>';
return $html;
}
}
Button.php 0000644 00000006007 15235524365 0006545 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Utils\StringHelper;
use JText;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('text');
/**
* Form Field class for the FOF framework
* Supports a button input.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Button extends Text implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
return $this->getInput();
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
return $this->getInput();
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getInput()
{
$this->label = '';
$allowedElement = array('button', 'a');
if (in_array($this->element['htmlelement'], $allowedElement))
{
$type = $this->element['htmlelement'];
}
else
{
$type = 'button';
}
$text = $this->element['text'] ? (string) $this->element['text'] : '';
$class = $this->class ? $this->class : '';
$icon = $this->element['icon'] ? '<span class="icon ' . (string) $this->element['icon'] . '"></span> ' : '';
if ($this->element['listItemTask'])
{
$this->onclick = "listItemTask('cb" . $this->item->getId() . "', '" . (string)$this->element['listItemTask'] . "')";
}
$onclick = $this->onclick ? 'onclick="' . $this->onclick . '" ' : '';
$url = $this->element['url'] ? 'href="' . $this->parseFieldTags((string) $this->element['url']) . '" ' : '';
$title = $this->element['title'] ? 'title="' . JText::_((string) $this->element['title']) . '" ' : '';
$useValue = StringHelper::toBool((string) $this->element['use_value']);
if (!$useValue)
{
$this->value = JText::_($text);
}
$html = '<' . $type . ' id="' . $this->id . '" class="btn ' . $class . '" ' . $onclick . $url . $title . '>';
$html .= $icon . htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8');
$html .= '</' . $type . '>';
return $html;
}
/**
* Method to get the field title.
*
* @return string The field title.
*/
protected function getTitle()
{
return null;
}
}
TextArea.php 0000644 00000005775 15235524365 0007022 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('textarea');
/**
* Form Field class for the FOF framework
* Supports a text area
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class TextArea extends \JFormFieldTextarea implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? 'id="' . $fieldOptions['id'] . '" ' : '';
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
return '<div ' . ($id ? $id : '') . 'class="' . $class . '">' .
htmlspecialchars(nl2br($this->value), ENT_COMPAT, 'UTF-8') .
'</div>';
}
}
ViewTemplate.php 0000644 00000007736 15235524365 0007712 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Container\Container;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use FOF30\View\View;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('text');
/**
* Form Field class for the FOF framework
* Displays a view template loaded from an outside source
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class ViewTemplate extends \JFormField implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'input':
if (empty($this->input))
{
$this->input = $this->getInput();
}
return $this->input;
break;
case 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
return $this->getRenderedTemplate();
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
return $this->getRenderedTemplate(true);
}
/**
* Method to get the field input markup.
*
* @return string The field input markup.
*
* @since 11.1
*/
protected function getInput()
{
return $this->getRenderedTemplate();
}
/**
* Returns the rendered view template
*
* @return string
*/
protected function getRenderedTemplate($isRepeatable = false)
{
$sourceTemplate = isset($this->element['source']) ? (string) $this->element['source'] : null;
$sourceView = isset($this->element['source_view']) ? (string) $this->element['source_view'] : null;
$sourceViewType = isset($this->element['source_view_type']) ? (string) $this->element['source_view_type'] : 'html';
$sourceComponent = isset($this->element['source_component']) ? (string) $this->element['source_component'] : null;
if (empty($sourceTemplate))
{
return '';
}
$sourceContainer = empty($sourceComponent) ? $this->form->getContainer() : Container::getInstance($sourceComponent);
if (empty($sourceView))
{
$viewObject = new View($sourceContainer, array(
'name' => 'FAKE_FORM_VIEW'
));
}
else
{
$viewObject = $sourceContainer->factory->view($sourceView, $sourceViewType);
}
$viewObject->populateFromModel($this->form->getModel());
return $viewObject->loadAnyTemplate($sourceTemplate, array(
'model' => $isRepeatable ? $this->item : $this->form->getModel(),
'rowid' => $isRepeatable ? $this->rowid : null,
'form' => $this->form,
'formType' => $this->form->getAttribute('type', 'edit'),
'fieldValue' => $this->value,
'fieldElement' => $this->element,
));
}
}
SelectRow.php 0000644 00000006620 15235524365 0007202 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\Exception\DataModelRequired;
use FOF30\Form\Exception\GetInputNotAllowed;
use FOF30\Form\Exception\GetStaticNotAllowed;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use JHtml;
defined('_JEXEC') or die;
/**
* Form Field class for FOF
* Renders the checkbox in browse views which allows you to select rows
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class SelectRow extends \JFormField implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Method to get the field input markup for this field type.
*
* @since 2.0
*
* @return string The field input markup.
*
* @throws GetInputNotAllowed
*/
protected function getInput()
{
throw new GetInputNotAllowed(__CLASS__);
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*
* @throws \LogicException
*/
public function getStatic()
{
throw new GetStaticNotAllowed(__CLASS__);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*
* @throws DataModelRequired
*/
public function getRepeatable()
{
// Should I support checked-out elements?
$checkoutSupport = false;
if (isset($this->element['checkout']))
{
$checkoutSupportValue = (string)$this->element['checkout'];
$checkoutSupport = in_array(strtolower($checkoutSupportValue), array('yes', 'true', 'on', 1));
}
if (!($this->item instanceof DataModel))
{
throw new DataModelRequired(__CLASS__);
}
// Is this record checked out?
$userId = $this->form->getContainer()->platform->getUser()->get('id', 0);
$checked_out = false;
if ($checkoutSupport)
{
$checked_out = $this->item->isLocked($userId);
}
// Get the key id for this record
$key_field = $this->item->getKeyName();
$key_id = $this->item->$key_field;
// Get the HTML
return JHtml::_('grid.id', $this->rowid, $key_id, $checked_out);
}
}
GroupedButton.php 0000644 00000006271 15235524365 0010076 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('text');
/**
* Form Field class for FOF
* Supports a generic list of options.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class GroupedButton extends \JFormFieldText implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
return $this->getInput();
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
return $this->getInput();
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getInput()
{
$class = $this->class ? $this->class : '';
$html = '<div id="' . $this->id . '" class="btn-group ' . $class . '">';
/** @var \SimpleXMLElement $option */
foreach ($this->element->children() as $option)
{
$renderedAttributes = array();
foreach ($option->attributes() as $name => $value)
{
if (!is_null($value))
{
$renderedAttributes[] = $name . '="' . htmlentities($value) . '"';
}
}
$buttonXML = new \SimpleXMLElement('<field ' . implode(' ', $renderedAttributes) . ' />');
$buttonField = new Button($this->form);
// Pass required objects to the field
$buttonField->item = $this->item;
$buttonField->rowid = $this->rowid;
$buttonField->setup($buttonXML, null);
$html .= $buttonField->getRepeatable();
}
$html .= '</div>';
return $html;
}
}
Sql.php 0000644 00000006056 15235524365 0006035 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('sql');
/**
* Form Field class for FOF
* Radio selection listGeneric list from an SQL statement
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Sql extends \JFormFieldSql implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? 'id="' . $fieldOptions['id'] . '" ' : '';
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
return '<span ' . ($id ? $id : '') . 'class="' . $class . '">' .
htmlspecialchars(GenericList::getOptionName($this->getOptions(), $this->value), ENT_COMPAT, 'UTF-8') .
'</span>';
}
}
Hidden.php 0000644 00000004245 15235524365 0006467 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('hidden');
/**
* Form Field class for the FOF framework
* A hidden field
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Hidden extends \JFormFieldHidden implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
return $this->getInput();
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
return $this->getInput();
}
}
Tag.php 0000644 00000010253 15235524365 0006003 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('tag');
/**
* Form Field class for FOF
* Tag Fields
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Tag extends \JFormFieldTag implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.1
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? 'id="' . $fieldOptions['id'] . '" ' : '';
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
$front_link = $this->element['front_link'] ? (string) $this->element['front_link'] : false;
$translate = $this->element['translate'] ? (string) $this->element['translate'] : false;
$tagIds = is_array($this->value) ? implode(',', $this->value) : $this->value;
if (!$this->item instanceof DataModel)
{
$this->item = $this->form->getModel();
}
if ($tagIds && $this->item instanceof DataModel)
{
$db = $this->form->getContainer()->platform->getDbo();
$query = $db->getQuery(true)
->select(array($db->quoteName('id'), $db->quoteName('title')))
->from($db->quoteName('#__tags'))
->where($db->quoteName('id') . ' IN (' . $tagIds . ')');
$query->order($db->quoteName('title'));
$db->setQuery($query);
$tags = $db->loadObjectList();
$html = '';
foreach ($tags as $tag)
{
$html .= '<span>';
if ($front_link)
{
\JLoader::register('TagsHelperRoute', \JPATH_SITE . '/components/com_tags/helpers/route.php');
$html .= '<a href="' . \JRoute::_(\TagsHelperRoute::getTagRoute($tag->id)) . '">';
}
if ($translate == true)
{
$html .= \JText::_($tag->title);
}
else
{
$html .= $tag->title;
}
if ($front_link)
{
$html .= '</a>';
}
$html .= '</span>';
}
}
return '<span ' . ($id ? $id : '') . 'class="' . $class . '">' .
$html .
'</span>';
}
}
Actions.php 0000644 00000013477 15235524365 0006703 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\Exception\DataModelRequired;
use FOF30\Form\Exception\GetStaticNotAllowed;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use FOF30\Utils\StringHelper;
use JHtml;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('list');
/**
* Form Field class for FOF
* Supports a generic list of options.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Actions extends \JFormFieldList implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the field configuration
*
* @return array
*/
protected function getConfig()
{
// If no custom options were defined let's figure out which ones of the
// defaults we shall use...
$config = array(
'published' => 1,
'unpublished' => 1,
'archived' => 0,
'trash' => 0,
'all' => 0,
);
if (isset($this->element['show_published']))
{
$config['published'] = StringHelper::toBool($this->element['show_published']);
}
if (isset($this->element['show_unpublished']))
{
$config['unpublished'] = StringHelper::toBool($this->element['show_unpublished']);
}
if (isset($this->element['show_archived']))
{
$config['archived'] = StringHelper::toBool($this->element['show_archived']);
}
if (isset($this->element['show_trash']))
{
$config['trash'] = StringHelper::toBool($this->element['show_trash']);
}
if (isset($this->element['show_all']))
{
$config['all'] = StringHelper::toBool($this->element['show_all']);
}
return $config;
}
/**
* Method to get the field options.
*
* @since 2.0
*
* @return array The field option objects.
*/
protected function getOptions()
{
return null;
}
/**
* Method to get a
*
* @param string $enabledFieldName Name of the enabled/published field
*
* @return Published Field
*/
protected function getPublishedField($enabledFieldName)
{
$attributes = array(
'name' => $enabledFieldName,
'type' => 'published',
);
if ($this->element['publish_up'])
{
$attributes['publish_up'] = (string) $this->element['publish_up'];
}
if ($this->element['publish_down'])
{
$attributes['publish_down'] = (string) $this->element['publish_down'];
}
$renderedAttributes = array();
foreach ($attributes as $name => $value)
{
if (!is_null($value))
{
$renderedAttributes[] = $name . '="' . $value . '"';
}
}
$publishedXml = new \SimpleXMLElement('<field ' . implode(' ', $renderedAttributes) . ' />');
$publishedField = new Published($this->form);
// Pass required objects to the field
$publishedField->item = $this->item;
$publishedField->rowid = $this->rowid;
$publishedField->setup($publishedXml, $this->item->{$enabledFieldName});
return $publishedField;
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*
* @throws \LogicException
*/
public function getStatic()
{
throw new GetStaticNotAllowed(__CLASS__);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*
* @throws DataModelRequired
*/
public function getRepeatable()
{
if (!($this->item instanceof DataModel))
{
throw new DataModelRequired(__CLASS__);
}
$config = $this->getConfig();
$html = '<div class="btn-group">';
// Render a published field
if ($this->item->hasField('enabled'))
{
$publishedFieldName = $this->item->getFieldAlias('enabled');
if ($config['published'] || $config['unpublished'])
{
// Generate a FieldInterfacePublished field
$publishedField = $this->getPublishedField($publishedFieldName);
// Render the publish button
$html .= $publishedField->getRepeatable();
}
if ($config['archived'])
{
$archived = $this->item->getFieldValue($publishedFieldName) == 2 ? true : false;
// Create dropdown items
$action = $archived ? 'unarchive' : 'archive';
JHtml::_('actionsdropdown.' . $action, 'cb' . $this->rowid);
}
if ($config['trash'])
{
$trashed = $this->item->getFieldValue($publishedFieldName) == -2 ? true : false;
$action = $trashed ? 'untrash' : 'trash';
JHtml::_('actionsdropdown.' . $action, 'cb' . $this->rowid);
}
// Render dropdown list
if ($config['archived'] || $config['trash'])
{
$html .= JHtml::_('actionsdropdown.render', $this->item->title);
}
}
$html .= '</div>';
return $html;
}
}
Boolean.php 0000644 00000002616 15235524365 0006653 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use JHtml;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('list');
/**
* Form Field class for FOF
* Supports a drop-down list of Yes/No (boolean) answers.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Boolean extends GenericList implements FieldInterface
{
/**
* Method to get the field options.
*
* Ordering is disabled by default. You can enable ordering by setting the
* 'order' element in your form field. The other order values are optional.
*
* - order What to order. Possible values: 'name' or 'value' (default = false)
* - order_dir Order direction. Possible values: 'asc' = Ascending or 'desc' = Descending (default = 'asc')
* - order_case_sensitive Order case sensitive. Possible values: 'true' or 'false' (default = false)
*
* @return array The field option objects.
*
* @since Ordering is available since FOF 2.1.b2.
*/
protected function getOptions()
{
$options = parent::getOptions();
$defaultOptions = array(
JHtml::_('select.option', 1, \JText::_('JYES')),
JHtml::_('select.option', 0, \JText::_('JNO')),
);
$options = array_merge($defaultOptions, $options);
return $options;
}
}
Numeric.php 0000644 00000001273 15235524365 0006674 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('number');
/**
* Backwards compatibility field. DO NOT USE IN PHP 7.2 AND LATER.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Numeric extends Number
{
public function __construct($form = null)
{
parent::__construct($form);
$this->form->getModel()->getContainer()->platform->logDeprecated("The numeric field is deprecated and may cause fatal errors in PHP 7.2 and later. Use the number field type instead.");
}
}
Editor.php 0000644 00000005760 15235524365 0006525 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('editor');
/**
* Form Field class for the FOF framework
* An editarea field for content creation and formatted HTML display
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Editor extends \JFormFieldEditor implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? 'id="' . $fieldOptions['id'] . '" ' : '';
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
return '<div ' . ($id ? $id : '') . 'class="' . $class . '">' . $this->value . '</div>';
}
}
BooleanToggle.php 0000644 00000003001 15235524365 0010002 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use JHtml;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('list');
/**
* Form Field class for FOF
* Supports a drop-down list of Yes/No (boolean) answers.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class BooleanToggle extends Radio implements FieldInterface
{
protected function getInput()
{
$this->class = 'btn-group btn-group-yesno ';
return parent::getInput();
}
/**
* Method to get the field options.
*
* Ordering is disabled by default. You can enable ordering by setting the
* 'order' element in your form field. The other order values are optional.
*
* - order What to order. Possible values: 'name' or 'value' (default = false)
* - order_dir Order direction. Possible values: 'asc' = Ascending or 'desc' = Descending (default = 'asc')
* - order_case_sensitive Order case sensitive. Possible values: 'true' or 'false' (default = false)
*
* @return array The field option objects.
*
* @since Ordering is available since FOF 2.1.b2.
*/
protected function getOptions()
{
$options = parent::getOptions();
$defaultOptions = array(
JHtml::_('select.option', 1, \JText::_('JYES')),
JHtml::_('select.option', 0, \JText::_('JNO')),
);
$options = array_merge($defaultOptions, $options);
return $options;
}
}
Captcha.php 0000644 00000004263 15235524365 0006637 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('captcha');
/**
* Form Field class for the FOF framework
* Supports a captcha field.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Captcha extends \JFormFieldCaptcha implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
return $this->getInput();
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
return $this->getInput();
}
}
Timezone.php 0000644 00000006601 15235524365 0007064 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('timezone');
/**
* Form Field class for FOF
* Supports a generic list of options.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Timezone extends \JFormFieldTimezone implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? $fieldOptions['id'] : null;
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
$selected = GroupedList::getOptionName($this->getGroups(), $this->value);
if (is_null($selected))
{
$selected = array(
'group' => '',
'item' => ''
);
}
return '<span ' . ($id ? 'id="' . $id . '-group" ' : '') . 'class="fof-groupedlist-group ' . $class . '>' .
htmlspecialchars($selected['group'], ENT_COMPAT, 'UTF-8') .
'</span>' .
'<span ' . ($id ? 'id="' . $id . '-item" ' : '') . 'class="fof-groupedlist-item ' . $class . '>' .
htmlspecialchars($selected['item'], ENT_COMPAT, 'UTF-8') .
'</span>';
}
}
Media.php 0000644 00000010513 15235524365 0006306 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use JHtml;
use JText;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('media');
/**
* Form Field class for the FOF framework
* Media selection field.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Media extends \JFormFieldMedia implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$imgattr = array();
if (isset($fieldOptions['id']))
{
$imgattr['id'] = $fieldOptions['id'];
}
if ($this->class || (isset($fieldOptions['class']) && $fieldOptions['class']))
{
$imgattr['class'] = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
}
if ($this->element['style'])
{
$imgattr['style'] = (string) $this->element['style'];
}
if ($this->element['width'])
{
$imgattr['width'] = (string) $this->element['width'];
}
if ($this->element['height'])
{
$imgattr['height'] = (string) $this->element['height'];
}
if ($this->element['align'])
{
$imgattr['align'] = (string) $this->element['align'];
}
if ($this->element['rel'])
{
$imgattr['rel'] = (string) $this->element['rel'];
}
if ($this->element['alt'])
{
$alt = JText::_((string) $this->element['alt']);
}
else
{
$alt = null;
}
if ($this->element['title'])
{
$imgattr['title'] = JText::_((string) $this->element['title']);
}
$directory = '';
if ($this->element['directory'])
{
$directory = (string) $this->element['directory'];
$directory = trim($directory, '/\\') . '/';
}
$imagePath = $directory . $this->value;
$platform = $this->form->getContainer()->platform;
$baseDirs = $platform->getPlatformBaseDirs();
if ($this->value && file_exists($baseDirs['root'] . '/' . $imagePath))
{
$src = $platform->URIroot() . '/' . $imagePath;
return JHtml::image($src, $alt, $imgattr);
}
// JHtml::image returns weird stuff when an empty path is provided, so let's be safe than sorry and return empty
return '';
}
}
Radio.php 0000644 00000006022 15235524365 0006325 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('radio');
/**
* Form Field class for FOF
* Radio selection list
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Radio extends \JFormFieldRadio implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? 'id="' . $fieldOptions['id'] . '" ' : '';
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
return '<span ' . ($id ? $id : '') . 'class="' . $class . '">' .
htmlspecialchars(GenericList::getOptionName($this->getOptions(), $this->value), ENT_COMPAT, 'UTF-8') .
'</span>';
}
}
Url.php 0000644 00000011577 15235524365 0006044 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use JText;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('url');
/**
* Form Field class for the FOF framework
* Supports a URL text field.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Url extends \JFormFieldUrl implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? 'id="' . $fieldOptions['id'] . '" ' : '';
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
$show_link = $this->element['show_link'] == 'true';
$empty_replacement = $this->element['empty_replacement'] ? (string) $this->element['empty_replacement'] : '';
if (!empty($empty_replacement) && empty($this->value))
{
$this->value = JText::_($empty_replacement);
}
$value = htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8');
$html = $value;
if ($show_link)
{
if ($this->element['url'])
{
$link_url = $this->parseFieldTags((string) $this->element['url']);
}
else
{
$link_url = $value;
}
$html = '<a href="' . $link_url . '">' .
$value . '</a>';
}
return '<span ' . ($id ? $id : '') . 'class="' . $class . '"">' .
$html .
'</span>';
}
/**
* Replace string with tags that reference fields
*
* @param string $text Text to process
*
* @return string Text with tags replace
*/
protected function parseFieldTags($text)
{
$ret = $text;
// Replace [ITEM:ID] in the URL with the item's key value (usually:
// the auto-incrementing numeric ID)
if (is_null($this->item))
{
$this->item = $this->form->getModel();
}
$replace = $this->item->getId();
$ret = str_replace('[ITEM:ID]', $replace, $ret);
// Replace the [ITEMID] in the URL with the current Itemid parameter
$ret = str_replace('[ITEMID]', $this->form->getContainer()->input->getInt('Itemid', 0), $ret);
// Replace the [TOKEN] in the URL with the Joomla! form token
$ret = str_replace('[TOKEN]', \JFactory::getSession()->getFormToken(), $ret);
// Replace other field variables in the URL
$data = $this->item->getData();
foreach ($data as $field => $value)
{
// Skip non-processable values
if(is_array($value) || is_object($value))
{
continue;
}
$search = '[ITEM:' . strtoupper($field) . ']';
$ret = str_replace($search, $value, $ret);
}
return $ret;
}
}
Language.php 0000644 00000007400 15235524365 0007013 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use JHtml;
use JText;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('language');
/**
* Form Field class for FOF
* Available site languages
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Language extends \JFormFieldLanguage implements FieldInterface
{
protected static $cachedOptions = array();
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Method to get the field options.
*
* @since 2.0
*
* @return array The field option objects.
*/
protected function getOptions()
{
$client = (string) $this->element['client'];
if ($client != 'site' && $client != 'administrator')
{
$client = 'site';
}
if (!isset(static::$cachedOptions[$client]))
{
static::$cachedOptions[$client] = parent::getOptions();
}
$options = array_merge(static::$cachedOptions[$client]);
$noneoption = $this->element['none'] ? $this->element['none'] : null;
if ($noneoption)
{
array_unshift($options, JHtml::_('select.option', '*', JText::_($noneoption)));
}
return $options;
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? 'id="' . $fieldOptions['id'] . '" ' : '';
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
return '<span ' . ($id ? $id : '') . 'class="' . $class . '">' .
htmlspecialchars(GenericList::getOptionName($this->getOptions(), $this->value), ENT_COMPAT, 'UTF-8') .
'</span>';
}
}
Model.php 0000644 00000020602 15235524365 0006327 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Container\Container;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use FOF30\Utils\StringHelper;
use JHtml;
use JText;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('list');
/**
* Form Field class for FOF
* Generic list from a model's results
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Model extends GenericList implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* Options loaded from the model, cached for efficiency
*
* @var null|array
*/
protected static $loadedOptions = null;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
$class = $this->class ? 'class="' . $this->class . '"' : '';
return '<span id="' . $this->id . '" ' . $class . '>' .
htmlspecialchars(GenericList::getOptionName($this->getOptions(), $this->value), ENT_COMPAT, 'UTF-8') .
'</span>';
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
// Get field parameters
$class = $this->class ? $this->class : $this->id;
$format_string = $this->element['format'] ? (string) $this->element['format'] : '';
$link_url = $this->element['url'] ? (string) $this->element['url'] : '';
$empty_replacement = $this->element['empty_replacement'] ? (string) $this->element['empty_replacement'] : '';
if ($link_url && ($this->item instanceof DataModel))
{
$link_url = $this->parseFieldTags($link_url);
}
else
{
$link_url = false;
}
if ($this->element['empty_replacement'])
{
$empty_replacement = (string) $this->element['empty_replacement'];
}
// Ask GenericList::getOptionName to not automatically select the first value
$value = GenericList::getOptionName($this->getOptions(), $this->value, 'value', 'text', false);
// Get the (optionally formatted) value
if (!empty($empty_replacement) && empty($value))
{
$value = JText::_($empty_replacement);
}
if (empty($format_string))
{
$value = htmlspecialchars($value, ENT_COMPAT, 'UTF-8');
}
else
{
$value = sprintf($format_string, $value);
}
// Create the HTML
$html = '<span class="' . $class . '">';
if ($link_url)
{
$html .= '<a href="' . $link_url . '">';
}
$html .= $value;
if ($link_url)
{
$html .= '</a>';
}
$html .= '</span>';
return $html;
}
/**
* Method to get the field options.
*
* @param bool $forceReset
*
* @return array The field option objects.
*/
protected function getOptions($forceReset = false)
{
$myFormKey = $this->form->getName() . '#$#' . (string) $this->element['model'];
if ($forceReset && isset(static::$loadedOptions[$myFormKey]))
{
unset(static::$loadedOptions[$myFormKey]);
}
if (!isset(static::$loadedOptions[$myFormKey]))
{
$options = array();
// Initialize some field attributes.
$key = $this->element['key_field'] ? (string) $this->element['key_field'] : 'value';
$value = $this->element['value_field'] ? (string) $this->element['value_field'] : (string) $this->element['name'];
$valueReplace = StringHelper::toBool($this->element['parse_value']);
$translate = StringHelper::toBool($this->element['translate']);
$applyAccess = StringHelper::toBool($this->element['apply_access']);
$modelName = (string) $this->element['model'];
$nonePlaceholder = (string) $this->element['none'];
$with = $this->element['with'] ? (string) $this->element['with'] : null;
if (!is_null($with))
{
$with = trim($with);
$with = explode(',', $with);
$with = array_map('trim', $with);
}
if (!empty($nonePlaceholder))
{
$options[] = JHtml::_('select.option', null, JText::_($nonePlaceholder));
}
// Explode model name into component name and prefix
$componentName = $this->form->getContainer()->componentName;
$mName = $modelName;
if (strpos($modelName, '.') !== false)
{
list ($componentName, $mName) = explode('.', $mName, 2);
}
// Get the applicable container
$container = $this->form->getContainer();
if ($componentName != $container->componentName)
{
$container = Container::getInstance($componentName);
}
/** @var DataModel $model */
$model = $container->factory->model($mName)->setIgnoreRequest(true)->savestate(false);
// Get the model object
if ($applyAccess)
{
$model->applyAccessFiltering();
}
if (!is_null($with))
{
$model->with($with);
}
// Process state variables
/** @var \SimpleXMLElement $stateoption */
foreach ($this->element->children() as $stateoption)
{
// Only add <state /> elements.
if ($stateoption->getName() != 'state')
{
continue;
}
$stateKey = (string) $stateoption['key'];
$stateValue = (string) $stateoption;
$model->setState($stateKey, $stateValue);
}
// Set the query and get the result list.
$items = $model->get(true);
// Build the field options.
if (!empty($items))
{
foreach ($items as $item)
{
if ($translate == true)
{
$options[] = JHtml::_('select.option', $item->$key, JText::_($item->$value));
}
else
{
if ($valueReplace)
{
$text = $this->parseFieldTags($value, $item);
}
else
{
$text = $item->$value;
}
$options[] = JHtml::_('select.option', $item->$key, $text);
}
}
}
// Merge any additional options in the XML definition.
$options = array_merge(parent::getOptions(), $options);
static::$loadedOptions[$myFormKey] = $options;
}
return static::$loadedOptions[$myFormKey];
}
/**
* Replace string with tags that reference fields
*
* @param string $text Text to process
*
* @return string Text with tags replace
*/
protected function parseFieldTags($text, $item = null)
{
$ret = $text;
if ($item)
{
$this->item = $item;
}
if (is_null($this->item))
{
$this->item = $this->form->getModel();
}
$replace = $this->item->getId();
$ret = str_replace('[ITEM:ID]', $replace, $ret);
// Replace the [ITEMID] in the URL with the current Itemid parameter
$ret = str_replace('[ITEMID]', $this->form->getContainer()->input->getInt('Itemid', 0), $ret);
// Replace the [TOKEN] in the URL with the Joomla! form token
$ret = str_replace('[TOKEN]', \JFactory::getSession()->getFormToken(), $ret);
// Replace other field variables in the URL
$data = $this->item->getData();
foreach ($data as $field => $value)
{
// Skip non-processable values
if(is_array($value) || is_object($value))
{
continue;
}
$search = '[ITEM:' . strtoupper($field) . ']';
$ret = str_replace($search, $value, $ret);
}
return $ret;
}
}
SessionHandler.php 0000644 00000006062 15235524365 0010214 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('sessionhandler');
/**
* Form Field class for FOF
* Joomla! session handlers
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class SessionHandler extends \JFormFieldSessionHandler implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? 'id="' . $fieldOptions['id'] . '" ' : '';
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
return '<span ' . ($id ? $id : '') . 'class="' . $class . '">' .
htmlspecialchars(GenericList::getOptionName($this->getOptions(), $this->value), ENT_COMPAT, 'UTF-8') .
'</span>';
}
}
Text.php 0000644 00000017356 15235524365 0006227 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use JText;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('text');
/**
* Form Field class for the FOF framework
* Supports a one line text field.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Text extends \JFormFieldText implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (is_array($this->value))
{
$this->value = empty($this->value) ? '' : print_r($this->value, true);
}
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$class = $this->class ? ' class="' . $this->class . '"' : '';
$empty_replacement = $this->element['empty_replacement'] ? (string) $this->element['empty_replacement'] : '';
if (!empty($empty_replacement) && empty($this->value))
{
$this->value = JText::_($empty_replacement);
}
return '<span id="' . $this->id . '" ' . $class . '>' .
htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8') .
'</span>';
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (is_array($this->value))
{
$this->value = print_r($this->value, true);
}
if (isset($this->element['legacy']))
{
return $this->getInput();
}
// Should I support checked-out elements?
$checkoutSupport = false;
if (isset($this->element['checkout']))
{
$checkoutSupportValue = (string)$this->element['checkout'];
$checkoutSupport = in_array(strtolower($checkoutSupportValue), array('yes', 'true', 'on', 1));
}
// Initialise
$class = $this->class ? $this->class : $this->id;
$format_string = $this->element['format'] ? (string) $this->element['format'] : '';
$format_if_not_empty = in_array((string) $this->element['format_if_not_empty'], array('true', '1', 'on', 'yes'));
$parse_value = in_array((string) $this->element['parse_value'], array('true', '1', 'on', 'yes'));
$link_url = $this->element['url'] ? (string) $this->element['url'] : '';
$empty_replacement = $this->element['empty_replacement'] ? (string) $this->element['empty_replacement'] : '';
$format_source_file = empty($this->element['format_source_file']) ? '' : (string) $this->element['format_source_file'];
$format_source_class = empty($this->element['format_source_class']) ? '' : (string) $this->element['format_source_class'];
$format_source_method = empty($this->element['format_source_method']) ? '' : (string) $this->element['format_source_method'];
if ($link_url && ($this->item instanceof DataModel))
{
$link_url = $this->parseFieldTags($link_url);
}
else
{
$link_url = false;
}
// Get the (optionally formatted) value
$value = $this->value;
if (!empty($empty_replacement) && empty($this->value))
{
$value = JText::_($empty_replacement);
}
if ($parse_value)
{
$value = $this->parseFieldTags($value);
}
if (!empty($format_string) && (!$format_if_not_empty || ($format_if_not_empty && !empty($this->value))))
{
$format_string = $this->parseFieldTags($format_string);
$value = sprintf($format_string, $value);
}
elseif ($format_source_class && $format_source_method)
{
// Maybe we have to load a file?
if (!empty($format_source_file))
{
$format_source_file = $this->form->getContainer()->template->parsePath($format_source_file, true);
if ($this->form->getContainer()->filesystem->fileExists($format_source_file))
{
include_once $format_source_file;
}
}
// Make sure the class and method exist
if (class_exists($format_source_class, true) && in_array($format_source_method, get_class_methods($format_source_class)))
{
$value = $format_source_class::$format_source_method($value);
$value = $this->parseFieldTags($value);
}
else
{
$value = htmlspecialchars($value, ENT_COMPAT, 'UTF-8');
}
}
else
{
$value = htmlspecialchars($value, ENT_COMPAT, 'UTF-8');
}
// Create the HTML
$html = '<span class="' . $class . '">';
$userId = $this->form->getContainer()->platform->getUser()->id;
if ($checkoutSupport && $this->item->isLocked($userId))
{
$key_field = $this->item->getKeyName();
$key_id = $this->item->$key_field;
$lockedBy = '';
$lockedOn = '';
if ($this->item->hasField('locked_by'))
{
$lockedUser = $this->form->getContainer()->platform->getUser($this->item->getFieldValue('locked_by'));
$lockedBy = $lockedUser->name . ' (' . $lockedUser->username . ')';
}
if ($this->item->hasField('locked_on'))
{
$lockedOn = $this->item->getFieldValue('locked_on');
}
$html .= \JHtml::_('jgrid.checkedout', $key_id, $lockedBy, $lockedOn, '', true);
}
if ($link_url)
{
$html .= '<a href="' . $link_url . '">';
}
$html .= $value;
if ($link_url)
{
$html .= '</a>';
}
$html .= '</span>';
return $html;
}
/**
* Replace string with tags that reference fields
*
* @param string $text Text to process
*
* @return string Text with tags replace
*/
protected function parseFieldTags($text)
{
$ret = $text;
// Replace [ITEM:ID] in the URL with the item's key value (usually:
// the auto-incrementing numeric ID)
if (is_null($this->item))
{
$this->item = $this->form->getModel();
}
$replace = $this->item->getId();
$ret = str_replace('[ITEM:ID]', $replace, $ret);
// Replace the [ITEMID] in the URL with the current Itemid parameter
$ret = str_replace('[ITEMID]', $this->form->getContainer()->input->getInt('Itemid', 0), $ret);
// Replace the [TOKEN] in the URL with the Joomla! form token
$ret = str_replace('[TOKEN]', \JFactory::getSession()->getFormToken(), $ret);
// Replace other field variables in the URL
$data = $this->item->getData();
foreach ($data as $field => $value)
{
// Skip non-processable values
if(is_array($value) || is_object($value))
{
continue;
}
$search = '[ITEM:' . strtoupper($field) . ']';
$ret = str_replace($search, $value, $ret);
}
return $ret;
}
}
UserGroup.php 0000644 00000010732 15235524365 0007225 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use JHtml;
use JText;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('usergroup');
/**
* Form Field class for FOF
* Joomla! user groups
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class UserGroup extends \JFormFieldUsergroup implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$class = $this->class ? ' class="' . $this->class . '"' : '';
$params = $this->getOptions();
$db = $this->form->getContainer()->platform->getDbo();
$query = $db->getQuery(true)
->select('a.id AS value, a.title AS text')
->from('#__usergroups AS a')
->group('a.id, a.title')
->order('a.id ASC')
->order($db->qn('title') . ' ASC');
// Get the options.
$options = $db->setQuery($query)->loadObjectList();
// If params is an array, push these options to the array
if (is_array($params))
{
$options = array_merge($params, $options);
}
// If all levels is allowed, push it into the array.
elseif ($params)
{
array_unshift($options, JHtml::_('select.option', '', JText::_('JOPTION_ACCESS_SHOW_ALL_LEVELS')));
}
return '<span id="' . $this->id . '" ' . $class . '>' .
htmlspecialchars(GenericList::getOptionName($options, $this->value), ENT_COMPAT, 'UTF-8') .
'</span>';
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$class = $this->class ? $this->class : '';
$db = $this->form->getContainer()->platform->getDbo();
$query = $db->getQuery(true)
->select('a.id AS value, a.title AS text')
->from('#__usergroups AS a')
->group('a.id, a.title')
->order('a.id ASC')
->order($db->qn('title') . ' ASC');
// Get the options.
$options = $db->setQuery($query)->loadObjectList();
return '<span class="' . $this->id . ' ' . $class . '">' .
htmlspecialchars(GenericList::getOptionName($options, $this->value), ENT_COMPAT, 'UTF-8') .
'</span>';
}
/**
* Returns the options for this control
*
* Adapted from JHtmlAccess::usergroup
*
* @return \stdClass[]
*/
protected function getOptions()
{
$db = $this->form->getContainer()->platform->getDbo();
$query = $db->getQuery(true)
->select('a.id AS value, a.title AS text, COUNT(DISTINCT b.id) AS level')
->from($db->quoteName('#__usergroups') . ' AS a')
->join('LEFT', $db->quoteName('#__usergroups') . ' AS b ON a.lft > b.lft AND a.rgt < b.rgt')
->group('a.id, a.title, a.lft, a.rgt')
->order('a.lft ASC');
$db->setQuery($query);
$options = $db->loadObjectList();
for ($i = 0, $n = count($options); $i < $n; $i++)
{
$options[$i]->text = str_repeat('- ', $options[$i]->level) . $options[$i]->text;
}
}
}
Published.php 0000644 00000012255 15235524365 0007213 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\Exception\DataModelRequired;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use JHtml;
use JText;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('list');
/**
* Form Field class for FOF
* Supports a generic list of options.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Published extends \JFormFieldList implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Method to get the field options.
*
* @since 2.0
*
* @return array The field option objects.
*/
protected function getOptions()
{
$options = parent::getOptions();
if (!empty($options))
{
return $options;
}
// If no custom options were defined let's figure out which ones of the
// defaults we shall use...
$config = array(
'published' => 1,
'unpublished' => 1,
'archived' => 0,
'trash' => 0,
'all' => 0,
);
$configMap = array(
'show_published' => array('published', 1),
'show_unpublished' => array('unpublished', 1),
'show_archived' => array('archived', 0),
'show_trash' => array('trash', 0),
'show_all' => array('all', 0),
);
foreach ($configMap as $attribute => $preferences)
{
list($configKey, $default) = $preferences;
switch (strtolower($this->element[$attribute]))
{
case 'true':
case '1':
case 'yes':
$config[$configKey] = true;
break;
case 'false':
case '0':
case 'no':
$config[$configKey] = false;
break;
default:
$config[$configKey] = $default;
}
}
$stack = array();
if ($config['published'])
{
$stack[] = JHtml::_('select.option', '1', JText::_('JPUBLISHED'));
}
if ($config['unpublished'])
{
$stack[] = JHtml::_('select.option', '0', JText::_('JUNPUBLISHED'));
}
if ($config['archived'])
{
$stack[] = JHtml::_('select.option', '2', JText::_('JARCHIVED'));
}
if ($config['trash'])
{
$stack[] = JHtml::_('select.option', '-2', JText::_('JTRASHED'));
}
if ($config['all'])
{
$stack[] = JHtml::_('select.option', '*', JText::_('JALL'));
}
return $stack;
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
$class = $this->class ? ' class="' . $this->class . '"' : '';
return '<span id="' . $this->id . '" ' . $class . '>' .
htmlspecialchars(GenericList::getOptionName($this->getOptions(), $this->value), ENT_COMPAT, 'UTF-8') .
'</span>';
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*
* @throws DataModelRequired
*/
public function getRepeatable()
{
if (!($this->item instanceof DataModel))
{
throw new DataModelRequired(__CLASS__);
}
$prefix = $this->element['prefix'] ? (string) $this->element['prefix'] : '';
$checkbox = $this->element['checkbox'] ? (string) $this->element['checkbox'] : 'cb';
$publish_up = $this->element['publish_up'] ? (string) $this->element['publish_up'] : null;
$publish_down = $this->element['publish_down'] ? (string) $this->element['publish_down'] : null;
$container = $this->form->getContainer();
$privilege = $this->element['acl_privilege'] ? $this->element['acl_privilege'] : 'core.edit.state';
$component = $this->element['acl_component'] ? $this->element['acl_component'] : $container->componentName;
$component = empty($component) ? null : $component;
$enabled = $container->platform->getUser()->authorise($privilege, $component);
// @todo Enforce ACL checks to determine if the field should be enabled or not
// Get the HTML
return JHTML::_('jgrid.published', $this->value, $this->rowid, $prefix, $enabled, $checkbox, $publish_up, $publish_down);
}
}
Checkbox.php 0000644 00000007315 15235524365 0007023 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('checkbox');
/**
* Form Field class for the FOF framework
* A single checkbox
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Checkbox extends \JFormFieldCheckbox implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? 'id="' . $fieldOptions['id'] . '" ' : '';
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
$value = $this->element['value'] ? (string) $this->element['value'] : '1';
$disabled = $this->disabled ? ' disabled="disabled"' : '';
$required = $this->required ? ' required="required" aria-required="true"' : '';
$autofocus = $this->autofocus ? ' autofocus' : '';
$checked = $this->checked || !empty($this->value) ? ' checked' : '';
$onchange = $this->onchange ? ' onchange="' . $this->onchange . '"' : '';
$onclick = $this->onclick ? ' onclick="' . $this->onclick . '"' : '';
return '<span ' . ($id ? $id : '') . 'class="' . $class . '">' .
'<input type="checkbox" name="' . $this->name . '" ' . ($id ? $id : '') . 'class="' . $this->id . ' ' . $class . '"' . ' value="'
. htmlspecialchars($value, ENT_COMPAT, 'UTF-8') . '"' . $checked . $disabled . $onclick . $onchange
. $required . $autofocus . ' />' .
'</span>';
}
}
ImageList.php 0000644 00000010433 15235524365 0007146 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use JHtml;
use JText;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('imagelist');
/**
* Form Field class for the FOF framework
* Media selection field.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class ImageList extends \JFormFieldImageList implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$imgattr = array();
$alt = null;
if (isset($fieldOptions['id']) && $fieldOptions['id'])
{
$imgattr['id'] = $fieldOptions['id'];
}
if ($this->class || (isset($fieldOptions['class']) && $fieldOptions['class']))
{
$imgattr['class'] = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
}
if ($this->element['style'])
{
$imgattr['style'] = (string) $this->element['style'];
}
if ($this->element['width'])
{
$imgattr['width'] = (string) $this->element['width'];
}
if ($this->element['height'])
{
$imgattr['height'] = (string) $this->element['height'];
}
if ($this->element['align'])
{
$imgattr['align'] = (string) $this->element['align'];
}
if ($this->element['rel'])
{
$imgattr['rel'] = (string) $this->element['rel'];
}
if ($this->element['alt'])
{
$alt = JText::_((string) $this->element['alt']);
}
if ($this->element['title'])
{
$imgattr['title'] = JText::_((string) $this->element['title']);
}
$path = (string) $this->element['directory'];
$path = trim($path, '/' . DIRECTORY_SEPARATOR);
$platform = $this->form->getContainer()->platform;
$baseDirs = $platform->getPlatformBaseDirs();
if ($this->value && file_exists($baseDirs['root'] . '/' . $path . '/' . $this->value))
{
$src = $platform->URIroot() . '/' . $path . '/' . $this->value;
return JHtml::image($src, $alt, $imgattr);
}
// JHtml::image returns weird stuff when an empty path is provided, so let's be safe than sorry and return empty
return '';
}
}
Spacer.php 0000644 00000004270 15235524365 0006507 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('spacer');
/**
* Form Field class for the FOF framework
* Spacer used between form elements
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Spacer extends \JFormFieldSpacer implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
return $this->getInput();
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
return $this->getInput();
}
}
Ordering.php 0000644 00000016516 15235524365 0007051 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\Exception\DataModelRequired;
use FOF30\Form\Exception\GetStaticNotAllowed;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use JHtml;
use JText;
defined('_JEXEC') or die;
/**
* Form Field class for FOF
* Renders the row ordering interface checkbox in browse views
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Ordering extends \JFormField implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Method to get the field input markup for this field type.
*
* @since 2.0
*
* @return string The field input markup.
*/
protected function getInput()
{
$html = array();
$attr = '';
// Initialize some field attributes.
$attr .= !empty($this->class) ? ' class="' . $this->class . '"' : '';
$attr .= $this->disabled ? ' disabled' : '';
$attr .= !empty($this->size) ? ' size="' . $this->size . '"' : '';
// Initialize JavaScript field attributes.
$attr .= !empty($this->onchange) ? ' onchange="' . $this->onchange . '"' : '';
$this->item = $this->form->getModel();
$keyfield = $this->item->getKeyName();
$itemId = $this->item->$keyfield;
$query = $this->getQuery();
// Create a read-only list (no name) with a hidden input to store the value.
if ($this->readonly)
{
$html[] = JHtml::_('list.ordering', '', $query, trim($attr), $this->value, $itemId ? 0 : 1);
$html[] = '<input type="hidden" name="' . $this->name . '" value="' . $this->value . '"/>';
}
else
{
// Create a regular list.
$html[] = JHtml::_('list.ordering', $this->name, $query, trim($attr), $this->value, $itemId ? 0 : 1);
}
return implode($html);
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*
* @throws \LogicException
*/
public function getStatic()
{
throw new GetStaticNotAllowed(__CLASS__);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*
* @throws DataModelRequired
*/
public function getRepeatable()
{
if (!($this->item instanceof DataModel))
{
throw new DataModelRequired(__CLASS__);
}
$class = isset($this->class) ? $this->class : 'input-mini';
$icon = isset($this->element['icon']) ? $this->element['icon'] : 'icon-menu';
$dnd = isset($this->element['dragndrop']) ? (string) $this->element['dragndrop'] : 'notbroken';
if (strtolower($dnd) == 'notbroken')
{
$dnd = !version_compare(JVERSION, '3.5.0', 'ge');
}
else
{
$dnd = in_array(strtolower($dnd), array('1', 'true', 'yes', 'on', 'enabled'), true);
}
$html = '';
$view = $this->form->getView();
$ordering = $view->getLists()->order == $this->item->getFieldAlias('ordering');
if (!$view->hasAjaxOrderingSupport())
{
// Ye olde Joomla! 2.5 method
$disabled = $ordering ? '' : 'disabled="disabled"';
$html .= '<span>';
$html .= $view->getPagination()->orderUpIcon($this->rowid, true, 'orderup', 'Move Up', $ordering);
$html .= '</span><span>';
$html .= $view->getPagination()->orderDownIcon($this->rowid, $view->getPagination()->total, true, 'orderdown', 'Move Down', $ordering);
$html .= '</span>';
$html .= '<input type="text" name="order[]" size="5" value="' . $this->value . '" ' . $disabled;
$html .= 'class="text-area-order" style="text-align: center" />';
}
else
{
// The modern drag'n'drop method
if ($view->getPerms()->editstate)
{
$disableClassName = '';
$disabledLabel = '';
$hasAjaxOrderingSupport = $view->hasAjaxOrderingSupport();
if (!$hasAjaxOrderingSupport['saveOrder'])
{
$disabledLabel = JText::_('JORDERINGDISABLED');
$disableClassName = 'inactive tip-top';
}
$orderClass = $ordering ? 'order-enabled' : 'order-disabled';
$html .= '<div class="' . $orderClass . '">';
if ($dnd)
{
$html .= '<span class="sortable-handler ' . $disableClassName . '" title="' . $disabledLabel . '" rel="tooltip">';
$html .= '<span class="' . $icon . '"></span>';
$html .= '</span>';
}
if ($ordering)
{
/**
* Joomla! 3.5 and later: drag and drop reordering is broken when the ordering field is not hidden
* because some random bloke submitted that code and some supposedly responsible adult with commit
* rights committed it. I tried to file a PR to fix it and got the reply "can't test, won't test".
* OK, then. You blindly accepted code which did the EXACT OPPOSITE of what it promised and broke
* b/c. However, you won't accept the fix to your mess from someone who knows how Joomla! works and
* wasted 2 hours of his time to track down your mistake, fix it and explain why your actions
* resulted in a b/c break. You have to be kidding me!
*/
$joomla35IsBroken = version_compare(JVERSION, '3.5.0', 'ge') ? 'style="display: none"': '';
// When the developer has disabled Drag and Drop we will show the field regardless
$joomla35IsBroken = $dnd ? $joomla35IsBroken : '';
$html .= '<input type="text" name="order[]" ' . $joomla35IsBroken . ' size="5" class="' . $class . ' text-area-order" value="' . $this->value . '" />';
}
$html .= '</div>';
}
else
{
$html .= '<span class="sortable-handler inactive" >';
$html .= '<i class="' . $icon . '"></i>';
$html .= '</span>';
}
}
return $html;
}
/**
* Builds the query for the ordering list.
*
* @since 2.3.2
*
* @return \JDatabaseQuery The query for the ordering form field
*/
protected function getQuery()
{
$ordering = $this->name;
$title = $this->element['ordertitle'] ? (string) $this->element['ordertitle'] : $this->item->getFieldAlias('title');
$db = $this->form->getContainer()->platform->getDbo();
$query = $db->getQuery(true);
$query->select(array($db->quoteName($ordering, 'value'), $db->quoteName($title, 'text')))
->from($db->quoteName($this->item->getTableName()))
->order($ordering);
return $query;
}
}
Email.php 0000644 00000011631 15235524365 0006320 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use FOF30\Utils\StringHelper;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('email');
/**
* Form Field class for the FOF framework
* Supports a one line text field.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Email extends \JFormFieldEMail implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? 'id="' . $fieldOptions['id'] . '" ' : '';
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
$show_link = StringHelper::toBool((string) $this->element['show_link']);
$empty_replacement = $this->element['empty_replacement'] ? (string) $this->element['empty_replacement'] : '';
if (!empty($empty_replacement) && empty($this->value))
{
$replacement_key = (string) $this->element['empty_replacement'];
$this->value = \JText::_($replacement_key);
}
$value = htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8');
$html = $value;
if ($show_link)
{
if ($this->element['url'])
{
$link_url = $this->parseFieldTags((string) $this->element['url']);
}
else
{
$link_url = $value;
}
$html = '<a href="mailto:' . $link_url . '">' .
$value . '</a>';
}
return '<span ' . ($id ? $id : '') . 'class="' . $class . '">' .
$html .
'</span>';
}
/**
* Replace string with tags that reference fields
*
* @param string $text Text to process
*
* @return string Text with tags replace
*/
protected function parseFieldTags($text)
{
$ret = $text;
// Replace [ITEM:ID] in the URL with the item's key value (usually:
// the auto-incrementing numeric ID)
if (is_null($this->item))
{
$this->item = $this->form->getModel();
}
$replace = $this->item->getId();
$ret = str_replace('[ITEM:ID]', $replace, $ret);
// Replace the [ITEMID] in the URL with the current Itemid parameter
$ret = str_replace('[ITEMID]', $this->form->getContainer()->input->getInt('Itemid', 0), $ret);
// Replace the [TOKEN] in the URL with the Joomla! form token
$ret = str_replace('[TOKEN]', \JFactory::getSession()->getFormToken(), $ret);
// Replace other field variables in the URL
$data = $this->item->getData();
foreach ($data as $field => $value)
{
// Skip non-processable values
if(is_array($value) || is_object($value))
{
continue;
}
$search = '[ITEM:' . strtoupper($field) . ']';
$ret = str_replace($search, $value, $ret);
}
return $ret;
}
}
GroupedList.php 0000644 00000011310 15235524365 0007524 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\Exception\InvalidGroupContents;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('groupedlist');
/**
* Form Field class for FOF
* Supports a generic list of options.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class GroupedList extends \JFormFieldGroupedList implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? $fieldOptions['id'] : null;
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
$selected = self::getOptionName($this->getGroups(), $this->value);
if (is_null($selected))
{
$selected = array(
'group' => '',
'item' => ''
);
}
return '<span ' . ($id ? 'id="' . $id . '-group" ' : '') . 'class="fof-groupedlist-group' . $class . '">' .
htmlspecialchars($selected['group'], ENT_COMPAT, 'UTF-8') .
'</span>' .
'<span ' . ($id ? 'id="' . $id . '-item" ' : '') . 'class="fof-groupedlist-item' . $class . '">' .
htmlspecialchars($selected['item'], ENT_COMPAT, 'UTF-8') .
'</span>';
}
/**
* Gets the active option's label given an array of JHtml options
*
* @param array $data The JHtml options to parse
* @param mixed $selected The currently selected value
* @param string $groupKey Group name
* @param string $optKey Key name
* @param string $optText Value name
*
* @return mixed The label of the currently selected option
*/
public static function getOptionName($data, $selected = null, $groupKey = 'items', $optKey = 'value', $optText = 'text')
{
if ($groupKey) {}; // Keeps phpStorm from freaking out
$ret = null;
foreach ($data as $dataKey => $group)
{
$noGroup = true;
if (is_array($group) || is_object($group))
{
$label = $dataKey;
// If the key is a string, most likely is the title of group
if(is_string($dataKey))
{
$noGroup = false;
}
}
else
{
throw new InvalidGroupContents(get_called_class());
}
if ($noGroup)
{
$label = '';
}
$match = GenericList::getOptionName($group, $selected, $optKey, $optText, false);
if (!is_null($match))
{
$ret = array(
'group' => $label,
'item' => $match
);
break;
}
}
return $ret;
}
}
Tel.php 0000644 00000011664 15235524365 0006023 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use JText;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('tel');
/**
* Form Field class for the FOF framework
* Supports a URL text field.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Tel extends \JFormFieldTel implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? 'id="' . $fieldOptions['id'] . '" ' : '';
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
$show_link = in_array((string) $this->element['show_link'], array('true', '1', 'on', 'yes'));
$empty_replacement = $this->element['empty_replacement'] ? (string) $this->element['empty_replacement'] : '';
if (!empty($empty_replacement) && empty($this->value))
{
$this->value = JText::_($empty_replacement);
}
$value = htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8');
$html = $value;
if ($show_link)
{
if ($this->element['url'])
{
$link_url = $this->parseFieldTags((string) $this->element['url']);
}
else
{
$link_url = $value;
}
$html = '<a href="tel:' . $link_url . '">' .
$value . '</a>';
}
return '<span ' . ($id ? $id : '') . 'class="' . $class . '"">' .
$html .
'</span>';
}
/**
* Replace string with tags that reference fields
*
* @param string $text Text to process
*
* @return string Text with tags replace
*/
protected function parseFieldTags($text)
{
$ret = $text;
// Replace [ITEM:ID] in the URL with the item's key value (usually:
// the auto-incrementing numeric ID)
if (is_null($this->item))
{
$this->item = $this->form->getModel();
}
$replace = $this->item->getId();
$ret = str_replace('[ITEM:ID]', $replace, $ret);
// Replace the [ITEMID] in the URL with the current Itemid parameter
$ret = str_replace('[ITEMID]', $this->form->getContainer()->input->getInt('Itemid', 0), $ret);
// Replace the [TOKEN] in the URL with the Joomla! form token
$ret = str_replace('[TOKEN]', \JFactory::getSession()->getFormToken(), $ret);
// Replace other field variables in the URL
$data = $this->item->getData();
foreach ($data as $field => $value)
{
// Skip non-processable values
if(is_array($value) || is_object($value))
{
continue;
}
$search = '[ITEM:' . strtoupper($field) . ']';
$ret = str_replace($search, $value, $ret);
}
return $ret;
}
}
RowSelect.php 0000644 00000000610 15235524365 0007173 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
defined('_JEXEC') or die;
/**
* Form Field class for FOF
* Alias to RowSelect (common typo)
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class RowSelect extends SelectRow
{
}
Callback.php 0000644 00000007434 15235524365 0006773 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('text');
/**
* Form Field class for the FOF framework
* Displays a field generated by a callback
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Callback extends \JFormField implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'input':
if (empty($this->input))
{
$this->input = $this->getInput();
}
return $this->input;
break;
case 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
return $this->getCallbackResults();
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
return $this->getCallbackResults();
}
/**
* Method to get the field input markup.
*
* @return string The field input markup.
*
* @since 11.1
*/
protected function getInput()
{
return $this->getCallbackResults();
}
/**
* Returns the rendered view template
*
* @return string
*/
protected function getCallbackResults()
{
$source_file = empty($this->element['source_file']) ? '' : (string) $this->element['source_file'];
$source_class = empty($this->element['source_class']) ? '' : (string) $this->element['source_class'];
$source_method = empty($this->element['source_method']) ? '' : (string) $this->element['source_method'];
if (empty($source_class) || empty($source_method))
{
return '';
}
// Maybe we have to load a file?
if (!empty($source_file))
{
$source_file = $this->form->getContainer()->template->parsePath($source_file, true);
if ($this->form->getContainer()->filesystem->fileExists($source_file))
{
include_once $source_file;
}
}
// Make sure the class exists
if (class_exists($source_class, true))
{
// ...and so does the option
if (in_array($source_method, get_class_methods($source_class)))
{
return $source_class::$source_method(array(
'model' => $this->form->getModel(),
'form' => $this->form,
'formType' => $this->form->getAttribute('type', 'edit'),
'fieldValue' => $this->value,
'fieldElement' => $this->element,
));
}
}
return '';
}
}
Title.php 0000644 00000002741 15235524365 0006354 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use JText;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('text');
/**
* Form Field class for the FOF framework
* Supports a title field with an optional slug display below it.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Title extends Text implements FieldInterface
{
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
// Initialise
$slug_field = isset($this->element['slug_field']) ? (string)$this->element['slug_field'] :
$this->item->getFieldAlias('slug');
$slug_format = $this->element['slug_format'] ? (string)$this->element['slug_format'] : '(%s)';
$slug_class = $this->element['slug_class'] ? (string)$this->element['slug_class'] : 'small';
$slug_separator = isset($this->element['slug_separator']) ? (string)$this->element['slug_separator'] : '<br />';
// Get the regular display
$html = parent::getRepeatable();
$slug = $this->item->$slug_field;
$html .= $slug_separator . '<span class="' . $slug_class . '">';
$html .= JText::sprintf($slug_format, $slug);
$html .= '</span>';
return $html;
}
}
AccessLevel.php 0000644 00000010015 15235524365 0007455 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use JHtml;
use JText;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('accesslevel');
/**
* Form Field class for FOF
* Joomla! access levels
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class AccessLevel extends \JFormFieldAccessLevel implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
/** @var array|null The select options coming from the access levels of the site */
static $defaultOptions = null;
$id = isset($fieldOptions['id']) ? 'id="' . $fieldOptions['id'] . '" ' : '';
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
$params = $this->getOptions();
if (is_null($defaultOptions))
{
$db = $this->form->getContainer()->platform->getDbo();
$query = $db->getQuery(true)
->select('a.id AS value, a.title AS text')
->from('#__viewlevels AS a')
->group('a.id, a.title, a.ordering')
->order('a.ordering ASC')
->order($db->qn('title') . ' ASC');
// Get the options.
$defaultOptions = $db->setQuery($query)->loadObjectList();
}
$options = $defaultOptions;
// If params is an array, push these options to the array
if (is_array($params))
{
$options = array_merge($params, $defaultOptions);
}
// If all levels is allowed, push it into the array.
elseif ($params)
{
array_unshift($options, JHtml::_('select.option', '', JText::_('JOPTION_ACCESS_SHOW_ALL_LEVELS')));
}
return '<span ' . ($id ? $id : '') . 'class="'. $class . '">' .
htmlspecialchars(GenericList::getOptionName($options, $this->value), ENT_COMPAT, 'UTF-8') .
'</span>';
}
}
Images.php 0000644 00000004724 15235524365 0006503 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use JHtml;
use JText;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('imagelist');
/**
* Form Field class for the FOF framework
* Images field.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Images extends ImageList
{
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? 'id="' . $fieldOptions['id'] . '" ' : '';
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
if (!is_array($this->value))
{
$this->value = (array) $this->value;
}
$html = '<span ' . ($id ? $id : '') . 'class="'. $class . '">';
foreach ($this->value as $image)
{
$imgattr = array();
$alt = null;
if ($class)
{
$imgattr['class'] = $class;
}
if ($this->element['style'])
{
$imgattr['style'] = (string) $this->element['style'];
}
if ($this->element['width'])
{
$imgattr['width'] = (string) $this->element['width'];
}
if ($this->element['height'])
{
$imgattr['height'] = (string) $this->element['height'];
}
if ($this->element['align'])
{
$imgattr['align'] = (string) $this->element['align'];
}
if ($this->element['rel'])
{
$imgattr['rel'] = (string) $this->element['rel'];
}
if ($this->element['alt'])
{
$alt = JText::_((string) $this->element['alt']);
}
if ($this->element['title'])
{
$imgattr['title'] = JText::_((string) $this->element['title']);
}
$path = (string) $this->element['directory'];
$path = trim($path, '/' . DIRECTORY_SEPARATOR);
$platform = $this->form->getContainer()->platform;
$baseDirs = $platform->getPlatformBaseDirs();
if ($image && file_exists($baseDirs['root'] . '/' . $path . '/' . $image))
{
$src = $platform->URIroot() . '/' . $path . '/' . $image;
$html .= JHtml::image($src, $alt, $imgattr);
}
else
{
// JHtml::image returns weird stuff when an empty path is provided, so let's be safe than sorry and return empty
$html .= '';
}
}
$html .= '</span>';
return $html;
}
}
Color.php 0000644 00000005056 15235524365 0006353 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
// no direct access
defined('_JEXEC') or die('Restricted access');
\JFormHelper::loadFieldClass('color');
/**
* Form Field class for the FOF framework
* Color field
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Color extends \JFormFieldColor implements FieldInterface
{
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* The item being rendered in a repeatable form field.
*
* @var DataModel
*/
public $item;
/**
* Repeatable field output.
*
* @var string
*/
protected $repeatable;
/**
* A monotonically increasing number, denoting the row number in a repeatable view.
*
* @var int
*/
public $rowid;
/**
* Static field output.
*
* @var string
*/
protected $static;
/**
* Method to get certain otherwise inaccessible properties from the form field
* object.
*
* @access public
* @param string $name The property name for which to the the value.
*
*
* @since 2.0
*
* @return mixed The property value or null.
*/
public function __get($name)
{
switch ($name)
{
case 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for a repeatable (grid) display, e.g.
* in a view listing many item (typically a "browse" task)
*
* @access public
*
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$class = $this->class ? $this->class : '';
$hexColor = '#' . ltrim($this->value, '#');
return '<div class="' . $this->id . ' ' . $class
. '" style="width:20px; height:20px; background-color:' . $hexColor . ';">' .
'</div>';
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @access public
*
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
// Return the joomla native control
return $this->getInput();
}
}
Rules.php 0000644 00000025530 15235524365 0006366 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use JHtml;
use JText;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('rules');
/**
* Form Field class for FOF
* Joomla! ACL Rules
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Rules extends \JFormFieldRules implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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)
{
// This field cannot provide a static display
case 'static':
return '';
break;
// This field cannot provide a repeateable display
case 'repeatable':
return '';
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
return '';
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.1
*
* @return string The field HTML
*/
public function getRepeatable()
{
return '';
}
/**
* At the timing of this writing (2013-12-03), the Joomla "rules" field is buggy. When you are
* dealing with a new record it gets the default permissions from the root asset node, which
* is fine for the default permissions of Joomla articles, but unsuitable for third party software.
* We had to copy & paste the whole code, since we can't "inject" the correct asset id if one is
* not found. Our fixes are surrounded by `FOF Library fix` remarks.
*
* @return string The input field's HTML for this field type
*/
protected function getInput()
{
JHtml::_('bootstrap.tooltip');
// Initialise some field attributes.
$section = $this->section;
$component = $this->component;
$assetField = $this->assetField;
// Get the actions for the asset.
$actions = \JAccess::getActions($component, $section);
// Iterate over the children and add to the actions.
/** @var \SimpleXMLElement $el */
foreach ($this->element->children() as $el)
{
if ($el->getName() == 'action')
{
$actions[] = (object) array('name' => (string) $el['name'], 'title' => (string) $el['title'],
'description' => (string) $el['description']);
}
}
// Get the explicit rules for this asset.
if ($section == 'component')
{
// Need to find the asset id by the name of the component.
$db = $this->form->getContainer()->platform->getDbo();
$query = $db->getQuery(true)
->select($db->quoteName('id'))
->from($db->quoteName('#__assets'))
->where($db->quoteName('name') . ' = ' . $db->quote($component));
$assetId = (int) $db->setQuery($query)->loadResult();
}
else
{
// Find the asset id of the content.
// Note that for global configuration, com_config injects asset_id = 1 into the form.
$assetId = $this->form->getValue($assetField);
// ==== FOF Library fix - Start ====
// If there is no assetId (let's say we are dealing with a new record), let's ask the table
// to give it to us. Here you should implement your logic (ie getting default permissions from
// the component or from the category)
if(!$assetId)
{
$table = $this->form->getModel();
$assetId = $table->getAssetParentId();
}
// ==== FOF Library fix - End ====
}
// Full width format.
// Get the rules for just this asset (non-recursive).
$assetRules = \JAccess::getAssetRules($assetId);
// Get the available user groups.
$groups = $this->getUserGroups();
// Prepare output
$html = array();
// Description
$html[] = '<p class="rule-desc">' . JText::_('JLIB_RULES_SETTINGS_DESC') . '</p>';
// Begin tabs
$html[] = '<div id="permissions-sliders" class="tabbable tabs-left">';
// Building tab nav
$html[] = '<ul class="nav nav-tabs">';
foreach ($groups as $group)
{
// Initial Active Tab
$active = "";
if ($group->value == 1)
{
$active = "active";
}
$html[] = '<li class="' . $active . '">';
$html[] = '<a href="#permission-' . $group->value . '" data-toggle="tab">';
$html[] = str_repeat('<span class="level">–</span> ', $curLevel = $group->level) . $group->text;
$html[] = '</a>';
$html[] = '</li>';
}
$html[] = '</ul>';
$html[] = '<div class="tab-content">';
// Start a row for each user group.
foreach ($groups as $group)
{
// Initial Active Pane
$active = "";
if ($group->value == 1)
{
$active = " active";
}
$html[] = '<div class="tab-pane' . $active . '" id="permission-' . $group->value . '">';
$html[] = '<table class="table table-striped">';
$html[] = '<thead>';
$html[] = '<tr>';
$html[] = '<th class="actions" id="actions-th' . $group->value . '">';
$html[] = '<span class="acl-action">' . JText::_('JLIB_RULES_ACTION') . '</span>';
$html[] = '</th>';
$html[] = '<th class="settings" id="settings-th' . $group->value . '">';
$html[] = '<span class="acl-action">' . JText::_('JLIB_RULES_SELECT_SETTING') . '</span>';
$html[] = '</th>';
// The calculated setting is not shown for the root group of global configuration.
$canCalculateSettings = ($group->parent_id || !empty($component));
if ($canCalculateSettings)
{
$html[] = '<th id="aclactionth' . $group->value . '">';
$html[] = '<span class="acl-action">' . JText::_('JLIB_RULES_CALCULATED_SETTING') . '</span>';
$html[] = '</th>';
}
$html[] = '</tr>';
$html[] = '</thead>';
$html[] = '<tbody>';
foreach ($actions as $action)
{
$html[] = '<tr>';
$html[] = '<td headers="actions-th' . $group->value . '">';
$html[] = '<label for="' . $this->id . '_' . $action->name . '_' . $group->value . '" class="hasTooltip" title="'
. htmlspecialchars(JText::_($action->title) . ' ' . JText::_($action->description), ENT_COMPAT, 'UTF-8') . '">';
$html[] = JText::_($action->title);
$html[] = '</label>';
$html[] = '</td>';
$html[] = '<td headers="settings-th' . $group->value . '">';
$html[] = '<select class="input-small" name="' . $this->name . '[' . $action->name . '][' . $group->value . ']" id="' . $this->id . '_' . $action->name
. '_' . $group->value . '" title="'
. JText::sprintf('JLIB_RULES_SELECT_ALLOW_DENY_GROUP', JText::_($action->title), trim($group->text)) . '">';
$inheritedRule = \JAccess::checkGroup($group->value, $action->name, $assetId);
// Get the actual setting for the action for this group.
$assetRule = $assetRules->allow($action->name, $group->value);
// Build the dropdowns for the permissions sliders
// The parent group has "Not Set", all children can rightly "Inherit" from that.
$html[] = '<option value=""' . ($assetRule === null ? ' selected="selected"' : '') . '>'
. JText::_(empty($group->parent_id) && empty($component) ? 'JLIB_RULES_NOT_SET' : 'JLIB_RULES_INHERITED') . '</option>';
$html[] = '<option value="1"' . ($assetRule === true ? ' selected="selected"' : '') . '>' . JText::_('JLIB_RULES_ALLOWED')
. '</option>';
$html[] = '<option value="0"' . ($assetRule === false ? ' selected="selected"' : '') . '>' . JText::_('JLIB_RULES_DENIED')
. '</option>';
$html[] = '</select>  ';
// If this asset's rule is allowed, but the inherited rule is deny, we have a conflict.
if (($assetRule === true) && ($inheritedRule === false))
{
$html[] = JText::_('JLIB_RULES_CONFLICT');
}
$html[] = '</td>';
// Build the Calculated Settings column.
// The inherited settings column is not displayed for the root group in global configuration.
if ($canCalculateSettings)
{
$html[] = '<td headers="aclactionth' . $group->value . '">';
// This is where we show the current effective settings considering currrent group, path and cascade.
// Check whether this is a component or global. Change the text slightly.
if (\JAccess::checkGroup($group->value, 'core.admin', $assetId) !== true)
{
if ($inheritedRule === null)
{
$html[] = '<span class="label label-important">' . JText::_('JLIB_RULES_NOT_ALLOWED') . '</span>';
}
elseif ($inheritedRule === true)
{
$html[] = '<span class="label label-success">' . JText::_('JLIB_RULES_ALLOWED') . '</span>';
}
elseif ($inheritedRule === false)
{
if ($assetRule === false)
{
$html[] = '<span class="label label-important">' . JText::_('JLIB_RULES_NOT_ALLOWED') . '</span>';
}
else
{
$html[] = '<span class="label"><i class="icon-lock icon-white"></i> ' . JText::_('JLIB_RULES_NOT_ALLOWED_LOCKED')
. '</span>';
}
}
}
elseif (!empty($component))
{
$html[] = '<span class="label label-success"><i class="icon-lock icon-white"></i> ' . JText::_('JLIB_RULES_ALLOWED_ADMIN')
. '</span>';
}
else
{
// Special handling for groups that have global admin because they can't be denied.
// The admin rights can be changed.
if ($action->name === 'core.admin')
{
$html[] = '<span class="label label-success">' . JText::_('JLIB_RULES_ALLOWED') . '</span>';
}
elseif ($inheritedRule === false)
{
// Other actions cannot be changed.
$html[] = '<span class="label label-important"><i class="icon-lock icon-white"></i> '
. JText::_('JLIB_RULES_NOT_ALLOWED_ADMIN_CONFLICT') . '</span>';
}
else
{
$html[] = '<span class="label label-success"><i class="icon-lock icon-white"></i> ' . JText::_('JLIB_RULES_ALLOWED_ADMIN')
. '</span>';
}
}
$html[] = '</td>';
}
$html[] = '</tr>';
}
$html[] = '</tbody>';
$html[] = '</table></div>';
}
$html[] = '</div></div>';
$html[] = '<div class="alert">';
if ($section == 'component' || $section == null)
{
$html[] = JText::_('JLIB_RULES_SETTING_NOTES');
}
else
{
$html[] = JText::_('JLIB_RULES_SETTING_NOTES_ITEM');
}
$html[] = '</div>';
return implode("\n", $html);
}
}
Relation.php 0000644 00000012315 15235524365 0007046 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Model\DataModel;
use JHtml;
use JText;
defined('_JEXEC') or die;
/**
* Form Field class for FOF
* Relation list
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Relation extends GenericList
{
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic() {
return $this->getRepeatable();
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
$class = $this->class ? $this->class : $this->id;
$relationclass = $this->element['relationclass'] ? (string) $this->element['relationclass'] : '';
$value_field = $this->element['value_field'] ? (string) $this->element['value_field'] : 'title';
$translate = $this->element['translate'] ? (string) $this->element['translate'] : false;
$link_url = $this->element['url'] ? (string) $this->element['url'] : false;
if (!($link_url && $this->item instanceof DataModel))
{
$link_url = false;
}
if ($this->element['empty_replacement'])
{
$empty_replacement = (string) $this->element['empty_replacement'];
}
$relationName = $this->form->getModel()->getContainer()->inflector->pluralize($this->name);
$relations = $this->item->getRelations()->getData($relationName);
$rels = array();
foreach ($relations as $relation) {
$html = '<span class="' . $relationclass . '">';
if ($link_url)
{
$keyfield = $relation->getKeyName();
$this->_relationId = $relation->$keyfield;
$url = $this->parseFieldTags($link_url);
$html .= '<a href="' . $url . '">';
}
if (!isset($this->valueField))
{
$this->valueField = $relation->getFieldAlias($value_field);
}
$value = $relation->{$this->valueField};
// Get the (optionally formatted) value
if (!empty($empty_replacement) && empty($value))
{
$value = JText::_($empty_replacement);
}
if ($translate == true)
{
$html .= JText::_($value);
}
else
{
$html .= $value;
}
if ($link_url)
{
$html .= '</a>';
}
$html .= '</span>';
$rels[] = $html;
}
$html = '<span class="' . $class . '">';
$html .= implode(', ', $rels);
$html .= '</span>';
return $html;
}
/**
* Method to get the field options.
*
* @return array The field option objects.
*/
protected function getOptions()
{
$options = array();
$this->value = array();
$value_field = $this->element['value_field'] ? (string) $this->element['value_field'] : 'title';
$name = (string) $this->element['name'];
$class = $this->element['model'] ? (string) $this->element['model'] : $name;
$view = $this->form->getView()->getName();
$relation = $this->form->getModel()->getContainer()->inflector->pluralize($class);
/** @var DataModel $model */
$model = $this->form->getContainer()->factory->model($relation)->setIgnoreRequest(true)->savestate(false);
$key = $model->getIdFieldName();
$value = $model->getFieldAlias($value_field);
foreach ($model->get(true) as $option)
{
$options[] = JHtml::_('select.option', $option->$key, $option->$value);
}
if ($id = $this->form->getModel()->getId())
{
$model = $this->form->getModel();
$relations = $model->$name;
foreach ($relations as $item)
{
$this->value[] = $item->getId();
}
}
return $options;
}
/**
* Replace string with tags that reference fields
*
* @param string $text Text to process
*
* @return string Text with tags replace
*/
protected function parseFieldTags($text)
{
$ret = $text;
// Replace [ITEM:ID] in the URL with the item's key value (usually:
// the auto-incrementing numeric ID)
if (is_null($this->item))
{
$this->item = $this->form->getModel();
}
$replace = $this->item->getId();
$ret = str_replace('[ITEM:ID]', $replace, $ret);
// Replace the [ITEMID] in the URL with the current Itemid parameter
$ret = str_replace('[ITEMID]', $this->form->getContainer()->input->getInt('Itemid', 0), $ret);
// Replace the [TOKEN] in the URL with the Joomla! form token
$ret = str_replace('[TOKEN]', \JFactory::getSession()->getFormToken(), $ret);
// Replace the [RELATION:ID] in the URL with the relation's key value
$ret = str_replace('[RELATION:ID]', $this->_relationId, $ret);
// Replace other field variables in the URL
$data = $this->item->getData();
foreach ($data as $field => $value)
{
// Skip non-processable values
if(is_array($value) || is_object($value))
{
continue;
}
$search = '[ITEM:' . strtoupper($field) . ']';
$ret = str_replace($search, $value, $ret);
}
return $ret;
}
}
Number.php 0000644 00000006670 15235524365 0006530 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('number');
/**
* Form Field class for the FOF framework
* Supports a numeric field and currency symbols.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Number extends \JFormFieldNumber implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
return $this->getRepeatable();
}
/**
* Print out the number as requested by the attributes
*/
public function getRepeatable()
{
$currencyPos = $this->getAttribute('currency_position', false);
$currencySymbol = $this->getAttribute('currency_symbol', false);
// Initialise
$class = $this->id;
// Get field parameters
if ($this->element['class'])
{
$class = (string) $this->element['class'];
}
// Start the HTML output
$html = '<span class="' . $class . '">';
// Prepend currency?
if ($currencyPos == 'before' && $currencySymbol)
{
$html .= $currencySymbol;
}
$number = $this->value;
// Should we format the number too?
$formatNumber = false;
if (isset($this->element['format_number']))
{
$formatNumberValue = (string)$this->element['format_number'];
$formatNumber = in_array(strtolower($formatNumberValue), array('yes', 'true', 'on', 1));
}
// Format the number correctly
if ($formatNumber)
{
$numDecimals = $this->getAttribute('decimals', 2);
$minNumDecimals = $this->getAttribute('min_decimals', 2);
$decimalsSep = $this->getAttribute('decimals_separator', '.');
$thousandSep = $this->getAttribute('thousand_separator', ',');
// Format the number
$number = number_format((float)$this->value, $numDecimals, $decimalsSep, $thousandSep);
}
// Put it all together
$html .= $number;
// Append currency?
if ($currencyPos == 'after' && $currencySymbol)
{
$html .= $currencySymbol;
}
// End the HTML output
$html .= '</span>';
return $html;
}
}
CacheHandler.php 0000644 00000006050 15235524365 0007571 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('cachehandler');
/**
* Form Field class for FOF
* Joomla! cache handlers
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class CacheHandler extends \JFormFieldCacheHandler implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? 'id="' . $fieldOptions['id'] . '" ' : '';
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
return '<span ' . ($id ? $id : '') . 'class="'. $class . '">' .
htmlspecialchars(GenericList::getOptionName($this->getOptions(), $this->value), ENT_COMPAT, 'UTF-8') .
'</span>';
}
}
User.php 0000644 00000020330 15235524365 0006203 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('user');
/**
* Form Field class for the FOF framework
* A user selection box / display field
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class User extends \JFormFieldUser implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
// Initialise
$show_username = !$this->element['show_username'] == 'false';
$show_email = $this->element['show_email'] == 'true';
$show_name = $this->element['show_name'] == 'true';
$show_id = $this->element['show_id'] == 'true';
$class = $this->class ? ' class="' . $this->class . '"' : '';
// Get the user record
$user = $this->form->getContainer()->platform->getUser($this->value);
// Render the HTML
$html = '<div id="' . $this->id . '" ' . $class . '>';
if ($show_username)
{
$html .= '<span class="fof-userfield-username">' . $user->username . '</span>';
}
if ($show_id)
{
$html .= '<span class="fof-userfield-id">' . $user->id . '</span>';
}
if ($show_name)
{
$html .= '<span class="fof-userfield-name">' . $user->name . '</span>';
}
if ($show_email)
{
$html .= '<span class="fof-userfield-email">' . $user->email . '</span>';
}
$html .= '</div>';
return $html;
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
static $userCache = array();
if (isset($this->element['legacy']))
{
return $this->getInput();
}
// Initialise
$show_username = !$this->element['show_username'] == 'false';
$show_email = !$this->element['show_email'] == 'false';
$show_name = !$this->element['show_name'] == 'false';
$show_id = !$this->element['show_id'] == 'false';
$show_avatar = !$this->element['show_avatar'] == 'false';
$show_link = $this->element['show_link'] == 'true';
$link_url = $this->element['link_url'] ? $this->element['link_url'] : null;
$avatar_method = 'gravatar';
$avatar_size = $this->element['avatar_size'] ? $this->element['avatar_size'] : 64;
$class = '';
// Get the user record
$key = is_numeric($this->value) ? $this->value : 'empty';
$key = ($key == 0) ? 'zero' : $key;
if (!array_key_exists($key, $userCache))
{
$userCache[$key] = $this->form->getContainer()->platform->getUser($this->value);
}
$user = $userCache[$key];
// Get the field parameters
if ($this->class)
{
$class = ' class="' . $this->class . '"';
}
if ($this->element['avatar_method'])
{
$avatar_method = strtolower($this->element['avatar_method']);
}
if (!$link_url && $this->form->getContainer()->platform->isBackend())
{
$link_url = 'index.php?option=com_users&task=user.edit&id=[USER:ID]';
}
elseif (!$link_url)
{
// If no link is defined in the front-end, we can't create a
// default link. Therefore, show no link.
$show_link = false;
}
// Post-process the link URL
if ($show_link)
{
$replacements = array(
'[USER:ID]' => $user->id,
'[USER:USERNAME]' => $user->username,
'[USER:EMAIL]' => $user->email,
'[USER:NAME]' => $user->name,
);
foreach ($replacements as $key => $value)
{
$link_url = str_replace($key, $value, $link_url);
}
$link_url = $this->parseFieldTags($link_url);
}
// Get the avatar image, if necessary
$avatar_url = '';
if ($show_avatar)
{
if ($avatar_method == 'plugin')
{
// Use the user plugins to get an avatar
$this->form->getContainer()->platform->importPlugin('user');
$jResponse = $this->form->getContainer()->platform->runPlugins('onUserAvatar', array($user, $avatar_size));
if (!empty($jResponse))
{
foreach ($jResponse as $response)
{
if ($response)
{
$avatar_url = $response;
}
}
}
if (empty($avatar_url))
{
$show_avatar = false;
}
}
else
{
// Fall back to the Gravatar method
$md5 = md5($user->email);
if ($this->form->getContainer()->platform->isCli())
{
$scheme = 'http';
}
else
{
$scheme = \JUri::getInstance()->getScheme();
}
if ($scheme == 'http')
{
$avatar_url = 'http://www.gravatar.com/avatar/' . $md5 . '.jpg?s='
. $avatar_size . '&d=mm';
}
else
{
$avatar_url = 'https://secure.gravatar.com/avatar/' . $md5 . '.jpg?s='
. $avatar_size . '&d=mm';
}
}
}
// Generate the HTML
$html = '<div id="' . $this->id . '" ' . $class . '>';
if ($show_avatar)
{
$html .= '<img src="' . $avatar_url . '" align="left" class="fof-usersfield-avatar" />';
}
if ($show_link)
{
$html .= '<a href="' . $link_url . '">';
}
if ($show_username)
{
$html .= '<span class="fof-usersfield-username">' . $user->username
. '</span>';
}
if ($show_id)
{
$html .= '<span class="fof-usersfield-id">' . $user->id
. '</span>';
}
if ($show_name)
{
$html .= '<span class="fof-usersfield-name">' . $user->name
. '</span>';
}
if ($show_email)
{
$html .= '<span class="fof-usersfield-email">' . $user->email
. '</span>';
}
if ($show_link)
{
$html .= '</a>';
}
$html .= '</div>';
return $html;
}
/**
* Replace string with tags that reference fields
*
* @param string $text Text to process
*
* @return string Text with tags replace
*/
protected function parseFieldTags($text)
{
$ret = $text;
// Replace [ITEM:ID] in the URL with the item's key value (usually:
// the auto-incrementing numeric ID)
if (is_null($this->item))
{
$this->item = $this->form->getModel();
}
$replace = $this->item->getId();
$ret = str_replace('[ITEM:ID]', $replace, $ret);
// Replace the [ITEMID] in the URL with the current Itemid parameter
$ret = str_replace('[ITEMID]', $this->form->getContainer()->input->getInt('Itemid', 0), $ret);
// Replace the [TOKEN] in the URL with the Joomla! form token
$ret = str_replace('[TOKEN]', \JFactory::getSession()->getFormToken(), $ret);
// Replace other field variables in the URL
$data = $this->item->getData();
foreach ($data as $field => $value)
{
// Skip non-processable values
if(is_array($value) || is_object($value))
{
continue;
}
$search = '[ITEM:' . strtoupper($field) . ']';
$ret = str_replace($search, $value, $ret);
}
return $ret;
}
}
Calendar.php 0000644 00000017641 15235524365 0007011 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Date\Date;
use FOF30\Date\DateDecorator;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use JHtml;
use JText;
use SimpleXMLElement;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('calendar');
/**
* Form Field class for the FOF framework
* Supports a calendar / date field.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Calendar extends \JFormFieldCalendar implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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)
{
// ATTENTION: Redirected getInput() to getStatic()
case 'input':
case 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
return $this->getCalendar('static');
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
return $this->getCalendar('repeatable');
}
/**
* Overridden to enable time display by default in the FOF Calendar field. This is required for backwards
* compatibility: all previous Joomla! version would display the time and/or let you specify a time in the Calendar
* field. Joomla! 3.7 broke this, stripping away the time by default.
*
* @param SimpleXMLElement $element
* @param mixed $value
* @param null $group
*
* @return bool
*/
public function setup(SimpleXMLElement $element, $value, $group = null)
{
$ret = parent::setup($element, $value, $group);
// Show time by default in the FOF Calendar field
$showTimeValue = (string) $this->element['showtime'];
if (empty($showTimeValue))
{
$this->showtime = true;
}
return $ret;
}
/**
* Method to get the calendar input markup.
*
* @param string $display The display to render ('static' or 'repeatable')
*
* @return string The field input markup.
*
* @since 2.1.rc4
*/
protected function getCalendar($display)
{
// Initialize some field attributes.
$format = $this->format ? $this->format : '%Y-%m-%d';
$class = $this->class ? $this->class : '';
$default = $this->element['default'] ? (string) $this->element['default'] : '';
// Get some system objects.
$config = $this->form->getContainer()->platform->getConfig();
$user = $this->form->getContainer()->platform->getUser();
// Check for empty date values
if (empty($this->value) || $this->value == $this->form->getContainer()->platform->getDbo()->getNullDate() || $this->value == '0000-00-00')
{
$this->value = $default;
}
// Handle the special case for "now".
if (strtoupper($this->value) == 'NOW')
{
$this->value = strftime($format);
}
// If a known filter is given use it.
switch (strtoupper($this->filter))
{
case 'SERVER_UTC':
// Convert a date to UTC based on the server timezone.
if ((int) $this->value)
{
// Get a date object based on the correct timezone.
$coreObject = \JFactory::getDate($this->value, 'UTC');
$date = new DateDecorator($coreObject);
$date->setTimezone(new \DateTimeZone($config->get('offset')));
// Transform the date string.
$this->value = $date->format('Y-m-d H:i:s', true, false);
}
break;
case 'USER_UTC':
// Convert a date to UTC based on the user timezone.
if ((int) $this->value)
{
// Get a date object based on the correct timezone.
$coreObject = \JFactory::getDate($this->value, 'UTC');
$date = new DateDecorator($coreObject);
$date->setTimezone(new \DateTimeZone($user->getParam('timezone', $config->get('offset'))));
// Transform the date string.
$this->value = $date->format('Y-m-d H:i:s', true, false);
}
break;
}
if ($display == 'static')
{
// Build the attributes array.
$attributes = array();
if ($this->placeholder)
{
$attributes['placeholder'] = $this->placeholder;
}
if ($this->class)
{
$attributes['class'] = $this->class;
}
if ($this->size)
{
$attributes['size'] = $this->size;
}
if ($this->maxlength)
{
$attributes['maxlength'] = $this->maxlength;
}
if ($this->class)
{
$attributes['class'] = $this->class;
}
if ($this->readonly)
{
$attributes['readonly'] = 'readonly';
}
if ($this->disabled)
{
$attributes['disabled'] = 'disabled';
}
if ($this->onchange)
{
$attributes['onChange'] = $this->onchange;
}
if ($this->autocomplete)
{
$attributes['autocomplete'] = $this->autocomplete;
}
if ($this->autofocus)
{
$attributes['autofocus'] = $this->autofocus;
}
if ($this->filter)
{
$attributes['filter'] = $this->filter;
}
if ($this->today)
{
$attributes['todayBtn'] = $this->today;
}
if ($this->weeknumbers)
{
$attributes['weekNumbers'] = $this->weeknumbers;
}
if ($this->showtime)
{
$attributes['showTime'] = in_array(strtolower($this->showtime), ['true', '1', 'on', 'yes']);
}
elseif ($this->time)
{
$attributes['showTime'] = in_array(strtolower($this->time), ['true', '1', 'on', 'yes']);
}
if ($this->filltable)
{
$attributes['fillTable'] = in_array(strtolower($this->filltable), ['true', '1', 'on', 'yes']);
}
if ($this->timeformat)
{
$attributes['timeFormat'] = $this->timeformat;
}
if ($this->singleheader)
{
$attributes['singleHeader'] = in_array(strtolower($this->singleheader), ['true', '1', 'on', 'yes']);
}
if ($this->required)
{
$attributes['required'] = 'required';
$attributes['aria-required'] = 'true';
}
// Including fallback code for HTML5 non supported browsers.
JHtml::_('jquery.framework');
JHtml::_('script', 'system/html5fallback.js', false, true);
if (($format == '%Y-%m-%d') && isset($attributes['showTime']))
{
if ($attributes['showTime'])
{
$format = JText::_('DATE_FORMAT_CALENDAR_DATETIME');
}
else
{
$format = JText::_('DATE_FORMAT_CALENDAR_DATE');
}
}
return JHtml::_('calendar', $this->value, $this->name, $this->id, $format, $attributes);
}
else
{
if (!$this->value
&& (string) $this->element['empty_replacement'])
{
$replacement_key = (string) $this->element['empty_replacement'];
$value = \JText::_($replacement_key);
}
else
{
$date = new Date($this->value);
$value = strftime($format, $date->getTimestamp());
}
return '<span class="' . $this->id . ' ' . $class . '">' .
htmlspecialchars($value, ENT_COMPAT, 'UTF-8') .
'</span>';
}
}
}
GenericList.php 0000644 00000025030 15235524365 0007477 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use FOF30\Utils\StringHelper;
use JHtml;
use Joomla\Utilities\ArrayHelper;
use JText;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('list');
/**
* Form Field class for FOF
* Supports a generic list of options.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class GenericList extends \JFormFieldList implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$class = $this->class ? ' class="' . $this->class . '"' : '';
return '<span id="' . $this->id . '" ' . $class . '>' .
htmlspecialchars(self::getOptionName($this->getOptions(), $this->value), ENT_COMPAT, 'UTF-8') .
'</span>';
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$class = $this->class ? $this->class : '';
$link_url = $this->element['url'];
if ($link_url && ($this->item instanceof DataModel))
{
$link_url = $this->parseFieldTags($link_url);
}
else
{
$link_url = false;
}
$html = '<span class="' . $this->id . ' ' . $class . '">';
if ($link_url)
{
$html .= '<a href="' . $link_url . '">';
}
$html .= htmlspecialchars(self::getOptionName($this->getOptions(), $this->value), ENT_COMPAT, 'UTF-8');
if ($link_url)
{
$html .= '</a>';
}
$html .= '</span>';
return $html;
}
/**
* Gets the active option's label given an array of JHtml options
*
* @param array $data The JHtml options to parse
* @param mixed $selected The currently selected value
* @param string $optKey Key name
* @param string $optText Value name
* @param bool $selectFirst Should I automatically select the first option?
*
* @return mixed The label of the currently selected option
*/
public static function getOptionName($data, $selected = null, $optKey = 'value', $optText = 'text', $selectFirst = true)
{
$ret = null;
foreach ($data as $elementKey => &$element)
{
if (is_array($element))
{
$key = $optKey === null ? $elementKey : $element[$optKey];
$text = $element[$optText];
}
elseif (is_object($element))
{
$key = $optKey === null ? $elementKey : $element->$optKey;
$text = $element->$optText;
}
else
{
// This is a simple associative array
$key = $elementKey;
$text = $element;
}
if (is_null($ret) && $selectFirst)
{
$ret = $text;
}
elseif ($selected == $key)
{
$ret = $text;
}
}
return $ret;
}
/**
* Method to get the field options.
*
* Ordering is disabled by default. You can enable ordering by setting the
* 'order' element in your form field. The other order values are optional.
*
* - order What to order. Possible values: 'name' or 'value' (default = false)
* - order_dir Order direction. Possible values: 'asc' = Ascending or 'desc' = Descending (default = 'asc')
* - order_case_sensitive Order case sensitive. Possible values: 'true' or 'false' (default = false)
*
* @return array The field option objects.
*
* @since Ordering is available since FOF 2.1.b2.
*/
protected function getOptions()
{
// Ordering is disabled by default for backward compatibility
$order = false;
// Set default order direction
$order_dir = 'asc';
// Set default value for case sensitive sorting
$order_case_sensitive = false;
if ($this->element['order'] && $this->element['order'] !== 'false')
{
$order = $this->element['order'];
}
if ($this->element['order_dir'])
{
$order_dir = $this->element['order_dir'];
}
if ($this->element['order_case_sensitive'])
{
// Override default setting when the form element value is 'true'
if ($this->element['order_case_sensitive'] == 'true')
{
$order_case_sensitive = true;
}
}
// Create a $sortOptions array in order to apply sorting
$i = 0;
$sortOptions = array();
foreach ($this->element->children() as $option)
{
$name = JText::alt(trim((string) $option), preg_replace('/[^a-zA-Z0-9_\-]/', '_', $this->fieldname));
$sortOptions[$i] = new \stdClass;
$sortOptions[$i]->option = $option;
$sortOptions[$i]->value = $option['value'];
$sortOptions[$i]->name = $name;
$i++;
}
// Only order if it's set
if ($order)
{
jimport('joomla.utilities.arrayhelper');
if (class_exists('JArrayHelper'))
{
\JArrayHelper::sortObjects($sortOptions, $order, $order_dir == 'asc' ? 1 : -1, $order_case_sensitive, false);
}
else
{
ArrayHelper::sortObjects($sortOptions, $order, $order_dir == 'asc' ? 1 : -1, $order_case_sensitive, false);
}
}
// Initialise the options
$options = array();
// Get the field $options
foreach ($sortOptions as $sortOption)
{
/** @var \SimpleXMLElement $option */
$option = $sortOption->option;
$name = $sortOption->name;
// Only add <option /> elements.
if ($option->getName() != 'option')
{
continue;
}
$tmp = JHtml::_('select.option', (string) $option['value'], $name, 'value', 'text', ((string) $option['disabled'] == 'true'));
// Set some option attributes.
$tmp->class = (string) $option['class'];
// Set some JavaScript option attributes.
$tmp->onclick = (string) $option['onclick'];
// Add the option object to the result set.
$options[] = $tmp;
}
// Do we have a class and method source for our options?
$source_file = empty($this->element['source_file']) ? '' : (string) $this->element['source_file'];
$source_class = empty($this->element['source_class']) ? '' : (string) $this->element['source_class'];
$source_method = empty($this->element['source_method']) ? '' : (string) $this->element['source_method'];
$source_key = empty($this->element['source_key']) ? '*' : (string) $this->element['source_key'];
$source_value = empty($this->element['source_value']) ? '*' : (string) $this->element['source_value'];
$source_translate = is_null($this->element['source_translate']) ? 'true' : (string) $this->element['source_translate'];
$source_translate = StringHelper::toBool($source_translate) ? true : false;
$source_format = empty($this->element['source_format']) ? '' : (string) $this->element['source_format'];
if ($source_class && $source_method)
{
// Maybe we have to load a file?
if (!empty($source_file))
{
$source_file = $this->form->getContainer()->template->parsePath($source_file, true);
if ($this->form->getContainer()->filesystem->fileExists($source_file))
{
include_once $source_file;
}
}
// Make sure the class exists
if (class_exists($source_class, true))
{
// ...and so does the option
if (in_array($source_method, get_class_methods($source_class)))
{
// Get the data from the class
if ($source_format == 'optionsobject')
{
$options = array_merge($options, $source_class::$source_method());
}
else
{
// Get the data from the class
$source_data = $source_class::$source_method();
// Loop through the data and prime the $options array
foreach ($source_data as $k => $v)
{
$key = (empty($source_key) || ($source_key == '*')) ? $k : @$v[$source_key];
$value = (empty($source_value) || ($source_value == '*')) ? $v : @$v[$source_value];
if ($source_translate)
{
$value = JText::_($value);
}
$options[] = JHtml::_('select.option', $key, $value, 'value', 'text');
}
}
}
}
}
reset($options);
return $options;
}
/**
* Replace string with tags that reference fields
*
* @param string $text Text to process
*
* @return string Text with tags replace
*/
protected function parseFieldTags($text)
{
$ret = $text;
// Replace [ITEM:ID] in the URL with the item's key value (usually:
// the auto-incrementing numeric ID)
if (is_null($this->item))
{
$this->item = $this->form->getModel();
}
$replace = $this->item->getId();
$ret = str_replace('[ITEM:ID]', $replace, $ret);
// Replace the [ITEMID] in the URL with the current Itemid parameter
$ret = str_replace('[ITEMID]', $this->form->getContainer()->input->getInt('Itemid', 0), $ret);
// Replace the [TOKEN] in the URL with the Joomla! form token
$ret = str_replace('[TOKEN]', \JFactory::getSession()->getFormToken(), $ret);
// Replace other field variables in the URL
$data = $this->item->getData();
foreach ($data as $field => $value)
{
// Skip non-processable values
if(is_array($value) || is_object($value))
{
continue;
}
$search = '[ITEM:' . strtoupper($field) . ']';
$ret = str_replace($search, $value, $ret);
}
return $ret;
}
}
Image.php 0000644 00000000660 15235524365 0006313 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
defined('_JEXEC') or die;
/**
* Form Field class for the FOF framework
* Media selection field. This is an alias of the "media" field type.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Image extends Media
{
}
Components.php 0000644 00000014672 15235524365 0007426 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
use JText;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('list');
/**
* Form Field class for FOF
* Components installed on the site
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Components extends \JFormFieldList implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* Override for the list of client IDs. Comma separated list, e.g. "0,1"
*
* @var string
*/
public $client_ids = null;
/**
* 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.1
*/
public function __get($name)
{
switch ($name)
{
case 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.1
*
* @return string The field HTML
*/
public function getStatic()
{
$options = array(
'id' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.1
*
* @return string The field HTML
*/
public function getRepeatable()
{
$options = array(
'class' => $this->id
);
return $this->getFieldContents($options);
}
/**
* Method to get the field input markup.
*
* @param array $fieldOptions Options to be passed into the field
*
* @return string The field HTML
*/
public function getFieldContents(array $fieldOptions = array())
{
$id = isset($fieldOptions['id']) ? 'id="' . $fieldOptions['id'] . '" ' : '';
$class = $this->class . (isset($fieldOptions['class']) ? ' ' . $fieldOptions['class'] : '');
return '<span ' . ($id ? $id : '') . 'class="' . $class . '">' .
htmlspecialchars(GenericList::getOptionName($this->getOptions(), $this->value), ENT_COMPAT, 'UTF-8') .
'</span>';
}
/**
* Get a list of all installed components and also translates them.
*
* The manifest_cache is used to get the extension names, since JInstaller is also
* translating those names in stead of the name column. Else some of the translations
* fails.
*
* @since 2.1
*
* @return array An array of JHtml options.
*/
protected function getOptions()
{
$db = $this->form->getContainer()->platform->getDbo();
// Check for client_ids override
if ($this->client_ids !== null)
{
$client_ids = $this->client_ids;
}
else
{
$client_ids = $this->element['client_ids'];
}
$client_ids = explode(',', $client_ids);
// Calculate client_ids where clause
foreach ($client_ids as &$client_id)
{
$client_id = (int) trim($client_id);
$client_id = $db->q($client_id);
}
$query = $db->getQuery(true)
->select(
array(
$db->qn('name'),
$db->qn('element'),
$db->qn('client_id'),
$db->qn('manifest_cache'),
)
)
->from($db->qn('#__extensions'))
->where($db->qn('type') . ' = ' . $db->q('component'))
->where($db->qn('client_id') . ' IN (' . implode(',', $client_ids) . ')');
$components = $db->setQuery($query)->loadObjectList('element');
// Convert to array of objects, so we can use sortObjects()
// Also translate component names with JText::_()
$aComponents = array();
$user = $this->form->getContainer()->platform->getUser();
foreach ($components as $component)
{
// Don't show components in the list where the user doesn't have access for
// TODO: perhaps add an option for this
if (!$user->authorise('core.manage', $component->element))
{
continue;
}
$oData = (object) array(
'value' => $component->element,
'text' => $this->translate($component, 'component')
);
$aComponents[$component->element] = $oData;
}
// Reorder the components array, because the alphabetical
// ordering changed due to the JText::_() translation
uasort(
$aComponents,
function ($a, $b) {
return strcasecmp($a->text, $b->text);
}
);
return $aComponents;
}
/**
* Translate a list of objects with JText::_().
*
* @param \stdClass $item The component object
* @param string $type The extension type (e.g. component)
*
* @since 2.1
*
* @return string $text The translated name of the extension
*
* @see administrator/com_installer/models/extension.php
*/
public function translate($item, $type)
{
$platform = $this->form->getContainer()->platform;
// Map the manifest cache to $item. This is needed to get the name from the
// manifest_cache and NOT from the name column, else some JText::_() translations fails.
$mData = json_decode($item->manifest_cache);
if ($mData)
{
foreach ($mData as $key => $value)
{
if ($key == 'type')
{
// Ignore the type field
continue;
}
$item->$key = $value;
}
}
$lang = $platform->getLanguage();
switch ($type)
{
case 'component':
$source = JPATH_ADMINISTRATOR . '/components/' . $item->element;
$lang->load("$item->element.sys", JPATH_ADMINISTRATOR, null, false, false)
|| $lang->load("$item->element.sys", $source, null, false, false)
|| $lang->load("$item->element.sys", JPATH_ADMINISTRATOR, $lang->getDefault(), false, false)
|| $lang->load("$item->element.sys", $source, $lang->getDefault(), false, false);
break;
}
$text = JText::_($item->name);
return $text;
}
}
Integer.php 0000644 00000005300 15235524365 0006662 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Form\Field;
use FOF30\Form\FieldInterface;
use FOF30\Form\Form;
use FOF30\Model\DataModel;
defined('_JEXEC') or die;
\JFormHelper::loadFieldClass('integer');
/**
* Form Field class for the FOF framework
* Supports a one line text field.
*
* @deprecated 3.1 Support for XML forms will be removed in FOF 4
*/
class Integer extends \JFormFieldInteger implements FieldInterface
{
/**
* @var string Static field output
*/
protected $static;
/**
* @var string Repeatable field output
*/
protected $repeatable;
/**
* The Form object of the form attached to the form field.
*
* @var Form
*/
protected $form;
/**
* A monotonically increasing number, denoting the row number in a repeatable view
*
* @var int
*/
public $rowid;
/**
* The item being rendered in a repeatable form field
*
* @var DataModel
*/
public $item;
/**
* 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 'static':
if (empty($this->static))
{
$this->static = $this->getStatic();
}
return $this->static;
break;
case 'repeatable':
if (empty($this->repeatable))
{
$this->repeatable = $this->getRepeatable();
}
return $this->repeatable;
break;
default:
return parent::__get($name);
}
}
/**
* Get the rendering of this field type for static display, e.g. in a single
* item view (typically a "read" task).
*
* @since 2.0
*
* @return string The field HTML
*/
public function getStatic()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$class = $this->class ? ' class="' . $this->class . '"' : '';
return '<span id="' . $this->id . '" ' . $class . '>' .
htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8') .
'</span>';
}
/**
* Get the rendering of this field type for a repeatable (grid) display,
* e.g. in a view listing many item (typically a "browse" task)
*
* @since 2.0
*
* @return string The field HTML
*/
public function getRepeatable()
{
if (isset($this->element['legacy']))
{
return $this->getInput();
}
$class = $this->class ? $this->class : '';
return '<span class="' . $this->id . ' ' . $class . '">' .
htmlspecialchars(GenericList::getOptionName($this->getOptions(), $this->value), ENT_COMPAT, 'UTF-8') .
'</span>';
}
}