Files
conservatorio-tomadini/plugins/system/nrframework/fields/tfunitcontrol.php
2024-12-31 11:07:09 +01:00

155 lines
4.5 KiB
PHP

<?php
/**
* @author Tassos Marinos <info@tassos.gr>
* @link http://www.tassos.gr
* @copyright Copyright © 2021 Tassos Marinos All Rights Reserved
* @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
*/
// No direct access to this file
defined('_JEXEC') or die;
use Joomla\CMS\Form\Field\TextField;
use Joomla\CMS\Layout\FileLayout;
use Joomla\CMS\HTML\HTMLHelper;
class JFormFieldTFUnitControl extends TextField
{
private $units = ['px', '%', 'em', 'rem'];
private $default_unit = 'px';
private $min = 0;
private $max;
private $step;
/**
* Method to render the input field
*
* @return string
*/
public function getInput()
{
$wrapper_class = $dropdown_class = '';
$initial_name = $this->name;
$units = $this->getUnits();
$hint = $this->hint;
$parsedValue = \NRFramework\Helpers\Controls\Control::findUnitInValue($this->value);
$value = isset($parsedValue['value']) ? $parsedValue['value'] : $this->value;
$unit = isset($parsedValue['unit']) && $parsedValue['unit'] ? $parsedValue['unit'] : (isset($units[0]) && $units[0] ? $units[0] : $this->default_unit);
if ($value === 'auto' || $unit === 'auto')
{
$unit = 'auto';
$this->hint = '';
$this->readonly = true;
$wrapper_class .= ' has-value';
}
else if (count($units) > 0 && $unit)
{
/**
* If the value unit is not in the $units list,
* this means that the value most probably was a string that had a specific unit set,
* such as: 50em
*
* We add the "em" to the units list in order to use the existing value unit
* and later on allow the user to switch to the new units. The new units wont allow the
* user to use the previous unit once they change to the new one.
*/
if (!in_array($unit, $units))
{
$units[] = $unit;
}
}
if (count($units) > 0)
{
$this->assets();
}
if (count($units) > 1)
{
$wrapper_class .= ' has-multiple-units';
}
if ($value !== '')
{
$wrapper_class .= ' has-value';
}
// Update value
$this->value = $value;
// Append [value] to name
$this->name .= '[value]';
$this->min = isset($this->element['min']) ? (int) $this->element['min'] : $this->min;
$this->max = isset($this->element['max']) ? (int) $this->element['max'] : $this->max;
$this->step = isset($this->element['step']) ? (int) $this->element['step'] : $this->step;
$this->layout = 'joomla.form.field.number';
$this->class .= (!empty($this->class) ? ' ' : '') . 'tf-unit-control--value';
$html = parent::getInput();
$html = str_replace('form-control', '', $html);
$payload = [
// Default values
'value' => $value,
'unit' => $unit,
'wrapper_class' => $wrapper_class,
'dropdown_class' => $dropdown_class,
'name' => $initial_name,
'input' => $html,
'hint' => $hint,
'form_field_name' => $this->name,
'units' => $units
];
$layout = new FileLayout('unit', JPATH_PLUGINS . '/system/nrframework/layouts/controls');
return $layout->render($payload);
}
private function getUnits()
{
$units = isset($this->element['units']) ? (string) $this->element['units'] : $this->units;
return is_string($units) ? array_filter(array_unique(array_map('trim', explode(',', $units)))) : $units;
}
/**
* Method to get the data to be passed to the layout for rendering.
*
* @return array
*/
protected function getLayoutData()
{
$data = parent::getLayoutData();
$extraData = [
'max' => $this->max,
'min' => $this->min,
'step' => $this->step,
'value' => $this->value
];
return array_merge($data, $extraData);
}
/**
* Load field assets.
*
* @return void
*/
private function assets()
{
HTMLHelper::script('plg_system_nrframework/autosize-input.js', ['relative' => true, 'version' => 'auto']);
HTMLHelper::stylesheet('plg_system_nrframework/controls/unit.css', ['relative' => true, 'version' => 'auto']);
}
}