155 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			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']);
 | |
|     }
 | |
| } |