コード例 #1
0
 protected function checkBlogFields($oBlog = null)
 {
     $bOk = parent::checkBlogFields($oBlog);
     if (!F::isPost('submit_blog_add')) {
         //  Проверяем есть ли подзаголовок блога
         $iMin = C::Get('plugin.blogsubtitle.min_subtitle_len');
         $iMax = C::Get('plugin.blogsubtitle.max_subtitle_len');
         $sSubtitle = F::GetRequestStr('blog_subtitle');
         if (!$sSubtitle && $iMin) {
             E::ModuleMessage()->AddError(E::ModuleLang()->Get('plugin.blogsubtitle.blog_create_subtitle_error', array('min' => $iMin, 'max' => $iMax)), E::ModuleLang()->Get('error'));
             $bOk = false;
         } elseif ($iMax) {
             if (!F::CheckVal($sSubtitle, 'text', $iMin, $iMax)) {
                 E::ModuleMessage()->AddError(E::ModuleLang()->Get('plugin.blogsubtitle.blog_create_subtitle_error', array('min' => $iMin, 'max' => $iMax)), E::ModuleLang()->Get('error'));
                 $bOk = false;
             }
         }
     }
     return $bOk;
 }
コード例 #2
0
 /**
  * Редактирование поля контента
  *
  * @param ModuleTopic_EntityContentType $oContentType
  * @param ModuleTopic_EntityField $oField
  * @return bool
  */
 protected function SubmitEditField($oContentType, $oField)
 {
     // * Проверяем отправлена ли форма с данными
     if (!F::isPost('submit_field')) {
         return false;
     }
     // * Проверка корректности полей формы
     if (!$this->CheckFieldsField($oContentType)) {
         return false;
     }
     if (!E::ModuleTopic()->GetFieldValuesCount($oField->getFieldId())) {
         // Нет ещё ни одного значения этого поля, тогда можно сменить ещё и тип
         $oField->setFieldType(F::GetRequest('field_type'));
     }
     $oField->setFieldName(F::GetRequest('field_name'));
     $oField->setFieldDescription(F::GetRequest('field_description'));
     $oField->setFieldRequired(F::GetRequest('field_required'));
     if ($oField->getFieldType() == 'select') {
         $oField->setOptionValue('select', F::GetRequest('field_values'));
     }
     $sOldFieldUniqueName = $oField->getFieldUniqueName();
     if (F::GetRequest('field_unique_name_translit')) {
         $oField->setFieldUniqueName(F::TranslitUrl(F::GetRequest('field_name')));
     } else {
         $oField->setFieldUniqueName(F::TranslitUrl(F::GetRequest('field_unique_name')));
     }
     try {
         if (E::ModuleTopic()->UpdateContentField($oField)) {
             E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('action.admin.contenttypes_success_fieldedit'), null, true);
             R::Location('admin/settings-contenttypes/edit/' . $oContentType->getContentId() . '/');
         }
     } catch (Exception $e) {
         // Если ошибка дублирования уникального ключа, то выводим соответствующее сообщение
         if (1062 == $e->getCode()) {
             $sNewFieldUniqueName = $oField->getFieldUniqueName();
             $oField->setFieldUniqueName($sOldFieldUniqueName);
             E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('plugin.contentfieldsx.error_field_unique_name_duplicate', array('unique_name' => htmlspecialchars($sNewFieldUniqueName))), null, false);
         }
     }
     return false;
 }
