Пример #1
0
 /**
  * Поиск текста по топикам
  *
  * @param string $sRegExp
  * @param int    $iCount
  * @param int    $iCurrPage
  * @param int    $iPerPage
  * @param array  $aParams
  *
  * @return array
  */
 public function GetTopicsIdByRegexp($sRegExp, &$iCount, $iCurrPage, $iPerPage, $aParams)
 {
     $aData = $this->PrepareRegExp($sRegExp);
     $aWeight = array();
     // Обработка возможного фильтра. Пока параметр один - это разрешённые блоги для пользователя
     // но на будущее условия разделены
     if (isset($aParams['aFilter']) && is_array($aParams['aFilter']) && !empty($aParams['aFilter'])) {
         // Если определён список типов/ид. разрешённых блогов
         if (isset($aParams['aFilter']['blog_type']) && is_array($aParams['aFilter']['blog_type']) && !empty($aParams['aFilter']['blog_type'])) {
             $sWhere = '';
             $aBlogTypes = array();
             $aOrClauses = array();
             $aParams['aFilter']['blog_type'] = F::Array_FlipIntKeys($aParams['aFilter']['blog_type'], 0);
             foreach ($aParams['aFilter']['blog_type'] as $sType => $aBlogsId) {
                 if ($aBlogsId) {
                     if ($sType == '*') {
                         $aOrClauses[] = "(t.blog_id IN ('" . join("','", $aBlogsId) . "'))";
                     } else {
                         $aOrClauses[] = "b.blog_type='" . $sType . "' AND t.blog_id IN ('" . join("','", $aBlogsId) . "')";
                     }
                 } else {
                     $aBlogTypes[] = "'" . $sType . "'";
                 }
             }
             if ($aBlogTypes) {
                 $aOrClauses[] = '(b.blog_type IN (' . join(',', $aBlogTypes) . '))';
             }
             if ($aOrClauses) {
                 $sWhere .= ' AND (' . join(' OR ', $aOrClauses) . ')';
             }
         }
     }
     $aWeight[] = "(LOWER(t.topic_title) REGEXP " . $this->oDb->escape($aData['regexp']['phrase']) . ")*" . $aData['rates']['phrase'] * $aData['rates']['title'];
     $aWeight[] = "(LOWER(tc.topic_text_source) REGEXP " . $this->oDb->escape($aData['regexp']['phrase']) . ")*" . $aData['rates']['phrase'];
     foreach ($aData['words'] as $sWord) {
         $aWeight[] = "(LOWER(t.topic_title) REGEXP " . $this->oDb->escape($sWord) . ")*" . $aData['rates']['words'] * $aData['rates']['title'];
         $aWeight[] = "(LOWER(tc.topic_text_source) REGEXP " . $this->oDb->escape($sWord) . ")*" . $aData['rates']['words'];
     }
     $sWeight = implode('+', $aWeight);
     $aResult = array();
     $sql = "\n                SELECT t.topic_id,\n                    {$sWeight} AS weight\n                FROM ?_topic AS t\n                    INNER JOIN ?_topic_content AS tc ON tc.topic_id=t.topic_id\n                    " . (C::Get('module.search.accessible') ? 'INNER JOIN ?_blog AS b ON b.blog_id=t.blog_id' : '') . "\n                WHERE \n                    (topic_publish=1)\n                    " . $sWhere . "\n                     AND topic_index_ignore=0\n                     AND (\n                        (LOWER(t.topic_title) REGEXP ?)\n                        OR (LOWER(tc.topic_text_source) REGEXP ?)\n                     )\n                ORDER BY\n                    weight DESC,\n                    t.topic_id ASC\n                LIMIT ?d, ?d\n            ";
     $aRows = $this->oDb->selectPage($iCount, $sql, $aData['regexp']['words'], $aData['regexp']['words'], ($iCurrPage - 1) * $iPerPage, $iPerPage);
     if ($aRows) {
         foreach ($aRows as $aRow) {
             $aResult[] = $aRow['topic_id'];
         }
     }
     return $aResult;
 }
