/** * Запрос данных администратора и сохранение их в базе данных * */ protected function StepAdmin() { $this->SetSessionVar(self::SESSION_KEY_STEP_NAME, 'Admin'); $this->SetStep('Admin'); // * Передаем данные из запроса во вьювер, сохраняя значение в сессии $this->Assign('install_admin_login', $this->GetRequest('install_admin_login', 'admin', self::GET_VAR_FROM_SESSION), self::SET_VAR_IN_SESSION); $this->Assign('install_admin_mail', $this->GetRequest('install_admin_mail', '*****@*****.**', self::GET_VAR_FROM_SESSION), self::SET_VAR_IN_SESSION); // * Если данные формы не были отправлены, передаем значения по умолчанию if (!$this->GetRequest('install_admin_params', false)) { return $this->Layout('steps/admin.tpl'); } // * Проверяем валидность введенных данных list($bResult, $aErrors) = $this->ValidateAdminFields(); if (!$bResult) { foreach ($aErrors as $sError) { $this->aMessages[] = array('type' => 'error', 'text' => $sError); } $this->Layout('steps/admin.tpl'); return false; } // * Подключаемся к базе данных и сохраняем новые данные администратора $aParams = $this->GetSessionVar('INSTALL_DATABASE_PARAMS'); $oDb = $this->ValidateDBConnection($aParams); if (!$oDb) { $this->aMessages[] = array('type' => 'error', 'text' => $this->Lang('error_db_connection_invalid')); $this->Layout('steps/admin.tpl'); return false; } $this->SelectDatabase($oDb, $aParams['name']); $sLocalConfigFile = $this->sConfigDir . '/' . self::LOCAL_CONFIG_FILE_NAME; if (!$this->bSkipAdmin) { // make and save "salt" $aSalt = array(); $this->SaveConfig('security.salt_sess', $aSalt['sess'] = F::RandomStr(64, false), $sLocalConfigFile); $this->SaveConfig('security.salt_pass', $aSalt['pass'] = F::RandomStr(64, false), $sLocalConfigFile); $this->SaveConfig('security.salt_auth', $aSalt['auth'] = F::RandomStr(64, false), $sLocalConfigFile); // make salted password $sPass = F::DoSalt($this->GetRequest('install_admin_pass'), $aSalt['pass']); $bUpdated = $this->UpdateDBUser($oDb, $this->GetRequest('install_admin_login'), $sPass, $this->GetRequest('install_admin_mail'), $aParams['prefix']); if (!$bUpdated) { $this->aMessages[] = array('type' => 'error', 'text' => $this->Lang('error_db_saved') . '<br />' . mysqli_error($oDb)); $this->Layout('steps/admin.tpl'); return false; } // * Обновляем данные о пользовательском блоге $this->UpdateUserBlog($oDb, 'Blog by ' . $this->GetRequest('install_admin_login'), $aParams['prefix']); } // * Передаем управление на следующий шаг return $this->StepEnd(); }
protected function _eventRecoverySend($sRecoveryCode) { /** @var ModuleUser_EntityReminder $oReminder */ if ($oReminder = E::ModuleUser()->GetReminderByCode($sRecoveryCode)) { /** @var ModuleUser_EntityUser $oUser */ if ($oReminder->IsValid() && ($oUser = E::ModuleUser()->GetUserById($oReminder->getUserId()))) { $sNewPassword = F::RandomStr(7); $oUser->setPassword($sNewPassword, true); if (E::ModuleUser()->Update($oUser)) { // Do logout of current user E::ModuleUser()->Logout(); // Close all sessions of this user E::ModuleUser()->CloseAllSessions($oUser); $oReminder->setDateUsed(F::Now()); $oReminder->setIsUsed(1); E::ModuleUser()->UpdateReminder($oReminder); E::ModuleNotify()->SendReminderPassword($oUser, $sNewPassword); $this->SetTemplateAction('reminder_confirm'); if (($sUrl = F::GetPost('return_url')) || ($sUrl = F::GetPost('return-path'))) { E::ModuleViewer()->Assign('return-path', $sUrl); } return true; } } } return false; }
/** * @param string $sFile * * @return string|bool */ public function SaveUpload($sFile) { if ($oImage = $this->GetImage()) { if ($sTmpFile = F::File_GetUploadDir() . F::RandomStr() . '.' . pathinfo($sFile, PATHINFO_EXTENSION)) { if (F::File_CheckDir(dirname($sTmpFile))) { $oImage->save($sTmpFile); if (E::ModuleUploader()->Move($sTmpFile, $sFile)) { return $sFile; } } } } return false; }
/** * Формирование процесса смены емайла в профиле пользователя * * @param ModuleUser_EntityUser $oUser Объект пользователя * @param string $sMailNew Новый емайл * * @return bool|ModuleUser_EntityChangemail */ public function MakeUserChangemail($oUser, $sMailNew) { /** @var ModuleUser_EntityChangemail $oChangemail */ $oChangemail = E::GetEntity('ModuleUser_EntityChangemail'); $oChangemail->setUserId($oUser->getId()); $oChangemail->setDateAdd(date('Y-m-d H:i:s')); $oChangemail->setDateExpired(date('Y-m-d H:i:s', time() + 3 * 24 * 60 * 60)); // 3 дня для смены емайла $oChangemail->setMailFrom($oUser->getMail() ? $oUser->getMail() : ''); $oChangemail->setMailTo($sMailNew); $oChangemail->setCodeFrom(F::RandomStr(32)); $oChangemail->setCodeTo(F::RandomStr(32)); if ($this->AddUserChangemail($oChangemail)) { // * Если у пользователя раньше не было емайла, то сразу шлем подтверждение на новый емайл if (!$oChangemail->getMailFrom()) { $oChangemail->setConfirmFrom(1); E::ModuleUser()->UpdateUserChangemail($oChangemail); // * Отправляем уведомление на новый емайл E::ModuleNotify()->Send($oChangemail->getMailTo(), 'user_changemail_to.tpl', E::ModuleLang()->Get('notify_subject_user_changemail'), array('oUser' => $oUser, 'oChangemail' => $oChangemail), null, true); } else { // * Отправляем уведомление на старый емайл E::ModuleNotify()->Send($oUser, 'user_changemail_from.tpl', E::ModuleLang()->Get('notify_subject_user_changemail'), array('oUser' => $oUser, 'oChangemail' => $oChangemail), null, true); } return $oChangemail; } return false; }
protected function _eventMenuEdit() { // * Получаем тип $sMenuId = $this->GetParam(1); if (!($oMenu = E::ModuleMenu()->GetMenu($sMenuId))) { return parent::EventNotFound(); } E::ModuleViewer()->Assign('oMenu', $oMenu); if (strpos($oMenu->getId(), 'submenu_') === 0) { E::ModuleViewer()->Assign('isSubMenu', E::ModuleLang()->Get('action.admin.menu_manager_submenu')); } // * Устанавливаем шаблон вывода $this->_setTitle(E::ModuleLang()->Get('action.admin.menu_manager_edit_menu')); $this->SetTemplateAction('settings/menumanager_edit'); // * Проверяем отправлена ли форма с данными if (getRequestPost('submit_add_new_item')) { if (!(($sItemLink = trim(F::GetRequestStr('menu-item-link'))) && ($sItemTitle = trim(F::GetRequestStr('menu-item-title'))))) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('menu_manager_item_add_error'), E::ModuleLang()->Get('error')); return null; } $sRoot = F::GetRequest('menu-item-place'); if ($sRoot == 'root_item') { $sItemName = F::RandomStr(10); // Добавим имя в объявление $aAllowedData = array_values(Config::Get("menu.data.{$oMenu->getId()}.init.fill.list")); if (count($aAllowedData) > 1 && isset($aAllowedData[0]) && $aAllowedData[0] == '*') { unset($aAllowedData[0]); } if (is_array($aAllowedData) && isset($aAllowedData[0]) && $aAllowedData[0] == '*') { $aAllowedData = array_keys(Config::Get("menu.data.{$oMenu->getId()}.list")); } $aNewItems = array_merge($aAllowedData, array($sItemName)); $sMenuKey = "menu.data.{$oMenu->getId()}"; $aMenu = C::Get($sMenuKey); $aMenu['init']['fill']['list'] = $aNewItems; // Добавим имя в список $aNewItemConfig = array($sItemName => array('text' => $sItemTitle, 'link' => $sItemLink, 'active' => false)); $aNewItemConfig = array_merge(Config::Get("menu.data.{$oMenu->getId()}.list"), $aNewItemConfig); $aMenu['list'] = $aNewItemConfig; Config::WriteCustomConfig(array($sMenuKey => $aMenu), false); R::Location("admin/settings-menumanager/edit/{$sMenuId}"); return null; } elseif ($sRoot) { // Разрешенные идентификаторы меню $aAllowedData = array_values(Config::Get("menu.data.{$oMenu->getId()}.init.fill.list")); if (count($aAllowedData) > 1 && isset($aAllowedData[0]) && $aAllowedData[0] == '*') { unset($aAllowedData[0]); } if (is_array($aAllowedData) && isset($aAllowedData[0]) && $aAllowedData[0] == '*') { $aAllowedData = array_keys(Config::Get("menu.data.{$oMenu->getId()}.list")); } if (!in_array($sRoot, $aAllowedData)) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('menu_manager_item_add_error'), E::ModuleLang()->Get('error')); return null; } // Проверим есть ли подменю для этого элемента? $sSubMenuName = Config::Get("menu.data.{$oMenu->getId()}.list.{$sRoot}.submenu"); if (!$sSubMenuName) { $sSubMenuName = 'submenu_' . F::RandomStr(10); // Сохраним указатель на подменю $sMenuListKey = "menu.data.{$oMenu->getId()}"; $aMenu = C::Get($sMenuListKey); if ($aMenu) { $aMenu['list'][$sRoot]['submenu'] = $sSubMenuName; C::WriteCustomConfig(array($sMenuListKey => $aMenu), false); } // Сохраним само пордменю $aSubmenu = array('init' => array('fill' => array('list' => array('*'))), 'list' => array()); Config::WriteCustomConfig(array("menu.data.{$sSubMenuName}" => $aSubmenu), false); } // Добавим новый элемент в подменю $sItemName = F::RandomStr(10); // Добавим имя в объявление $sMenuKey = "menu.data.{$sSubMenuName}"; $aMenu = C::Get($sMenuKey); $aAllowedData = isset($aMenu['init']['fill']['list']) ? array_values($aMenu['init']['fill']['list']) : array(); if (is_array($aAllowedData) && isset($aAllowedData[0]) && $aAllowedData[0] == '*') { $aAllowedData = isset($aMenu['list']) ? array_keys($aMenu['list']) : array(); } if (count($aAllowedData) > 1 && isset($aAllowedData[0]) && $aAllowedData[0] == '*') { unset($aAllowedData[0]); } $aNewItems = array_merge($aAllowedData, array($sItemName)); $aMenu['init']['fill']['list'] = $aNewItems; // Добавим имя в список $aNewItemConfig = array($sItemName => array('text' => $sItemTitle, 'link' => $sItemLink, 'active' => false)); $aNewItemConfig = array_merge(isset($aMenu['list']) ? $aMenu['list'] : array(), $aNewItemConfig); $aMenu['list'] = $aNewItemConfig; Config::WriteCustomConfig(array($sMenuKey => $aMenu), false); R::Location("admin/settings-menumanager/edit/{$sMenuId}"); return null; } E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('menu_manager_item_add_error'), E::ModuleLang()->Get('error')); return null; } return null; }
/** * Возвращает уникальное имя файла для конкретной папки * * @param $sDir * @param $sExtension * @param int $nLength * * @return string */ public static function Uniqname($sDir, $sExtension, $nLength = 8) { $sFileName = F::RandomStr($nLength) . ($sExtension ? '.' . trim($sExtension, '.') : ''); while (static::Exists($sDir . '/' . $sFileName)) { $sFileName = static::Uniqname($sDir, $sExtension, $nLength); } return static::NormPath($sDir . '/' . $sFileName); }
/** * Обработка Ajax регистрации */ protected function EventAjaxRegistration() { // * Устанавливаем формат Ajax ответа E::ModuleViewer()->SetResponseAjax('json'); E::ModuleSecurity()->ValidateSendForm(); // * Создаем объект пользователя и устанавливаем сценарий валидации /** @var ModuleUser_EntityUser $oUser */ $oUser = E::GetEntity('ModuleUser_EntityUser'); $oUser->_setValidateScenario('registration'); // * Заполняем поля (данные) $oUser->setLogin($this->GetPost('login')); $oUser->setMail($this->GetPost('mail')); $oUser->setPassword($this->GetPost('password')); $oUser->setPasswordConfirm($this->GetPost('password_confirm')); $oUser->setCaptcha($this->GetPost('captcha')); $oUser->setDateRegister(F::Now()); $oUser->setIpRegister(F::GetUserIp()); // * Если используется активация, то генерим код активации if (Config::Get('general.reg.activation')) { $oUser->setActivate(0); $oUser->setActivationKey(F::RandomStr()); } else { $oUser->setActivate(1); $oUser->setActivationKey(null); } E::ModuleHook()->Run('registration_validate_before', array('oUser' => $oUser)); // * Запускаем валидацию if ($oUser->_Validate()) { // Сбросим капчу // issue#342. E::ModuleSession()->Drop(E::ModuleCaptcha()->GetKeyName()); E::ModuleHook()->Run('registration_validate_after', array('oUser' => $oUser)); $oUser->setPassword($oUser->getPassword(), true); if ($this->_addUser($oUser)) { E::ModuleHook()->Run('registration_after', array('oUser' => $oUser)); // * Подписываем пользователя на дефолтные события в ленте активности E::ModuleStream()->SwitchUserEventDefaultTypes($oUser->getId()); // * Если юзер зарегистрировался по приглашению то обновляем инвайт if (Config::Get('general.reg.invite') && ($oInvite = E::ModuleUser()->GetInviteByCode($this->GetInviteRegister()))) { $oInvite->setUserToId($oUser->getId()); $oInvite->setDateUsed(F::Now()); $oInvite->setUsed(1); E::ModuleUser()->UpdateInvite($oInvite); } // * Если стоит регистрация с активацией то проводим её if (Config::Get('general.reg.activation')) { // * Отправляем на мыло письмо о подтверждении регистрации E::ModuleNotify()->SendRegistrationActivate($oUser, F::GetRequestStr('password')); E::ModuleViewer()->AssignAjax('sUrlRedirect', R::GetPath('registration') . 'confirm/'); } else { E::ModuleNotify()->SendRegistration($oUser, F::GetRequestStr('password')); $oUser = E::ModuleUser()->GetUserById($oUser->getId()); // * Сразу авторизуем E::ModuleUser()->Authorization($oUser, false); $this->DropInviteRegister(); // * Определяем URL для редиректа после авторизации $sUrl = Config::Get('module.user.redirect_after_registration'); if (F::GetRequestStr('return-path')) { $sUrl = F::GetRequestStr('return-path'); } E::ModuleViewer()->AssignAjax('sUrlRedirect', $sUrl ? $sUrl : Config::Get('path.root.url')); E::ModuleMessage()->AddNoticeSingle(E::ModuleLang()->Get('registration_ok')); } } else { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('system_error')); return; } } else { // * Получаем ошибки E::ModuleViewer()->AssignAjax('aErrors', $oUser->_getValidateErrors()); } }
/** * Создает подписку, если уже есть, то возвращает существующую * * @param string $sTargetType Тип * @param string $sTargetId ID владельца * @param string $sUserId ID юзера * * @return ModuleSubscribe_EntityTrack|bool */ public function AddTrackSimple($sTargetType, $sTargetId, $sUserId) { if (!$sUserId) { return false; } if (!($oTrack = E::ModuleSubscribe()->GetTrackByTargetAndUser($sTargetType, $sTargetId, $sUserId))) { $oTrack = E::GetEntity('ModuleSubscribe_EntityTrack'); $oTrack->setTargetType($sTargetType); $oTrack->setTargetId($sTargetId); $oTrack->setUserId($sUserId); $oTrack->setDateAdd(date('Y-m-d H:i:s')); $oTrack->setKey(F::RandomStr(32)); $oTrack->setIp(F::GetUserIp()); $oTrack->setStatus(1); E::ModuleSubscribe()->AddTrack($oTrack); } return $oTrack; }
/** * Generates security key for the current session * * @return string */ protected function _generateSecurityKey() { // Сохраняем текущий ключ для ajax-запросов if (F::AjaxRequest() && ($sKey = E::ModuleSession()->Get($this->sSecurityKeyName))) { return $sKey; } if (Config::Get('module.security.randomkey')) { return F::RandomStr($this->sSecurityKeyLen); } else { //return md5(E::ModuleSession()->GetId().Config::Get('module.security.hash')); return md5($this->GetUniqKey() . $this->GetClientHash() . Config::Get('module.security.hash')); } }
/** * Добавление топика * * @return mixed */ protected function EventAdd() { // * Устанавливаем шаблон вывода $this->SetTemplateAction('add'); E::ModuleViewer()->Assign('sMode', 'add'); // * Вызов хуков E::ModuleHook()->Run('topic_add_show'); // * Получаем тип контента if (!($this->oContentType = E::ModuleTopic()->GetContentTypeByUrl($this->sCurrentEvent))) { if (!($this->oContentType = E::ModuleTopic()->GetContentTypeDefault())) { return parent::EventNotFound(); } } E::ModuleViewer()->Assign('oContentType', $this->oContentType); $this->sMenuSubItemSelect = $this->oContentType->getContentUrl(); // * Если тип контента не доступен текущему юзеру if (!$this->oContentType->isAccessible()) { return parent::EventNotFound(); } $aBlogFilter = array('user' => $this->oUserCurrent, 'content_type' => $this->oContentType); $aBlogsAllow = $this->_getAllowBlogs($aBlogFilter); // Такой тип контента не разрешен для пользователя ни в одном из типов блогов if (!$aBlogsAllow) { return parent::EventNotFound(); } // Проверим можно ли писать в персональный блог такой тип контента /** @var ModuleBlog_EntityBlog $oAllowedBlog */ $this->bPersonalBlogEnabled = FALSE; foreach ($aBlogsAllow as $oAllowedBlog) { // Нашли среди разрешенных персональный блог if ($oAllowedBlog->getType() == 'personal') { if (!$oAllowedBlog->getBlogType()->getContentTypes()) { // типы контента не определены, значит, разрешен любой $this->bPersonalBlogEnabled = TRUE; } else { foreach ($oAllowedBlog->getBlogType()->getContentTypes() as $oContentType) { if ($oContentType->getId() == $this->oContentType->getId()) { $this->bPersonalBlogEnabled = TRUE; break; } } } break; } } // * Загружаем переменные в шаблон E::ModuleViewer()->Assign('bPersonalBlog', $this->bPersonalBlogEnabled); E::ModuleViewer()->Assign('aBlogsAllow', $aBlogsAllow); E::ModuleViewer()->Assign('bEditDisabled', false); E::ModuleViewer()->AddHtmlTitle(E::ModuleLang()->Get('topic_topic_create') . ' ' . mb_strtolower($this->oContentType->getContentTitle(), 'UTF-8')); if (!is_numeric(F::GetRequest('topic_id'))) { $_REQUEST['topic_id'] = ''; } $_REQUEST['topic_show_photoset'] = 1; // * Если нет временного ключа для нового топика, то генерируем; если есть, то загружаем фото по этому ключу if ($sTargetTmp = E::ModuleSession()->GetCookie('ls_photoset_target_tmp')) { E::ModuleSession()->SetCookie('ls_photoset_target_tmp', $sTargetTmp, 'P1D', false); E::ModuleViewer()->Assign('aPhotos', E::ModuleTopic()->GetPhotosByTargetTmp($sTargetTmp)); } else { E::ModuleSession()->SetCookie('ls_photoset_target_tmp', F::RandomStr(), 'P1D', false); } // Если POST-запрос, то обрабатываем отправку формы if ($this->IsPost()) { return $this->SubmitAdd(); } return null; }
/** * Выводит изображение и прикрепляет его ко временному объекту * * @param $aParams * @param Smarty $oSmarty * @return string */ function smarty_function_imgs($aParams, &$oSmarty = NULL) { // Пропущен тип объекта if (!isset($aParams['target-type'])) { trigger_error("img: missing 'target-type' parameter", E_USER_WARNING); return ''; } // Пропущен идентификатор объекта if (!isset($aParams['target-id'])) { trigger_error("img: missing 'target-id' parameter", E_USER_WARNING); return ''; } // Получим тип объекта $sTargetType = $aParams['target-type']; unset($aParams['target-type']); // Получим ид объекта $iTargetId = intval($aParams['target-id']); unset($aParams['target-id']); // Получим параметры обрезки объекта $sCrop = isset($aParams['crop']) ? $aParams['crop'] : FALSE; unset($aParams['crop']); // Получим ид объекта $sTemplate = isset($aParams['template']) ? $aParams['template'] : FALSE; unset($aParams['template']); // Получим изображение по временному ключу, или создадим этот ключ $aParams['src'] = array(); if (($sTargetTmp = E::ModuleSession()->GetCookie(ModuleUploader::COOKIE_TARGET_TMP)) && E::IsUser()) { // Продлим куку E::ModuleSession()->SetCookie(ModuleUploader::COOKIE_TARGET_TMP, $sTargetTmp, 'P1D', FALSE); } else { // Куки нет, это значит, что пользователь первый раз создает этот тип // и старой картинки просто нет if ($iTargetId == '0') { E::ModuleSession()->SetCookie(ModuleUploader::COOKIE_TARGET_TMP, F::RandomStr(), 'P1D', FALSE); } else { E::ModuleSession()->DelCookie(ModuleUploader::COOKIE_TARGET_TMP); } } // Получим предыдущее изображение и если оно было, установим в качестве текущего // Получим и удалим все ресурсы $aMresourceRel = E::ModuleMresource()->GetMresourcesRelByTargetAndUser($sTargetType, $iTargetId, E::UserId()); if ($aMresourceRel && is_array($aMresourceRel)) { /** @var ModuleMresource_EntityMresource $oResource */ foreach ($aMresourceRel as $oMresource) { if ($sCrop) { $aParams['src'][$oMresource->getMresourceId()] = array('url' => E::ModuleUploader()->ResizeTargetImage($oMresource->GetUrl(), $sCrop), 'cover' => $oMresource->IsCover()); } else { $aParams['src'][$oMresource->getMresourceId()] = array('url' => $oMresource->GetUrl(), 'cover' => $oMresource->IsCover()); } $oSmarty->assign("bHasImage", TRUE); } } // Создадим массив картинок $sItems = ''; if ($aParams['src']) { foreach ($aParams['src'] as $sID => $aData) { $sItems .= str_replace(array('ID', 'uploader_item_SRC', 'MARK_AS_PREVIEW'), array($sID, $aData['url'], $aData['cover'] ? E::ModuleLang()->Get('topic_photoset_is_preview') : E::ModuleLang()->Get('topic_photoset_mark_as_preview')), $sTemplate); } } return $sItems; }
/** * генерирует случайную последовательность символов * * @param int $iLength * * @return string */ function func_generator($iLength = 10) { if ($iLength > 32) { $iLength = 32; } return F::RandomStr($iLength); }
/** * Гинерирует уникальный идентификатор * * @return string */ protected function GenerateId() { return md5(F::RandomStr() . time()); }
/** * Выводит изображение и прикрепляет его ко временному объекту * * @param $aParams * @param Smarty $oSmarty * @return string */ function smarty_function_img($aParams, &$oSmarty = NULL) { // Пропущен тип объекта if (!isset($aParams['attr']['target-type'])) { trigger_error("img: missing 'target-type' parameter", E_USER_WARNING); return ''; } // Пропущен идентификатор объекта if (!isset($aParams['attr']['target-id'])) { trigger_error("img: missing 'target-id' parameter", E_USER_WARNING); return ''; } // Получим тип объекта $sTargetType = $aParams['attr']['target-type']; unset($aParams['attr']['target-type']); // Получим ид объекта $iTargetId = intval($aParams['attr']['target-id']); unset($aParams['attr']['target-id']); // Получим ид объекта $sCrop = isset($aParams['attr']['crop']) ? $aParams['attr']['crop'] : FALSE; unset($aParams['attr']['crop']); // Получим изображение по временному ключу, или создадим этот ключ if (($sTargetTmp = E::ModuleSession()->GetCookie(ModuleUploader::COOKIE_TARGET_TMP)) && E::IsUser()) { // Продлим куку E::ModuleSession()->SetCookie(ModuleUploader::COOKIE_TARGET_TMP, $sTargetTmp, 'P1D', FALSE); // Получим предыдущее изображение и если оно было, установим в качестве текущего // Получим и удалим все ресурсы $aMresourceRel = E::ModuleMresource()->GetMresourcesRelByTargetAndUser($sTargetType, $iTargetId, E::UserId()); if ($aMresourceRel) { /** @var ModuleMresource_EntityMresource $oResource */ $oMresource = array_shift($aMresourceRel); if ($oMresource) { if ($sCrop) { $aParams['attr']['src'] = E::ModuleUploader()->ResizeTargetImage($oMresource->GetUrl(), $sCrop); } else { $aParams['attr']['src'] = $oMresource->GetUrl(); } $oSmarty->assign("bImageIsTemporary", TRUE); } } } else { // Куки нет, это значит, что пользователь первый раз создает этот тип // и старой картинки просто нет if ($iTargetId == '0') { E::ModuleSession()->SetCookie(ModuleUploader::COOKIE_TARGET_TMP, F::RandomStr(), 'P1D', FALSE); } else { E::ModuleSession()->DelCookie(ModuleUploader::COOKIE_TARGET_TMP); $sImage = E::ModuleUploader()->GetTargetImageUrl($sTargetType, $iTargetId, $sCrop); if ($sImage) { $aParams['attr']['src'] = $sImage; $oSmarty->assign("bImageIsTemporary", TRUE); } } } // Формируем строку атрибутов изображения $sAttr = ''; if (isset($aParams['attr']) && is_array($aParams['attr'])) { foreach ($aParams['attr'] as $sAttrName => $sAttrValue) { $sAttr .= ' ' . $sAttrName . '="' . $sAttrValue . '"'; } } // Сформируем тег изображения $sImageTag = '<img ' . $sAttr . '/>'; return $sImageTag; }
/** * Resize,copy image, * make rounded corners and add watermark * * @param string $sFileSrc Исходный файл изображения * @param string $sDirDest Директория куда нужно сохранить изображение относительно корня сайта (path.root.server) * @param string $sFileDest Имя файла для сохранения, без расширения * @param int $iWidthMax Максимально допустимая ширина изображения * @param int $iHeightMax Максимало допустимая высота изображения * @param int|null $iWidthDest Ширина необходимого изображения на выходе * @param int|null $iHeightDest Высота необходимого изображения на выходе * @param bool $bForcedMinSize Растягивать изображение по ширине или нет, если исходное меньше. При false - изображение будет растянуто * @param array|null $aParams Параметры * @param LiveImage|null $oImage Объект изображения, если null то будет содано автоматически * @return string|bool Полный серверный путь до сохраненного изображения */ public function Resize($sFileSrc, $sDirDest, $sFileDest, $iWidthMax, $iHeightMax, $iWidthDest = null, $iHeightDest = null, $bForcedMinSize = true, $aParams = null, $oImage = null) { $this->ClearLastError(); /** * Если параметры не переданы, устанавливаем действия по умолчанию */ if (!is_array($aParams)) { $aParams = $this->aParamsDefault; } /** * Если объект не передан как параметр, * создаем новый */ if (!$oImage) { $oImage = $this->CreateImageObject($sFileSrc); } if ($oImage->get_last_error()) { $this->SetLastError($oImage->get_last_error()); return false; } $sFileDest .= '.' . $oImage->get_image_params('format'); if ($oImage->get_image_params('width') > $iWidthMax or $oImage->get_image_params('height') > $iHeightMax) { return false; } if ($iWidthDest) { if ($bForcedMinSize and $iWidthDest > $oImage->get_image_params('width')) { $iWidthDest = $oImage->get_image_params('width'); } /** * Ресайзим и выводим результат в файл. * Если не задана новая высота, то применяем масштабирование. * Если нужно добавить Watermark, то запрещаем ручное управление alfa-каналом */ $bWatermark = isset($aParams['watermark_use']) ? $aParams['watermark_use'] : false; $oImage->resize($iWidthDest, $iHeightDest, !$iHeightDest, !$bWatermark); /** * Добавляем watermark согласно в конфигурации заданым параметрам */ if ($bWatermark) { if ($oImage->get_image_params('width') > $aParams['watermark_min_width'] and $oImage->get_image_params('height') > $aParams['watermark_min_height']) { switch ($aParams['watermark_type']) { default: case 'text': $oImage->set_font($aParams['watermark_font_size'], 0, $aParams['path']['fonts'] . $aParams['watermark_font'] . '.ttf'); $oImage->watermark($aParams['watermark_text'], explode(',', $aParams['watermark_position'], 2), explode(',', $aParams['watermark_font_color']), explode(',', $aParams['watermark_back_color']), $aParams['watermark_font_alfa'], $aParams['watermark_back_alfa']); break; case 'image': $oImage->paste_image($aParams['path']['watermarks'] . $aParams['watermark_image'], false, explode(',', $aParams['watermark_position'], 2)); break; } } } /** * Скругляем углы */ if (!empty($aParams['round_corner'])) { $oImage->round_corners($aParams['round_corner_radius'], $aParams['round_corner_rate']); } /** * Для JPG формата устанавливаем output quality, если это предусмотрено в конфигурации */ if (isset($aParams['jpg_quality']) and $oImage->get_image_params('format') == 'jpg') { $oImage->set_jpg_quality($aParams['jpg_quality']); } $sFileTmp = Config::Get('sys.cache.dir') . F::RandomStr(20); $oImage->output(null, $sFileTmp); return $this->SaveFile($sFileTmp, $sDirDest, $sFileDest, 0666, true); } else { return $this->SaveFile($sFileSrc, $sDirDest, $sFileDest, 0666, false); } return false; }
/** * Обработка дополнительных полей топика * * @param ModuleTopic_EntityTopic $oTopic * @param string $sType * * @return bool */ public function processTopicFields($oTopic, $sType = 'add') { /** @var ModuleTopic_EntityContentValues $aValues */ $aValues = array(); if ($sType == 'update') { // * Получаем существующие значения if ($aData = $this->GetTopicValuesByArrayId(array($oTopic->getId()))) { $aValues = $aData[$oTopic->getId()]; } // * Чистим существующие значения E::ModuleTopic()->DeleteTopicValuesByTopicId($oTopic->getId()); } if ($oType = E::ModuleTopic()->GetContentTypeByUrl($oTopic->getType())) { //получаем поля для данного типа if ($aFields = $oType->getFields()) { foreach ($aFields as $oField) { $sData = null; if (isset($_REQUEST['fields'][$oField->getFieldId()]) || isset($_FILES['fields_' . $oField->getFieldId()]) || $oField->getFieldType() == 'single-image-uploader') { //текстовые поля if (in_array($oField->getFieldType(), array('input', 'textarea', 'select'))) { $sData = E::ModuleText()->Parser($_REQUEST['fields'][$oField->getFieldId()]); } //поле ссылки if ($oField->getFieldType() == 'link') { $sData = $_REQUEST['fields'][$oField->getFieldId()]; } //поле даты if ($oField->getFieldType() == 'date') { if (isset($_REQUEST['fields'][$oField->getFieldId()])) { if (F::CheckVal($_REQUEST['fields'][$oField->getFieldId()], 'text', 6, 10) && substr_count($_REQUEST['fields'][$oField->getFieldId()], '.') == 2) { list($d, $m, $y) = explode('.', $_REQUEST['fields'][$oField->getFieldId()]); if (@checkdate($m, $d, $y)) { $sData = $_REQUEST['fields'][$oField->getFieldId()]; } } } } //поле с файлом if ($oField->getFieldType() == 'file') { //если указано удаление файла if (F::GetRequest('topic_delete_file_' . $oField->getFieldId())) { if ($oTopic->getFieldFile($oField->getFieldId())) { @unlink(Config::Get('path.root.dir') . $oTopic->getFieldFile($oField->getFieldId())->getFileUrl()); //$oTopic->setValueField($oField->getFieldId(),''); $sData = null; } } else { //если удаление файла не указано, уже ранее залит файл^ и нового файла не загружалось if ($sType == 'update' && isset($aValues[$oField->getFieldId()])) { $sData = $aValues[$oField->getFieldId()]->getValueSource(); } } if (isset($_FILES['fields_' . $oField->getFieldId()]) && is_uploaded_file($_FILES['fields_' . $oField->getFieldId()]['tmp_name'])) { $iMaxFileSize = F::MemSize2Int(Config::Get('module.uploader.files.default.file_maxsize')); $aFileExtensions = Config::Get('module.uploader.files.default.file_extensions'); if (!$iMaxFileSize || filesize($_FILES['fields_' . $oField->getFieldId()]['tmp_name']) <= $iMaxFileSize) { $aPathInfo = pathinfo($_FILES['fields_' . $oField->getFieldId()]['name']); if (!$aFileExtensions || in_array(strtolower($aPathInfo['extension']), $aFileExtensions)) { $sFileTmp = $_FILES['fields_' . $oField->getFieldId()]['tmp_name']; $sDirSave = Config::Get('path.uploads.root') . '/files/' . E::ModuleUser()->GetUserCurrent()->getId() . '/' . F::RandomStr(16); mkdir(Config::Get('path.root.dir') . $sDirSave, 0777, true); if (is_dir(Config::Get('path.root.dir') . $sDirSave)) { $sFile = $sDirSave . '/' . F::RandomStr(10) . '.' . strtolower($aPathInfo['extension']); $sFileFullPath = Config::Get('path.root.dir') . $sFile; if (copy($sFileTmp, $sFileFullPath)) { //удаляем старый файл if ($oTopic->getFieldFile($oField->getFieldId())) { $sOldFile = Config::Get('path.root.dir') . $oTopic->getFieldFile($oField->getFieldId())->getFileUrl(); F::File_Delete($sOldFile); } $aFileObj = array(); $aFileObj['file_hash'] = F::RandomStr(32); $aFileObj['file_name'] = E::ModuleText()->Parser($_FILES['fields_' . $oField->getFieldId()]['name']); $aFileObj['file_url'] = $sFile; $aFileObj['file_size'] = $_FILES['fields_' . $oField->getFieldId()]['size']; $aFileObj['file_extension'] = $aPathInfo['extension']; $aFileObj['file_downloads'] = 0; $sData = serialize($aFileObj); F::File_Delete($sFileTmp); } } } else { $sTypes = implode(', ', $aFileExtensions); E::ModuleMessage()->AddError(E::ModuleLang()->Get('topic_field_file_upload_err_type', array('types' => $sTypes)), null, true); } } else { E::ModuleMessage()->AddError(E::ModuleLang()->Get('topic_field_file_upload_err_size', array('size' => $iMaxFileSize)), null, true); } F::File_Delete($_FILES['fields_' . $oField->getFieldId()]['tmp_name']); } } // Поле с изображением if ($oField->getFieldType() == 'single-image-uploader') { $sTargetType = $oField->getFieldType() . '-' . $oField->getFieldId(); $iTargetId = $oTopic->getId(); // 1. Удалить значение target_tmp // Нужно затереть временный ключ в ресурсах, что бы в дальнейшем картнка не // воспринималась как временная. if ($sTargetTmp = E::ModuleSession()->GetCookie(ModuleUploader::COOKIE_TARGET_TMP)) { // 2. Удалить куку. // Если прозошло сохранение вновь созданного топика, то нужно // удалить куку временной картинки. Если же сохранялся уже существующий топик, // то удаление куки ни на что влиять не будет. E::ModuleSession()->DelCookie(ModuleUploader::COOKIE_TARGET_TMP); // 3. Переместить фото $sNewPath = E::ModuleUploader()->GetUserImageDir(E::UserId(), true, false); $aMresourceRel = E::ModuleMresource()->GetMresourcesRelByTargetAndUser($sTargetType, 0, E::UserId()); if ($aMresourceRel) { $oResource = array_shift($aMresourceRel); $sOldPath = $oResource->GetFile(); $oStoredFile = E::ModuleUploader()->Store($sOldPath, $sNewPath); /** @var ModuleMresource_EntityMresource $oResource */ $oResource = E::ModuleMresource()->GetMresourcesByUuid($oStoredFile->getUuid()); if ($oResource) { $oResource->setUrl(E::ModuleMresource()->NormalizeUrl(E::ModuleUploader()->GetTargetUrl($sTargetType, $iTargetId))); $oResource->setType($sTargetType); $oResource->setUserId(E::UserId()); // 4. В свойство поля записать адрес картинки $sData = $oResource->getMresourceId(); $oResource = array($oResource); E::ModuleMresource()->UnlinkFile($sTargetType, 0, $oTopic->getUserId()); E::ModuleMresource()->AddTargetRel($oResource, $sTargetType, $iTargetId); } } } else { // Топик редактируется, просто обновим поле $aMresourceRel = E::ModuleMresource()->GetMresourcesRelByTargetAndUser($sTargetType, $iTargetId, E::UserId()); if ($aMresourceRel) { $oResource = array_shift($aMresourceRel); $sData = $oResource->getMresourceId(); } else { $sData = false; // $this->DeleteField($oField); } } } E::ModuleHook()->Run('content_field_proccess', array('sData' => &$sData, 'oField' => $oField, 'oTopic' => $oTopic, 'aValues' => $aValues, 'sType' => &$sType)); //Добавляем поле к топику. if ($sData) { /** @var ModuleTopic_EntityContentValues $oValue */ $oValue = E::GetEntity('Topic_ContentValues'); $oValue->setTargetId($oTopic->getId()); $oValue->setTargetType('topic'); $oValue->setFieldId($oField->getFieldId()); $oValue->setFieldType($oField->getFieldType()); $oValue->setValue($sData); $oValue->setValueSource(in_array($oField->getFieldType(), array('file', 'single-image-uploader')) ? $sData : $_REQUEST['fields'][$oField->getFieldId()]); $this->AddTopicValue($oValue); } } } } } return true; }
/** * @return null|string */ protected function _eventMenuEdit() { // * Получаем тип $sMenuId = $this->GetParam(1); if (!($oMenu = E::ModuleMenu()->GetMenu($sMenuId))) { return parent::EventNotFound(); } E::ModuleViewer()->Assign('oMenu', $oMenu); if (strpos($oMenu->getId(), 'submenu_') === 0) { E::ModuleViewer()->Assign('isSubMenu', E::ModuleLang()->Get('action.admin.menu_manager_submenu')); } // * Устанавливаем шаблон вывода $this->_setTitle(E::ModuleLang()->Get('action.admin.menu_manager_edit_menu')); $this->SetTemplateAction('settings/menumanager_edit'); // * Проверяем отправлена ли форма с данными if (F::GetPost('submit_add_new_item')) { $sItemTitle = ''; if (!(($sItemLink = trim(F::GetRequestStr('menu-item-link'))) && ($sItemTitle = trim(F::GetRequestStr('menu-item-title'))))) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('menu_manager_item_add_error'), E::ModuleLang()->Get('error')); return null; } $sRoot = F::GetRequest('menu-item-place'); if ($sRoot == 'root_item') { // Add new item in root of menu $sItemName = F::RandomStr(10); $oMenuItem = E::ModuleMenu()->CreateMenuItem($sItemName, array('text' => $sItemTitle, 'link' => $sItemLink, 'active' => false)); // Добавим в меню $oMenu->AddItem($oMenuItem); E::ModuleMenu()->SaveMenu($oMenu); R::Location("admin/settings-menumanager/edit/{$sMenuId}"); return null; } elseif ($sRoot) { // Разрешенные идентификаторы меню $aAllowedData = $oMenu->getFillList(); if (!empty($aAllowedData) && !in_array($sRoot, $aAllowedData)) { E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('menu_manager_item_add_error'), E::ModuleLang()->Get('error')); return null; } // Проверим, есть ли подменю для этого элемента? $sSubMenuName = Config::Get("menu.data.{$oMenu->getId()}.list.{$sRoot}.submenu"); if (!$sSubMenuName) { $sSubMenuName = 'submenu_' . F::RandomStr(10); // Сохраним указатель на подменю $oMenu->SetConfigItem($sRoot, 'submenu', $sSubMenuName); E::ModuleMenu()->SaveMenu($oMenu); // Сохраним само подменю (пока пустое) $oSubMenu = E::ModuleMenu()->CreateMenu($sSubMenuName); E::ModuleMenu()->SaveMenu($oSubMenu); } else { $oSubMenu = E::ModuleMenu()->GetMenu($sSubMenuName); } // Добавим новый элемент в подменю $sItemName = F::RandomStr(10); $oMenuItem = E::ModuleMenu()->CreateMenuItem($sItemName, array('text' => $sItemTitle, 'link' => $sItemLink, 'active' => false)); // Добавим в меню $oSubMenu->AddItem($oMenuItem); E::ModuleMenu()->SaveMenu($oSubMenu); R::Location("admin/settings-menumanager/edit/{$sMenuId}"); return null; } E::ModuleMessage()->AddErrorSingle(E::ModuleLang()->Get('menu_manager_item_add_error'), E::ModuleLang()->Get('error')); return null; } return null; }