コード例 #3
0
ファイル: ActionSeopack.class.php プロジェクト: Azany/altocms
 /**
  * @return bool
  */
 protected function CheckSeopackFields()
 {
     E::ModuleSecurity()->ValidateSendForm();
     $bOk = true;
     if (F::isPost('title') && !F::CheckVal(F::GetRequest('title', null, 'post'), 'text', 0, 1000)) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('plugin.seopack.title_error'), E::ModuleLang()->Get('error'));
         $bOk = false;
     }
     if (F::isPost('description') && !F::CheckVal(F::GetRequest('description', null, 'post'), 'text', 0, 1000)) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('plugin.seopack.description_error'), E::ModuleLang()->Get('error'));
         $bOk = false;
     }
     if (F::isPost('keywords') && !F::CheckVal(F::GetRequest('keywords', null, 'post'), 'text', 0, 1000)) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('plugin.seopack.keywords_error'), E::ModuleLang()->Get('error'));
         $bOk = false;
     }
     if (!F::CheckVal(F::GetRequest('url', null, 'post'), 'text', 0, 255)) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('plugin.seopack.url_error'), E::ModuleLang()->Get('error'));
         $bOk = false;
     }
     return $bOk;
 }
コード例 #4
0
 /**
  * Дополнительные настройки сайта
  */
 protected function EventTuning()
 {
     $this->sMenuItemSelect = 'settings';
     $this->sMenuSubItemSelect = 'tuning';
     E::ModuleViewer()->AddHtmlTitle(E::ModuleLang()->Get('settings_menu_tuning'));
     $aTimezoneList = array('-12', '-11', '-10', '-9.5', '-9', '-8', '-7', '-6', '-5', '-4.5', '-4', '-3.5', '-3', '-2', '-1', '0', '1', '2', '3', '3.5', '4', '4.5', '5', '5.5', '5.75', '6', '6.5', '7', '8', '8.75', '9', '9.5', '10', '10.5', '11', '11.5', '12', '12.75', '13', '14');
     E::ModuleViewer()->Assign('aTimezoneList', $aTimezoneList);
     /**
      * Если отправили форму с настройками - сохраняем
      */
     if (F::isPost('submit_settings_tuning')) {
         E::ModuleSecurity()->ValidateSendForm();
         if (in_array(F::GetRequestStr('settings_general_timezone'), $aTimezoneList)) {
             $this->oUserCurrent->setSettingsTimezone(F::GetRequestStr('settings_general_timezone'));
         }
         $this->oUserCurrent->setSettingsNoticeNewTopic(F::GetRequest('settings_notice_new_topic') ? 1 : 0);
         $this->oUserCurrent->setSettingsNoticeNewComment(F::GetRequest('settings_notice_new_comment') ? 1 : 0);
         $this->oUserCurrent->setSettingsNoticeNewTalk(F::GetRequest('settings_notice_new_talk') ? 1 : 0);
         $this->oUserCurrent->setSettingsNoticeReplyComment(F::GetRequest('settings_notice_reply_comment') ? 1 : 0);
         $this->oUserCurrent->setSettingsNoticeNewFriend(F::GetRequest('settings_notice_new_friend') ? 1 : 0);
         $this->oUserCurrent->setProfileDate(F::Now());
         // * Запускаем выполнение хуков
         E::ModuleHook()->Run('settings_tuning_save_before', array('oUser' => $this->oUserCurrent));
         if (E::ModuleUser()->Update($this->oUserCurrent)) {
             E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('settings_tuning_submit_ok'));
             E::ModuleHook()->Run('settings_tuning_save_after', array('oUser' => $this->oUserCurrent));
         } else {
             E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'));
         }
     } else {
         if (is_null($this->oUserCurrent->getSettingsTimezone())) {
             $_REQUEST['settings_general_timezone'] = (strtotime(date('Y-m-d H:i:s')) - strtotime(gmdate('Y-m-d H:i:s'))) / 3600 - date('I');
         } else {
             $_REQUEST['settings_general_timezone'] = $this->oUserCurrent->getSettingsTimezone();
         }
     }
 }