Пример #2
0
 /**
  * Получает дополнительные данные(объекты) для топиков по их ID
  *
  * @param array|int  $aTopicId    Список ID топиков
  * @param array|null $aAllowData  Список типов дополнительных данных, которые нужно подключать к топикам
  *
  * @return ModuleTopic_EntityTopic[]
  */
 public function GetTopicsAdditionalData($aTopicId, $aAllowData = null)
 {
     if (!is_array($aTopicId)) {
         $aTopicId = array($aTopicId);
     }
     // * Получаем "голые" топики
     $aTopics = $this->GetTopicsByArrayId($aTopicId);
     if (!$aTopics) {
         return array();
     }
     if (is_null($aAllowData)) {
         $aAllowData = $this->aAdditionalData;
     }
     $aAllowData = F::Array_FlipIntKeys($aAllowData);
     // * Формируем ID дополнительных данных, которые нужно получить
     $aUserId = array();
     $aBlogId = array();
     $aTopicId = array();
     $aPhotoMainId = array();
     /** @var ModuleTopic_EntityTopic $oTopic */
     foreach ($aTopics as $oTopic) {
         if (isset($aAllowData['user'])) {
             $aUserId[] = $oTopic->getUserId();
         }
         if (isset($aAllowData['blog'])) {
             $aBlogId[] = $oTopic->getBlogId();
         }
         $aTopicId[] = $oTopic->getId();
         if ($oTopic->getPhotosetMainPhotoId()) {
             $aPhotoMainId[] = $oTopic->getPhotosetMainPhotoId();
         }
     }
     if ($aUserId) {
         $aUserId = array_unique($aUserId);
     }
     if ($aBlogId) {
         $aBlogId = array_unique($aBlogId);
     }
     /**
      * Получаем дополнительные данные
      */
     $aTopicsVote = array();
     $aFavouriteTopics = array();
     $aTopicsQuestionVote = array();
     $aTopicsRead = array();
     $aUsers = isset($aAllowData['user']) && is_array($aAllowData['user']) ? E::ModuleUser()->GetUsersAdditionalData($aUserId, $aAllowData['user']) : E::ModuleUser()->GetUsersAdditionalData($aUserId);
     $aBlogs = isset($aAllowData['blog']) && is_array($aAllowData['blog']) ? E::ModuleBlog()->GetBlogsAdditionalData($aBlogId, $aAllowData['blog']) : E::ModuleBlog()->GetBlogsAdditionalData($aBlogId);
     if (isset($aAllowData['vote']) && $this->oUserCurrent) {
         $aTopicsVote = E::ModuleVote()->GetVoteByArray($aTopicId, 'topic', $this->oUserCurrent->getId());
         $aTopicsQuestionVote = $this->GetTopicsQuestionVoteByArray($aTopicId, $this->oUserCurrent->getId());
     }
     if (isset($aAllowData['favourite']) && $this->oUserCurrent) {
         $aFavouriteTopics = $this->GetFavouriteTopicsByArray($aTopicId, $this->oUserCurrent->getId());
     }
     if (isset($aAllowData['fields'])) {
         $aTopicFieldValues = $this->GetTopicValuesByArrayId($aTopicId);
     }
     if (isset($aAllowData['comment_new']) && $this->oUserCurrent) {
         $aTopicsRead = $this->GetTopicsReadByArray($aTopicId, $this->oUserCurrent->getId());
     }
     $aPhotosetMainPhotos = $this->GetTopicPhotosByArrayId($aPhotoMainId);
     // * Добавляем данные к результату - списку топиков
     /** @var ModuleTopic_EntityTopic $oTopic */
     foreach ($aTopics as $oTopic) {
         if (isset($aUsers[$oTopic->getUserId()])) {
             $oTopic->setUser($aUsers[$oTopic->getUserId()]);
         } else {
             $oTopic->setUser(null);
             // или $oTopic->setUser(new ModuleUser_EntityUser());
         }
         if (isset($aBlogs[$oTopic->getBlogId()])) {
             $oTopic->setBlog($aBlogs[$oTopic->getBlogId()]);
         } else {
             $oTopic->setBlog(null);
             // или $oTopic->setBlog(new ModuleBlog_EntityBlog());
         }
         if (isset($aTopicsVote[$oTopic->getId()])) {
             $oTopic->setVote($aTopicsVote[$oTopic->getId()]);
         } else {
             $oTopic->setVote(null);
         }
         if (isset($aFavouriteTopics[$oTopic->getId()])) {
             $oTopic->setFavourite($aFavouriteTopics[$oTopic->getId()]);
         } else {
             $oTopic->setFavourite(null);
         }
         if (isset($aTopicsQuestionVote[$oTopic->getId()])) {
             $oTopic->setUserQuestionIsVote(true);
         } else {
             $oTopic->setUserQuestionIsVote(false);
         }
         if (isset($aTopicFieldValues[$oTopic->getId()])) {
             $oTopic->setTopicValues($aTopicFieldValues[$oTopic->getId()]);
         } else {
             $oTopic->setTopicValues(false);
         }
         if (isset($aTopicsRead[$oTopic->getId()])) {
             $oTopic->setCountCommentNew($oTopic->getCountComment() - $aTopicsRead[$oTopic->getId()]->getCommentCountLast());
             $oTopic->setDateRead($aTopicsRead[$oTopic->getId()]->getDateRead());
         } else {
             $oTopic->setCountCommentNew(0);
             $oTopic->setDateRead(F::Now());
         }
         if (isset($aPhotosetMainPhotos[$oTopic->getPhotosetMainPhotoId()])) {
             $oTopic->setPhotosetMainPhoto($aPhotosetMainPhotos[$oTopic->getPhotosetMainPhotoId()]);
         } else {
             $oTopic->setPhotosetMainPhoto(null);
         }
     }
     return $aTopics;
 }
Пример #3
0
 /**
  * Получает дополнительные данные(объекты) для юзеров по их ID
  *
  * @param array|int $aUsersId   - Список ID пользователей
  * @param array     $aAllowData - Список типоd дополнительных данных для подгрузки у пользователей
  *
  * @return ModuleUser_EntityUser[]
  */
 public function GetUsersAdditionalData($aUsersId, $aAllowData = null)
 {
     if (!$aUsersId) {
         return array();
     }
     if (!is_array($aUsersId)) {
         $aUsersId = array($aUsersId);
     } else {
         $aUsersId = array_unique($aUsersId);
     }
     if (sizeof($aUsersId) == 1) {
         $iUserId = reset($aUsersId);
         if ($this->oUserCurrent && $this->oUserCurrent->getId() == $iUserId) {
             return array($iUserId => $this->oUserCurrent);
         }
     }
     if (is_null($aAllowData)) {
         $aAllowData = $this->aAdditionalData;
     }
     $aAllowData = F::Array_FlipIntKeys($aAllowData);
     // * Получаем юзеров
     $aUsers = $this->GetUsersByArrayId($aUsersId);
     // * Получаем дополнительные данные
     $aSessions = array();
     $aFriends = array();
     $aVote = array();
     $aGeoTargets = array();
     $aNotes = array();
     if (isset($aAllowData['session'])) {
         $aSessions = $this->GetSessionsByArrayId($aUsersId);
     }
     if (isset($aAllowData['friend']) && $this->oUserCurrent) {
         $aFriends = $this->GetFriendsByArray($aUsersId, $this->oUserCurrent->getId());
     }
     if (isset($aAllowData['vote']) && $this->oUserCurrent) {
         $aVote = E::ModuleVote()->GetVoteByArray($aUsersId, 'user', $this->oUserCurrent->getId());
     }
     if (isset($aAllowData['geo_target'])) {
         $aGeoTargets = E::ModuleGeo()->GetTargetsByTargetArray('user', $aUsersId);
     }
     if (isset($aAllowData['note']) && $this->oUserCurrent) {
         $aNotes = $this->GetUserNotesByArray($aUsersId, $this->oUserCurrent->getId());
     }
     $aAvatars = E::ModuleUploader()->GetMediaObjects('profile_avatar', $aUsersId, null, array('target_id'));
     // * Добавляем данные к результату
     /** @var ModuleUser_EntityUser $oUser */
     foreach ($aUsers as $oUser) {
         if (isset($aSessions[$oUser->getId()])) {
             $oUser->setSession($aSessions[$oUser->getId()]);
         } else {
             $oUser->setSession(null);
             // или $oUser->setSession(new ModuleUser_EntitySession());
         }
         if ($aFriends && isset($aFriends[$oUser->getId()])) {
             $oUser->setUserFriend($aFriends[$oUser->getId()]);
         } else {
             $oUser->setUserFriend(null);
         }
         if (isset($aVote[$oUser->getId()])) {
             $oUser->setVote($aVote[$oUser->getId()]);
         } else {
             $oUser->setVote(null);
         }
         if (isset($aGeoTargets[$oUser->getId()])) {
             $aTargets = $aGeoTargets[$oUser->getId()];
             $oUser->setGeoTarget(isset($aTargets[0]) ? $aTargets[0] : null);
         } else {
             $oUser->setGeoTarget(null);
         }
         if (isset($aAllowData['note'])) {
             if (isset($aNotes[$oUser->getId()])) {
                 $oUser->setUserNote($aNotes[$oUser->getId()]);
             } else {
                 $oUser->setUserNote(false);
             }
         }
         if (isset($aAvatars[$oUser->getId()])) {
             $oUser->setMediaResources('profile_avatar', $aAvatars[$oUser->getId()]);
         } else {
             $oUser->setMediaResources('profile_avatar', array());
         }
     }
     return $aUsers;
 }
