Your IP : 216.73.216.240


Current Path : /home/juvelize/saulnois/tmp/install_695d2cf0b4957/src/
Upload File :
Current File : /home/juvelize/saulnois/tmp/install_695d2cf0b4957/src/TForm.php

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