Example #1
0
 public function run()
 {
     if (!$this->request->isAjax()) {
         cmsCore::error404();
     }
     $field_id = $this->request->get('field_id', 0);
     $field_type = $this->request->get('type', '');
     $field_class = 'field' . string_to_camel('_', $field_type);
     if (!class_exists($field_class)) {
         cmsCore::error404();
     }
     $base_field = new $field_class(null, null);
     $options = $base_field->getOptions();
     $values = false;
     if ($options && $field_id) {
         $content_model = cmsCore::getModel('content');
         $content_model->setTablePrefix('');
         $field = $content_model->getContentField('{users}', $field_id);
         $values = $field['options'];
     }
     $options_js_file = $this->cms_template->getJavascriptFileName('fields/' . $field_type);
     if ($options_js_file) {
         $this->cms_template->addJSFromContext($options_js_file);
     }
     $this->cms_template->render('backend/field_options', array('is_can_in_filter' => $base_field->filter_type !== false, 'options' => $options, 'values' => $values));
 }
Example #2
0
 public function __construct()
 {
     $config = cmsConfig::getInstance();
     if ($config->cache_enabled) {
         $cacher_class = 'cmsCache' . string_to_camel('_', $config->cache_method);
         $this->cacher = new $cacher_class();
         $this->cache_ttl = $config->cache_ttl;
         $this->is_debug = $config->debug;
     }
 }
Example #3
0
 public function loadControllerBackend($controller_name, $request)
 {
     $config = cmsConfig::getInstance();
     $ctrl_file = $config->root_path . 'system/controllers/' . $controller_name . '/backend.php';
     if (!file_exists($ctrl_file)) {
         $this->halt(sprintf(LANG_CP_ERR_BACKEND_NOT_FOUND, $controller_name));
     }
     include_once $ctrl_file;
     $controller_class = 'backend' . string_to_camel('_', $controller_name);
     $backend = new $controller_class($request);
     return $backend;
 }
Example #4
0
 public function run($ctype_id)
 {
     if (!$ctype_id) {
         cmsCore::error404();
     }
     $content_model = cmsCore::getModel('content');
     $ctype = $content_model->getContentType($ctype_id);
     if (!$ctype) {
         cmsCore::error404();
     }
     $form = $this->getForm('ctypes_field', array('add', $ctype['name']));
     $is_submitted = $this->request->has('submit');
     $field = array('ctype_id' => $ctype['id']);
     if ($is_submitted) {
         // добавляем поля настроек типа поля в общую форму
         // чтобы они были обработаны парсером и валидатором
         // вместе с остальными полями
         if (empty($field['is_system'])) {
             $field_type = $this->request->get('type');
             $field_class = "field" . string_to_camel('_', $field_type);
             $field_object = new $field_class(null, null);
             $field_options = $field_object->getOptions();
             foreach ($field_options as $option_field) {
                 $option_field->setName("options:{$option_field->name}");
                 $form->addField('type', $option_field);
             }
         }
         $field = $form->parse($this->request, $is_submitted);
         $errors = $form->validate($this, $field);
         $field['ctype_id'] = $ctype['id'];
         if (!$errors) {
             // если не выбрана группа, обнуляем поле группы
             if (!$field['fieldset']) {
                 $field['fieldset'] = null;
             }
             // если создается новая группа, то выбираем ее
             if ($field['new_fieldset']) {
                 $field['fieldset'] = $field['new_fieldset'];
             }
             unset($field['new_fieldset']);
             // сохраняем поле
             $field_id = $content_model->addContentField($ctype['name'], $field);
             if ($field_id) {
                 cmsUser::addSessionMessage(sprintf(LANG_CP_FIELD_CREATED, $field['title']), 'success');
             }
             $this->redirectToAction('ctypes', array('fields', $ctype['id']));
         }
         if ($errors) {
             cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error');
         }
     }
     return cmsTemplate::getInstance()->render('ctypes_field', array('do' => 'add', 'ctype' => $ctype, 'field' => $field, 'form' => $form, 'errors' => isset($errors) ? $errors : false));
 }