Пример #4
0
 /**
  * Получает дополнительные данные(объекты) для разговоров по их ID
  *
  * @param array      $aTalkId       Список ID сообщений
  * @param array|null $aAllowData    Список дополнительных типов подгружаемых в объект
  *
  * @return array
  */
 public function GetTalksAdditionalData($aTalkId, $aAllowData = null)
 {
     if (!$aTalkId) {
         return array();
     }
     if (is_null($aAllowData)) {
         $aAllowData = $this->aAdditionalData;
     }
     $aAllowData = F::Array_FlipIntKeys($aAllowData);
     if (!is_array($aTalkId)) {
         $aTalkId = array($aTalkId);
     }
     // * Получаем "голые" разговоры
     $aTalks = $this->GetTalksByArrayId($aTalkId);
     // * Формируем ID дополнительных данных, которые нужно получить
     if (isset($aAllowData['favourite']) && $this->oUserCurrent) {
         $aFavouriteTalks = E::ModuleFavourite()->GetFavouritesByArray($aTalkId, 'talk', $this->oUserCurrent->getId());
     }
     $aUserId = array();
     $aCommentLastId = array();
     foreach ($aTalks as $oTalk) {
         if (isset($aAllowData['user'])) {
             $aUserId[] = $oTalk->getUserId();
         }
         if (isset($aAllowData['comment_last']) && $oTalk->getCommentIdLast()) {
             $aCommentLastId[] = $oTalk->getCommentIdLast();
         }
     }
     // * Получаем дополнительные данные
     $aTalkUsers = array();
     $aCommentLast = array();
     if (isset($aAllowData['user']) && is_array($aAllowData['user'])) {
         $aUsers = E::ModuleUser()->GetUsersAdditionalData($aUserId, $aAllowData['user']);
     } else {
         $aUsers = E::ModuleUser()->GetUsersAdditionalData($aUserId);
     }
     if (isset($aAllowData['talk_user']) && $this->oUserCurrent) {
         $aTalkUsers = $this->GetTalkUsersByArray($aTalkId, $this->oUserCurrent->getId());
     }
     if (isset($aAllowData['comment_last'])) {
         $aCommentLast = E::ModuleComment()->GetCommentsAdditionalData($aCommentLastId, array());
     }
     // Добавляем данные к результату - списку разговоров
     /** @var ModuleTalk_EntityTalk $oTalk */
     foreach ($aTalks as $oTalk) {
         if (isset($aUsers[$oTalk->getUserId()])) {
             $oTalk->setUser($aUsers[$oTalk->getUserId()]);
         } else {
             $oTalk->setUser(null);
             // или $oTalk->setUser(new ModuleUser_EntityUser());
         }
         if (isset($aTalkUsers[$oTalk->getId()])) {
             $oTalk->setTalkUser($aTalkUsers[$oTalk->getId()]);
         } else {
             $oTalk->setTalkUser(null);
         }
         if (isset($aFavouriteTalks[$oTalk->getId()])) {
             $oTalk->setIsFavourite(true);
         } else {
             $oTalk->setIsFavourite(false);
         }
         if ($oTalk->getCommentIdLast() && isset($aCommentLast[$oTalk->getCommentIdLast()])) {
             $oTalk->setCommentLast($aCommentLast[$oTalk->getCommentIdLast()]);
         } else {
             $oTalk->setCommentLast(null);
         }
     }
     return $aTalks;
 }
Пример #5
0
 public function EventDashboard()
 {
     $this->sMainMenuItem = 'info';
     $aDashboardWidgets = array('admin_dashboard_updates' => array('name' => 'admin_dashboard_updates', 'key' => 'admin.dashboard.updates', 'status' => Config::Val('admin.dashboard.updates', true), 'label' => E::ModuleLang()->Get('action.admin.dashboard_updates_title')), 'admin_dashboard_news' => array('name' => 'admin_dashboard_news', 'key' => 'admin.dashboard.news', 'status' => Config::Val('admin.dashboard.news', true), 'label' => E::ModuleLang()->Get('action.admin.dashboard_news_title')));
     if ($this->IsPost('widgets')) {
         $aWidgets = F::Array_FlipIntKeys($this->GetPost('widgets'));
         $aConfig = array();
         foreach ($aDashboardWidgets as $aDashboardWidget) {
             if (isset($aWidgets[$aDashboardWidget['name']])) {
                 $aConfig[$aDashboardWidget['key']] = 1;
             } else {
                 $aConfig[$aDashboardWidget['key']] = 0;
             }
         }
         Config::WriteCustomConfig($aConfig);
         R::Location('admin');
     }
     $this->_setTitle(E::ModuleLang()->Get('action.admin.menu_info_dashboard'));
     $this->SetTemplateAction('info/index');
     $this->sMenuItem = $this->_getMode(0, 'index');
     $aData = array('e-alto' => ALTO_VERSION, 'e-uniq' => E::ModuleSecurity()->GetUniqKey());
     $aPlugins = E::ModulePlugin()->GetPluginsList(true);
     foreach ($aPlugins as $oPlugin) {
         $aData['p-' . $oPlugin->GetId()] = $oPlugin->GetVersion();
     }
     $aSkins = E::ModuleSkin()->GetSkinsList();
     foreach ($aSkins as $oSkin) {
         $aData['s-' . $oSkin->GetId()] = $oSkin->GetVersion();
     }
     E::ModuleViewer()->Assign('sUpdatesRequest', base64_encode(http_build_query($aData)));
     E::ModuleViewer()->Assign('sUpdatesRefresh', true);
     E::ModuleViewer()->Assign('aDashboardWidgets', $aDashboardWidgets);
 }