コード例 #5
0
ファイル: ActionAdmin.class.php プロジェクト: ZeoNish/altocms
 /**
  * Редактирование поля контента
  *
  * @param ModuleTopic_EntityContentType $oContentType
  * @param ModuleTopic_EntityField $oField
  * @return bool
  */
 protected function SubmitEditField($oContentType, $oField)
 {
     // * Проверяем отправлена ли форма с данными
     if (!F::isPost('submit_field')) {
         return false;
     }
     // * Проверка корректности полей формы
     if (!$this->CheckFieldsField($oContentType)) {
         return false;
     }
     if (!E::ModuleTopic()->GetFieldValuesCount($oField->getFieldId())) {
         // Нет ещё ни одного значения этого поля, тогда можно сменить ещё и тип
         $oField->setFieldType(F::GetRequest('field_type'));
     }
     $oField->setFieldName(F::GetRequest('field_name'));
     $oField->setFieldDescription(F::GetRequest('field_description'));
     $oField->setFieldRequired(F::GetRequest('field_required'));
     if ($oField->getFieldType() == 'select') {
         $oField->setOptionValue('select', F::GetRequest('field_values'));
     }
     if (E::ModuleTopic()->UpdateContentField($oField)) {
         E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('action.admin.contenttypes_success_fieldedit'), null, true);
         R::Location('admin/settings-contenttypes/edit/' . $oContentType->getContentId() . '/');
     }
     return false;
 }
コード例 #6
0
ファイル: ActionTalk.class.php プロジェクト: ZeoNish/altocms
 /**
  * Страница создания письма
  */
 protected function EventAdd()
 {
     $this->sMenuSubItemSelect = 'add';
     E::ModuleViewer()->AddHtmlTitle(E::ModuleLang()->Get('talk_menu_inbox_create'));
     // * Получаем список друзей
     $aUsersFriend = E::ModuleUser()->GetUsersFriend($this->oUserCurrent->getId());
     if ($aUsersFriend['collection']) {
         E::ModuleViewer()->Assign('aUsersFriend', $aUsersFriend['collection']);
     }
     // * Проверяем отправлена ли форма с данными
     if (!F::isPost('submit_talk_add')) {
         return false;
     }
     // * Проверка корректности полей формы
     if (!$this->checkTalkFields()) {
         return false;
     }
     // * Проверяем разрешено ли отправлять инбокс по времени
     if (!E::ModuleACL()->CanSendTalkTime($this->oUserCurrent)) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('talk_time_limit'), E::ModuleLang()->Get('error'));
         return false;
     }
     // * Отправляем письмо
     if ($oTalk = E::ModuleTalk()->SendTalk(E::ModuleText()->Parser(strip_tags(F::GetRequestStr('talk_title'))), E::ModuleText()->Parser(F::GetRequestStr('talk_text')), $this->oUserCurrent, $this->aUsersId)) {
         E::ModuleMresource()->CheckTargetTextForImages('talk', $oTalk->getId(), $oTalk->getText());
         R::Location(R::GetPath('talk') . 'read/' . $oTalk->getId() . '/');
     } else {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'));
         return R::Action('error');
     }
 }
コード例 #7
0
 /**
  * Обработка кода приглашения при включеном режиме инвайтов
  *
  */
 protected function EventInvite()
 {
     if (!Config::Get('general.reg.invite')) {
         return parent::EventNotFound();
     }
     //  Обработка отправки формы с кодом приглашения
     if (F::isPost('submit_invite')) {
         //  проверяем код приглашения на валидность
         if ($this->CheckInviteRegister()) {
             $sInviteCode = $this->GetInviteRegister();
         } else {
             $sInviteCode = trim(F::GetRequestStr('invite_code'));
         }
         $oInvite = E::ModuleUser()->GetInviteByCode($sInviteCode);
         if ($oInvite) {
             if (!$this->CheckInviteRegister()) {
                 E::ModuleSession()->Set('invite_code', $oInvite->getCode());
             }
             return R::Action('registration');
         } else {
             E::ModuleMessage()->AddError(E::ModuleLang()->Get('registration_invite_code_error'), E::ModuleLang()->Get('error'));
         }
     }
 }