Example #5
0
 public function loadControllerBackend($controller_name, $request)
 {
     $config = cmsConfig::getInstance();
     $ctrl_file = $config->root_path . 'system/controllers/' . $controller_name . '/backend.php';
     if (!file_exists($ctrl_file)) {
         cmsCore::error(sprintf(LANG_CP_ERR_BACKEND_NOT_FOUND, $controller_name));
     }
     include_once $ctrl_file;
     $controller_class = 'backend' . string_to_camel('_', $controller_name);
     $backend = new $controller_class($request);
     // Устанавливаем корень для URL внутри бакенда
     $backend->setRootURL($this->name . '/controllers/edit/' . $controller_name);
     return $backend;
 }
Example #6
0
 public function run()
 {
     $content_model = cmsCore::getModel('content');
     $content_model->setTablePrefix('');
     $form = $this->getForm('field', array('add'));
     $form = cmsEventsManager::hook('user_field_form', $form);
     $field = array('ctype_id' => 'users');
     if ($this->request->has('submit')) {
         // добавляем поля настроек типа поля в общую форму
         // чтобы они были обработаны парсером и валидатором
         // вместе с остальными полями
         $field_type = $this->request->get('type');
         $field_class = "field" . string_to_camel('_', $field_type);
         $field_object = new $field_class(null, null);
         $field_options = $field_object->getOptions();
         foreach ($field_options as $option_field) {
             $option_field->setName("options:{$option_field->name}");
             $form->addField('type', $option_field);
         }
         $field = $form->parse($this->request, true);
         $errors = $form->validate($this, $field);
         if (!$errors) {
             $field['ctype_id'] = null;
             // если не выбрана группа, обнуляем поле группы
             if (!$field['fieldset']) {
                 $field['fieldset'] = null;
             }
             // если создается новая группа, то выбираем ее
             if ($field['new_fieldset']) {
                 $field['fieldset'] = $field['new_fieldset'];
             }
             unset($field['new_fieldset']);
             // сохраняем поле
             $field_id = $content_model->addContentField('{users}', $field);
             if ($field_id) {
                 cmsUser::addSessionMessage(sprintf(LANG_CP_FIELD_CREATED, $field['title']), 'success');
             }
             $this->redirectToAction('fields');
         }
         if ($errors) {
             cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error');
         }
     }
     return $this->cms_template->render('backend/field', array('do' => 'add', 'field' => $field, 'form' => $form, 'errors' => isset($errors) ? $errors : false));
 }
Example #7
0
 public function run()
 {
     if (!$this->request->isAjax()) {
         cmsCore::error404();
     }
     $field_id = $this->request->get('field_id');
     $field_type = $this->request->get('type');
     $field_class = 'field' . string_to_camel('_', $field_type);
     $base_field = new $field_class(null, null);
     $options = $base_field->getOptions();
     if (!$options) {
         $this->halt();
     }
     $values = false;
     if ($field_id) {
         $content_model = cmsCore::getModel('content');
         $content_model->setTablePrefix('');
         $field = $content_model->getContentField('{users}', $field_id);
         $values = $field['options'];
     }
     cmsTemplate::getInstance()->render('backend/field_options', array('options' => $options, 'values' => $values));
 }
Example #8
0
 public function updateContentField($ctype_name, $id, $field)
 {
     $content_table_name = $this->table_prefix . $ctype_name;
     $fields_table_name = $this->table_prefix . $ctype_name . '_fields';
     $field_old = $this->getContentField($ctype_name, $id);
     if (!$field_old['is_system']) {
         if ($field_old['name'] != $field['name'] || $field_old['type'] != $field['type']) {
             $field_class = "field" . string_to_camel('_', $field['type']);
             $field_handler = new $field_class(null, null);
             $sql = "ALTER TABLE  `{#}{$content_table_name}` CHANGE  `{$field_old['name']}` `{$field['name']}` {$field_handler->getSQL()}";
             $this->db->query($sql);
         }
     }
     return $this->update($fields_table_name, $id, $field);
 }