Пример #6
0
 /**
  * Получает дополнительные данные(объекты) для блогов по их ID
  *
  * @param array|int $aBlogsId   - Список ID блогов
  * @param array     $aAllowData - Список типов дополнительных данных, которые нужно получить для блогов
  * @param array     $aOrder     - Порядок сортировки
  *
  * @return array
  */
 public function GetBlogsAdditionalData($aBlogsId, $aAllowData = null, $aOrder = null)
 {
     if (!$aBlogsId) {
         return array();
     }
     if (is_null($aAllowData)) {
         $aAllowData = $this->aAdditionalData;
     }
     $aAllowData = F::Array_FlipIntKeys($aAllowData);
     if (!is_array($aBlogsId)) {
         $aBlogsId = array($aBlogsId);
     }
     // * Получаем блоги
     $aBlogs = $this->GetBlogsByArrayId($aBlogsId, $aOrder);
     if (!$aBlogs || is_array($aAllowData) && empty($aAllowData)) {
         // additional data not required
         return $aBlogs;
     }
     $sCacheKey = 'Blog_GetBlogsAdditionalData_' . md5(serialize(array($aBlogsId, $aAllowData, $aOrder)));
     if (false !== ($data = E::ModuleCache()->Get($sCacheKey, 'tmp'))) {
         return $data;
     }
     // * Формируем ID дополнительных данных, которые нужно получить
     $aUserId = array();
     foreach ($aBlogs as $oBlog) {
         if (isset($aAllowData['owner'])) {
             $aUserId[] = $oBlog->getOwnerId();
         }
     }
     // * Получаем дополнительные данные
     $aBlogUsers = array();
     $aBlogsVote = array();
     $aUsers = isset($aAllowData['owner']) && is_array($aAllowData['owner']) ? E::ModuleUser()->GetUsersAdditionalData($aUserId, $aAllowData['owner']) : E::ModuleUser()->GetUsersAdditionalData($aUserId);
     if (isset($aAllowData['relation_user']) && $this->oUserCurrent) {
         $aBlogUsers = $this->GetBlogUsersByArrayBlog($aBlogsId, $this->oUserCurrent->getId());
     }
     if (isset($aAllowData['vote']) && $this->oUserCurrent) {
         $aBlogsVote = E::ModuleVote()->GetVoteByArray($aBlogsId, 'blog', $this->oUserCurrent->getId());
     }
     $aBlogTypes = $this->GetBlogTypes();
     if (isset($aAllowData['media'])) {
         $aAvatars = E::ModuleUploader()->GetMediaObjects('blog_avatar', $aBlogsId, null, array('target_id'));
     }
     // * Добавляем данные к результату - списку блогов
     /** @var ModuleBlog_EntityBlog $oBlog */
     foreach ($aBlogs as $oBlog) {
         if (isset($aUsers[$oBlog->getOwnerId()])) {
             $oBlog->setOwner($aUsers[$oBlog->getOwnerId()]);
         } else {
             $oBlog->setOwner(null);
             // или $oBlog->setOwner(new ModuleUser_EntityUser());
         }
         if (isset($aBlogUsers[$oBlog->getId()])) {
             $oBlog->setCurrentUserRole($aBlogUsers[$oBlog->getId()]->getUserRole());
         }
         if (isset($aBlogsVote[$oBlog->getId()])) {
             $oBlog->setVote($aBlogsVote[$oBlog->getId()]);
         } else {
             $oBlog->setVote(null);
         }
         if (isset($aBlogTypes[$oBlog->getType()])) {
             $oBlog->setBlogType($aBlogTypes[$oBlog->getType()]);
         }
         if (isset($aAllowData['media'])) {
             // Sets blogs avatars
             if (isset($aAvatars[$oBlog->getId()])) {
                 $oBlog->setMediaResources('blog_avatar', $aAvatars[$oBlog->getId()]);
             } else {
                 $oBlog->setMediaResources('blog_avatar', array());
             }
         }
     }
     // Saves only for executing session, so any additional tags no required
     E::ModuleCache()->Set($aBlogs, $sCacheKey, array(), 'P1D', 'tmp');
     return $aBlogs;
 }