コード例 #8
0
ファイル: ActionBlog.class.php プロジェクト: anp135/altocms
 /**
  * Проверка полей блога
  *
  * @param ModuleBlog_EntityBlog|null $oBlog
  *
  * @return bool
  */
 protected function checkBlogFields($oBlog = null)
 {
     //  Проверяем только если была отправлена форма с данными (методом POST)
     if (!F::isPost('submit_blog_add')) {
         $_REQUEST['blog_limit_rating_topic'] = 0;
         return false;
     }
     E::ModuleSecurity()->ValidateSendForm();
     $bOk = true;
     //  Проверяем есть ли название блога
     if (!F::CheckVal(F::GetRequestStr('blog_title'), 'text', 2, 200)) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('blog_create_title_error'), E::ModuleLang()->Get('error'));
         $bOk = false;
     } else {
         //  Проверяем есть ли уже блог с таким названием
         if ($oBlogExists = E::ModuleBlog()->GetBlogByTitle(F::GetRequestStr('blog_title'))) {
             if (!$oBlog || $oBlog->getId() != $oBlogExists->getId()) {
                 E::ModuleMessage()->AddError(E::ModuleLang()->Get('blog_create_title_error_unique'), E::ModuleLang()->Get('error'));
                 $bOk = false;
             }
         }
     }
     //  Проверяем есть ли URL блога, с заменой всех пробельных символов на "_"
     if (!$oBlog || $this->oUserCurrent->isAdministrator()) {
         $blogUrl = preg_replace("/\\s+/", '_', F::GetRequestStr('blog_url'));
         $_REQUEST['blog_url'] = $blogUrl;
         if (!F::CheckVal(F::GetRequestStr('blog_url'), 'login', 2, 50)) {
             E::ModuleMessage()->AddError(E::ModuleLang()->Get('blog_create_url_error'), E::ModuleLang()->Get('error'));
             $bOk = false;
         }
     }
     //  Проверяем на счет плохих УРЛов
     if (in_array(F::GetRequestStr('blog_url'), $this->aBadBlogUrl)) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('blog_create_url_error_badword') . ' ' . join(',', $this->aBadBlogUrl), E::ModuleLang()->Get('error'));
         $bOk = false;
     }
     //  Проверяем есть ли уже блог с таким URL
     if ($oBlogExists = E::ModuleBlog()->GetBlogByUrl(F::GetRequestStr('blog_url'))) {
         if (!$oBlog || $oBlog->getId() != $oBlogExists->getId()) {
             E::ModuleMessage()->AddError(E::ModuleLang()->Get('blog_create_url_error_unique'), E::ModuleLang()->Get('error'));
             $bOk = false;
         }
     }
     // * Проверяем доступные типы блога для создания
     $aBlogTypes = E::ModuleBlog()->GetAllowBlogTypes($this->oUserCurrent, 'add');
     if (!in_array(F::GetRequestStr('blog_type'), array_keys($aBlogTypes))) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('blog_create_type_error'), E::ModuleLang()->Get('error'));
         $bOk = false;
     }
     //  Проверяем есть ли описание блога
     if (!F::CheckVal(F::GetRequestStr('blog_description'), 'text', 10, 3000)) {
         E::ModuleMessage()->AddError(E::ModuleLang()->Get('blog_create_description_error'), E::ModuleLang()->Get('error'));
         $bOk = false;
     }
     //  Выполнение хуков
     E::ModuleHook()->Run('check_blog_fields', array('bOk' => &$bOk));
     return $bOk;
 }
