Your IP : 216.73.216.240
<?php
/*
* @package Tech Fry Library
* @license https://www.gnu.org/licenses/gpl-3.0.en.html
*/
namespace TechFry\Library;
defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\Form\FormFactoryInterface;
// Class to Manage Forms: Pre-xml Object/Array -> XMLElement -> JForm Object -> Render/Display
class TForm
{
// Form - field groups, fieldset, fields
public $jform; // Joomla Form
public function __construct($name = '', $xml_file = '', $control = 'jform')
{
if (!$name)
{
return;
}
$this->jform = Factory::getContainer()->get(FormFactoryInterface::class)->createForm($name, array('control' => 'jform'));
if (!$xml_file)
{
$xml_file = JPATH_LIBRARIES . DIRECTORY_SEPARATOR . 'techfry' . DIRECTORY_SEPARATOR . 'forms' . DIRECTORY_SEPARATOR . 'blank.xml';
}
$this->jform->loadFile($xml_file);
}
// Set Joomla form directly
public function set_form($jform)
{
$this->jform = $jform;
}
public function get_form()
{
return $this->jform;
}
public function get_form_control()
{
return $this->jform->getFormControl();
}
public function get_name()
{
return $this->jform->getName();
}
public function get_fieldsets()
{
// name, label, description
return $this->jform->getFieldsets();
}
// Add field to Form
public function add_field($field, $fieldset = 'default', $group = null, $replace = true)
{
// Field Information Object/Array -> Field Element -> XML -> Set Field
if (!\is_array($field))
{
$field = (array) $field;
}
$element = $this->get_field_element($field);
$xml = new \SimpleXMLElement($element);
$this->jform->setField($xml, $group, $replace, $fieldset);
}
public function add_fields($fields, $fieldset = 'default', $group = null, $replace = true)
{
if (!$fields)
{
return;
}
foreach ($fields as $field)
{
$this->add_field($field, $fieldset, $group, $replace);
}
}
// Get field XML definition from Field Object/Array
public function get_field_element($field = [])
{
// $field can be Joomla Custom Field or TF Field
$field = (array) $field;
// If Joomla custom field, then convert to field object
if (isset($field['fieldparams']) && isset($field['params']))
{
$field = (array) $this->convert_joomla_field($field);
}
$field_type = $field['type'] ?? $field['field_type'];
unset($field['type']);
unset($field['field_type']);
$element = '<field name="' . $field['name'] . '"';
$element .= ' type="' . $field_type . '"';
$element .= ' label="' . $field['label'] . '"';
unset($field['name']);
unset($field['label']);
$options = [];
if (isset($field['options']))
{
$options = $field['options'];
unset($field['options']);
}
$subform_fields = [];
if (isset($field['subform_fields']))
{
$subform_fields = $field['subform_fields'];
unset($field['subform_fields']);
}
foreach ($field as $k => $v)
{
if (!is_array($v) && $v != '')
{
$element .= ' ' . $k . '="' . $v . '"';
}
}
$element .= '>';
if ($options)
{
$element .= $this->set_field_options($options);
}
// Add subform fields
if ($field_type == 'subform' && $subform_fields)
{
$element .= $this->add_subform_fields($subform_fields);
}
$element .= '</field>';
//print_r(htmlspecialchars($element));
return $element;
}
// Set options for list, radio, checkboxes
public function set_field_options($options)
{
// $options can be comma separed value string or array (value/name)
$output = '';
if (\is_string($options))
{
$options_arr = explode(',', $options);
foreach ($options_arr as $option)
{
$output .= '<option value="' . $option . '">' . $option . '</option>';
}
}
else
{
foreach ($options as $option)
{
if (\is_array($option))
{
$option = (object) $option;
}
$value = $option->value ?? '';
$name = $option->name ?? '';
$output .= '<option value="' . $value . '">' . $name . '</option>';
}
}
return $output;
}
// Display or Render Field
public function render_field($name, $group = null)
{
// Field description, parentclass is not displaying
echo $this->jform->getLabel($name, $group);
echo $this->jform->getInput($name, $group);
//echo $this->jform->renderField($name, $group = null);
}
public function set_field_attribute($name, $attribute, $value, $group = null)
{
return $this->jform->setFieldAttribute($name, $attribute, $value, $group);
}
// Set value to field
public function set_value($name, $value = null, $group = null)
{
return $this->jform->setValue($name, $group, $value);
}
public function remove_field($name, $group = null)
{
return $this->jform->removeField($name, $group);
}
// Add fieldset to form
public function add_fieldset($name, $label = '', $description = '', $group = '')
{
$element = '<form>';
if ($group != '')
{
$element .= '<fields name="' . $group . '">';
}
$element .= '<fieldset name="' . $name . '"';
if ($label != '')
{
$element .= ' label="' . $label . '"';
}
if ($description != '')
{
$element .= ' description="' . $description . '"';
}
$element .= '></fieldset>';
if ($group != '')
{
$element .= '</fields>';
}
$element .= '</form>';
$xml = new \SimpleXMLElement($element);
$this->jform->load($xml);
}
public function render_fieldset($name)
{
// Get Fields in Fieldset
$fields = $this->jform->getFieldset($name);
foreach ($fields as $field)
{
echo $field->label;
echo $field->input;
}
//echo $this->jform->renderFieldset($name);
}
public function add_subform_fields($subform_fields)
{
// Add Subform fields - name, field_type, field_settings
$output = '<form>';
if (!empty($subform_fields))
{
foreach ($subform_fields as $subform_field)
{
$subform_field = (object) $subform_field;
if (isset($subform_field->field_settings) && $subform_field->field_settings)
{
$settings = str_getcsv($subform_field->field_settings, ';');
foreach ($settings as $setting)
{
$a = explode(':', $setting);
$key = trim($a[0]);
$value = trim($a[1]);
$subform_field->$key = $value;
}
}
$subform_field->label = $subform_field->label ?? $subform_field->name;
$output .= $this->get_field_element($subform_field);
}
}
$output .= '</form>';
return $output;
}
// Convert Joomla Field Object to New Field Object
public function convert_joomla_field($field)
{
// fieldparams (specific to field type), params (common for all fields)
$new_field = new \stdClass();
//$new_field->id = $field->id;
$new_field->name = $field['name'];
$new_field->type = $field['type'];
$new_field->label = $field['label'];
$new_field->description = $field['description'];
$new_field->default_value = $field['default_value'];
if (isset($field['required']))
{
$new_field->required = ($field['required']) ? 'true' : 'false';
}
$params = \is_array($field['params']) ? $field['params'] : $field['params']->toArray();
foreach ($params as $k => $v)
{
if ($v != '')
{
$new_field->$k = $v;
}
}
$fieldparams = \is_array($field['fieldparams']) ? $field['fieldparams'] : $field['fieldparams']->toArray();
foreach ($fieldparams as $k => $v)
{
if ($v != '')
{
$new_field->$k = $v;
}
}
return $new_field;
}
public function render_submit($config = [])
{
$text = $config['button_text'] ?? 'Submit';
$class = $config['button_class'] ?? 'btn btn-primary';
$name = $config['name'] ?? 'submit';
$value = $config['value'] ?? $name;
$icon = $config['icon'] ?? '';
echo '<button type="submit" name="' . $name . '" value="' . $value . '" class="' . $class . '">';
if ($icon)
{
echo '<i class="' . $icon . '"></i> ';
}
echo $text;
echo '</button>';
}
}