Пример #7
0
 /**
  * Строит строку условий для SQL запроса топиков
  *
  * @param array $aFilter    Фильтр
  *
  * @return string
  */
 protected function buildFilter($aFilter)
 {
     $sWhere = '';
     if (isset($aFilter['topic_date_more'])) {
         $sWhere .= " AND ((t.topic_date_show IS NOT NULL AND t.topic_date_show >  " . $this->oDb->escape($aFilter['topic_date_more']) . ")";
         $sWhere .= " OR (t.topic_date_show IS NULL AND t.topic_date_add >  " . $this->oDb->escape($aFilter['topic_date_more']) . "))";
     }
     if (isset($aFilter['topic_publish'])) {
         $sWhere .= " AND (t.topic_publish =  " . ($aFilter['topic_publish'] ? 1 : 0) . ")";
         $sWhere .= " AND (t.topic_date_show IS NULL OR t.topic_date_show <= '" . F::Now() . "')";
     }
     if (isset($aFilter['topic_index_ignore'])) {
         $sWhere .= " AND (";
         $sWhere .= "t.topic_index_ignore=" . ($aFilter['topic_index_ignore'] ? 1 : 0);
         if (!$aFilter['topic_index_ignore']) {
             $sWhere .= " OR t.topic_index_ignore IS NULL";
         }
         $sWhere .= ") ";
     }
     if (isset($aFilter['topic_rating']) && is_array($aFilter['topic_rating'])) {
         $sPublishIndex = '';
         if (isset($aFilter['topic_rating']['publish_index']) && $aFilter['topic_rating']['publish_index'] == 1) {
             $sPublishIndex = " OR topic_publish_index=1 ";
         }
         if ($aFilter['topic_rating']['type'] == 'top') {
             $sWhere .= " AND ( t.topic_rating >= " . (double) $aFilter['topic_rating']['value'] . " {$sPublishIndex} ) ";
         } else {
             $sWhere .= " AND ( t.topic_rating < " . (double) $aFilter['topic_rating']['value'] . "  ) ";
         }
     }
     if (isset($aFilter['topic_new'])) {
         $sWhere .= " AND (";
         $sWhere .= "(t.topic_date_show IS NOT NULL AND t.topic_date_show >=  '" . $aFilter['topic_new'] . "' AND t.topic_date_show <='" . F::Now() . "')";
         $sWhere .= " OR (t.topic_date_show IS NULL AND t.topic_date_add >=  '" . $aFilter['topic_new'] . "')";
         $sWhere .= ")";
     }
     if (isset($aFilter['user_id'])) {
         $sWhere .= is_array($aFilter['user_id']) ? " AND t.user_id IN(" . implode(', ', $aFilter['user_id']) . ")" : " AND t.user_id =  " . (int) $aFilter['user_id'];
     }
     if (isset($aFilter['blog_id'])) {
         if (!is_array($aFilter['blog_id'])) {
             $aFilter['blog_id'] = array($aFilter['blog_id']);
         }
         $sWhere .= " AND t.blog_id IN ('" . join("','", $aFilter['blog_id']) . "')";
     }
     if (isset($aFilter['topic_id']) && is_array($aFilter['topic_id'])) {
         $sWhere .= " AND t.topic_id IN ('" . join("','", $aFilter['topic_id']) . "')";
     }
     if (isset($aFilter['blog_type']) && is_array($aFilter['blog_type'])) {
         $aBlogTypes = array();
         $aOrClauses = array();
         $aFilter['blog_type'] = F::Array_FlipIntKeys($aFilter['blog_type'], 0);
         foreach ($aFilter['blog_type'] as $sType => $aBlogsId) {
             if ($aBlogsId) {
                 // 'type'=>array('id1', 'id2') - blog type & blogs id
                 if ($sType == '*') {
                     $aOrClauses[] = "(t.blog_id IN ('" . join("','", $aBlogsId) . "'))";
                 } else {
                     $aOrClauses[] = "b.blog_type='" . $sType . "' AND t.blog_id IN ('" . join("','", $aBlogsId) . "')";
                 }
             } else {
                 // blog type only
                 $aBlogTypes[] = "'" . $sType . "'";
             }
         }
         if ($aBlogTypes) {
             $aOrClauses[] = '(b.blog_type IN (' . join(',', $aBlogTypes) . '))';
         }
         if ($aOrClauses) {
             $sWhere .= ' AND (' . join(' OR ', $aOrClauses) . ')';
         }
     }
     if (isset($aFilter['blog_type_exclude']) && is_array($aFilter['blog_type_exclude'])) {
         $sWhere .= " AND (b.blog_type NOT IN ('" . join("','", $aFilter['blog_type_exclude']) . "'))";
     }
     if (isset($aFilter['topic_type'])) {
         if (!is_array($aFilter['topic_type'])) {
             $aFilter['topic_type'] = array($aFilter['topic_type']);
         }
         $sWhere .= " AND t.topic_type IN (" . join(",", array_map(array($this->oDb, 'escape'), $aFilter['topic_type'])) . ")";
     }
     return $sWhere;
 }
Пример #8
0
 /**
  * Получение записей по ID с дополнительные связаными данными
  *
  * @param array $aWallId    - Список ID сообщений
  * @param array $aAllowData - Список типов дополнительных данных для подгрузки в сообщения стены
  *
  * @return array
  */
 public function GetWallAdditionalData($aWallId, $aAllowData = null)
 {
     if (!$aWallId) {
         return array();
     }
     if (is_null($aAllowData)) {
         $aAllowData = $this->aAdditionalData;
     }
     $aAllowData = F::Array_FlipIntKeys($aAllowData);
     if (!is_array($aWallId)) {
         $aWallId = array($aWallId);
     }
     $aWalls = $this->GetWallsByArrayId($aWallId);
     // * Формируем ID дополнительных данных, которые нужно получить
     $aUserId = array();
     $aWallUserId = array();
     $aWallReplyId = array();
     foreach ($aWalls as $oWall) {
         if (isset($aAllowData['user'])) {
             $aUserId[] = $oWall->getUserId();
         }
         if (isset($aAllowData['wall_user'])) {
             $aWallUserId[] = $oWall->getWallUserId();
         }
         // * Список последних записей хранится в строке через запятую
         if (isset($aAllowData['reply']) && !$oWall->getPid() && $oWall->getLastReply()) {
             $aReply = explode(',', trim($oWall->getLastReply()));
             $aWallReplyId = array_merge($aWallReplyId, $aReply);
         }
     }
     // * Получаем дополнительные данные
     $aUsers = isset($aAllowData['user']) && is_array($aAllowData['user']) ? E::ModuleUser()->GetUsersAdditionalData($aUserId, $aAllowData['user']) : E::ModuleUser()->GetUsersAdditionalData($aUserId);
     $aWallUsers = isset($aAllowData['wall_user']) && is_array($aAllowData['wall_user']) ? E::ModuleUser()->GetUsersAdditionalData($aWallUserId, $aAllowData['wall_user']) : E::ModuleUser()->GetUsersAdditionalData($aWallUserId);
     $aWallReply = array();
     if (isset($aAllowData['reply']) && count($aWallReplyId)) {
         $aWallReply = $this->GetWallAdditionalData($aWallReplyId, array('user' => array()));
     }
     // * Добавляем данные к результату
     foreach ($aWalls as $oWall) {
         if (isset($aUsers[$oWall->getUserId()])) {
             $oWall->setUser($aUsers[$oWall->getUserId()]);
         } else {
             $oWall->setUser(null);
             // или $oWall->setUser(new ModuleUser_EntityUser());
         }
         if (isset($aWallUsers[$oWall->getWallUserId()])) {
             $oWall->setWallUser($aWallUsers[$oWall->getWallUserId()]);
         } else {
             $oWall->setWallUser(null);
         }
         $aReply = array();
         if ($oWall->getLastReply()) {
             $aReplyId = explode(',', trim($oWall->getLastReply()));
             foreach ($aReplyId as $iReplyId) {
                 if (isset($aWallReply[$iReplyId])) {
                     $aReply[] = $aWallReply[$iReplyId];
                 }
             }
         }
         $oWall->setLastReplyWall($aReply);
     }
     return $aWalls;
 }