Example #9
0
 public function updateContentField($ctype_name, $id, $field)
 {
     $content_table_name = $this->table_prefix . $ctype_name;
     $fields_table_name = $this->table_prefix . $ctype_name . '_fields';
     $field_old = $this->getContentField($ctype_name, $id);
     if (!$field_old['is_system']) {
         $new_lenght = isset($field['options']) && !empty($field['options']['max_length']) ? $field['options']['max_length'] : false;
         $old_lenght = isset($field_old['options']) && !empty($field_old['options']['max_length']) ? $field_old['options']['max_length'] : false;
         $field_class = 'field' . string_to_camel('_', $field['type']);
         $field_handler = new $field_class(null, isset($field['options']) ? array('options' => $field['options']) : null);
         if ($field_old['name'] != $field['name'] || $field_old['type'] != $field['type'] || $new_lenght != $old_lenght) {
             $sql = "ALTER TABLE  `{#}{$content_table_name}` CHANGE  `{$field_old['name']}` `{$field['name']}` {$field_handler->getSQL()}";
             $this->db->query($sql);
             if ($field_old['name'] != $field['name'] || $field_old['type'] != $field['type']) {
                 // удаляем старый индекс
                 $this->db->dropIndex($content_table_name, $field_old['name']);
                 // добавляем новый
                 if ($field['is_in_filter'] && $field_handler->allow_index) {
                     $this->db->addIndex($content_table_name, $field['name']);
                 }
             }
         }
         if ($field['is_in_filter'] && $field_handler->allow_index && !$field_old['is_in_filter']) {
             $this->db->addIndex($content_table_name, $field['name']);
         }
         if (!$field['is_in_filter'] && $field_handler->allow_index && $field_old['is_in_filter']) {
             $this->db->dropIndex($content_table_name, $field_old['name']);
         }
         // если есть опция полнотекстового поиска и ее значение изменилось
         if (is_array($field['options']) && array_key_exists('in_fulltext_search', $field['options'])) {
             if ($field['options']['in_fulltext_search'] != @$field_old['options']['in_fulltext_search']) {
                 // получаем полнотекстовый индекс для таблицы, он может быть только один
                 $fulltext_index = $this->db->getTableIndexes($content_table_name, 'FULLTEXT');
                 if ($fulltext_index) {
                     // название индекса
                     $index_name = key($fulltext_index);
                     // поля индекса
                     $index_fields = $fulltext_index[$index_name];
                     // выключили опцию
                     if (!$field['options']['in_fulltext_search']) {
                         $key = array_search($field['name'], $index_fields);
                         // нашли - удаляем из массива
                         if ($key !== false) {
                             unset($index_fields[$key]);
                             // удаляем индекс
                             $this->db->dropIndex($content_table_name, $index_name);
                             // и создаем новый
                             if ($index_fields) {
                                 $this->db->addIndex($content_table_name, $index_fields, '', 'FULLTEXT');
                             }
                         }
                     }
                     // включили опцию
                     if ($field['options']['in_fulltext_search']) {
                         // ищем, нет ли такого поля уже в индексе, мало ли :-)
                         $key = array_search($field['name'], $index_fields);
                         // не нашли, добавляем
                         if ($key === false) {
                             // удаляем старый индекс
                             $this->db->dropIndex($content_table_name, $index_name);
                             // создаем новый
                             $this->createFullTextIndex($ctype_name, $field['name']);
                         }
                     }
                 }
             }
         }
     }
     return $this->update($fields_table_name, $id, $field);
 }
