mambax7/songlist

View on GitHub
class/Form/FormController.php

Summary

Maintainability
F
3 wks
Test Coverage
<?php declare(strict_types=1);

namespace XoopsModules\Songlist\Form;


use Xmf\Request;
use XoopsModules\Songlist\{
    Albums,
    Helper
};

\xoops_loadLanguage('user');

/**
 *
 */
class FormController
{
    /**
     * Get {@link XoopsThemeForm} for adding/editing fields
     *
     * @param object $field  {@link ProfileField} object to get edit form for
     * @param mixed  $action URL to submit to - or false for $_SERVER['SCRIPT_NAME']
     *
     * @return object
     */
    public static function getFieldForm($field, $action = false)
    {
        if (false === $action) {
            $action = $_SERVER['SCRIPT_NAME'];
        }

        $helper = Helper::getInstance();
        $helper->loadLanguage('forms');

        $title = $field->isNew() ? \sprintf(\_FRM_SONGLIST_FIELDS_ADD, \_FRM_SONGLIST_FIELDS_FIELD) : \sprintf(\_FRM_SONGLIST_FIELDS_EDIT, \_FRM_SONGLIST_FIELDS_FIELD);

        \xoops_load('XoopsFormLoader');

        $form = new \XoopsThemeForm($title, 'form', $action, 'post', true);

        $form->addElement(new \XoopsFormText(\_FRM_SONGLIST_FIELDS_TITLE, 'field_title', 35, 255, $field->getVar('field_title', 'e')));
        $form->addElement(new \XoopsFormTextArea(\_FRM_SONGLIST_FIELDS_DESCRIPTION, 'field_description', $field->getVar('field_description', 'e')));

        if ($field->isNew()) {
            $fieldcid = [1 => 0];
        } else {
            $fieldcid = $field->getVar('cids');
        }
        $categoryHandler = Helper::getInstance()
                                 ->getHandler('Category');
        $cat_select      = new \XoopsFormSelect(\_FRM_SONGLIST_FIELDS_CATEGORY, 'cids', $fieldcid, 7, true);
        $cat_select->addOption(0, \_FRM_SONGLIST_FIELDS_DEFAULT);
        foreach ($categoryHandler->getObjects(null, true) as $cid => $category) {
            $cat_select->addOption($cid, $category->getVar('name'));
        }
        $form->addElement($cat_select);
        $form->addElement(new \XoopsFormText(\_FRM_SONGLIST_FIELDS_WEIGHT, 'field_weight', 10, 10, $field->getVar('field_weight', 'e')));
        if ($field->getVar('field_config') || $field->isNew()) {
            if ($field->isNew()) {
                $form->addElement(new \XoopsFormText(\_FRM_SONGLIST_FIELDS_NAME, 'field_name', 35, 255, $field->getVar('field_name', 'e')));
            } else {
                $form->addElement(new \XoopsFormLabel(\_FRM_SONGLIST_FIELDS_NAME, $field->getVar('field_name')));
                $form->addElement(new \XoopsFormHidden('id', $field->getVar('field_id')));
            }

            //autotext and theme left out of this one as fields of that type should never be changed (valid assumption, I think)
            $fieldtypes = [
                'checkbox'     => \_FRM_SONGLIST_FIELDS_CHECKBOX,
                'date'         => \_FRM_SONGLIST_FIELDS_DATE,
                'datetime'     => \_FRM_SONGLIST_FIELDS_DATETIME,
                'longdate'     => \_FRM_SONGLIST_FIELDS_LONGDATE,
                'group'        => \_FRM_SONGLIST_FIELDS_GROUP,
                'group_multi'  => \_FRM_SONGLIST_FIELDS_GROUPMULTI,
                'language'     => \_FRM_SONGLIST_FIELDS_LANGUAGE,
                'radio'        => \_FRM_SONGLIST_FIELDS_RADIO,
                'select'       => \_FRM_SONGLIST_FIELDS_SELECT,
                'select_multi' => \_FRM_SONGLIST_FIELDS_SELECTMULTI,
                'textarea'     => \_FRM_SONGLIST_FIELDS_TEXTAREA,
                'dhtml'        => \_FRM_SONGLIST_FIELDS_DHTMLTEXTAREA,
                'textbox'      => \_FRM_SONGLIST_FIELDS_TEXTBOX,
                'timezone'     => \_FRM_SONGLIST_FIELDS_TIMEZONE,
                'yesno'        => \_FRM_SONGLIST_FIELDS_YESNO,
            ];

            $element_select = new \XoopsFormSelect(\_FRM_SONGLIST_FIELDS_TYPE, 'field_type', $field->getVar('field_type', 'e'));
            $element_select->addOptionArray($fieldtypes);

            $form->addElement($element_select);

            switch ($field->getVar('field_type')) {
                case 'textbox':
                    $valuetypes = [
                        \XOBJ_DTYPE_ARRAY   => \_FRM_SONGLIST_FIELDS_ARRAY,
                        \XOBJ_DTYPE_EMAIL   => \_FRM_SONGLIST_FIELDS_EMAIL,
                        \XOBJ_DTYPE_INT     => \_FRM_SONGLIST_FIELDS_INT,
                        XOBJ_DTYPE_FLOAT    => \_FRM_SONGLIST_FIELDS_FLOAT,
                        \XOBJ_DTYPE_DECIMAL => \_FRM_SONGLIST_FIELDS_DECIMAL,
                        \XOBJ_DTYPE_TXTAREA => \_FRM_SONGLIST_FIELDS_TXTAREA,
                        \XOBJ_DTYPE_TXTBOX  => \_FRM_SONGLIST_FIELDS_TXTBOX,
                        \XOBJ_DTYPE_URL     => \_FRM_SONGLIST_FIELDS_URL,
                        \XOBJ_DTYPE_OTHER   => \_FRM_SONGLIST_FIELDS_OTHER,
                    ];

                    $type_select = new \XoopsFormSelect(\_FRM_SONGLIST_FIELDS_VALUETYPE, 'field_valuetype', $field->getVar('field_valuetype', 'e'));
                    $type_select->addOptionArray($valuetypes);
                    $form->addElement($type_select);
                    break;
                case 'select':
                case 'radio':
                    $valuetypes = [
                        \XOBJ_DTYPE_ARRAY   => \_FRM_SONGLIST_FIELDS_ARRAY,
                        \XOBJ_DTYPE_EMAIL   => \_FRM_SONGLIST_FIELDS_EMAIL,
                        \XOBJ_DTYPE_INT     => \_FRM_SONGLIST_FIELDS_INT,
                        XOBJ_DTYPE_FLOAT    => \_FRM_SONGLIST_FIELDS_FLOAT,
                        \XOBJ_DTYPE_DECIMAL => \_FRM_SONGLIST_FIELDS_DECIMAL,
                        \XOBJ_DTYPE_TXTAREA => \_FRM_SONGLIST_FIELDS_TXTAREA,
                        \XOBJ_DTYPE_TXTBOX  => \_FRM_SONGLIST_FIELDS_TXTBOX,
                        \XOBJ_DTYPE_URL     => \_FRM_SONGLIST_FIELDS_URL,
                        \XOBJ_DTYPE_OTHER   => \_FRM_SONGLIST_FIELDS_OTHER,
                    ];

                    $type_select = new \XoopsFormSelect(\_FRM_SONGLIST_FIELDS_VALUETYPE, 'field_valuetype', $field->getVar('field_valuetype', 'e'));
                    $type_select->addOptionArray($valuetypes);
                    $form->addElement($type_select);
                    break;
            }

            //$form->addElement(new \XoopsFormRadioYN(_FRM_SONGLIST_FIELDS_NOTNULL, 'field_notnull', $field->getVar('field_notnull', 'e') ));

            if ('select' === $field->getVar('field_type') || 'select_multi' === $field->getVar('field_type') || 'radio' === $field->getVar('field_type') || 'checkbox' === $field->getVar('field_type')) {
                $options = $field->getVar('field_options');
                if (\count($options) > 0) {
                    $remove_options          = new \XoopsFormCheckBox(\_FRM_SONGLIST_FIELDS_REMOVEOPTIONS, 'removeOptions');
                    $remove_options->columns = 3;
                    \asort($options);
                    foreach (\array_keys($options) as $key) {
                        $options[$key] .= "[{$key}]";
                    }
                    $remove_options->addOptionArray($options);
                    $form->addElement($remove_options);
                }

                $option_text = "<table  cellspacing='1'><tr><td width='20%'>" . \_FRM_SONGLIST_FIELDS_KEY . '</td><td>' . \_FRM_SONGLIST_FIELDS_VALUE . '</td></tr>';
                for ($i = 0; $i < 3; ++$i) {
                    $option_text .= "<tr><td><input type='text' name='addOption[{$i}][key]' id='addOption[{$i}][key]' size='15'></td><td><input type='text' name='addOption[{$i}][value]' id='addOption[{$i}][value]' size='35'></td></tr>";
                    $option_text .= "<tr height='3px'><td colspan='2'> </td></tr>";
                }
                $option_text .= '</table>';
                $form->addElement(new \XoopsFormLabel(\_FRM_SONGLIST_FIELDS_ADDOPTION, $option_text));
            }
        }

        if ($field->getVar('field_edit')) {
            switch ($field->getVar('field_type')) {
                case 'textbox':
                case 'textarea':
                case 'dhtml':
                    $form->addElement(new \XoopsFormText(\_FRM_SONGLIST_FIELDS_MAXLENGTH, 'field_maxlength', 35, 35, $field->getVar('field_maxlength', 'e')));
                    $form->addElement(new \XoopsFormTextArea(\_FRM_SONGLIST_FIELDS_DEFAULT, 'field_default', $field->getVar('field_default', 'e')));
                    break;
                case 'checkbox':
                case 'select_multi':
                    $def_value = null !== $field->getVar('field_default', 'e') ? \unserialize(($field->getVar('field_default', 'n')) ?? '') : null;
                    $element   = new \XoopsFormSelect(\_FRM_SONGLIST_FIELDS_DEFAULT, 'field_default', $def_value, 8, true);
                    $options   = $field->getVar('field_options');
                    \asort($options);
                    // If options do not include an empty element, then add a blank option to prevent any default selection
                    if (!\array_key_exists('', $options)) {
                        $element->addOption('', \_NONE);
                    }
                    $element->addOptionArray($options);
                    $form->addElement($element);
                    break;
                case 'select':
                case 'radio':
                    $def_value = null !== $field->getVar('field_default', 'e') ? $field->getVar('field_default') : null;
                    $element   = new \XoopsFormSelect(\_FRM_SONGLIST_FIELDS_DEFAULT, 'field_default', $def_value);
                    $options   = $field->getVar('field_options');
                    \asort($options);
                    // If options do not include an empty element, then add a blank option to prevent any default selection
                    if (!\array_key_exists('', $options)) {
                        $element->addOption('', \_NONE);
                    }
                    $element->addOptionArray($options);
                    $form->addElement($element);
                    break;
                case 'date':
                    $form->addElement(new \XoopsFormTextDateSelect(\_FRM_SONGLIST_FIELDS_DEFAULT, 'field_default', 15, $field->getVar('field_default', 'e')));
                    break;
                case 'longdate':
                    $form->addElement(new \XoopsFormTextDateSelect(\_FRM_SONGLIST_FIELDS_DEFAULT, 'field_default', 15, \strtotime($field->getVar('field_default', 'e'))));
                    break;
                case 'datetime':
                    $form->addElement(new \XoopsFormDateTime(\_FRM_SONGLIST_FIELDS_DEFAULT, 'field_default', 15, $field->getVar('field_default', 'e')));
                    break;
                case 'yesno':
                    $form->addElement(new \XoopsFormRadioYN(\_FRM_SONGLIST_FIELDS_DEFAULT, 'field_default', $field->getVar('field_default', 'e')));
                    break;
                case 'timezone':
                    $form->addElement(new \XoopsFormSelectTimezone(\_FRM_SONGLIST_FIELDS_DEFAULT, 'field_default', $field->getVar('field_default', 'e')));
                    break;
                case 'language':
                    $form->addElement(new \XoopsFormSelectLang(\_FRM_SONGLIST_FIELDS_DEFAULT, 'field_default', $field->getVar('field_default', 'e')));
                    break;
                case 'group':
                    $form->addElement(new \XoopsFormSelectGroup(\_FRM_SONGLIST_FIELDS_DEFAULT, 'field_default', true, $field->getVar('field_default', 'e')));
                    break;
                case 'group_multi':
                    $form->addElement(new \XoopsFormSelectGroup(\_FRM_SONGLIST_FIELDS_DEFAULT, 'field_default', true, $field->getVar('field_default', 'e'), 5, true));
                    break;
                case 'theme':
                    $form->addElement(new \XoopsFormSelectTheme(\_FRM_SONGLIST_FIELDS_DEFAULT, 'field_default', $field->getVar('field_default', 'e')));
                    break;
                case 'autotext':
                    $form->addElement(new \XoopsFormTextArea(\_FRM_SONGLIST_FIELDS_DEFAULT, 'field_default', $field->getVar('field_default', 'e')));
                    break;
            }
        }

        /** @var \XoopsGroupPermHandler $grouppermHandler */
        $grouppermHandler = \xoops_getHandler('groupperm');
        $searchable_types = [
            'textbox',
            'select',
            'radio',
            'yesno',
            'date',
            'datetime',
            'timezone',
            'language',
        ];
        if (\in_array($field->getVar('field_type'), $searchable_types, true)) {
            $search_groups = $grouppermHandler->getGroupIds('songlist_search', $field->getVar('field_id'), $GLOBALS['songlistModule']->getVar('mid'));
            $form->addElement(new \XoopsFormSelectGroup(\_FRM_SONGLIST_FIELDS_PROF_SEARCH, 'songlist_search', true, $search_groups, 5, true));
        }
        if ($field->getVar('field_edit') || $field->isNew()) {
            if ($field->isNew()) {
                $editable_groups = [];
            } else {
                //Load groups
                $editable_groups = $grouppermHandler->getGroupIds('songlist_edit', $field->getVar('field_id'), $GLOBALS['songlistModule']->getVar('mid'));
            }
            $form->addElement(new \XoopsFormSelectGroup(\_FRM_SONGLIST_FIELDS_PROF_EDITABLE, 'songlist_edit', false, $editable_groups, 5, true));
//            $form->addElement($steps_select);
        }
        $form->addElement(new \XoopsFormHidden('op', 'save'));
        $form->addElement(new \XoopsFormButton('', 'submit', \_SUBMIT, 'submit'));

        return $form;
    }