Пример #9
0
 /**
  * Site settings > Config parameters
  *
  * @param   string  $sSelectedSection
  */
 protected function _eventConfigParams($sSelectedSection)
 {
     $this->SetTemplateAction('settings/params');
     $aFields = F::IncludeFile(Config::Get('path.dir.config') . 'actions/admin.settings.php', false, true);
     foreach ($aFields as $nSec => $aSection) {
         foreach ($aSection as $nKey => $aItem) {
             $aItem['text'] = E::ModuleLang()->Text($aItem['label']);
             if (isset($aItem['help'])) {
                 $aItem['help'] = E::ModuleLang()->Text($aItem['help']);
             }
             if (isset($aItem['config'])) {
                 $aItem['value'] = Config::Get($aItem['config'], Config::LEVEL_CUSTOM);
                 $aItem['config'] = str_replace('.', '--', $aItem['config']);
                 if (!isset($aItem['valtype']) && isset($aItem['type']) && $aItem['type'] == 'checkbox') {
                     $aItem['valtype'] = 'boolean';
                 }
             }
             if (!empty($aItem['type'])) {
                 if ($aItem['type'] == 'password') {
                     $aItem['valtype'] = 'string';
                 } elseif ($aItem['type'] == 'select' && !empty($aItem['options'])) {
                     $aItem['options'] = F::Array_FlipIntKeys($aItem['options'], null);
                     foreach ($aItem['options'] as $sValue => $sText) {
                         if (is_null($sText)) {
                             $aItem['options'][$sValue] = $sValue;
                         } else {
                             $aItem['options'][$sValue] = E::ModuleLang()->Text($sText);
                         }
                     }
                 }
             }
             $aFields[$nSec][$nKey] = $aItem;
         }
     }
     if (($aData = $this->GetPost()) && isset($aFields[$sSelectedSection])) {
         $this->_eventConfigSave($aFields[$sSelectedSection], $aData);
     }
     if (!isset($aFields[$sSelectedSection])) {
         $sSelectedSection = F::Array_FirstKey($aFields);
         $this->_saveMode(0, $sSelectedSection);
     }
     E::ModuleViewer()->Assign('aFields', $aFields[$sSelectedSection]);
 }
