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

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;
}
}