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)); }
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; } }
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; }
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)); }
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; }
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)); }
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)); }
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); }
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); }
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); }
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; }
public function __construct() { $cacher_class = 'cmsCache' . string_to_camel('_', cmsConfig::get('cache_method')); $this->cacher = new $cacher_class(); }
/** * Для 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); }
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)); }
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; }
/** * Выполняет хук, находящийся в отдельном файле ./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; }
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; }