Пример #10
0
function func_array_simpleflip(&$arr, $sDefValue = 1)
{
    $arr = F::Array_FlipIntKeys($arr, $sDefValue);
}
Пример #11
0
 /**
  * Возвращает список ID блогов по заданным критериям
  *
  * Общая структура массива критериев
  *  $aCriteria = array(
  *      'filter' => array(..),
  *      'order' => array(..),
  *      'limit' => array(..),
  * );
  *
  * Возвращаемое значение:
  *  array('data' => array(), 'total' => int)
  *
  * @param array $aCriteria
  *
  * @return array
  */
 public function GetBlogsIdByCriteria($aCriteria = array())
 {
     if (isset($aCriteria['filter'])) {
         $aFilter = $aCriteria['filter'];
     } else {
         $aFilter = array();
     }
     if (isset($aFilter['not_blog_id'])) {
         if (!is_array($aFilter['not_blog_id'])) {
             $aFilter['not_blog_id'] = array(intval($aFilter['not_blog_id']));
         }
     }
     if (isset($aFilter['blog_title_like'])) {
         if (substr($aFilter['blog_title_like'], -1) !== '%') {
             $aFilter['blog_title_like'] .= '%';
         }
     }
     if (isset($aFilter['exclude_type']) && !isset($aFilter['not_blog_type'])) {
         $aFilter['not_blog_type'] = $aFilter['exclude_type'];
     }
     if (isset($aFilter['include_type']) && !isset($aFilter['blog_type'])) {
         $aFilter['blog_type'] = $aFilter['include_type'];
     }
     // Сортировка
     $sSqlOrder = '';
     if (isset($aCriteria['order'])) {
         $aOrderAllow = array('blog_id', 'blog_title', 'blog_rating', 'blog_count_user', 'blog_count_topic');
         if (!is_array($aCriteria['order'])) {
             $aCriteria['order'] = array($aCriteria['order']);
         }
         $aOrders = F::Array_FlipIntKeys($aCriteria['order'], 'ASC');
         $aOrderList = array();
         foreach ($aOrders as $sField => $sWay) {
             $sField = strtolower(trim($sField));
             if (strpos($sField, ' ')) {
                 list($sField, $sWay) = explode(' ', $sField, 2);
             }
             if (in_array($sField, $aOrderAllow)) {
                 $aOrderList[] = $sField . ' ' . (strtoupper($sWay) == 'DESC' ? 'DESC' : 'ASC');
             }
         }
         if ($aOrderList) {
             $sSqlOrder = 'ORDER BY ' . implode(',', $aOrderList);
         }
     }
     // Установка лимита
     $sSqlLimit = '';
     list($nOffset, $nLimit) = $this->_prepareLimit($aCriteria);
     // Если задан ID блога, то всегда устанавливаем лимит
     if (isset($aFilter['blog_id']) && !is_array($aFilter['blog_id'])) {
         $nOffset = false;
         $nLimit = 1;
     }
     // Формируем строку лимита и автосчетчик общего числа записей
     if ($nOffset !== false && $nLimit !== false) {
         $sSqlLimit = 'LIMIT ' . $nOffset . ', ' . $nLimit;
         $nCalcTotal = static::CRITERIA_CALC_TOTAL_AUTO;
     } elseif ($nLimit != false && $nLimit != 1) {
         $sSqlLimit = 'LIMIT ' . $nLimit;
         $nCalcTotal = static::CRITERIA_CALC_TOTAL_AUTO;
     } else {
         $nCalcTotal = static::CRITERIA_CALC_TOTAL_SKIP;
     }
     // Обрабатываем опции
     if (isset($aCriteria['options']) && is_array($aCriteria['options'])) {
         if (array_key_exists('calc_total', $aCriteria['options'])) {
             if ($aCriteria['options']['calc_total'] != static::CRITERIA_CALC_TOTAL_AUTO) {
                 $nCalcTotal = $aCriteria['options']['calc_total'];
             }
             // Если требуется только подсчет записей, то строку лимита принудительно устанавливаем в 0
             // Запрос с LIMIT 0 отрабатывает моментально
             if ($aCriteria['options']['calc_total'] != static::CRITERIA_CALC_TOTAL_ONLY) {
                 $sSqlLimit = 'LIMIT 0';
             }
         }
     }
     // Необходимость JOIN'ов
     $aBlogTypeFields = array('allow_add', 'min_rate_add', 'allow_list', 'min_rate_list', 'acl_read', 'min_rate_read', 'acl_write', 'min_rate_write', 'acl_comment', 'min_rate_comment', 'index_ignore', 'membership');
     if ($aFilter && array_intersect(array_keys($aFilter), $aBlogTypeFields)) {
         $bBlogTypeJoin = true;
     } else {
         $bBlogTypeJoin = false;
     }
     $aBlogUserFields = array('user_role');
     if ($aFilter && array_intersect(array_keys($aFilter), $aBlogUserFields)) {
         $bBlogUserJoin = true;
     } else {
         $bBlogUserJoin = false;
     }
     $sql = "\n            SELECT b.blog_id\n            FROM ?_blog AS b\n                { INNER JOIN ?_blog_type AS bt ON bt.type_code=b.blog_type AND 1=?d }\n                { INNER JOIN ?_blog_user AS bu ON bu.blog_id=b.blog_id AND 1=?d }\n            WHERE\n                1 = 1\n                { AND (b.blog_id = ?d) }\n                { AND (b.blog_id IN (?a)) }\n                { AND (b.blog_id NOT IN (?a)) }\n                { AND (b.user_owner_id = ?d) }\n                { AND (b.user_owner_id IN (?a)) }\n                { AND (b.user_owner_id = ?d) }\n                { AND (b.user_owner_id IN (?a)) }\n                { AND (b.blog_type = ?) }\n                { AND (b.blog_type IN (?a)) }\n                { AND (b.blog_type != ?) }\n                { AND (b.blog_type NOT IN (?a)) }\n                { AND blog_url = ? }\n                { AND blog_url IN(?a) }\n                { AND blog_title = ? }\n                { AND blog_title LIKE ? }\n                { AND (bt.allow_add = ?d) }\n                { AND (bt.min_rate_add >= ?d) }\n                { AND (bt.allow_list = ?d) }\n                { AND (bt.min_rate_list >= ?d) }\n                { AND (bt.acl_read & ?d > 0) }\n                { AND (bt.min_rate_read >= ?d) }\n                { AND (bt.acl_write & ?d > 0) }\n                { AND (bt.min_rate_write >= ?d) }\n                { AND (bt.acl_comment & ?d > 0) }\n                { AND (bt.min_rate_comment >= ?d) }\n                { AND (bt.index_ignore = ?d) }\n                { AND (bt.membership = ?d) }\n                { AND (bu.user_role = ?d) }\n        " . $sSqlOrder . ' ' . $sSqlLimit;
     $aData = $this->oDb->selectCol($sql, $bBlogTypeJoin ? 1 : DBSIMPLE_SKIP, $bBlogUserJoin ? 1 : DBSIMPLE_SKIP, isset($aFilter['blog_id']) && !is_array($aFilter['blog_id']) ? $aFilter['blog_id'] : DBSIMPLE_SKIP, isset($aFilter['blog_id']) && is_array($aFilter['blog_id']) ? $aFilter['blog_id'] : DBSIMPLE_SKIP, isset($aFilter['not_blog_id']) ? $aFilter['not_blog_id'] : DBSIMPLE_SKIP, isset($aFilter['user_id']) && !is_array($aFilter['user_id']) ? $aFilter['user_id'] : DBSIMPLE_SKIP, isset($aFilter['user_id']) && is_array($aFilter['user_id']) ? $aFilter['user_id'] : DBSIMPLE_SKIP, isset($aFilter['user_owner_id']) && !is_array($aFilter['user_owner_id']) ? $aFilter['user_owner_id'] : DBSIMPLE_SKIP, isset($aFilter['user_owner_id']) && is_array($aFilter['user_owner_id']) ? $aFilter['user_owner_id'] : DBSIMPLE_SKIP, isset($aFilter['blog_type']) && !is_array($aFilter['blog_type']) ? $aFilter['blog_type'] : DBSIMPLE_SKIP, isset($aFilter['blog_type']) && is_array($aFilter['blog_type']) ? $aFilter['blog_type'] : DBSIMPLE_SKIP, isset($aFilter['not_blog_type']) && !is_array($aFilter['not_blog_type']) ? $aFilter['not_blog_type'] : DBSIMPLE_SKIP, isset($aFilter['not_blog_type']) && is_array($aFilter['not_blog_type']) ? $aFilter['not_blog_type'] : DBSIMPLE_SKIP, isset($aFilter['blog_url']) && !is_array($aFilter['blog_url']) ? $aFilter['blog_url'] : DBSIMPLE_SKIP, isset($aFilter['blog_url']) && is_array($aFilter['blog_url']) ? $aFilter['blog_url'] : DBSIMPLE_SKIP, isset($aFilter['blog_title']) ? $aFilter['blog_title'] : DBSIMPLE_SKIP, isset($aFilter['blog_title_like']) ? $aFilter['blog_title_like'] : DBSIMPLE_SKIP, isset($aFilter['allow_add']) ? $aFilter['allow_add'] ? 1 : 0 : DBSIMPLE_SKIP, isset($aFilter['min_rate_add']) ? $aFilter['min_rate_add'] : DBSIMPLE_SKIP, isset($aFilter['allow_list']) ? $aFilter['allow_list'] ? 1 : 0 : DBSIMPLE_SKIP, isset($aFilter['min_rate_list']) ? $aFilter['min_rate_list'] : DBSIMPLE_SKIP, isset($aFilter['acl_read']) ? $aFilter['acl_read'] : DBSIMPLE_SKIP, isset($aFilter['min_rate_read']) ? $aFilter['min_rate_read'] : DBSIMPLE_SKIP, isset($aFilter['acl_write']) ? $aFilter['acl_write'] : DBSIMPLE_SKIP, isset($aFilter['min_rate_write']) ? $aFilter['min_rate_write'] : DBSIMPLE_SKIP, isset($aFilter['acl_comment']) ? $aFilter['acl_comment'] : DBSIMPLE_SKIP, isset($aFilter['min_rate_comment']) ? $aFilter['min_rate_comment'] : DBSIMPLE_SKIP, isset($aFilter['index_ignore']) ? $aFilter['index_ignore'] ? 1 : 0 : DBSIMPLE_SKIP, isset($aFilter['membership']) ? $aFilter['membership'] ? 1 : 0 : DBSIMPLE_SKIP, isset($aFilter['user_role']) ? $aFilter['user_role'] : DBSIMPLE_SKIP);
     $aResult = array('data' => $aData ? $aData : array(), 'total' => -1);
     if ($nCalcTotal) {
         if ($nOffset == 0 && $nLimit > 0 && sizeof($aResult['data']) < $nLimit) {
             $aResult['total'] = sizeof($aResult['data']);
         } else {
             $sLastQuery = trim(E::ModuleDatabase()->GetLastQuery());
             $n = strpos($sLastQuery, ' LIMIT ');
             if ($n) {
                 $sql = str_replace('SELECT b.blog_id', 'SELECT COUNT(*) AS cnt', substr($sLastQuery, 0, $n));
                 $aData = $this->oDb->select($sql);
                 if ($aData) {
                     $aResult['total'] = $aData[0]['cnt'];
                 }
             }
         }
     }
     return $aResult;
 }