    /**
     * Get {@link XoopsThemeForm} for editing a user
     *
     * @param bool $action
     * @return object
     * @internal param object $user <a href='psi_element://XoopsUser'>XoopsUser</a> to edit to edit
     */
    public static function getUserSearchForm($action = false)
    {
        \xoops_loadLanguage('forms', 'songlist');

        if (!$action) {
            $action = $_SERVER['SCRIPT_NAME'];
        }
        if (empty($GLOBALS['xoopsConfigUser'])) {
            /** @var \XoopsConfigHandler $configHandler */
            $configHandler              = \xoops_getHandler('config');
            $GLOBALS['xoopsConfigUser'] = $configHandler->getConfigsByCat(\XOOPS_CONF_USER);
        }

        $helper = Helper::getInstance();

        $title = \_FRM_SONGLIST_FIELDS_SEARCH;

        $form = new \XoopsThemeForm($title, 'search', $action, 'post', true);

        $songlistHandler = Helper::getInstance()
                                 ->getHandler('Profile', 'objects');
        // Get fields
        $fields = $songlistHandler->loadFields();

        /** @var \XoopsGroupPermHandler $grouppermHandler */
        $grouppermHandler = \xoops_getHandler('groupperm');
        /** @var \XoopsConfigHandler $configHandler */
        $configHandler = \xoops_getHandler('config');
        $groups        = \is_object($GLOBALS['xoopsUser']) ? $GLOBALS['xoopsUser']->getGroups() : [XOOPS_GROUP_ANONYMOUS];
        /** @var \XoopsModuleHandler $moduleHandler */
        $moduleHandler = \xoops_getHandler('module');
        $xoModule      = $moduleHandler->getByDirname('objects');
        $modid         = $xoModule->getVar('mid');

        // Get ids of fields that can be edited
        /** @var \XoopsGroupPermHandler $grouppermHandler */
        $grouppermHandler = \xoops_getHandler('groupperm');

        $editable_fields = $grouppermHandler->getItemIds('songlist_search', $groups, $modid);

        $catHandler = Helper::getInstance()
                            ->getHandler('Category');

        $selcat = new \XoopsFormSelect('Form', 'cid', !empty($_REQUEST['cid']) ? Request::getInt('cid', 0, 'REQUEST') : 0, 1, false, false, false, true);
        $selcat->setExtra(' onChange="window.location=\'' . XOOPS_URL . '/modules/objects/search.php?op=search&fct=form&cid=\'+document.search.cid.options[document.search.cid.selectedIndex].value"');

        $form->addElement($selcat, true);

        $categories = [];

        $criteria       = new \CriteriaCompo(new \Criteria('cid', !empty($_REQUEST['cid']) ? Request::getInt('cid', 0, 'REQUEST') : '0'), 'OR');
        $all_categories = $catHandler->getObjects($criteria, true, false);
        $count_fields   = \count($fields);

        foreach (\array_keys($fields) as $i) {
            if (\in_array($fields[$i]->getVar('field_id'), $editable_fields, true)) {
                // Set default value for user fields if available
                $fieldinfo['element']  = $fields[$i]->getSearchElement();
                $fieldinfo['required'] = false;

                foreach ($fields[$i]->getVar('cids') as $catidid => $cid) {
                    if (\array_key_exists($cid, $all_categories)) {
                        $key              = $all_categories[$cid]['cat_weight'] * $count_fields + $cid;
                        $elements[$key][] = $fieldinfo;
                        $weights[$key][]  = $fields[$i]->getVar('field_weight');
                        $categories[$key] = $all_categories[$cid];
                    } elseif (\in_array(0, $fields[$i]->getVar('cids'), true)) {
                        $key              = $all_categories[$cid]['cat_weight'] * $count_fields + $cid;
                        $elements[$key][] = $fieldinfo;
                        $weights[$key][]  = $fields[$i]->getVar('field_weight');
                        $categories[$key] = $all_categories[$cid];
                    }
                }
            }
        }

        \ksort($elements);
        foreach (\array_keys($elements) as $k) {
            \array_multisort($weights[$k], \SORT_ASC, \array_keys($elements[$k]), \SORT_ASC, $elements[$k]);
            $title = isset($categories[$k]) ? $categories[$k]['cat_title'] : \_FRM_SONGLIST_FORM_DEFAULT;
            $desc  = isset($categories[$k]) ? $categories[$k]['cat_description'] : '';
            $form->addElement(new \XoopsFormLabel("<h3>{$title}</h3>", $desc), false);
            foreach (\array_keys($elements[$k]) as $i) {
                $form->addElement($elements[$k][$i]['element'], $elements[$k][$i]['required']);
            }
        }

        $form->addElement(new \XoopsFormHidden('fct', 'objects'));
        $form->addElement(new \XoopsFormHidden('op', 'search'));
        $form->addElement(new \XoopsFormButton('', 'submit', \_SUBMIT, 'submit'));

        return $form;
    }