Example #10
0
 public function runWidget($widget)
 {
     $user = cmsUser::getInstance();
     $is_user_view = $user->isInGroups($widget['groups_view']);
     $is_user_hide = !empty($widget['groups_hide']) && $user->isInGroups($widget['groups_hide']) && !$user->is_admin;
     if ($is_user_hide) {
         return false;
     }
     if (!$is_user_view) {
         return false;
     }
     $path = 'system/' . cmsCore::getWidgetPath($widget['name'], $widget['controller']);
     $file = $path . '/widget.php';
     cmsCore::includeFile($file);
     cmsCore::loadWidgetLanguage($widget['name'], $widget['controller']);
     $class = 'widget' . ($widget['controller'] ? string_to_camel('_', $widget['controller']) : '') . string_to_camel('_', $widget['name']);
     $widget_object = new $class($widget);
     $cache_key = "widgets.{$widget['id']}";
     $cache = cmsCache::getInstance();
     if (!$widget_object->isCacheable() || false === ($result = $cache->get($cache_key))) {
         $result = call_user_func_array(array($widget_object, 'run'), array());
         if ($result) {
             // Отдельно кешируем имя шаблона виджета, поскольку оно могло быть
             // изменено внутри виджета, а в кеш у нас попадает только тот массив
             // который возвращается кодом виджета (без самих свойств $widget_object)
             $result['_wd_template'] = $widget_object->getTemplate();
         }
         $cache->set($cache_key, $result);
     }
     if ($result === false) {
         return false;
     }
     if (isset($result['_wd_template'])) {
         $widget_object->setTemplate($result['_wd_template']);
     }
     cmsTemplate::getInstance()->renderWidget($widget_object, $result);
 }
Example #11
0
 public function updateContentField($ctype_name, $id, $field)
 {
     $content_table_name = $this->table_prefix . $ctype_name;
     $fields_table_name = $this->table_prefix . $ctype_name . '_fields';
     $field_old = $this->getContentField($ctype_name, $id);
     if (!$field_old['is_system']) {
         $new_lenght = isset($field['options']) && !empty($field['options']['max_length']) ? $field['options']['max_length'] : false;
         $old_lenght = isset($field_old['options']) && !empty($field_old['options']['max_length']) ? $field_old['options']['max_length'] : false;
         $field_class = 'field' . string_to_camel('_', $field['type']);
         $field_handler = new $field_class(null, isset($field['options']) ? array('options' => $field['options']) : null);
         if ($field_old['name'] != $field['name'] || $field_old['type'] != $field['type'] || $new_lenght != $old_lenght) {
             if ($field_old['type'] != $field['type']) {
                 $this->db->dropIndex($content_table_name, $field_old['name']);
             }
             $sql = "ALTER TABLE `{#}{$content_table_name}` CHANGE `{$field_old['name']}` `{$field['name']}` {$field_handler->getSQL()}";
             $this->db->query($sql);
             if ($field_old['name'] != $field['name'] || $field_old['type'] != $field['type']) {
                 // поля денормализации
                 $old_cfield_name = $field_old['name'] . cmsFormField::FIELD_CACHE_POSTFIX;
                 $new_cfield_name = $field['name'] . cmsFormField::FIELD_CACHE_POSTFIX;
                 $update_cache_sql = "ALTER TABLE `{#}{$content_table_name}` CHANGE `{$old_cfield_name}` `{$new_cfield_name}` {$field_handler->getCacheSQL()}";
                 // изменилось только имя поля
                 if ($field_handler->is_denormalization && $field_old['type'] == $field['type']) {
                     $this->db->query($update_cache_sql);
                 }
                 // изменился тип
                 if ($field_old['type'] != $field['type']) {
                     if ($field_old['parser']->is_denormalization && $field_handler->is_denormalization) {
                         $this->db->query($update_cache_sql);
                     } elseif ($field_old['parser']->is_denormalization && !$field_handler->is_denormalization) {
                         $this->db->dropTableField($content_table_name, $old_cfield_name);
                     } elseif (!$field_old['parser']->is_denormalization && $field_handler->is_denormalization) {
                         $sql = "ALTER TABLE {#}{$content_table_name} ADD `{$new_cfield_name}` {$field_handler->getCacheSQL()}";
                         $this->db->query($sql);
                     }
                 }
                 // удаляем старый индекс
                 $this->db->dropIndex($content_table_name, $field_old['name']);
                 // добавляем новый
                 if ($field['is_in_filter'] && $field_handler->allow_index) {
                     $this->db->addIndex($content_table_name, $field['name']);
                 }
             }
         }
         if ($field['is_in_filter'] && $field_handler->allow_index && !$field_old['is_in_filter']) {
             $this->db->addIndex($content_table_name, $field['name']);
         }
         if (!$field['is_in_filter'] && $field_handler->allow_index && $field_old['is_in_filter']) {
             $this->db->dropIndex($content_table_name, $field_old['name']);
         }
         // если есть опция полнотекстового поиска и ее значение изменилось
         if (is_array($field['options']) && array_key_exists('in_fulltext_search', $field['options'])) {
             if ($field['options']['in_fulltext_search'] != @$field_old['options']['in_fulltext_search']) {
                 // получаем полнотекстовый индекс для таблицы, он может быть только один
                 $fulltext_index = $this->db->getTableIndexes($content_table_name, 'FULLTEXT');
                 if ($fulltext_index) {
                     // название индекса
                     $index_name = key($fulltext_index);
                     // поля индекса
                     $index_fields = $fulltext_index[$index_name];
                     // выключили опцию
                     if (!$field['options']['in_fulltext_search']) {
                         $key = array_search($field['name'], $index_fields);
                         // нашли - удаляем из массива
                         if ($key !== false) {
                             unset($index_fields[$key]);
                             // удаляем индекс
                             $this->db->dropIndex($content_table_name, $index_name);
                             // и создаем новый
                             if ($index_fields) {
                                 $this->db->addIndex($content_table_name, $index_fields, '', 'FULLTEXT');
                             }
                         }
                     }
                     // включили опцию
                     if ($field['options']['in_fulltext_search']) {
                         // ищем, нет ли такого поля уже в индексе, мало ли :-)
                         $key = array_search($field['name'], $index_fields);
                         // не нашли, добавляем
                         if ($key === false) {
                             // удаляем старый индекс
                             $this->db->dropIndex($content_table_name, $index_name);
                             // создаем новый
                             $this->createFullTextIndex($ctype_name, $field['name']);
                         }
                     }
                 }
             }
         }
     }
     $result = $this->update($fields_table_name, $id, $field);
     if ($result) {
         $field['id'] = $id;
         cmsEventsManager::hook('ctype_field_after_update', array($field, $ctype_name, $this));
     }
     cmsCache::getInstance()->clean("content.fields.{$ctype_name}");
     return $result;
 }
