Example #1
0
 /**
  * @param $table
  * @param array $params [data, action, button, fields[], unset[], order[]]
  * @return CmsForm
  */
 public static function outputForm($table, array $params = [])
 {
     // Maybe only one argument
     if (!$params) {
         $params['db_table'] = $table;
     }
     // Convert data to array
     if (isset($params['data']) && is_object($params['data'])) {
         /** @var Entity $obj */
         $obj = $params['data'];
         $params['data'] = $obj->getAsArray();
     }
     if (!isset($params['fields'])) {
         $params['fields'] = [];
     } else {
         $params['fields'] = self::normalizeFields($params['fields']);
     }
     // Generate fields from DB and combine with provided params
     if (isset($params['combine']) && $params['combine']) {
         $sort_order = isset($params['order']) ? $params['order'] : array_keys($params['fields']);
         $params['fields'] = array_merge(self::combineParamsFromDB($table, $sort_order), $params['fields']);
     }
     if (isset($params['unset'])) {
         foreach ($params['unset'] as $v) {
             unset($params['fields'][$v]);
         }
     }
     // Generate form
     $form = new CmsForm();
     if (!isset($params['action'])) {
         $tmp = $_GET;
         $tmp['do'] = '_' . $tmp['do'];
         $params['action'] = urldecode('?' . http_build_query($tmp));
     }
     if (isset($params['action'])) {
         $form->setAction($params['action']);
     }
     if (isset($params['title'])) {
         $form->setFormTitle($params['title']);
     }
     if (isset($params['button'])) {
         $form->setSubmitButton($params['button']);
     }
     if (isset($params['collapsed'])) {
         $form->setCollapsed($params['collapsed']);
     }
     if (isset($params['ajax']) && $params['ajax']) {
         $form->enableAjax();
     }
     if (isset($params['cancel']) && $params['cancel']) {
         if (is_bool($params['cancel'])) {
             $params['cancel'] = __('Cancel');
         }
         $form->setCancelButton($params['cancel']);
     }
     if (isset($params['fields'])) {
         foreach ($params['fields'] as $key => $field) {
             if (!is_array($field)) {
                 $key = $field;
             }
             // Field label
             if (isset($field['title'])) {
                 $name = $field['title'];
             } elseif (isset($field['name'])) {
                 $name = $field['name'];
             } else {
                 $name = Converter::symb2Ttl($key);
             }
             //
             if (isset($params['field_key_prefix'])) {
                 $key = $params['field_key_prefix'] . $key;
             }
             // Input type
             $cms_field = NULL;
             // Known types
             if (!isset($field['type']) && isset($field['options'])) {
                 $field['type'] = 'select';
             }
             if (!isset($field['type']) && isset($field['checked'])) {
                 $field['type'] = 'checkbox';
             }
             if (!isset($field['type']) && isset($field['rows'])) {
                 $field['type'] = 'textarea';
             }
             // Set field object
             if (!isset($field['type']) || $field['type'] == 'text') {
                 $cms_field = CmsInputText::getInstance($key);
             } elseif ($field['type'] == 'select' && (!isset($field['multi']) || isset($field['multi']) && !$field['multi'])) {
                 $cms_field = CmsSelect::getInstance($key);
                 // Selected value
                 if (isset($field['value'])) {
                     $cms_field->setSelected($field['value']);
                 }
             } elseif ($field['type'] == 'multiselect' || $field['type'] == 'multi' || isset($field['multi']) && $field['multi']) {
                 $cms_field = CmsMultipleSelect::getInstance($key);
             } elseif ($field['type'] == 'checkbox_list') {
                 $cms_field = CmsCheckboxList::getInstance($key);
                 // Set checked checkboxes in list
                 if (isset($params['data'][$key])) {
                     $field['checked'] = (array) $params['data'][$key];
                 }
             } elseif ($field['type'] == 'datetime' || $field['type'] == 'time' || $field['type'] == 'date') {
                 // Options for JS datepicker plugin
                 if (!isset($field['options'])) {
                     $field['options'] = [];
                 }
                 $cms_field = CmsInputText::getInstance($key)->enableDateTimePicker($field['options']);
                 // Default time
                 if (!isset($params['data'][$key])) {
                     $params['data'][$key] = NOW;
                 }
                 // Set value from db in required format from timestamp
                 if (isset($params['data'][$key]) && ctype_digit((string) $params['data'][$key])) {
                     $params['data'][$key] = date('Y-m-d H:i', $params['data'][$key]);
                     // Convert ts to date
                 }
                 if (isset($field['format'])) {
                     $cms_field->setFormat($field['format']);
                 }
             } elseif ($field['type'] == 'password') {
                 $cms_field = CmsInputPassword::getInstance($key);
             } elseif ($field['type'] == 'row') {
                 if (isset($field['value'])) {
                     $cms_field = CmsRow::getInstance($key)->value($field['value']);
                 }
             } elseif ($field['type'] == 'random') {
                 $cms_field = CmsInputTextRandom::getInstance($key);
             } elseif ($field['type'] == 'checkbox') {
                 $cms_field = CmsCheckbox::getInstance($key);
                 // checked box
                 if (isset($field['value']) && $field['value']) {
                     $cms_field->setChecked(true);
                 }
             } elseif ($field['type'] == 'radio_group') {
                 $cms_field = CmsRadioBox::getInstance($key);
             } elseif ($field['type'] == 'email') {
                 $cms_field = CmsInputEmail::getInstance($key);
             } elseif ($field['type'] == 'textarea' || $field['type'] == 'text') {
                 $cms_field = CmsTextarea::getInstance($key);
             } elseif ($field['type'] == 'number' || $field['type'] == 'digit' || $field['type'] == 'int') {
                 $cms_field = CmsInputNumber::getInstance($key);
             } elseif ($field['type'] == 'datalist') {
                 $cms_field = CmsInputDataList::getInstance($key);
             } elseif ($field['type'] == 'hidden') {
                 $cms_field = CmsInputHidden::getInstance($key);
             } elseif ($field['type'] == 'file') {
                 $cms_field = CmsInputFile::getInstance($key);
             } elseif ($field['type'] == 'color') {
                 $cms_field = CmsInputColor::getInstance($key);
             }
             if ($cms_field) {
                 // Extra params
                 if (isset($field['options']) && is_array($field['options'])) {
                     $cms_field->setOptions($field['options']);
                 }
                 if (isset($field['options']) && $field['type'] == 'checkbox_list') {
                     $cms_field->setCheckboxes($field['options']);
                 }
                 if (isset($field['buttons']) && $field['type'] == 'radio_group') {
                     $cms_field->setRadioButtons($field['buttons']);
                     if (isset($params['data'][$key])) {
                         $cms_field->setSelected($params['data'][$key]);
                     }
                 }
                 if (isset($field['checked'])) {
                     $cms_field->setChecked($field['checked']);
                 }
                 if (isset($field['value'])) {
                     $cms_field->value($field['value']);
                 }
                 if (isset($field['selected'])) {
                     $cms_field->setSelected($field['selected']);
                 }
                 if (isset($field['multiple'])) {
                     $cms_field->multiple(true);
                 }
                 if (isset($field['multilng'])) {
                     $cms_field->enableMultiLng();
                 }
                 if (isset($field['translation'])) {
                     $cms_field->enableMultiLng();
                 }
                 if (isset($field['required'])) {
                     $cms_field->validateRequired();
                 }
                 if (isset($field['uid'])) {
                     $cms_field->setUid($field['uid']);
                 }
                 // Disable custom css styles for select elements
                 if (isset($field['disable_custom_plugin'])) {
                     $cms_field->disableCustomStyled();
                 }
                 // Autogenerated slug
                 if (isset($field['uid'])) {
                     $to = $field['uid'];
                     // Check if we need to change key for current language translation
                     if (isset($params['fields'][$field['uid']]['translation']) && $params['fields'][$field['uid']]['translation']) {
                         $to = $to . '_' . LNG . '_';
                     }
                     $cms_field->enableSlugGenerationUidFromField($key, $to);
                 }
                 if (isset($field['readonly']) && $field['readonly']) {
                     $cms_field->readonly(true);
                 }
                 if (isset($field['html'])) {
                     $cms_field->html($field['html']);
                 }
                 if (isset($field['rows'])) {
                     $cms_field->rows($field['rows']);
                 }
                 if (isset($field['backup'])) {
                     $cms_field->backup($field['backup']);
                 }
                 if (isset($field['hint'])) {
                     $cms_field->setHintText($field['hint']);
                 }
                 if (isset($field['min'])) {
                     $cms_field->min($field['min']);
                 }
                 if (isset($field['max'])) {
                     $cms_field->max($field['max']);
                 }
                 if (isset($field['step'])) {
                     $cms_field->step($field['step']);
                 }
                 if (isset($field['reveal'])) {
                     $cms_field->reveal($field['reveal']);
                 }
                 if (isset($field['maxlength'])) {
                     $cms_field->maxlength($field['maxlength']);
                 }
                 // Editors
                 if (isset($field['edit'])) {
                     switch ($field['edit']) {
                         default:
                             dump('Widget for edit type "' . $field['edit'] . '" not found');
                             break;
                             // Visual editor
                         // Visual editor
                         case 'wysiwyg':
                             $cms_field->enableWysiwyg();
                             break;
                             // Google map for choosing coordinates
                         // Google map for choosing coordinates
                         case 'map':
                             $cms_field->enableGoogleMap();
                             break;
                             // Structure pages
                         // Structure pages
                         case 'pages':
                             $cms_field->setWidget(new SitemapPages());
                             break;
                             // SVG image handling for choosing polygon section
                         // SVG image handling for choosing polygon section
                         case 'svg_map':
                             // We need path to set for widget
                             if (!isset($params['fields'][$key . '_path'])) {
                                 dump('Form must have field "' . $key . '_path" with path for svg image.');
                             }
                             $path = '';
                             if (isset($params['data'][$key . '_path'])) {
                                 $path = $params['data'][$key . '_path'];
                             }
                             $svg_map = new SvgMap();
                             $svg_map->setSvgImagePath($path);
                             $cms_field->setWidget($svg_map);
                             break;
                             // Integrated filemanager
                         // Integrated filemanager
                         case 'files':
                         case 'filemanager':
                             $file_manager = FileManager::getInstance();
                             // Default path for filemanager
                             if (isset($field['path'])) {
                                 $file_manager->path($field['path']);
                             }
                             // Allow upload of only these extensions
                             if (isset($field['allowed_extensions'])) {
                                 $file_manager->setAllowedExtensions($field['allowed_extensions']);
                             }
                             // Refresh page after filemanager is closed
                             if (isset($field['reload'])) {
                                 $file_manager->enablePageReloadOnClose();
                             }
                             $cms_field->setWidget($file_manager);
                             break;
                             // Structure pages
                         // Structure pages
                         case 'custom':
                             $widget = Custom::getInstance();
                             if (isset($field['url'])) {
                                 $widget->setModalPopupAjaxUrl($field['url']);
                             }
                             $cms_field->setWidget($widget);
                             break;
                     }
                 }
                 // Validators
                 if (isset($field['validate'])) {
                     if (isset($field['validate']['required']) || in_array('required', $field['validate'])) {
                         $cms_field->validateRequired();
                     }
                     if (isset($field['validate']['is_digit']) || in_array('is_digit', $field['validate'])) {
                         $cms_field->validateDigits();
                     }
                     if (isset($field['validate']['number']) || in_array('number', $field['validate'])) {
                         $cms_field->validateNumber();
                     }
                     if (isset($field['validate']['alphanum']) || in_array('alphanum', $field['validate'])) {
                         $cms_field->validateAlphaNumeric();
                     }
                     if (isset($field['validate']['url']) || in_array('url', $field['validate'])) {
                         $cms_field->validateUrl();
                     }
                     if (isset($field['validate']['email']) || in_array('email', $field['validate'])) {
                         $cms_field->validateEmail();
                     }
                 }
                 $form->addField($name, $cms_field);
             }
         }
     }
     if (isset($params['data'])) {
         $form->addData($params['data']);
     }
     return $form;
 }
 /**
  * @return Element
  */
 public function getFieldView()
 {
     $field = NULL;
     // Type
     switch ($this->field_type) {
         default:
         case 'text':
             $field = CmsInputText::getInstance($this->component_name);
             break;
         case 'textarea':
             $field = CmsTextarea::getInstance($this->component_name);
             // Height
             if (isset($this->field_value['rows'])) {
                 $field->setRowCount($this->field_value['rows']);
             }
             break;
         case 'checkbox':
             $field = CmsCheckbox::getInstance($this->component_name);
             // Checked
             if (!isset($this->field_value['checked']) && isset($this->data[$this->component_name])) {
                 $this->field_value['checked'] = $this->data[$this->component_name];
             }
             if (isset($this->field_value['checked'])) {
                 $field->setChecked($this->field_value['checked']);
             }
             break;
         case 'checkbox_list':
             $field = CmsCheckboxList::getInstance($this->component_name);
             if (isset($this->field_value['checkboxes'])) {
                 $field->setCheckboxes($this->field_value['checkboxes']);
             }
             if (!isset($this->field_value['selected']) && isset($this->data[$this->component_name])) {
                 $this->field_value['selected'] = unserialize($this->data[$this->component_name]);
             }
             if (isset($this->field_value['selected'])) {
                 $field->setChecked(array_keys($this->field_value['selected']));
             }
             $field->setListView(true);
             break;
         case 'options':
         case 'select':
             $field = CmsSelect::getInstance($this->component_name);
             // Options
             if (isset($this->field_value['options'])) {
                 $field->setOptions($this->field_value['options']);
             }
             // Selected options
             if (!isset($this->field_value['selected']) && isset($this->data[$this->component_name])) {
                 $this->field_value['selected'] = $this->data[$this->component_name];
             }
             if (isset($this->field_value['selected'])) {
                 $field->setSelected($this->field_value['selected']);
                 $this->selected = $this->field_value['selected'];
             } else {
                 $this->selected = false;
             }
             break;
         case 'multiselect':
             $field = CmsMultipleSelect::getInstance($this->component_name);
             if (isset($this->field_value['options'])) {
                 $field->setOptions($this->field_value['options']);
             }
             if (!isset($this->field_value['selected']) && isset($this->data[$this->component_name])) {
                 $this->field_value['selected'] = $this->data[$this->component_name];
             }
             if (isset($this->field_value['selected'])) {
                 $field->setSelected($this->field_value['selected']);
                 $this->selected = $this->field_value['selected'];
             } else {
                 $this->selected = false;
             }
             $field->helper(false);
             break;
         case 'tags':
             $field = CmsInputTags::getInstance($this->component_name);
             break;
         case 'custom':
             // Skip because we have separate page for it
             break;
     }
     // Required for Widgets
     if ($field) {
         $field->setAttribute('data-page_id', $this->page_id);
     }
     // Set Widget
     switch ($this->widget_type) {
         case '':
             break;
         case 'wysiwyg':
             $field->enableWysiwyg();
             break;
         case 'tinymce':
             $field->enableWysiwyg();
             break;
         case 'calendar':
             $widget = new Calendar();
             if (isset($this->field_value['format'])) {
                 $widget->dateFormat($this->field_value['format']);
             }
             if (isset($this->field_value['showtime'])) {
                 $widget->showTime($this->field_value['showtime']);
             }
             $field->setWidget($widget);
             break;
         case 'files':
             $widget = new FileManager();
             // Path to opened folder
             if (isset($this->field_value['path'])) {
                 if (!file_exists(DIR_BASE . $this->field_value['path'])) {
                     FileSystem::mkDir(DIR_BASE . $this->field_value['path']);
                 }
                 $widget->path($this->field_value['path']);
             }
             // Allowed extensions
             if (isset($this->field_value['allowed_extensions'])) {
                 $widget->setAllowedExtensions($this->field_value['allowed_extensions']);
             }
             $field->setWidget($widget);
             break;
         case 'pages':
             $field->setWidget(new SitemapPages());
             break;
         case 'map':
             $field->enableGoogleMap();
             break;
     }
     // Special features for field
     if (isset($this->field_value['hint'])) {
         $field->setHintText($this->field_value['hint']);
     }
     return $field;
 }