public function run() { $form = $this->getForm('ctypes_basic', array('add')); $form = cmsEventsManager::hook('ctype_basic_form', $form); $is_submitted = $this->request->has('submit'); $ctype = $form->parse($this->request, $is_submitted); if ($is_submitted) { $errors = $form->validate($this, $ctype); if (!$errors) { if (cmsCore::isControllerExists($ctype['name'])) { $errors['name'] = LANG_CP_CTYPE_ERROR_NAME; } } if (!$errors) { $content_model = cmsCore::getModel('content'); $ctype = cmsEventsManager::hook('ctype_before_add', $ctype); $ctype = cmsEventsManager::hook("ctype_{$ctype['name']}_before_add", $ctype); $ctype_id = $content_model->addContentType($ctype); $ctype['id'] = $ctype_id; cmsEventsManager::hook('ctype_after_add', $ctype); cmsEventsManager::hook("ctype_{$ctype['name']}_after_add", $ctype); if ($ctype_id) { cmsCore::getController('content')->addWidgetsPages($ctype); cmsUser::addSessionMessage(sprintf(LANG_CP_CTYPE_CREATED, $ctype['title']), 'success'); } $this->redirectToAction('ctypes', array('labels', $ctype_id), array('wizard_mode' => true)); } if ($errors) { cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error'); } } return $this->cms_template->render('ctypes_basic', array('do' => 'add', 'ctype' => $ctype, 'form' => $form, 'errors' => isset($errors) ? $errors : false)); }
public function run($id) { if (!$id) { cmsCore::error404(); } $content_model = cmsCore::getModel('content'); $ctype = $content_model->getContentType($id); if (!$ctype) { cmsCore::error404(); } $form = $this->getForm('ctypes_basic', array('edit')); $form = cmsEventsManager::hook('ctype_basic_form', $form); $form = cmsEventsManager::hook('ctype_basic_' . $ctype['name'] . '_form', $form); $form->hideField('titles', 'name'); $ctype = cmsEventsManager::hook('ctype_before_edit', $ctype); // Если есть собственный шаблон для типа контента // то удаляем поле выбора стиля $tpl_file = $this->cms_template->getTemplateFileName('content/' . $ctype['name'] . '_list', true); if ($tpl_file) { $form->removeField('listview', 'options:list_style'); } if ($this->request->has('submit')) { $ctype = $form->parse($this->request, true); $errors = $form->validate($this, $ctype); if (!$errors) { $ctype = cmsEventsManager::hook("ctype_before_update", $ctype); $ctype = cmsEventsManager::hook("ctype_{$ctype['name']}_before_update", $ctype); $content_model->updateContentType($id, $ctype); $ctype['id'] = $id; cmsEventsManager::hook("ctype_after_update", $ctype); cmsEventsManager::hook("ctype_{$ctype['name']}_after_update", $ctype); cmsUser::addSessionMessage(LANG_CP_SAVE_SUCCESS, 'success'); $this->redirectToAction('ctypes'); } if ($errors) { cmsUser::addSessionMessage(LANG_FORM_ERRORS, 'error'); } } // проверяем, есть ли нативный контроллер и есть ли у него опции $is_controller = false; if (cmsCore::isControllerExists($ctype['name'])) { if (cmsCore::getController($ctype['name'])->options) { $is_controller = true; } } return $this->cms_template->render('ctypes_basic', array('is_controller' => $is_controller, 'id' => $id, 'do' => 'edit', 'ctype' => $ctype, 'form' => $form, 'errors' => isset($errors) ? $errors : false)); }
/** * 2.6.0 => 2.6.1 */ function install_package() { $core = cmsCore::getInstance(); $content_model = cmsCore::getModel('content'); $ctypes = $content_model->getContentTypes(); foreach ($ctypes as $ctype) { if ($ctype['name'] == 'video' && cmsCore::isControllerExists('video')) { if (isFieldExists("{$content_model->table_prefix}video_cats", 'desc') && !isFieldExists("{$content_model->table_prefix}video_cats", 'description')) { $content_model->db->query("ALTER TABLE `{#}{$content_model->table_prefix}video_cats` CHANGE `desc` `description` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL"); } continue; } if (!isFieldExists("{$content_model->table_prefix}{$ctype['name']}_cats", 'description')) { $content_model->db->query("ALTER TABLE `{#}{$content_model->table_prefix}{$ctype['name']}_cats` ADD `description` TEXT NULL DEFAULT NULL"); } } return true; }
public function run($id = false) { if (!$id) { cmsCore::error404(); } $task = $this->model->getSchedulerTask($id); // Проверяем существование контроллера if (!cmsCore::isControllerExists($task['controller'])) { cmsUser::addSessionMessage(sprintf(LANG_CP_SCHEDULER_TASK_RUN_FAIL, $task['title']), 'error'); $this->redirectBack(); } $controller = cmsCore::getController($task['controller']); // Выполняем хук $controller->runHook("cron_{$task['hook']}"); // Обновляем время последнего запуска задачи $this->model->updateSchedulerTaskDate($task['id']); cmsUser::addSessionMessage(sprintf(LANG_CP_SCHEDULER_TASK_RAN, $task['title'], html_date_time())); $this->redirectBack(); }
public function run($ctype_name = false) { if (!$ctype_name || $this->validate_sysname($ctype_name) !== true) { cmsCore::error404(); } $feed = $this->model->getFeedByCtypeName($ctype_name); if (!$feed || !$feed['is_enabled']) { cmsCore::error404(); } if ($feed['is_cache']) { $this->cache_file_path = cmsConfig::get('cache_path') . 'rss/' . md5($ctype_name . serialize($this->request->getData())) . '.rss'; if ($this->isDisplayCached($feed)) { return $this->displayCached(); } } if ($this->model->isCtypeFeed($ctype_name)) { $ctype_name = 'content'; } if (!cmsCore::isControllerExists($ctype_name)) { cmsCore::error404(); } $controller = cmsCore::getController($ctype_name, $this->request); if (!$controller->isEnabled()) { cmsCore::error404(); } $data = $controller->runHook('rss_feed_list', array($feed)); if ($data === $this->request) { cmsCore::error404(); } list($feed, $category, $author) = $data; header('Content-type: application/rss+xml; charset=utf-8'); $rss = $this->cms_template->getRenderedChild($feed['template'], array('feed' => $feed, 'category' => $category, 'author' => $author)); if ($feed['is_cache']) { $this->cacheRss($rss); } $this->halt($rss); }
// Подключение модели $model = cmsCore::getModel('admin'); // Получение списка задач для выполнения $tasks = $model->getPendingSchedulerTasks(); // Если задач нет, выходим if (!$tasks) { exit; } // Коллекция контроллеров $controllers = array(); // // Выполняем задачи по списку // foreach ($tasks as $task) { // Проверяем существование контроллера if (!cmsCore::isControllerExists($task['controller'])) { continue; } // Получаем контроллер из коллекции либо загружаем // и сохраняем в коллекцию if (isset($controllers[$task['controller']])) { $controller = $controllers[$task['controller']]; } else { $controller = cmsCore::getController($task['controller']); $controllers[$task['controller']] = $controller; } // Выполняем хук $controller->runHook("cron_{$task['hook']}"); // Обновляем время последнего запуска задачи $model->updateSchedulerTaskDate($task['id']); }
public function run() { if (!$this->request->isAjax()) { cmsCore::error404(); } $action = $this->request->get('action', ''); $csrf_token = $this->request->get('csrf_token', ''); $controller_name = $this->request->get('pc', ''); $profile_type = $this->request->get('pt', ''); $profile_id = $this->request->get('pi', ''); $parent_id = $this->request->get('parent_id', ''); $entry_id = $this->request->get('id', ''); $content = $this->request->get('content', ''); // Проверяем валидность $is_valid = $controller_name && $profile_type && $action && $this->validate_sysname($controller_name) === true && $this->validate_sysname($profile_type) === true && is_numeric($profile_id) && is_numeric($parent_id) && (!$entry_id || is_numeric($entry_id)) && cmsForm::validateCSRFToken($csrf_token, false) && in_array($action, array('add', 'preview', 'update')); if (!$is_valid) { return $this->error(); } if (!cmsCore::isControllerExists($controller_name)) { return $this->error(); } // какой контроллер обслуживаем $controller = cmsCore::getController($controller_name); // // Получаем права доступа // $permissions = $controller->runHook('wall_permissions', array('profile_type' => $profile_type, 'profile_id' => $profile_id)); if (!$permissions || !is_array($permissions)) { return $this->error(); } // Типографируем текст $content_html = cmsEventsManager::hook('html_filter', $content); if ($this->validate_required($content_html) !== true) { return $this->error(ERR_VALIDATE_REQUIRED); } // // Превью записи // if ($action == 'preview') { return $this->cms_template->renderJSON(array('error' => false, 'html' => cmsEventsManager::hook('parse_text', $content_html))); } // // Редактирование записи // if ($action == 'update') { $entry = $this->model->getEntry($entry_id); if ($entry['user']['id'] != $this->cms_user->id && !$this->cms_user->is_admin) { $this->error(); } list($entry_id, $content, $content_html) = cmsEventsManager::hook('wall_before_update', array($entry_id, $content, $content_html)); $this->model->updateEntryContent($entry_id, $content, $content_html); $entry_html = cmsEventsManager::hook('parse_text', $content_html); } // // Добавление записи // if ($action == 'add') { // проверяем права на добавление if (!$permissions['add']) { return $this->error(); } // Собираем данные записи $entry = array('user_id' => $this->cms_user->id, 'parent_id' => $parent_id, 'controller' => $controller_name, 'profile_type' => $profile_type, 'profile_id' => $profile_id, 'content' => $content, 'content_html' => $content_html); // Сохраняем запись $entry_id = $this->model->addEntry(cmsEventsManager::hook('wall_before_add', $entry)); if ($entry_id) { // Получаем и рендерим добавленную запись $entry = $this->model->getEntry($entry_id); $entry['content_html'] = cmsEventsManager::hook('parse_text', $entry['content_html']); $entry_html = $this->cms_template->renderInternal($this, 'entry', array('entries' => array($entry), 'user' => $this->cms_user, 'permissions' => $permissions)); // действия после добавления $controller->runHook('wall_after_add', array('profile_type' => $profile_type, 'profile_id' => $profile_id, 'entry' => $entry, 'wall_model' => $this->model)); } } // Формируем и возвращаем результат $result = array('error' => $entry_id ? false : true, 'message' => $entry_id ? LANG_WALL_ENTRY_SUCCESS : LANG_WALL_ENTRY_ERROR, 'id' => $entry_id, 'parent_id' => isset($entry['parent_id']) ? $entry['parent_id'] : 0, 'html' => isset($entry_html) ? $entry_html : false); return $this->cms_template->renderJSON($result); }
public function run() { if (!$this->request->isAjax()) { cmsCore::error404(); } $action = $this->request->get('action', ''); $is_guests_allowed = !empty($this->options['is_guests']); $is_guest = $is_guests_allowed && !$this->cms_user->is_logged; $is_user_allowed = $this->cms_user->is_logged && cmsUser::isAllowed('comments', 'add') || $is_guests_allowed; $is_karma_allowed = $this->cms_user->is_logged && !cmsUser::isPermittedLimitHigher('comments', 'karma', $this->cms_user->karma) || $is_guests_allowed; $is_add_allowed = $is_user_allowed && $is_karma_allowed; if ($action == 'add' && !$is_add_allowed) { cmsCore::error404(); } if ($action == 'update' && !cmsUser::isAllowed('comments', 'edit')) { cmsCore::error404(); } $csrf_token = $this->request->get('csrf_token', ''); $target_controller = $this->request->get('tc', ''); $target_subject = $this->request->get('ts', ''); $target_id = $this->request->get('ti', ''); $target_user_id = $this->request->get('tud', ''); $parent_id = $this->request->get('parent_id', 0); $comment_id = $this->request->get('id', 0); $content = $this->request->get('content', ''); if ($is_guest) { $author_name = $this->request->get('author_name', ''); $author_email = $this->request->get('author_email', ''); if (!$author_name) { return $this->cms_template->renderJSON(array('error' => true, 'message' => LANG_COMMENT_ERROR_NAME, 'html' => false)); } if ($author_email && !preg_match("/^([a-zA-Z0-9\\._-]+)@([a-zA-Z0-9\\._-]+)\\.([a-zA-Z]{2,4})\$/i", $author_email)) { return $this->cms_template->renderJSON(array('error' => true, 'message' => LANG_COMMENT_ERROR_EMAIL, 'html' => false)); } if (!empty($this->options['restricted_ips'])) { if (string_in_mask_list($this->cms_user->ip, $this->options['restricted_ips'])) { return $this->cms_template->renderJSON(array('error' => true, 'message' => LANG_COMMENT_ERROR_IP, 'html' => false)); } } if (!empty($this->options['guest_ip_delay'])) { $last_comment_time = $this->model->getGuestLastCommentTime($this->cms_user->ip); $now_time = time(); $minutes_passed = ($now_time - $last_comment_time) / 60; if ($minutes_passed < $this->options['guest_ip_delay']) { $spellcount = html_spellcount($this->options['guest_ip_delay'], LANG_MINUTE1, LANG_MINUTE2, LANG_MINUTE10); return $this->cms_template->renderJSON(array('error' => true, 'message' => sprintf(LANG_COMMENT_ERROR_TIME, $spellcount), 'html' => false)); } } } // Проверяем валидность $is_valid = $target_controller && $target_subject && $target_id && $this->validate_sysname($target_controller) === true && $this->validate_sysname($target_subject) === true && is_numeric($target_id) && is_numeric($parent_id) && cmsCore::isControllerExists($target_controller) && cmsCore::isModelExists($target_controller) && (!$comment_id || is_numeric($comment_id)) && cmsForm::validateCSRFToken($csrf_token, false) && in_array($action, array('add', 'preview', 'update'), true); if (!$is_valid) { return $this->cms_template->renderJSON(array('error' => true, 'message' => LANG_COMMENT_ERROR)); } // Типографируем текст $content_html = cmsEventsManager::hook('html_filter', $content); if (!$content_html) { return $this->cms_template->renderJSON(array('error' => true, 'message' => ERR_VALIDATE_REQUIRED, 'html' => false)); } // // Превью комментария // if ($action == 'preview') { return $this->cms_template->renderJSON(array('error' => false, 'html' => cmsEventsManager::hook('parse_text', $content_html))); } // // Редактирование комментария // if ($action == 'update') { $comment = $this->model->getComment($comment_id); if (!cmsUser::isAllowed('comments', 'edit', 'all')) { if (cmsUser::isAllowed('comments', 'edit', 'own') && $comment['user']['id'] != $this->cms_user->id) { return $this->cms_template->renderJSON(array('error' => true, 'message' => LANG_COMMENT_ERROR)); } } list($comment_id, $content, $content_html) = cmsEventsManager::hook('comment_before_update', array($comment_id, $content, $content_html)); $this->model->updateCommentContent($comment_id, $content, $content_html); $comment_html = cmsEventsManager::hook('parse_text', $content_html); } // // Добавление комментария // if ($action == 'add') { // Собираем данные комментария $comment = array('user_id' => $this->cms_user->id, 'parent_id' => $parent_id, 'target_controller' => $target_controller, 'target_subject' => $target_subject, 'target_id' => $target_id, 'content' => $content, 'content_html' => $content_html, 'author_url' => $this->cms_user->ip); if ($is_guest) { $comment['author_name'] = $author_name; $comment['author_email'] = $author_email; } // Получаем модель целевого контроллера $target_model = cmsCore::getModel($target_controller); // Получаем URL и заголовок комментируемой страницы $target_info = $target_model->getTargetItemInfo($target_subject, $target_id); if ($target_info) { $comment['target_url'] = $target_info['url']; $comment['target_title'] = $target_info['title']; $comment['is_private'] = empty($target_info['is_private']) ? false : $target_info['is_private']; // проверяем модерацию $comment['is_approved'] = $this->isApproved($comment); list($comment, $permissions) = cmsEventsManager::hook('comment_add_permissions', array($comment, array('error' => false, 'message' => ''))); if ($permissions['error']) { return $this->cms_template->renderJSON($permissions); } // Сохраняем комментарий $comment_id = $this->model->addComment(cmsEventsManager::hook('comment_before_add', $comment)); } if ($comment_id) { // Получаем и рендерим добавленный комментарий $comment = $this->model->getComment($comment_id); $comment['content_html'] = cmsEventsManager::hook('parse_text', $comment['content_html']); $comment_html = $this->cms_template->render('comment', array('comments' => array($comment), 'target_user_id' => $target_user_id, 'user' => $this->cms_user), new cmsRequest(array(), cmsRequest::CTX_INTERNAL)); // Уведомление модерации if (!$comment['is_approved']) { $this->notifyModerators($comment); return $this->cms_template->renderJSON(array('error' => false, 'on_moderate' => true, 'message' => LANG_COMMENTS_MODERATE_HINT)); } else { // Уведомляем модель целевого контента об изменении количества комментариев $comments_count = $this->model->filterEqual('target_controller', $target_controller)->filterEqual('target_subject', $target_subject)->filterEqual('target_id', $target_id)->getCommentsCount(); $this->model->resetFilters(); $target_model->updateCommentsCount($target_subject, $target_id, $comments_count); $parent_comment = $parent_id ? $this->model->getComment($parent_id) : false; // Уведомляем подписчиков $this->notifySubscribers($comment, $parent_comment); // Уведомляем об ответе на комментарий if ($parent_comment) { $this->notifyParent($comment, $parent_comment); } $comment = cmsEventsManager::hook('comment_after_add', $comment); } } } // Формируем и возвращаем результат $result = array('error' => $comment_id ? false : true, 'message' => $comment_id ? LANG_COMMENT_SUCCESS : LANG_COMMENT_ERROR, 'id' => $comment_id, 'parent_id' => isset($comment['parent_id']) ? $comment['parent_id'] : 0, 'level' => isset($comment['level']) ? $comment['level'] : 0, 'html' => isset($comment_html) ? $comment_html : false); return $this->cms_template->renderJSON($result); }