コード例 #9
0
 /**
  * Обработка добавления топика
  *
  * @return bool|string
  */
 protected function SubmitAdd()
 {
     // * Проверяем отправлена ли форма с данными (хотяб одна кнопка)
     if (!F::isPost('submit_topic_publish') && !F::isPost('submit_topic_draft') && !F::isPost('submit_topic_save')) {
         return false;
     }
     /** @var ModuleTopic_EntityTopic $oTopic */
     $oTopic = E::GetEntity('Topic');
     $oTopic->_setValidateScenario('topic');
     // * Заполняем поля для валидации
     $oTopic->setBlogId(F::GetRequestStr('blog_id'));
     // issue 151 (https://github.com/altocms/altocms/issues/151)
     // Некорректная обработка названия блога
     // $oTopic->setTitle(strip_tags(F::GetRequestStr('topic_title')));
     $oTopic->setTitle(E::ModuleTools()->RemoveAllTags(F::GetRequestStr('topic_title')));
     $oTopic->setTextSource(F::GetRequestStr('topic_text'));
     $oTopic->setUserId($this->oUserCurrent->getId());
     $oTopic->setType($this->oContentType->getContentUrl());
     if ($this->oContentType->isAllow('link')) {
         $oTopic->setSourceLink(F::GetRequestStr('topic_field_link'));
     }
     $oTopic->setTags(F::GetRequestStr('topic_field_tags'));
     $oTopic->setDateAdd(F::Now());
     $oTopic->setUserIp(F::GetUserIp());
     $sTopicUrl = E::ModuleTopic()->CorrectTopicUrl($oTopic->MakeTopicUrl());
     $oTopic->setTopicUrl($sTopicUrl);
     // * Проверка корректности полей формы
     if (!$this->checkTopicFields($oTopic)) {
         return false;
     }
     // * Определяем в какой блог делаем запись
     $nBlogId = $oTopic->getBlogId();
     if ($nBlogId == 0) {
         $oBlog = E::ModuleBlog()->GetPersonalBlogByUserId($this->oUserCurrent->getId());
     } else {
         $oBlog = E::ModuleBlog()->GetBlogById($nBlogId);
     }
     // * Если блог не определен, то выдаем предупреждение
     if (!$oBlog) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('topic_create_blog_error_unknown'), E::ModuleLang()->Get('error'));
         return false;
     }
     // * Проверяем права на постинг в блог
     if (!E::ModuleACL()->IsAllowBlog($oBlog, $this->oUserCurrent)) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('topic_create_blog_error_noallow'), E::ModuleLang()->Get('error'));
         return false;
     }
     // * Проверяем разрешено ли постить топик по времени
     if (F::isPost('submit_topic_publish') && !E::ModuleACL()->CanPostTopicTime($this->oUserCurrent)) {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('topic_time_limit'), E::ModuleLang()->Get('error'));
         return false;
     }
     // * Теперь можно смело добавлять топик к блогу
     $oTopic->setBlogId($oBlog->getId());
     // * Получаемый и устанавливаем разрезанный текст по тегу <cut>
     list($sTextShort, $sTextNew, $sTextCut) = E::ModuleText()->Cut($oTopic->getTextSource());
     $oTopic->setCutText($sTextCut);
     $oTopic->setText(E::ModuleText()->Parser($sTextNew));
     // Получаем ссылки, полученные при парсинге текста
     $oTopic->setTextLinks(E::ModuleText()->GetLinks());
     $oTopic->setTextShort(E::ModuleText()->Parser($sTextShort));
     // * Варианты ответов
     if ($this->oContentType->isAllow('poll') && F::GetRequestStr('topic_field_question') && F::GetRequest('topic_field_answers', array())) {
         $oTopic->setQuestionTitle(strip_tags(F::GetRequestStr('topic_field_question')));
         $oTopic->clearQuestionAnswer();
         $aAnswers = F::GetRequest('topic_field_answers', array());
         foreach ($aAnswers as $sAnswer) {
             $sAnswer = trim((string) $sAnswer);
             if ($sAnswer) {
                 $oTopic->addQuestionAnswer($sAnswer);
             }
         }
     }
     $aPhotoSetData = E::ModuleMresource()->GetPhotosetData('photoset', 0);
     $oTopic->setPhotosetCount($aPhotoSetData['count']);
     if ($aPhotoSetData['cover']) {
         $oTopic->setPhotosetMainPhotoId($aPhotoSetData['cover']);
     }
     // * Публикуем или сохраняем
     if (isset($_REQUEST['submit_topic_publish'])) {
         $oTopic->setPublish(1);
         $oTopic->setPublishDraft(1);
         $oTopic->setDateShow(F::Now());
     } else {
         $oTopic->setPublish(0);
         $oTopic->setPublishDraft(0);
     }
     // * Принудительный вывод на главную
     $oTopic->setPublishIndex(0);
     if (E::ModuleACL()->IsAllowPublishIndex($this->oUserCurrent)) {
         if (F::GetRequest('topic_publish_index')) {
             $oTopic->setPublishIndex(1);
         }
     }
     // * Запрет на комментарии к топику
     $oTopic->setForbidComment(F::GetRequest('topic_forbid_comment', 0));
     // Разрешение/запрет индексации контента топика изначально - как у блога
     if ($oBlogType = $oBlog->GetBlogType()) {
         // Если тип блога определен, то берем из типа блога...
         $oTopic->setTopicIndexIgnore($oBlogType->GetIndexIgnore());
     } else {
         // ...если нет, то индексацию разрешаем
         $oTopic->setTopicIndexIgnore(false);
     }
     $oTopic->setShowPhotoset(F::GetRequest('topic_show_photoset', 0));
     // * Запускаем выполнение хуков
     E::ModuleHook()->Run('topic_add_before', array('oTopic' => $oTopic, 'oBlog' => $oBlog));
     // * Добавляем топик
     if ($this->_addTopic($oTopic)) {
         E::ModuleHook()->Run('topic_add_after', array('oTopic' => $oTopic, 'oBlog' => $oBlog));
         // * Получаем топик, чтоб подцепить связанные данные
         $oTopic = E::ModuleTopic()->GetTopicById($oTopic->getId());
         // * Обновляем количество топиков в блоге
         E::ModuleBlog()->RecalculateCountTopicByBlogId($oTopic->getBlogId());
         // * Добавляем автора топика в подписчики на новые комментарии к этому топику
         E::ModuleSubscribe()->AddSubscribeSimple('topic_new_comment', $oTopic->getId(), $this->oUserCurrent->getMail(), $this->oUserCurrent->getId());
         // * Подписываем автора топика на обновления в трекере
         if ($oTrack = E::ModuleSubscribe()->AddTrackSimple('topic_new_comment', $oTopic->getId(), $this->oUserCurrent->getId())) {
             // Если пользователь не отписался от обновлений топика
             if (!$oTrack->getStatus()) {
                 $oTrack->setStatus(1);
                 E::ModuleSubscribe()->UpdateTrack($oTrack);
             }
         }
         // * Делаем рассылку всем, кто состоит в этом блоге
         if ($oTopic->getPublish() == 1 && $oBlog->getType() != 'personal') {
             E::ModuleTopic()->SendNotifyTopicNew($oBlog, $oTopic, $this->oUserCurrent);
         }
         /**
          * Привязываем фото к ID топика
          */
         if (isset($aPhotos) && count($aPhotos)) {
             E::ModuleTopic()->AttachTmpPhotoToTopic($oTopic);
         }
         // * Удаляем временную куку
         E::ModuleSession()->DelCookie('ls_photoset_target_tmp');
         // Обработаем фотосет
         if ($this->oContentType->isAllow('photoset') && ($sTargetTmp = E::ModuleSession()->GetCookie(ModuleUploader::COOKIE_TARGET_TMP))) {
             // Уберем у ресурса флаг временного размещения и удалим из куки target_tmp
             E::ModuleSession()->DelCookie(ModuleUploader::COOKIE_TARGET_TMP);
         }
         // * Добавляем событие в ленту
         E::ModuleStream()->Write($oTopic->getUserId(), 'add_topic', $oTopic->getId(), $oTopic->getPublish() && (!$oBlog->getBlogType() || !$oBlog->getBlogType()->IsPrivate()));
         R::Location($oTopic->getUrl());
     } else {
         E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error'));
         F::SysWarning('System Error');
         return R::Action('error');
     }
 }
