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; }
/** * Редактирование поля контента * * @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; }
/** * @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; }
/** * Дополнительные настройки сайта */ 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(); } } }
/** * Редактирование поля контента * * @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; }
/** * Страница создания письма */ 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'); } }
/** * Обработка кода приглашения при включеном режиме инвайтов * */ 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')); } } }
/** * Проверка полей блога * * @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; }
/** * Обработка добавления топика * * @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'); } }
function isPost($sName) { return F::isPost($sName); }
/** * Возвращает 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; }