function fn_get_tags($params = array(), $items_per_page = 0) { // Init filter $params = LastView::instance()->update('tags', $params); $default_params = array('page' => 1, 'items_per_page' => $items_per_page); $params = array_merge($default_params, $params); // Define sort fields $sortings = array('tag' => '?:tags.tag', 'status' => '?:tags.status', 'popularity' => 'popularity', 'users' => 'users'); $conditions = fn_tags_build_conditions($params); $sorting = db_sort($params, $sortings, 'tag', 'asc'); $limit = ''; if (!empty($params['limit'])) { $limit = db_quote(' LIMIT 0, ?i', $params['limit']); } elseif (!empty($params['items_per_page'])) { $params['total_items'] = db_get_field("SELECT COUNT(DISTINCT(?:tags.tag_id)) FROM ?:tags LEFT JOIN ?:tag_links ON ?:tags.tag_id = ?:tag_links.tag_id WHERE 1 ?p", $conditions); $limit = db_paginate($params['page'], $params['items_per_page'], $params['total_items']); } $tags = db_get_hash_array("SELECT ?:tags.tag_id, ?:tag_links.object_id, ?:tag_links.object_type, ?:tags.tag, ?:tags.status, COUNT(?:tag_links.tag_id) as popularity " . "FROM ?:tags LEFT JOIN ?:tag_links ON ?:tag_links.tag_id = ?:tags.tag_id WHERE 1 ?p GROUP BY ?:tags.tag_id {$sorting} {$limit}", 'tag_id', $conditions); if (!empty($params['count_objects'])) { $objs = db_get_array("SELECT tag_id, COUNT(DISTINCT(object_id)) as count, object_type " . "FROM ?:tag_links WHERE tag_id IN (?n) GROUP BY tag_id, object_type", array_keys($tags)); foreach ($objs as $v) { $tags[$v['tag_id']]['objects_count'][$v['object_type']] = $v['count']; } } // Generate popularity level foreach ($tags as $k => $v) { $level = ceil(log($v['popularity'])); $tags[$k]['level'] = $level > TAGS_MAX_LEVEL ? TAGS_MAX_LEVEL : $level; } if (!empty($params['sort_popular'])) { $tags = fn_sort_array_by_key($tags, 'tag', SORT_ASC); } return array($tags, $params); }
function fn_get_tags($params = array(), $items_per_page = 0) { // Init filter $params = LastView::instance()->update('tags', $params); $default_params = array('page' => 1, 'items_per_page' => $items_per_page); /** * Change parameters for getting tags * * @param array $params Params list * @param int $items_per_page Tags per page * @param array $default_params Default params */ fn_set_hook('get_tags_pre', $params, $items_per_page, $default_params); $params = array_merge($default_params, $params); $fields = array('?:tags.tag_id', '?:tag_links.object_id', '?:tag_links.object_type', '?:tags.tag', '?:tags.status', 'COUNT(?:tag_links.tag_id) as popularity'); $joins = array('LEFT JOIN ?:tag_links ON ?:tag_links.tag_id = ?:tags.tag_id'); $conditions = fn_tags_build_conditions($params); // Define sort fields $sortings = array('tag' => '?:tags.tag', 'status' => '?:tags.status', 'popularity' => 'popularity', 'users' => 'users'); $sorting = db_sort($params, $sortings, 'tag', 'asc'); $group = 'GROUP BY ?:tags.tag_id'; /** * Gets tags * * @param array $params Params list * @param int $items_per_page Tags per page * @param array $fields List of SQL fields to be selected in an SQL-query * @param array $joins List of strings with the complete JOIN information (JOIN type, tables and fields) for an SQL-query * @param string $conditions String containing the SQL-query conditions prepended with a logical operator (AND or OR) * @param string $group String containing the SQL-query GROUP BY field * @param string $sorting String containing the SQL-query ORDER BY field */ fn_set_hook('get_tags', $params, $items_per_page, $fields, $joins, $conditions, $group, $sorting); $limit = ''; if (!empty($params['limit'])) { $limit = db_quote(' LIMIT 0, ?i', $params['limit']); } elseif (!empty($params['items_per_page'])) { $params['total_items'] = db_get_field("SELECT COUNT(DISTINCT(?:tags.tag_id)) FROM ?:tags LEFT JOIN ?:tag_links ON ?:tags.tag_id = ?:tag_links.tag_id WHERE 1 ?p", $conditions); $limit = db_paginate($params['page'], $params['items_per_page'], $params['total_items']); } $tags = db_get_hash_array("SELECT " . implode(', ', $fields) . " " . "FROM ?:tags " . implode(' ', $joins) . " WHERE 1 ?p {$group} {$sorting} {$limit}", 'tag_id', $conditions); if (!empty($params['count_objects'])) { $objs = db_get_array("SELECT tag_id, COUNT(DISTINCT(object_id)) as count, object_type " . "FROM ?:tag_links WHERE tag_id IN (?n) GROUP BY tag_id, object_type", array_keys($tags)); foreach ($objs as $v) { $tags[$v['tag_id']]['objects_count'][$v['object_type']] = $v['count']; } } // Generate popularity level foreach ($tags as $k => $v) { $level = ceil(log($v['popularity'])); $tags[$k]['level'] = $level > TAGS_MAX_LEVEL ? TAGS_MAX_LEVEL : $level; } if (!empty($params['sort_popular'])) { $tags = fn_sort_array_by_key($tags, 'tag', SORT_ASC); } /** * Change tags * * @param array $params Params list * @param int $items_per_page Tags per page * @param array $tags Tags */ fn_set_hook('get_tags_post', $params, $items_per_page, $tags); return array($tags, $params); }