コード例 #10
0
ファイル: function.php プロジェクト: AntiqS/altocms
function isPost($sName)
{
    return F::isPost($sName);
}
コード例 #11
0
ファイル: HookSnippet.class.php プロジェクト: anp135/altocms
 /**
  * Возвращает html-код фотосета
  *
  * @param array $aData
  *
  * @return bool|string
  */
 public function SnippetPhotoset($aData)
 {
     // Попытаемся определить откуда вызывается сниппет фотосета
     // поскольку нужно точно определить целевой объект и его ид
     // Редактируется топик.
     // Получим его ид. и по нему поднимем необходимый фотосет
     $aAdminMatches = array();
     $sControllerPath = R::GetControllerPath();
     if ($sControllerPath === 'ajax/preview/topic/' && F::isPost('topic_id')) {
         $iTopicId = (int) F::GetRequestStr('topic_id');
     } elseif (preg_match('~content\\/edit\\/(\\d+)\\/~', $sControllerPath, $aMatches) || preg_match('~admin\\/content-pages\\/edit\\/(\\d+)\\/~', $sControllerPath, $aAdminMatches)) {
         // Найдем топик, из которого будем брать фотосет
         $iTopicId = !empty($aData['params']['topic']) ? (int) $aData['params']['topic'] : ($aAdminMatches ? false : $aMatches[1]);
     } else {
         $iTopicId = 0;
     }
     if ($iTopicId) {
         // Странно, но топик не нашли - завернём сниппет
         if (!($oTopic = E::ModuleTopic()->GetTopicById($iTopicId))) {
             return FALSE;
         }
         // Проверим, можно ли пользователю читать этот топик, а то вдруг
         // он запросил картинки из топика закрытого блога - а так нельзя
         if (!E::ModuleACL()->IsAllowShowBlog($oTopic->getBlog(), E::User())) {
             return FALSE;
         }
         // Попытаемся найти фотосет
         /** @var ModuleMresource_EntityMresource[] $aPhotoset */
         $aPhotoset = E::ModuleMresource()->GetMresourcesRelByTarget('photoset', $oTopic->getId());
         if (empty($aPhotoset)) {
             return FALSE;
         }
         // Фотосет нашли, теперь из него нужно выбрать только те фото,
         // которые выбрал пользователь в параметрах from и to
         $iFrom = isset($aData['params']['from']) ? $aData['params']['from'] : 0;
         $iFrom = (int) str_replace(array('last', 'first'), array(count($aPhotoset), 0), $iFrom);
         // Пользователи считают картинки с первой, а не с нулевой
         if ($iFrom) {
             $iFrom -= 1;
         }
         // Если указано количество, то правый предел игнорируем
         if ($iCount = (int) isset($aData['params']['count']) ? $aData['params']['count'] : FALSE) {
             $iTo = $iFrom + $iCount - 1;
         } else {
             $iTo = isset($aData['params']['to']) ? $aData['params']['to'] : count($aPhotoset);
             $iTo = (int) str_replace(array('last', 'first'), array(count($aPhotoset), 0), $iTo);
             if ($iTo) {
                 $iTo -= 1;
             }
         }
         // Пользователь ошибочно указал диапазон. выдумывать ничего не будем,
         // просто не выведем фотосет
         if ($iTo - $iFrom < 0) {
             return FALSE;
         }
         // Сбросим ключи набора фото, так лучше считать диапазон
         $aPhotoset = array_values($aPhotoset);
         $aPhotos = array();
         for ($i = $iFrom; $i <= $iTo; $i++) {
             if (isset($aPhotoset[$i])) {
                 $oPhoto = $aPhotoset[$i];
                 $aPhotos[$oPhoto->getMresourceId()] = $oPhoto;
             }
         }
         if (!$aPhotos) {
             return FALSE;
         }
         $sPosition = isset($aData['params']['position']) ? $aData['params']['position'] : 'center';
         if (!in_array($sPosition, array('left', 'right'))) {
             $sPosition = 'center';
         }
         // Получим html-код сниппета
         $aVars = array('oTopic' => $oTopic, 'aPhotos' => $aPhotos, 'sPosition' => $sPosition, 'sPhotosetHash' => md5(serialize($aData['params'])));
         $aData['result'] = trim(E::ModuleViewer()->Fetch('tpls/snippets/snippet.photoset.tpl', $aVars));
         return $aData['result'];
     }
     return FALSE;
 }