Пример #12
0
 /**
  * Получает дополнительные данные(объекты) для комментов по их ID
  *
  * @param array|int  $aCommentId      Список ID комментов
  * @param array|null $aAllowData      Список типов дополнительных данных, которые нужно получить для комментариев
  * @param array      $aAdditionalData Predefined additional data
  *
  * @return array
  */
 public function GetCommentsAdditionalData($aCommentId, $aAllowData = null, $aAdditionalData = array())
 {
     if (!$aCommentId) {
         return array();
     }
     if (is_null($aAllowData)) {
         $aAllowData = $this->aAdditionalData;
     }
     $aAllowData = F::Array_FlipIntKeys($aAllowData);
     if (!is_array($aCommentId)) {
         $aCommentId = array($aCommentId);
     }
     // * Получаем комменты
     $aComments = $this->GetCommentsByArrayId($aCommentId);
     // * Формируем ID дополнительных данных, которые нужно получить
     $aUserId = array();
     $aTargetTypeId = array();
     foreach ($aComments as $oComment) {
         if (isset($aAllowData['user'])) {
             $aUserId[] = $oComment->getUserId();
         }
         if (isset($aAllowData['target'])) {
             $aTargetTypeId[$oComment->getTargetType()][] = $oComment->getTargetId();
         }
     }
     // * Получаем дополнительные данные
     if ($aUserId) {
         $aUsers = isset($aAllowData['user']) && is_array($aAllowData['user']) ? E::ModuleUser()->GetUsersAdditionalData($aUserId, $aAllowData['user']) : E::ModuleUser()->GetUsersAdditionalData($aUserId);
     }
     // * В зависимости от типа target_type достаем данные
     $aTargets = array();
     foreach ($aTargetTypeId as $sTargetType => $aTargetId) {
         if (isset($aAdditionalData['target'][$sTargetType])) {
             // predefined targets' data
             $aTargets[$sTargetType] = $aAdditionalData['target'][$sTargetType];
         } else {
             if (isset($aTargetTypeId['topic']) && $aTargetTypeId['topic']) {
                 // load targets' data
                 $aTargets['topic'] = E::ModuleTopic()->GetTopicsAdditionalData($aTargetTypeId['topic'], array('blog' => array('owner' => array(), 'relation_user'), 'user' => array()));
             } else {
                 // we don't know how to get targets' data
                 $aTargets['topic'] = array();
             }
         }
     }
     if (isset($aAllowData['vote']) && $this->oUserCurrent) {
         $aVote = E::ModuleVote()->GetVoteByArray($aCommentId, 'comment', $this->oUserCurrent->getId());
     } else {
         $aVote = array();
     }
     if (isset($aAllowData['favourite']) && $this->oUserCurrent) {
         $aFavouriteComments = E::ModuleFavourite()->GetFavouritesByArray($aCommentId, 'comment', $this->oUserCurrent->getId());
     } else {
         $aFavouriteComments = array();
     }
     // * Добавляем данные к результату
     foreach ($aComments as $oComment) {
         if (isset($aUsers[$oComment->getUserId()])) {
             $oComment->setUser($aUsers[$oComment->getUserId()]);
         } else {
             $oComment->setUser(null);
             // или $oComment->setUser(new ModuleUser_EntityUser());
         }
         if (isset($aTargets[$oComment->getTargetType()][$oComment->getTargetId()])) {
             $oComment->setTarget($aTargets[$oComment->getTargetType()][$oComment->getTargetId()]);
         } else {
             $oComment->setTarget(null);
         }
         if (isset($aVote[$oComment->getId()])) {
             $oComment->setVote($aVote[$oComment->getId()]);
         } else {
             $oComment->setVote(null);
         }
         if (isset($aFavouriteComments[$oComment->getId()])) {
             $oComment->setIsFavourite(true);
         } else {
             $oComment->setIsFavourite(false);
         }
     }
     return $aComments;
 }