175 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * @author          Tassos Marinos <info@tassos.gr>
 | |
|  * @link            https://www.tassos.gr
 | |
|  * @copyright       Copyright © 2024 Tassos All Rights Reserved
 | |
|  * @license         GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
 | |
|  */
 | |
| 
 | |
| namespace NRFramework\Helpers;
 | |
| 
 | |
| defined('_JEXEC') or die;
 | |
| 
 | |
| class ChainedFields
 | |
| {
 | |
| 	/**
 | |
| 	 * Loads a combined array of the inputs and choices of the CSV file.
 | |
| 	 * 
 | |
| 	 * @param   string  $path
 | |
| 	 * @param   string  $data_source
 | |
| 	 * @param   string  $separator
 | |
| 	 * @param   string  $id_prefix
 | |
| 	 * @param   string  $name_prefix
 | |
| 	 * 
 | |
| 	 * @return  array
 | |
| 	 */
 | |
| 	public static function loadCSV($input, $data_source = 'custom', $separator = ',', $id_prefix = '', $name_prefix = '')
 | |
| 	{
 | |
| 		if (!$separator)
 | |
| 		{
 | |
| 			return [];
 | |
| 		}
 | |
| 
 | |
| 		if ($data_source === 'csv_file')
 | |
| 		{
 | |
| 			if (!file_exists($input))
 | |
| 			{
 | |
| 				return [];
 | |
| 			}
 | |
| 	
 | |
| 			if (!$input = file_get_contents($input))
 | |
| 			{
 | |
| 				return [];
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if (!$data = self::getData($input, $separator, $id_prefix, $name_prefix))
 | |
| 		{
 | |
| 			return [];
 | |
| 		}
 | |
| 
 | |
| 		return $data;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Iterates over the given data and returns the inputs and choices.
 | |
| 	 * 
 | |
| 	 * @param   string  $data
 | |
| 	 * @param   string  $separator
 | |
| 	 * @param   string  $id_prefix
 | |
| 	 * @param   string  $name_prefix
 | |
| 	 * 
 | |
| 	 * @return  array
 | |
| 	 */
 | |
| 	public static function getData($data = '', $separator = ',', $id_prefix = '', $name_prefix = '')
 | |
| 	{
 | |
| 		if (!$data || !is_string($data))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 		if (!$rows = explode(PHP_EOL, $data))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$choices = [];
 | |
| 		$inputs = [];
 | |
| 
 | |
| 		foreach ($rows as $row)
 | |
| 		{
 | |
| 			$row = explode($separator, $row);
 | |
| 
 | |
| 			$row = array_filter($row, 'strlen');
 | |
| 
 | |
| 			// if an empty row was found, skip it
 | |
| 			if (empty($row))
 | |
| 			{
 | |
| 				continue;
 | |
| 			}
 | |
| 
 | |
| 			if (empty($inputs))
 | |
| 			{
 | |
| 				$i = 1;
 | |
| 				
 | |
| 				foreach ($row as $index => $item)
 | |
| 				{
 | |
| 					if ($i % 10 == 0)
 | |
| 					{
 | |
| 						$i++;
 | |
| 					}
 | |
| 
 | |
| 					$inputs[] = [
 | |
| 						'id'    => $id_prefix . $i,
 | |
| 						'name'  => $name_prefix . '[' . $i . ']',
 | |
| 						'label' => trim($item),
 | |
| 					];
 | |
| 
 | |
| 					$i++;
 | |
| 				}
 | |
| 
 | |
| 				continue;
 | |
| 			}
 | |
| 
 | |
| 			$parent = null;
 | |
| 
 | |
| 			foreach($row as $item)
 | |
| 			{
 | |
| 				$item = trim($item);
 | |
| 				
 | |
| 				if ($parent === null)
 | |
| 				{
 | |
| 					$parent = &$choices;
 | |
| 				}
 | |
| 
 | |
| 				if (!isset($parent[$item]))
 | |
| 				{
 | |
| 					$item = trim($item);
 | |
| 
 | |
| 					$parent[$item] = [
 | |
| 						'text'       => $item,
 | |
| 						'value'      => $item,
 | |
| 						'isSelected' => false,
 | |
| 						'choices'    => []
 | |
| 					];
 | |
| 				}
 | |
| 
 | |
| 				$parent = &$parent[$item]['choices'];
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		self::array_values_recursive($choices);
 | |
| 
 | |
| 		if (!isset($inputs) || !isset($choices))
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		return compact('inputs', 'choices');
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Transforms an array to using as key an index value instead of a alphanumeric.
 | |
| 	 * 
 | |
| 	 * @param   array   $choices
 | |
| 	 * @param   string  $property
 | |
| 	 * 
 | |
| 	 * @return  array
 | |
| 	 */
 | |
| 	public static function array_values_recursive(&$choices, $property = 'choices')
 | |
| 	{
 | |
| 		$choices = array_values($choices);
 | |
| 
 | |
| 		for($i = 0; $i <= count($choices); $i++)
 | |
| 		{
 | |
| 			if(empty($choices[$i][$property]))
 | |
| 			{
 | |
| 				continue;
 | |
| 			}
 | |
| 
 | |
| 			$choices[$i][$property] = self::array_values_recursive($choices[$i][$property], $property);
 | |
|         }
 | |
| 
 | |
| 		return $choices;
 | |
| 	}
 | |
| } |