Example #12
0
 public function __construct()
 {
     $cacher_class = 'cmsCache' . string_to_camel('_', cmsConfig::get('cache_method'));
     $this->cacher = new $cacher_class();
 }
Example #13
0
 /**
  * Для var_export
  * @param array $data
  * @return \field_class
  */
 public static function __set_state($data)
 {
     $field_class = 'field' . string_to_camel('_', $data['class']);
     return new $field_class($data['name'], $data);
 }
Example #14
0
 public function run($ctype_id, $field_id)
 {
     if (!$ctype_id || !$field_id) {
         cmsCore::error404();
     }
     $content_model = cmsCore::getModel('content');
     $ctype = $content_model->getContentType($ctype_id);
     if (!$ctype) {
         cmsCore::error404();
     }
     $form = $this->getForm('ctypes_field', array('edit', $ctype['name']));
     $form = cmsEventsManager::hook('ctype_field_form', $form);
     list($form, $ctype) = cmsEventsManager::hook($ctype['name'] . '_ctype_field_form', array($form, $ctype));
     $field = $content_model->getContentField($ctype['name'], $field_id);
     // скроем поле "Системное имя" для фиксированных полей
     if ($field['is_fixed']) {
         $form->hideField('basic', 'name');
     }
     // скроем лишние опции для системных полей
     if ($field['is_system']) {
         $form->hideField('basic', 'hint');
         $form->hideFieldset('type');
         $form->hideFieldset('group');
         $form->hideFieldset('format');
         $form->hideFieldset('values');
         $form->hideFieldset('labels');
         $form->hideFieldset('edit_access');
     }
     // удалим выбор типа для полей с фиксированным типом
     if ($field['is_fixed_type']) {
         $form->removeFieldset('type');
     }
     if ($this->request->has('submit')) {
         // добавляем поля настроек типа поля в общую форму
         // чтобы они были обработаны парсером и валидатором
         // вместе с остальными полями
         if (!$field['is_system'] && !$field['is_fixed_type']) {
             $field_type = $this->request->get('type');
             $field_class = "field" . string_to_camel('_', $field_type);
             $field_object = new $field_class(null, null);
             $field_options = $field_object->getOptions();
             foreach ($field_options as $option_field) {
                 $option_field->setName("options:{$option_field->name}");
                 $form->addField('type', $option_field);
             }
         }
         $defaults = $field['is_fixed_type'] ? array('type' => $field['type']) : array();
         $field = array_merge($defaults, $form->parse($this->request, true));
         $errors = $form->validate($this, $field);
         if (!$errors) {
             // если не выбрана группа, обнуляем поле группы
             if (!$field['fieldset']) {
                 $field['fieldset'] = null;
             }
             // если создается новая группа, то выбираем ее
             if ($field['new_fieldset']) {
                 $field['fieldset'] = $field['new_fieldset'];
             }
             unset($field['new_fieldset']);
             // сохраняем поле
             $content_model->updateContentField($ctype['name'], $field_id, $field);
             $this->redirectToAction('ctypes', array('fields', $ctype['id']));
         }
         if ($errors) {
             cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error');
         }
     }
     return $this->cms_template->render('ctypes_field', array('do' => 'edit', 'ctype' => $ctype, 'field' => $field, 'form' => $form, 'errors' => isset($errors) ? $errors : false));
 }
