Esempio n. 1
0
 /**
  * Добавляет новый тип в поле enum(перечисление)
  *
  * @see ModuleDatabase::addEnumType
  *
  * @param string $sTableName       - Название таблицы, необходимо перед именем таблицы добавлять "prefix_",
  *                                   это позволит учитывать произвольный префикс таблиц у пользователя
  * @param string $sFieldName       - Название поля в таблице
  * @param string $sType            - Название типа
  */
 protected function addEnumType($sTableName, $sFieldName, $sType)
 {
     E::ModuleDatabase()->AddEnumType($sTableName, $sFieldName, $sType);
 }
Esempio n. 2
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;
 }