    /**
     * @param bool $as_array
     * @return string
     */
    public static function  getFormImport($as_array = false): string
    {
        \xoops_loadLanguage('forms', 'songlist');

        $sform = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_ISNEW_IMPORT, 'import', $_SERVER['SCRIPT_NAME'], 'post', true);
        $sform->setExtra("enctype='multipart/form-data'");

        $ele['op']      = new \XoopsFormHidden('op', 'import');
        $ele['fct']     = new \XoopsFormHidden('fct', 'upload');
        $ele['xmlfile'] = new \XoopsFormFile((!$as_array ? \_FRM_SONGLIST_FORM_IMPORT_UPLOAD_XML : ''), 'xmlfile', 1024 * 1024 * 1024 * 32);
        $ele['xmlfile']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_IMPORT_UPLOAD_XML_DESC : ''));
        $ele['file'] = new \XoopsFormSelect((!$as_array ? \_FRM_SONGLIST_FORM_IMPORT_EXISTING_XML : ''), 'file');
        $ele['file']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_IMPORT_EXISTING_XML_DESC : ''));
        $ele['file']->addOption('', '*********');
        \xoops_load('XoopsLists');
        foreach (\XoopsLists::getFileListAsArray($GLOBALS['xoops']->path($GLOBALS['songlistModuleConfig']['upload_areas'])) as $file) {
            if ('xml' === mb_substr($file, mb_strlen($file) - 3, 3)) {
                $ele['file']->addOption($file, $file);
            }
        }
        $ele['submit'] = new \XoopsFormButton('', 'submit', \_SUBMIT, 'submit');

        $required = [];

        foreach ($ele as $id => $obj) {
            if (\in_array($id, $required, true)) {
                $sform->addElement($obj, true);
            } else {
                $sform->addElement($obj, false);
            }
        }

        return $sform->render();
    }

    /**
     * @param      $file
     * @param bool $as_array
     * @return string
     */
    public static function  getFormImportb($file, $as_array = false): string
    {
        \xoops_loadLanguage('forms', 'songlist');

        $sform = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_ISNEW_ELEMENTS, 'elements', $_SERVER['SCRIPT_NAME'], 'post', true);

        $filesize = \filesize($GLOBALS['xoops']->path($GLOBALS['songlistModuleConfig']['upload_areas'] . $file));
        $mb       = \floor($filesize / 1024 / 1024);
        if ($mb > 32) {
            ini_set('memory_limit', ($mb + 128) . 'M');
        }
        \set_time_limit(3600);

        $i = 0;
        foreach (\file($GLOBALS['xoops']->path($GLOBALS['songlistModuleConfig']['upload_areas'] . $_SESSION['xmlfile'])) as $data) {
            ++$i;
            if ($i < 20) {
                $line .= \htmlspecialchars($data, \ENT_QUOTES | \ENT_HTML5) . ($i < 19 ? "\n" : '');
            }
        }

        $ele['op']      = new \XoopsFormHidden('op', 'import');
        $ele['fct']     = new \XoopsFormHidden('fct', 'import');
        $ele['example'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_EXAMPLE : ''), '<pre>' . $line . '</pre>');
        $ele['example']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_EXAMPLE_DESC : ''));
        $ele['collection'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_COLLECTION : ''), 'collection', 32, 128, 'collection');
        $ele['collection']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_COLLECTION_DESC : ''));
        $ele['record'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_RECORD : ''), 'record', 32, 128, 'record');
        $ele['record']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_RECORD_DESC : ''));
        $ele['genre'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_GENRES : ''), 'genre', 32, 128, 'genre');
        $ele['genre']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_GENRES_DESC : ''));
        $ele['voice'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_VOICE : ''), 'voice', 32, 128, 'voice');
        $ele['voice']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_VOICE_DESC : ''));
        $ele['category'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_CATEGORY : ''), 'category', 32, 128, 'category');
        $ele['category']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_CATEGORY_DESC : ''));
        $ele['artist'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_ARTIST : ''), 'artist', 32, 128, 'artist');
        $ele['artist']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_ARTIST_DESC : ''));
        $ele['album'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_ALBUM : ''), 'album', 32, 128, 'album');
        $ele['album']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_ALBUM_DESC : ''));
        $ele['songid'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_SONGID : ''), 'songid', 32, 128, 'songid');
        $ele['songid']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_SONGID_DESC : ''));
        $ele['traxid'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_TRAXID : ''), 'traxid', 32, 128, 'trackno');
        $ele['traxid']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_TRAXID_DESC : ''));
        $ele['title'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_TITLE : ''), 'title', 32, 128, 'title');
        $ele['title']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_TITLE_DESC : ''));
        $ele['lyrics'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_LYRICS : ''), 'lyrics', 32, 128, 'lyric');
        $ele['lyrics']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_LYRICS_DESC : ''));
        $ele['tags'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_TAGS : ''), 'tags', 32, 128, 'tags');
        $ele['tags']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_TAGS_DESC : ''));
        $ele['mp3'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_MP3 : ''), 'mp3', 32, 128, 'mp3');
        $ele['mp3']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ELEMENT_MP3_DESC : ''));
        $extrasHandler = Helper::getInstance()
                               ->getHandler('Extras');
        $fields        = $extrasHandler->getFields(null);
        foreach ($fields as $field) {
            $ele[$field->getVar('field_name')] = new \XoopsFormText((!$as_array ? $field->getVar('field_title') : ''), $field->getVar('field_name'), 32, 128, $field->getVar('field_name'));
            $ele[$field->getVar('field_name')]->setDescription((!$as_array ? $field->getVar('field_description') : ''));
        }
        $ele['limiting'] = new \XoopsFormRadioYN((!$as_array ? \_FRM_SONGLIST_FORM_IMPORT_LIMITING : ''), 'limiting');
        $ele['limiting']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_IMPORT_LIMITING_DESC : ''));
        $ele['records'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_IMPORT_RECORDS : ''), 'records', 10, 10, '250');
        $ele['records']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_IMPORT_RECORDS_DESC : ''));
        $ele['wait'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_IMPORT_WAIT : ''), 'wait', 10, 10, '40');
        $ele['wait']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_IMPORT_WAIT_DESC : ''));

        $ele['submit'] = new \XoopsFormButton('', 'submit', \_SUBMIT, 'submit');

        $required = [];

        foreach ($ele as $id => $obj) {
            if (\in_array($id, $required, true)) {
                $sform->addElement($obj, true);
            } else {
                $sform->addElement($obj, false);
            }
        }

        return $sform->render();
    }

    /**
     * @param      $object
     * @param bool $as_array
     * @return array|string
     */
    public static function  getFormGenre($object, $as_array = false)
    {
        if (!\is_object($object)) {
            $handler = Helper::getInstance()
                             ->getHandler('Genre');
            $object  = $handler->create();
        }

        \xoops_loadLanguage('forms', 'songlist');
        $ele = [];

        if ($object->isNew()) {
            $sform       = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_ISNEW_GENRE, 'genre', $_SERVER['SCRIPT_NAME'], 'post', true);
            $ele['mode'] = new \XoopsFormHidden('mode', 'new');
        } else {
            $sform       = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_EDIT_GENRE, 'genre', $_SERVER['SCRIPT_NAME'], 'post', true);
            $ele['mode'] = new \XoopsFormHidden('mode', 'edit');
        }

        $sform->setExtra("enctype='multipart/form-data'");

        $id = $object->getVar('gid');
        if (empty($id)) {
            $id = '0';
        }

        $ele['op']  = new \XoopsFormHidden('op', 'genre');
        $ele['fct'] = new \XoopsFormHidden('fct', 'save');
        if ($as_array) {
            $ele['id'] = new \XoopsFormHidden('id[' . $id . ']', $id);
        } else {
            $ele['id'] = new \XoopsFormHidden('id', $id);
        }
        $ele['sort']   = new \XoopsFormHidden('sort', $_REQUEST['sort'] ?? 'created');
        $ele['order']  = new \XoopsFormHidden('order', $_REQUEST['order'] ?? 'DESC');
        $ele['start']  = new \XoopsFormHidden('start', (string)Request::getInt('start', 0, 'REQUEST'));
        $ele['limit']  = new \XoopsFormHidden('limit', (string)Request::getInt('limit', 0, 'REQUEST'));
        $ele['filter'] = new \XoopsFormHidden('filter', $_REQUEST['filter'] ?? '1,1');

        $ele['name'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_GENRE_NAME : ''), $id . '[name]', (!$as_array ? 55 : 21), 128, $object->getVar('name'));
        $ele['name']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_GENRE_NAME_DESC : ''));
        $ele['albums']  = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_GENRE_ALBUMS : ''), $object->getVar('albums'));
        $ele['artists'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_GENRE_ARTISTS : ''), $object->getVar('artists'));
        $ele['songs']   = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_GENRE_SONGS : ''), $object->getVar('songs'));
        $ele['hits']    = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_GENRE_HITS : ''), $object->getVar('hits'));
        $ele['rank']    = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_GENRE_RANK : ''), \number_format(($object->getVar('rank') > 0 && $object->getVar('votes') > 0 ? $object->getVar('rank') / $object->getVar('votes') : 0), 2) . ' of 10');
        if ($object->getVar('created') > 0) {
            $ele['created'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_GENRE_CREATED : ''), \date(\_DATESTRING, $object->getVar('created')));
        }
        if ($object->getVar('updated') > 0) {
            $ele['updated'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_GENRE_UPDATED : ''), \date(\_DATESTRING, $object->getVar('updated')));
        }

        if ($as_array) {
            return $ele;
        }

        $ele['submit'] = new \XoopsFormButton('', 'submit', \_SUBMIT, 'submit');

        $required = ['name'];

        foreach ($ele as $id => $obj) {
            if (\in_array($id, $required, true)) {
                $sform->addElement($obj, true);
            } else {
                $sform->addElement($obj, false);
            }
        }

        return $sform->render();
    }

    /**
     * @param      $object
     * @param bool $as_array
     * @return array|string
     */
    public static function  getFormVoice($object, $as_array = false)
    {
        if (!\is_object($object)) {
            $handler = Helper::getInstance()
                             ->getHandler('Voice');
            $object  = $handler->create();
        }

        \xoops_loadLanguage('forms', 'songlist');
        $ele = [];

        if ($object->isNew()) {
            $sform       = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_ISNEW_VOICE, 'voice', $_SERVER['SCRIPT_NAME'], 'post', true);
            $ele['mode'] = new \XoopsFormHidden('mode', 'new');
        } else {
            $sform       = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_EDIT_VOICE, 'voice', $_SERVER['SCRIPT_NAME'], 'post', true);
            $ele['mode'] = new \XoopsFormHidden('mode', 'edit');
        }

        $sform->setExtra("enctype='multipart/form-data'");

        $id = $object->getVar('vcid');
        if (empty($id)) {
            $id = '0';
        }

        $ele['op']  = new \XoopsFormHidden('op', 'voice');
        $ele['fct'] = new \XoopsFormHidden('fct', 'save');
        if ($as_array) {
            $ele['id'] = new \XoopsFormHidden('id[' . $id . ']', $id);
        } else {
            $ele['id'] = new \XoopsFormHidden('id', $id);
        }
        $ele['sort']   = new \XoopsFormHidden('sort', $_REQUEST['sort'] ?? 'created');
        $ele['order']  = new \XoopsFormHidden('order', $_REQUEST['order'] ?? 'DESC');
        $ele['start']  = new \XoopsFormHidden('start', (string)Request::getInt('start', 0, 'REQUEST'));
        $ele['limit']  = new \XoopsFormHidden('limit', (string)Request::getInt('limit', 0, 'REQUEST'));
        $ele['filter'] = new \XoopsFormHidden('filter', $_REQUEST['filter'] ?? '1,1');

        $ele['name'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_VOICE_NAME : ''), $id . '[name]', (!$as_array ? 55 : 21), 128, $object->getVar('name'));
        $ele['name']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_VOICE_NAME_DESC : ''));
        $ele['albums']  = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_VOICE_ALBUMS : ''), $object->getVar('albums'));
        $ele['artists'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_VOICE_ARTISTS : ''), $object->getVar('artists'));
        $ele['songs']   = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_VOICE_SONGS : ''), $object->getVar('songs'));
        $ele['hits']    = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_VOICE_HITS : ''), $object->getVar('hits'));
        $ele['rank']    = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_VOICE_RANK : ''), \number_format(($object->getVar('rank') > 0 && $object->getVar('votes') > 0 ? $object->getVar('rank') / $object->getVar('votes') : 0), 2) . ' of 10');
        if ($object->getVar('created') > 0) {
            $ele['created'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_VOICE_CREATED : ''), \date(\_DATESTRING, $object->getVar('created')));
        }
        if ($object->getVar('updated') > 0) {
            $ele['updated'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_VOICE_UPDATED : ''), \date(\_DATESTRING, $object->getVar('updated')));
        }

        if ($as_array) {
            return $ele;
        }

        $ele['submit'] = new \XoopsFormButton('', 'submit', \_SUBMIT, 'submit');

        $required = ['name'];

        foreach ($ele as $id => $obj) {
            if (\in_array($id, $required, true)) {
                $sform->addElement($obj, true);
            } else {
                $sform->addElement($obj, false);
            }
        }

        return $sform->render();
    }

    /**
     * @param Albums  $object
     * @param bool $as_array
     * @return array|string
     */
    public static function  getFormAlbums($object, $as_array = false)
    {
        if (!\is_object($object)) {
            $handler = Helper::getInstance()
                             ->getHandler('Albums');
            $object  = $handler->create();
        }

        \xoops_loadLanguage('forms', 'songlist');
        $ele = [];

        if ($object->isNew()) {
            $sform       = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_ISNEW_ALBUMS, 'albums', $_SERVER['SCRIPT_NAME'], 'post', true);
            $ele['mode'] = new \XoopsFormHidden('mode', 'new');
        } else {
            $sform       = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_EDIT_ALBUMS, 'albums', $_SERVER['SCRIPT_NAME'], 'post', true);
            $ele['mode'] = new \XoopsFormHidden('mode', 'edit');
        }

        $sform->setExtra("enctype='multipart/form-data'");

        $id = $object->getVar('abid');
        if (empty($id)) {
            $id = '0';
        }

        $ele['op']  = new \XoopsFormHidden('op', 'albums');
        $ele['fct'] = new \XoopsFormHidden('fct', 'save');
        if ($as_array) {
            $ele['id'] = new \XoopsFormHidden('id[' . $id . ']', $id);
        } else {
            $ele['id'] = new \XoopsFormHidden('id', $id);
        }
        $ele['sort']   = new \XoopsFormHidden('sort', $_REQUEST['sort'] ?? 'created');
        $ele['order']  = new \XoopsFormHidden('order', $_REQUEST['order'] ?? 'DESC');
        $ele['start']  = new \XoopsFormHidden('start', (string)Request::getInt('start', 0, 'REQUEST'));
        $ele['limit']  = new \XoopsFormHidden('limit', (string)Request::getInt('limit', 0, 'REQUEST'));
        $ele['filter'] = new \XoopsFormHidden('filter', $_REQUEST['filter'] ?? '1,1');

        $ele['cid'] = new SelectCategoryForm((!$as_array ? \_FRM_SONGLIST_FORM_ALBUMS_CATEGORY : ''), $id . '[cid]', $object->getVar('cid'), 1, false, false, false);
        $ele['cid']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ALBUMS_CATEGORY_DESC : ''));
        $ele['title'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_ALBUMS_TITLE : ''), $id . '[title]', (!$as_array ? 55 : 21), 128, $object->getVar('title'));
        $ele['title']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ALBUMS_TITLE_DESC : ''));
        $ele['image'] = new \XoopsFormFile((!$as_array ? \_FRM_SONGLIST_FORM_ALBUMS_UPLOAD_POSTER : ''), 'image', $GLOBALS['songlistModuleConfig']['filesize_upload']);
        $ele['image']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ALBUMS_UPLOAD_POSTER_DESC : ''));
        if ('' != $object->getVar('image') && \file_exists($GLOBALS['xoops']->path($object->getVar('path') . $object->getVar('image')))) {
            $ele['image_preview'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_ALBUMS_POSTER : ''), '<img src="' . $object->getImage('image') . '" width="340px">');
            $ele['image_preview']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ALBUMS_POSTER_DESC : ''));
        }
        $ele['artists'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_ALBUMS_ARTISTS : ''), $object->getVar('artists'));
        $ele['songs']   = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_ALBUMS_SONGS : ''), $object->getVar('songs'));
        $ele['hits']    = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_ALBUMS_HITS : ''), $object->getVar('hits'));
        $ele['rank']    = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_ALBUMS_RANK : ''), \number_format(($object->getVar('rank') > 0 && $object->getVar('votes') > 0 ? $object->getVar('rank') / $object->getVar('votes') : 0), 2) . ' of 10');
        if ($object->getVar('created') > 0) {
            $ele['created'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_ALBUMS_CREATED : ''), \date(\_DATESTRING, $object->getVar('created')));
        }
        if ($object->getVar('updated') > 0) {
            $ele['updated'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_ALBUMS_UPDATED : ''), \date(\_DATESTRING, $object->getVar('updated')));
        }

        if ($as_array) {
            return $ele;
        }

        $ele['submit'] = new \XoopsFormButton('', 'submit', \_SUBMIT, 'submit');

        $required = ['name', 'id', 'source'];

        foreach ($ele as $id => $obj) {
            if (\in_array($id, $required, true)) {
                $sform->addElement($obj, true);
            } else {
                $sform->addElement($obj, false);
            }
        }

        return $sform->render();
    }

    /**
     * @param Songlist\Artists $object
     * @param bool             $as_array
     * @return array|string
     */
    public static function  getFormArtists($object, $as_array = false)
    {
        if (!\is_object($object)) {
            $handler = Helper::getInstance()
                             ->getHandler('Artists');
            $object  = $handler->create();
        }

        \xoops_loadLanguage('forms', 'songlist');
        $ele = [];

        if ($object->isNew()) {
            $sform       = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_ISNEW_ARTISTS, 'artists', $_SERVER['SCRIPT_NAME'], 'post', true);
            $ele['mode'] = new \XoopsFormHidden('mode', 'new');
        } else {
            $sform       = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_EDIT_ARTISTS, 'artists', $_SERVER['SCRIPT_NAME'], 'post', true);
            $ele['mode'] = new \XoopsFormHidden('mode', 'edit');
        }

        $id = $object->getVar('aid');
        if (empty($id)) {
            $id = '0';
        }

        $ele['op']  = new \XoopsFormHidden('op', 'artists');
        $ele['fct'] = new \XoopsFormHidden('fct', 'save');
        if ($as_array) {
            $ele['id'] = new \XoopsFormHidden('id[' . $id . ']', $id);
        } else {
            $ele['id'] = new \XoopsFormHidden('id', $id);
        }
        $ele['sort']   = new \XoopsFormHidden('sort', $_REQUEST['sort'] ?? 'created');
        $ele['order']  = new \XoopsFormHidden('order', $_REQUEST['order'] ?? 'DESC');
        $ele['start']  = new \XoopsFormHidden('start', (string)Request::getInt('start', 0, 'REQUEST'));
        $ele['limit']  = new \XoopsFormHidden('limit', (string)Request::getInt('limit', 0, 'REQUEST'));
        $ele['filter'] = new \XoopsFormHidden('filter', $_REQUEST['filter'] ?? '1,1');

        $ele['cids'] = new SelectCategoryForm((!$as_array ? \_FRM_SONGLIST_FORM_ARTISTS_CATEGORY : ''), $id . '[cids]', $object->getVar('cids'), 7, true, false, false);
        $ele['cids']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ARTISTS_CATEGORY_DESC : ''));
        //$ele['singer'] = new \XoopsModules\Songlist\Form\SelectSingerForm(($as_array==false?_FRM_SONGLIST_FORM_ARTISTS_SINGER:''), $id.'[singer]', $object->getVar('singer'), 1, false, false, false);
        //$ele['singer']->setDescription(($as_array==false?_FRM_SONGLIST_FORM_ARTISTS_SINGER_DESC:''));
        $ele['name'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_ARTISTS_NAME : ''), $id . '[name]', (!$as_array ? 55 : 21), 128, $object->getVar('name'));
        $ele['name']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_ARTISTS_NAME_DESC : ''));
        $ele['albums'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_ARTISTS_ALBUMS : ''), $object->getVar('albums'));
        $ele['songs']  = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_ARTISTS_SONGS : ''), $object->getVar('songs'));
        $ele['hits']   = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_ARTISTS_HITS : ''), $object->getVar('hits'));
        $ele['rank']   = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_ARTISTS_RANK : ''), \number_format(($object->getVar('rank') > 0 && $object->getVar('votes') > 0 ? $object->getVar('rank') / $object->getVar('votes') : 0), 2) . ' of 10');
        if ($object->getVar('created') > 0) {
            $ele['created'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_ARTISTS_CREATED : ''), \date(\_DATESTRING, $object->getVar('created')));
        }
        if ($object->getVar('updated') > 0) {
            $ele['updated'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_ARTISTS_UPDATED : ''), \date(\_DATESTRING, $object->getVar('updated')));
        }

        if ($as_array) {
            return $ele;
        }

        $ele['submit'] = new \XoopsFormButton('', 'submit', \_SUBMIT, 'submit');

        $required = ['name', 'mimetype', 'support'];

        foreach ($ele as $id => $obj) {
            if (\in_array($id, $required, true)) {
                $sform->addElement($obj, true);
            } else {
                $sform->addElement($obj, false);
            }
        }

        return $sform->render();
    }

    /**
     * @param      $object
     * @param bool $as_array
     * @return array|string
     */
    public static function  getFormCategory($object, $as_array = false)
    {
        if (!\is_object($object)) {
            $handler = Helper::getInstance()
                             ->getHandler('Category');
            $object  = $handler->create();
        }

        \xoops_loadLanguage('forms', 'songlist');
        $ele = [];

        if ($object->isNew()) {
            $sform       = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_ISNEW_CATEGORY, 'category', $_SERVER['SCRIPT_NAME'], 'post', true);
            $ele['mode'] = new \XoopsFormHidden('mode', 'new');
        } else {
            $sform       = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_EDIT_CATEGORY, 'category', $_SERVER['SCRIPT_NAME'], 'post', true);
            $ele['mode'] = new \XoopsFormHidden('mode', 'edit');
        }

        $sform->setExtra("enctype='multipart/form-data'");

        $id = $object->getVar('cid');
        if (empty($id)) {
            $id = '0';
        }

        $ele['op']  = new \XoopsFormHidden('op', 'category');
        $ele['fct'] = new \XoopsFormHidden('fct', 'save');
        if ($as_array) {
            $ele['id'] = new \XoopsFormHidden('id[' . $id . ']', $id);
        } else {
            $ele['id'] = new \XoopsFormHidden('id', $id);
        }
        $ele['sort']   = new \XoopsFormHidden('sort', $_REQUEST['sort'] ?? 'created');
        $ele['order']  = new \XoopsFormHidden('order', $_REQUEST['order'] ?? 'DESC');
        $ele['start']  = new \XoopsFormHidden('start', (string)Request::getInt('start', 0, 'REQUEST'));
        $ele['limit']  = new \XoopsFormHidden('limit', (string)Request::getInt('limit', 0, 'REQUEST'));
        $ele['filter'] = new \XoopsFormHidden('filter', $_REQUEST['filter'] ?? '1,1');

        $ele['pid'] = new SelectCategoryForm((!$as_array ? \_FRM_SONGLIST_FORM_CATEGORY_PARENT : ''), $id . '[pid]', $object->getVar('pid'), 1, false, $object->getVar('cid'));
        $ele['pid']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_CATEGORY_PARENT_DESC : ''));
        $ele['name'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_CATEGORY_NAME : ''), $id . '[name]', (!$as_array ? 55 : 21), 128, $object->getVar('name'));
        $ele['name']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_CATEGORY_NAME_DESC : ''));
        $description_configs           = [];
        $description_configs['name']   = $id . '[description]';
        $description_configs['value']  = $object->getVar('description');
        $description_configs['rows']   = 35;
        $description_configs['cols']   = 60;
        $description_configs['width']  = '100%';
        $description_configs['height'] = '400px';
        $ele['description']            = new \XoopsFormEditor(\_FRM_SONGLIST_FORM_CATEGORY_DESCRIPTION, $GLOBALS['songlistModuleConfig']['editor'], $description_configs);
        $ele['description']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_CATEGORY_DESCRIPTION_DESC : ''));
        $ele['image'] = new \XoopsFormFile((!$as_array ? \_FRM_SONGLIST_FORM_CATEGORY_UPLOAD_POSTER : ''), 'image', $GLOBALS['songlistModuleConfig']['filesize_upload']);
        $ele['image']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_CATEGORY_UPLOAD_POSTER_DESC : ''));
        if ('' != $object->getVar('image') && \file_exists($GLOBALS['xoops']->path($object->getVar('path') . $object->getVar('image')))) {
            $ele['image_preview'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_CATEGORY_POSTER : ''), '<img src="' . $object->getImage('image') . '" width="340px">');
            $ele['image_preview']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_CATEGORY_POSTER_DESC : ''));
        }
        $ele['artists'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_CATEGORY_ARTISTS : ''), $object->getVar('artists'));
        $ele['songs']   = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_CATEGORY_SONGS : ''), $object->getVar('songs'));
        $ele['hits']    = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_CATEGORY_HITS : ''), $object->getVar('hits'));
        $ele['rank']    = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_CATEGORY_RANK : ''), \number_format(($object->getVar('rank') > 0 && $object->getVar('votes') > 0 ? $object->getVar('rank') / $object->getVar('votes') : 0), 2) . ' of 10');
        if ($object->getVar('created') > 0) {
            $ele['created'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_CATEGORY_CREATED : ''), \date(\_DATESTRING, $object->getVar('created')));
        }
        if ($object->getVar('updated') > 0) {
            $ele['updated'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_CATEGORY_UPDATED : ''), \date(\_DATESTRING, $object->getVar('updated')));
        }

        if ($as_array) {
            return $ele;
        }

        $ele['submit'] = new \XoopsFormButton('', 'submit', \_SUBMIT, 'submit');

        $required = ['name', 'id', 'source'];

        foreach ($ele as $id => $obj) {
            if (\in_array($id, $required, true)) {
                $sform->addElement($obj, true);
            } else {
                $sform->addElement($obj, false);
            }
        }

        return $sform->render();
    }

    /**
     * @param      $object
     * @param bool $as_array
     * @return array|string
     */
    public static function  getFormUtf8map($object, $as_array = false)
    {
        if (!\is_object($object)) {
            $handler = Helper::getInstance()
                             ->getHandler('Utf8map');
            $object  = $handler->create();
        }

        \xoops_loadLanguage('forms', 'songlist');
        $ele = [];

        if ($object->isNew()) {
            $sform       = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_ISNEW_UTF8MAP, 'utf8map', $_SERVER['SCRIPT_NAME'], 'post', true);
            $ele['mode'] = new \XoopsFormHidden('mode', 'new');
        } else {
            $sform       = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_EDIT_UTF8MAP, 'utf8map', $_SERVER['SCRIPT_NAME'], 'post', true);
            $ele['mode'] = new \XoopsFormHidden('mode', 'edit');
        }

        $sform->setExtra("enctype='multipart/form-data'");

        $id = $object->getVar('utfid');
        if (empty($id)) {
            $id = '0';
        }

        $ele['op']  = new \XoopsFormHidden('op', 'utf8map');
        $ele['fct'] = new \XoopsFormHidden('fct', 'save');
        if ($as_array) {
            $ele['id'] = new \XoopsFormHidden('id[' . $id . ']', $id);
        } else {
            $ele['id'] = new \XoopsFormHidden('id', $id);
        }
        $ele['sort']   = new \XoopsFormHidden('sort', $_REQUEST['sort'] ?? 'created');
        $ele['order']  = new \XoopsFormHidden('order', $_REQUEST['order'] ?? 'DESC');
        $ele['start']  = new \XoopsFormHidden('start', (string)Request::getInt('start', 0, 'REQUEST'));
        $ele['limit']  = new \XoopsFormHidden('limit', (string)Request::getInt('limit', 0, 'REQUEST'));
        $ele['filter'] = new \XoopsFormHidden('filter', $_REQUEST['filter'] ?? '1,1');

        $ele['from'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_UTF8MAP_FROM : ''), $id . '[from]', (!$as_array ? 6 : 4), 2, $object->getVar('from'));
        $ele['from']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_UTF8MAP_FROM_DESC : ''));
        $ele['to'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_UTF8MAP_TO : ''), $id . '[to]', (!$as_array ? 6 : 4), 2, $object->getVar('to'));
        $ele['to']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_UTF8MAP_TO_DESC : ''));

        if ($object->getVar('created') > 0) {
            $ele['created'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_UTF8MAP_CREATED : ''), \date(\_DATESTRING, $object->getVar('created')));
        }
        if ($object->getVar('updated') > 0) {
            $ele['updated'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_UTF8MAP_UPDATED : ''), \date(\_DATESTRING, $object->getVar('updated')));
        }

        if ($as_array) {
            return $ele;
        }

        $ele['submit'] = new \XoopsFormButton('', 'submit', \_SUBMIT, 'submit');

        $required = ['from', 'to'];

        foreach ($ele as $id => $obj) {
            if (\in_array($id, $required, true)) {
                $sform->addElement($obj, true);
            } else {
                $sform->addElement($obj, false);
            }
        }

        return $sform->render();
    }

    /**
     * @param      $object
     * @param bool $as_array
     * @return array|string
     */
    public static function  getFormRequests($object, $as_array = false)
    {
        if (!\is_object($object)) {
            $handler = Helper::getInstance()
                             ->getHandler('Requests');
            $object  = $handler->create();
        }

        \xoops_loadLanguage('forms', 'songlist');
        $ele = [];

        if ($object->isNew()) {
            $sform       = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_ISNEW_REQUESTS, 'requests', $_SERVER['SCRIPT_NAME'], 'post', true);
            $ele['mode'] = new \XoopsFormHidden('mode', 'new');
        } else {
            $sform       = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_EDIT_REQUESTS, 'requests', $_SERVER['SCRIPT_NAME'], 'post', true);
            $ele['mode'] = new \XoopsFormHidden('mode', 'edit');
        }

        $sform->setExtra("enctype='multipart/form-data'");

        $id = $object->getVar('rid');
        if (empty($id)) {
            $id = '0';
        }

        $ele['op']  = new \XoopsFormHidden('op', 'requests');
        $ele['fct'] = new \XoopsFormHidden('fct', 'save');
        if ($as_array) {
            $ele['id'] = new \XoopsFormHidden('id', $id);
        } else {
            $ele['id'] = new \XoopsFormHidden('id[' . $id . ']', $id);
        }
        $ele['sort']   = new \XoopsFormHidden('sort', $_REQUEST['sort'] ?? 'created');
        $ele['order']  = new \XoopsFormHidden('order', $_REQUEST['order'] ?? 'DESC');
        $ele['start']  = new \XoopsFormHidden('start', (string)Request::getInt('start', 0, 'REQUEST'));
        $ele['limit']  = new \XoopsFormHidden('limit', (string)Request::getInt('limit', 0, 'REQUEST'));
        $ele['filter'] = new \XoopsFormHidden('filter', $_REQUEST['filter'] ?? '1,1');

        $ele['artist'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_REQUESTS_ARTIST : ''), $id . '[artist]', (!$as_array ? 55 : 21), 128, $object->getVar('artist'));
        $ele['artist']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_REQUESTS_ARTIST_DESC : ''));
        $ele['album'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_REQUESTS_ALBUM : ''), $id . '[album]', (!$as_array ? 55 : 21), 128, $object->getVar('album'));
        $ele['album']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_REQUESTS_ALBUM_DESC : ''));
        $ele['title'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_REQUESTS_TITLE : ''), $id . '[title]', (!$as_array ? 55 : 21), 128, $object->getVar('title'));
        $ele['title']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_REQUESTS_TITLE_DESC : ''));
        $ele['lyrics'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_REQUESTS_LYRICS : ''), $id . '[lyrics]', (!$as_array ? 55 : 21), 128, $object->getVar('lyrics'));
        $ele['lyrics']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_REQUESTS_LYRICS_DESC : ''));

        if (\is_object($GLOBALS['xoopsUser'])) {
            $ele['uid']  = new \XoopsFormHidden('uid', $GLOBALS['xoopsUser']->getVar('uid'));
            $ele['name'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_REQUESTS_NAME : ''), $id . '[name]', (!$as_array ? 55 : 21), 128, ($object->isNew() ? $GLOBALS['xoopsUser']->getVar('name') : $object->getVar('name')));
            $ele['name']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_REQUESTS_NAME_DESC : ''));
            $ele['email'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_REQUESTS_EMAIL : ''), $id . '[email]', (!$as_array ? 55 : 21), 128, ($object->isNew() ? $GLOBALS['xoopsUser']->getVar('email') : $object->getVar('email')));
        } else {
            $ele['uid']  = new \XoopsFormHidden('uid', 0);
            $ele['name'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_REQUESTS_NAME : ''), $id . '[name]', (!$as_array ? 55 : 21), 128, ($object->isNew() ? '' : $object->getVar('name')));
            $ele['name']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_REQUESTS_NAME_DESC : ''));
            $ele['email'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_REQUESTS_EMAIL : ''), $id . '[email]', (!$as_array ? 55 : 21), 128, ($object->isNew() ? '' : $object->getVar('email')));
        }
        $ele['email']->setDescription((!$as_array ? _FRM_SONGLIST_FORM_REQUESTS_EMAIL_DESC : ''));
        if ($object->getVar('created') > 0) {
            $ele['created'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_REQUESTS_CREATED : ''), \date(\_DATESTRING, $object->getVar('created')));
        }
        if ($object->getVar('updated') > 0) {
            $ele['updated'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_REQUESTS_UPDATED : ''), \date(\_DATESTRING, $object->getVar('updated')));
        }

        if ($as_array) {
            return $ele;
        }

        $ele['submit'] = new \XoopsFormButton('', 'submit', \_SUBMIT, 'submit');

        $required = ['name', 'email'];

        foreach ($ele as $id => $obj) {
            if (\in_array($id, $required, true)) {
                $sform->addElement($obj, true);
            } else {
                $sform->addElement($obj, false);
            }
        }

        return $sform->render();
    }

    /**
     * @param      $object
     * @param bool $as_array
     * @return array|string
     */
    public static function  getFormSongs($object, $as_array = false)
    {
        if (!\is_object($object)) {
            $handler = Helper::getInstance()
                             ->getHandler('Songs');
            $object  = $handler->create();
        }

        \xoops_loadLanguage('forms', 'songlist');
        $ele = [];

        if ($object->isNew()) {
            $sform       = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_ISNEW_SONGS, 'songs', $_SERVER['SCRIPT_NAME'], 'post', true);
            $ele['mode'] = new \XoopsFormHidden('mode', 'new');
        } else {
            $sform       = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_EDIT_SONGS, 'songs', $_SERVER['SCRIPT_NAME'], 'post', true);
            $ele['mode'] = new \XoopsFormHidden('mode', 'edit');
        }

        $sform->setExtra("enctype='multipart/form-data'");

        $id = $object->getVar('sid');
        if (empty($id)) {
            $id = '0';
        }

        $ele['op']  = new \XoopsFormHidden('op', 'songs');
        $ele['fct'] = new \XoopsFormHidden('fct', 'save');
        if ($as_array) {
            $ele['id'] = new \XoopsFormHidden('id[' . $id . ']', $id);
        } else {
            $ele['id'] = new \XoopsFormHidden('id', $id);
        }
        $ele['sort']   = new \XoopsFormHidden('sort', $_REQUEST['sort'] ?? 'created');
        $ele['order']  = new \XoopsFormHidden('order', $_REQUEST['order'] ?? 'DESC');
        $ele['start']  = new \XoopsFormHidden('start', (string)Request::getInt('start', 0, 'REQUEST'));
        $ele['limit']  = new \XoopsFormHidden('limit', (string)Request::getInt('limit', 0, 'REQUEST'));
        $ele['filter'] = new \XoopsFormHidden('filter', $_REQUEST['filter'] ?? '1,1');

        $ele['cid'] = new SelectCategoryForm((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_CATEGORY : ''), $id . '[cid]', ($_REQUEST['cid'] ?? $object->getVar('cid')), 1, false);
        $ele['cid']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_CATEGORY_DESC : ''));
        if ($GLOBALS['songlistModuleConfig']['genre']) {
            $ele['gids'] = new SelectGenreForm((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_GENRE : ''), $id . '[gids]', ($_REQUEST['gids'] ?? $object->getVar('gids')), 8, true);
            $ele['gids']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_GENRE_DESC : ''));
        }
        if ($GLOBALS['songlistModuleConfig']['voice']) {
            $ele['vcid'] = new SelectVoiceForm((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_VOICE : ''), $id . '[vcid]', ($_REQUEST['vcid'] ?? $object->getVar('vcid')), 1, false);
            $ele['vcid']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_VOICE_DESC : ''));
        }
        if ($GLOBALS['songlistModuleConfig']['album']) {
            $ele['abid'] = new SelectAlbumForm((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_ALBUM : ''), $id . '[abid]', $object->getVar('abid'), 1, false);
            $ele['abid']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_ALBUM_DESC : ''));
        }
        $ele['aids'] = new SelectArtistForm((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_ARTISTS : ''), $id . '[aids]', $object->getVar('aids'), 7, true);
        $ele['aids']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_ARTISTS_DESC : ''));
        $ele['songid'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_SONGID : ''), $id . '[songid]', (!$as_array ? 25 : 15), 32, $object->getVar('songid'));
        $ele['songid']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_SONGID_DESC : ''));
        $ele['traxid'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_TRAXID : ''), $id . '[traxid]', (!$as_array ? 25 : 15), 32, $object->getVar('traxid'));
        $ele['traxid']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_TRAXID_DESC : ''));
        $ele['title'] = new \XoopsFormText((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_TITLE : ''), $id . '[title]', (!$as_array ? 55 : 21), 128, $object->getVar('title'));
        $ele['title']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_TITLE_DESC : ''));
        $description_configs           = [];
        $description_configs['name']   = $id . '[lyrics]';
        $description_configs['value']  = $object->getVar('lyrics');
        $description_configs['rows']   = 35;
        $description_configs['cols']   = 60;
        $description_configs['width']  = '100%';
        $description_configs['height'] = '400px';
        $ele['lyrics']                 = new \XoopsFormEditor(\_FRM_SONGLIST_FORM_SONGS_LYRICS, $GLOBALS['songlistModuleConfig']['editor'], $description_configs);
        $ele['lyrics']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_LYRICS_DESC : ''));
        $ele['mp3'] = new \XoopsFormFile((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_MP3 : ''), 'mp3' . $id, $GLOBALS['songlistModuleConfig']['mp3_filesize']);
        $ele['mp3']->setDescription((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_MP3_DESC : ''));
        $categoryHandler = Helper::getInstance()
                                 ->getHandler('Category');
        $criteria        = new \CriteriaCompo(new \Criteria('cid', !empty($_REQUEST['cid']) ? Request::getInt('cid', 0, 'REQUEST') : $object->getVar('cid')));
        $all_categories  = $categoryHandler->getObjects($criteria, true, false);

        // Dynamic fields
        $extrasHandler = Helper::getInstance()
                               ->getHandler('Extras');
        /** @var \XoopsGroupPermHandler $grouppermHandler */
        $grouppermHandler = \xoops_getHandler('groupperm');
        /** @var \XoopsModuleHandler $moduleHandler */
        $moduleHandler = \xoops_getHandler('module');
        $xoModule      = $moduleHandler->getByDirname('songlist');
        $modid         = $xoModule->getVar('mid');

        if (\is_object($GLOBALS['xoopsUser'])) {
            $groups = $GLOBALS['xoopsUser']->getGroups();
        } else {
            $groups = [XOOPS_GROUP_ANONYMOUS => XOOPS_GROUP_ANONYMOUS];
        }

        $count_fields = 0;
        $fields       = $extrasHandler->loadFields();

        $required = [];
        $elements = [];
        $weights  = [];
        if ($object->getVar('sid') > 0) {
            $extra = $extrasHandler->get($object->getVar('sid'));
        } else {
            $extra = $extrasHandler->create();
        }
        $allnames = [];
        if (\is_array($fields)) {
            foreach (\array_keys($fields) as $i) {
                if ((0 != $object->getVar('sid') && $grouppermHandler->checkRight('songlist_edit', $fields[$i]->getVar('field_id'), $groups, $modid))
                    || (0 == $object->getVar('sid') && $grouppermHandler->checkRight('songlist_post', $fields[$i]->getVar('field_id'), $groups, $modid))) {
                    $fieldinfo['element']  = $fields[$i]->getEditElement($object, $extra);
                    $fieldinfo['required'] = $fields[$i]->getVar('field_required');
                    foreach ($fields[$i]->getVar('cids') as $catidid => $cid) {
                        if (!\in_array($fields[$i]->getVar('field_name'), $allnames, true)) {
                            $allnames[] = $fields[$i]->getVar('field_name');
                            if (\array_key_exists($cid, $all_categories)
                                || $cid == (!empty($_REQUEST['cid'])
                                    ? Request::getInt('cid', 0, 'REQUEST')
                                    : $object->getVar('cid'))) {
                                $key              = (isset($all_categories[$cid]) ? $all_categories[$cid]['weight'] : 0)
                                                    * $count_fields + $object->getVar('cid');
                                $elements[$key][] = $fieldinfo;
                                $weights[$key][]  = $fields[$i]->getVar('field_weight');
                            } elseif (\in_array(0, $fields[$i]->getVar('cids'), true)) {
                                $key              = (isset($all_categories[$cid]) ? $all_categories[$cid]['weight'] : 0) * $count_fields + $object->getVar('cid');
                                $elements[$key][] = $fieldinfo;
                                $weights[$key][]  = $fields[$i]->getVar('field_weight');
                            }
                        }
                    }
                }
            }
        }
        if (\is_array($elements)) {
            \ksort($elements);
            foreach (\array_keys($elements) as $k) {
                \array_multisort($weights[$k], \SORT_ASC, \array_keys($elements[$k]), \SORT_ASC, $elements[$k]);
                foreach (\array_keys($elements[$k]) as $i) {
                    $ele[$k] = $elements[$k][$i]['element'];
                    if (true === $elements[$k][$i]['required']) {
                        $required[$k] = $elements[$k][$i]['element']->getName();
                    }
                }
            }
        }

        if (\class_exists(\XoopsModules\Tag\FormTag::class)) {
            $ele['tags'] = new \XoopsModules\Tag\FormTag('tags', 60, 255, $object->getVar('sid'), $object->getVar('cid'));
        } else {
            $ele['tags'] = new \XoopsFormHidden('tags', $object->getVar('tags'));
        }

        $ele['hits'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_HITS : ''), $object->getVar('hits'));
        $ele['rank'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_RANK : ''), \number_format(($object->getVar('rank') > 0 && $object->getVar('votes') > 0 ? $object->getVar('rank') / $object->getVar('votes') : 0), 2) . ' of 10');
        if ($object->getVar('created') > 0) {
            $ele['created'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_CREATED : ''), \date(\_DATESTRING, $object->getVar('created')));
        }
        if ($object->getVar('updated') > 0) {
            $ele['updated'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_SONGS_UPDATED : ''), \date(\_DATESTRING, $object->getVar('updated')));
        }
        if ($as_array) {
            return $ele;
        }

        $ele['submit'] = new \XoopsFormButton('', 'submit', \_SUBMIT, 'submit');

        foreach ($ele as $id => $obj) {
            if (\in_array($id, $required, true)) {
                $sform->addElement($obj, true);
            } else {
                $sform->addElement($obj, false);
            }
        }

        return $sform->render();
    }

    /**
     * @param      $object
     * @param bool $as_array
     * @return array|string
     */
    public static function  getFormVotes($object, $as_array = false)
    {
        if (!\is_object($object)) {
            $handler = Helper::getInstance()
                             ->getHandler('Votes');
            $object  = $handler->create();
        }

        \xoops_loadLanguage('forms', 'songlist');
        $ele = [];

        if ($object->isNew()) {
            $sform       = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_ISNEW_CART, 'votes', $_SERVER['SCRIPT_NAME'], 'post', true);
            $ele['mode'] = new \XoopsFormHidden('mode', 'new');
        } else {
            $sform       = new \XoopsThemeForm(\_FRM_SONGLIST_FORM_EDIT_CART, 'votes', $_SERVER['SCRIPT_NAME'], 'post', true);
            $ele['mode'] = new \XoopsFormHidden('mode', 'edit');
        }

        $sform->setExtra("enctype='multipart/form-data'");

        $id = $object->getVar('cid');
        if (empty($id)) {
            $id = '0';
        }

        $ele['op']  = new \XoopsFormHidden('op', 'votes');
        $ele['fct'] = new \XoopsFormHidden('fct', 'save');
        if ($as_array) {
            $ele['id'] = new \XoopsFormHidden('id', $id);
        } else {
            $ele['id'] = new \XoopsFormHidden('id[' . $id . ']', $id);
        }
        $ele['sort']   = new \XoopsFormHidden('sort', $_REQUEST['sort'] ?? 'created');
        $ele['order']  = new \XoopsFormHidden('order', $_REQUEST['order'] ?? 'DESC');
        $ele['start']  = new \XoopsFormHidden('start', (string)Request::getInt('start', 0, 'REQUEST'));
        $ele['limit']  = new \XoopsFormHidden('limit', (string)Request::getInt('limit', 0, 'REQUEST'));
        $ele['filter'] = new \XoopsFormHidden('filter', $_REQUEST['filter'] ?? '1,1');

        $songsHandler = Helper::getInstance()
                              ->getHandler('Songs');
        $userHandler  = \xoops_getHandler('user');
        $song         = $songsHandler->get($object->getVar('sid'));
        $user         = $userHandler->get($object->getVar('uid'));
        if (\is_object($song)) {
            $ele['sid'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_VOTES_SONG : ''), $song->getVar('title'));
        } else {
            $ele['sid'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_VOTES_SONG : ''), $object->getVar('sid'));
        }
        if (\is_object($user)) {
            $ele['uid'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_VOTES_USER : ''), $user->getVar('uname'));
        } else {
            $ele['uid'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_VOTES_USER : ''), \_GUESTS);
        }
        $ele['ip']      = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_VOTES_IP : ''), $object->getVar('ip'));
        $ele['netaddy'] = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_VOTES_NETADDY : ''), $object->getVar('netaddy'));
        $ele['rank']    = new \XoopsFormLabel((!$as_array ? \_FRM_SONGLIST_FORM_VOTES_RANK : ''), $object->getVar('rank') . ' of 10');

        if ($as_array) {
            return $ele;
        }

        $ele['submit'] = new \XoopsFormButton('', 'submit', \_SUBMIT, 'submit');

        $required = [];

        foreach ($ele as $id => $obj) {
            if (\in_array($id, $required, true)) {
                $sform->addElement($obj, true);
            } else {
                $sform->addElement($obj, false);
            }
        }

        return $sform->render();
    }
}