Example #15
0
 public static function getForm($form_file, $form_name, $params = false)
 {
     if (!file_exists($form_file)) {
         return false;
     }
     include_once $form_file;
     $form_class = 'form' . string_to_camel('_', $form_name);
     $form = new $form_class();
     if ($params) {
         $form->setParams($params);
         $form->setStructure(call_user_func_array(array($form, 'init'), $params));
     } else {
         $form->setStructure($form->init());
     }
     return $form;
 }
Example #16
0
 /**
  * Выполняет хук, находящийся в отдельном файле ./hooks/$event_name.php
  * @param str $event_name
  */
 public function runExternalHook($event_name, $params = array())
 {
     $class_name = 'on' . string_to_camel('_', $this->name) . string_to_camel('_', $event_name);
     if (!class_exists($class_name)) {
         $hook_file = $this->root_path . 'hooks/' . $event_name . '.php';
         include_once $hook_file;
     }
     $hook_object = new $class_name($this);
     $result = call_user_func_array(array($hook_object, 'run'), $params);
     return $result;
 }
Example #17
0
 public function getOptionsForm()
 {
     if (!$this->hasOptions()) {
         return false;
     }
     cmsCore::loadTemplateLanguage($this->name);
     $form_file = $this->path . '/options.form.php';
     $deprecated_form_name = 'template_options';
     $form_name = $this->name . '_template_options';
     $form = null;
     // $form = cmsForm::getForm($form_file, $form_name);
     // для совместимости форм шаблонов делаем здесь то, что делается в cmsForm::getForm, но с проверкой класса
     // убрать через пару релизов. http://docs.instantcms.ru/dev/templates/options
     include_once $form_file;
     $form_class = 'form' . string_to_camel('_', $form_name);
     if (!class_exists($form_class)) {
         $form_class = 'form' . string_to_camel('_', $deprecated_form_name);
     }
     if (class_exists($form_class)) {
         $form = new $form_class();
         $form->setStructure($form->init());
     }
     if ($form === null) {
         $form = new cmsForm();
     }
     return $form;
 }