function sp_blog($parameters, $id, $return_parameters = false) { global $smcFunc, $scripturl, $user_info, $modSettings; global $context, $boarddir, $sourcedir, $txt, $color_profile; static $mod; $block_parameters = array('limit' => 'int', 'type' => 'select', 'sort' => 'select'); if ($return_parameters) { return $block_parameters; } $limit = empty($parameters['limit']) ? 5 : (int) $parameters['limit']; $type = empty($parameters['type']) ? 0 : 1; $sort = empty($parameters['sort']) ? 0 : 1; if (!isset($mod)) { if (file_exists($boarddir . '/zCommunity')) { $mod = 'zcommunity'; } elseif (file_exists($sourcedir . '/Blog.php')) { $mod = 'smfblog'; } else { $mod = ''; } } if (empty($mod)) { echo ' ', $txt['error_sp_no_blog_found']; return; } elseif ($mod == 'zcommunity') { $request = $smcFunc['db_query']('', ' SELECT b.blog_id, b.blog_owner, b.member_groups, bs.users_allowed_access, bs.hideBlog AS hidden FROM {db_prefix}blog_blogs AS b LEFT JOIN {db_prefix}blog_settings AS bs ON (bs.blog_id = b.blog_id)', array()); $visible_blogs = array(); while ($row = $smcFunc['db_fetch_assoc']($request)) { $can_see_this_blog = false; if (empty($row['hidden'])) { $allowedGroups = !empty($row['member_groups']) ? explode(',', $row['member_groups']) : array(); $can_see_this_blog = count(array_intersect($user_info['groups'], $allowedGroups)) > 0; if (empty($can_see_this_blog) && !empty($row['users_allowed_access']) && !$user_info['is_guest']) { $users_allowed = !empty($row['users_allowed_access']) ? explode(',', $row['users_allowed_access']) : array(); $can_see_this_blog = in_array($context['user']['id'], $users_allowed); } } if ($user_info['is_admin'] || $context['user']['id'] == $row['blog_owner']) { $can_see_this_blog = true; } if ($can_see_this_blog) { $visible_blogs[] = $row['blog_id']; } } $smcFunc['db_free_result']($request); if (empty($visible_blogs)) { echo ' ', $txt['error_sp_no_blogs_found']; return; } if (empty($type)) { $request = $smcFunc['db_query']('', ' SELECT t.article_id, t.subject FROM {db_prefix}blog_articles AS t LEFT JOIN {db_prefix}blog_settings AS bs ON (bs.blog_id = t.blog_id) WHERE t.blog_id IN ({array_int:visible_blogs}) AND ((t.approved = 1) OR (bs.articles_require_approval = 0)) ORDER BY {raw:type} LIMIT {int:limit}', array('visible_blogs' => $visible_blogs, 'type' => $sort ? 'RAND()' : 't.article_id DESC', 'limit' => $limit)); while ($row = $smcFunc['db_fetch_assoc']($request)) { $articles[] = array('id' => $row['article_id'], 'subject' => strip_tags($row['subject']), 'link' => '<a href="' . $scripturl . '?article=' . $row['article_id'] . '.0">' . $row['subject'] . '</a>'); } $smcFunc['db_free_result']($request); if (empty($articles)) { echo ' ', $txt['error_sp_no_articles_found']; return; } echo ' <ul class="sp_list">'; foreach ($articles as $article) { echo ' <li>', sp_embed_image('blog'), ' ', $article['link'], '</li>'; } echo ' </ul>'; } else { $request = $smcFunc['db_query']('', ' SELECT b.blog_id, b.name, t.article_id, t.subject, m.id_member, m.real_name, m.avatar, a.id_attach, a.attachment_type, a.filename FROM {db_prefix}blog_blogs AS b LEFT JOIN {db_prefix}blog_articles AS t ON (t.article_id = b.last_article_id) LEFT JOIN {db_prefix}members AS m ON (m.id_member = b.blog_owner) LEFT JOIN {db_prefix}attachments AS a ON (a.id_member = m.id_member) WHERE b.blog_id IN ({array_int:visible_blogs}) ORDER BY {raw:type} LIMIT {int:limit}', array('visible_blogs' => $visible_blogs, 'type' => $sort ? 'RAND()' : 'b.last_article_id DESC', 'limit' => $limit)); $blogs = array(); $colorids = array(); while ($row = $smcFunc['db_fetch_assoc']($request)) { if (!empty($row['id_member'])) { $colorids[$row['id_member']] = $row['id_member']; } if ($modSettings['avatar_action_too_large'] == 'option_html_resize' || $modSettings['avatar_action_too_large'] == 'option_js_resize') { $avatar_width = !empty($modSettings['avatar_max_width_external']) ? ' width="' . $modSettings['avatar_max_width_external'] . '"' : ''; $avatar_height = !empty($modSettings['avatar_max_height_external']) ? ' height="' . $modSettings['avatar_max_height_external'] . '"' : ''; } else { $avatar_width = ''; $avatar_height = ''; } $blogs[] = array('id' => $row['blog_id'], 'name' => $row['name'], 'href' => $scripturl . '?blog=' . $row['blog_id'] . '.0', 'link' => '<a href="' . $scripturl . '?blog=' . $row['blog_id'] . '.0">' . $row['name'] . '</a>', 'article' => array('id' => $row['article_id'], 'subject' => strip_tags($row['subject']), 'link' => '<a href="' . $scripturl . '?article=' . $row['article_id'] . '.0">' . $row['subject'] . '</a>'), 'owner' => array('id' => $row['id_member'], 'name' => $row['real_name'], 'href' => $scripturl . '?action=profile;u=' . $row['id_member'], 'link' => '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['real_name'] . '</a>'), 'avatar' => array('name' => $row['avatar'], 'image' => $row['avatar'] == '' ? $row['id_attach'] > 0 ? '<img src="' . (empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) . '" alt="" class="avatar" border="0" />' : '' : (stristr($row['avatar'], 'http://') ? '<img src="' . $row['avatar'] . '"' . $avatar_width . $avatar_height . ' alt="" class="avatar" border="0" />' : '<img src="' . $modSettings['avatar_url'] . '/' . htmlspecialchars($row['avatar']) . '" alt="" class="avatar" border="0" />'), 'href' => $row['avatar'] == '' ? $row['id_attach'] > 0 ? empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename'] : '' : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']), 'url' => $row['avatar'] == '' ? '' : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']))); } $smcFunc['db_free_result']($request); if (!empty($colorids) && sp_loadColors($colorids) !== false) { foreach ($blogs as $k => $p) { if (!empty($color_profile[$p['owner']['id']]['link'])) { $blogs[$k]['owner']['link'] = $color_profile[$p['owner']['id']]['link']; } } } echo ' <table class="sp_fullwidth sp_blog">'; foreach ($blogs as $blog) { echo ' <tr> <td class="sp_top_poster sp_blog">', !empty($blog['avatar']['href']) ? ' <a href="' . $scripturl . '?action=profile;u=' . $blog['owner']['id'] . '"><img src="' . $blog['avatar']['href'] . '" alt="' . $blog['name'] . '" width="40" /></a>' : '', ' </td> <td> <span class="sp_blog_title">', $blog['owner']['link'], '</span><br /> ', $blog['article']['link'], ' </td> </tr>'; } echo ' </table>'; } } elseif ($mod == 'smfblog') { $request = $smcFunc['db_query']('', ' SELECT b.id_board FROM {db_prefix}boards AS b WHERE {query_see_board} AND b.is_blog = {int:is_blog}', array('is_blog' => 1)); $visible_blogs = array(); while ($row = $smcFunc['db_fetch_assoc']($request)) { $visible_blogs[] = $row['id_board']; } $smcFunc['db_free_result']($request); if (empty($visible_blogs)) { echo ' ', $txt['error_sp_no_blogs_found']; return; } if (empty($type)) { $request = $smcFunc['db_query']('', ' SELECT t.id_topic, m.subject FROM {db_prefix}topics AS t INNER JOIN {db_prefix}messages AS m ON (m.id_msg = t.id_first_msg) WHERE t.id_board IN ({array_int:visible_blogs})' . ($modSettings['postmod_active'] ? ' AND t.approved = {int:is_approved}' : '') . ' ORDER BY {raw:type} LIMIT {int:limit}', array('visible_blogs' => $visible_blogs, 'is_approved' => 1, 'type' => $sort ? 'RAND()' : 't.id_topic DESC', 'limit' => $limit)); while ($row = $smcFunc['db_fetch_assoc']($request)) { censorText($row['subject']); $articles[] = array('id' => $row['id_topic'], 'subject' => $row['subject'], 'link' => '<a href="' . $scripturl . '?action=blog;sa=view_post;id=' . $row['id_topic'] . '">' . $row['subject'] . '</a>'); } $smcFunc['db_free_result']($request); if (empty($articles)) { echo ' ', $txt['error_sp_no_articles_found']; return; } echo ' <ul class="sp_list">'; foreach ($articles as $article) { echo ' <li>', sp_embed_image('blog'), ' ', $article['link'], '</li>'; } echo ' </ul>'; } else { $request = $smcFunc['db_query']('', ' SELECT b.id_board, b.blog_alias, b.name, MAX(t.id_topic) AS id_topic FROM {db_prefix}boards AS b INNER JOIN {db_prefix}topics AS t ON (t.id_board = b.id_board) WHERE b.id_board IN ({array_int:visible_blogs})' . ($modSettings['postmod_active'] ? ' AND t.approved = {int:is_approved}' : '') . ' GROUP BY b.id_board ORDER BY {raw:type} LIMIT {int:limit}', array('visible_blogs' => $visible_blogs, 'is_approved' => 1, 'type' => $sort ? 'RAND()' : 'b.id_board DESC', 'limit' => $limit)); $blogs = array(); while ($row = $smcFunc['db_fetch_assoc']($request)) { $blogs[$row['id_board']] = array('id' => $row['id_board'], 'alias' => $row['blog_alias'], 'name' => $row['name'], 'href' => $scripturl . '?action=blog;sa=view_blog;name=' . $row['blog_alias'], 'link' => '<a href="' . $scripturl . '?action=blog;sa=view_blog;name=' . $row['blog_alias'] . '">' . $row['name'] . '</a>'); $articles[] = $row['id_topic']; } $smcFunc['db_free_result']($request); if (empty($articles)) { echo ' ', $txt['error_sp_no_articles_found']; return; } $request = $smcFunc['db_query']('', ' SELECT t.id_board, t.id_topic, m.subject, mem.id_member, mem.real_name, mem.avatar, a.id_attach, a.attachment_type, a.filename FROM {db_prefix}topics AS t INNER JOIN {db_prefix}messages AS m ON (m.id_msg = t.id_first_msg) INNER JOIN {db_prefix}members AS mem ON (mem.id_member = t.id_member_started) LEFT JOIN {db_prefix}attachments AS a ON (a.id_member = t.id_member_started) WHERE t.id_topic IN ({array_int:blog_articles}) LIMIT {int:limit}', array('blog_articles' => $articles, 'limit' => count($articles))); $colorids = array(); while ($row = $smcFunc['db_fetch_assoc']($request)) { if (!empty($row['id_member'])) { $colorids[$row['id_member']] = $row['id_member']; } if ($modSettings['avatar_action_too_large'] == 'option_html_resize' || $modSettings['avatar_action_too_large'] == 'option_js_resize') { $avatar_width = !empty($modSettings['avatar_max_width_external']) ? ' width="' . $modSettings['avatar_max_width_external'] . '"' : ''; $avatar_height = !empty($modSettings['avatar_max_height_external']) ? ' height="' . $modSettings['avatar_max_height_external'] . '"' : ''; } else { $avatar_width = ''; $avatar_height = ''; } censorText($row['subject']); $blogs[$row['id_board']] += array('article' => array('id' => $row['id_topic'], 'subject' => $row['subject'], 'link' => '<a href="' . $scripturl . '?action=blog;sa=view_post;id=' . $row['id_topic'] . '">' . $row['subject'] . '</a>'), 'owner' => array('id' => $row['id_member'], 'name' => $row['real_name'], 'href' => $scripturl . '?action=profile;u=' . $row['id_member'], 'link' => '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['real_name'] . '</a>'), 'avatar' => array('name' => $row['avatar'], 'image' => $row['avatar'] == '' ? $row['id_attach'] > 0 ? '<img src="' . (empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename']) . '" alt="" class="avatar" border="0" />' : '' : (stristr($row['avatar'], 'http://') ? '<img src="' . $row['avatar'] . '"' . $avatar_width . $avatar_height . ' alt="" class="avatar" border="0" />' : '<img src="' . $modSettings['avatar_url'] . '/' . htmlspecialchars($row['avatar']) . '" alt="" class="avatar" border="0" />'), 'href' => $row['avatar'] == '' ? $row['id_attach'] > 0 ? empty($row['attachment_type']) ? $scripturl . '?action=dlattach;attach=' . $row['id_attach'] . ';type=avatar' : $modSettings['custom_avatar_url'] . '/' . $row['filename'] : '' : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']), 'url' => $row['avatar'] == '' ? '' : (stristr($row['avatar'], 'http://') ? $row['avatar'] : $modSettings['avatar_url'] . '/' . $row['avatar']))); } $smcFunc['db_free_result']($request); if (!empty($colorids) && sp_loadColors($colorids) !== false) { foreach ($blogs as $k => $p) { if (!empty($color_profile[$p['owner']['id']]['link'])) { $blogs[$k]['owner']['link'] = $color_profile[$p['owner']['id']]['link']; } } } echo ' <table class="sp_fullwidth sp_blog">'; foreach ($blogs as $blog) { echo ' <tr> <td class="sp_top_poster sp_blog">', !empty($blog['avatar']['href']) ? ' <a href="' . $scripturl . '?action=profile;u=' . $blog['owner']['id'] . '"><img src="' . $blog['avatar']['href'] . '" alt="' . $blog['name'] . '" width="40" /></a>' : '', ' </td> <td> <span class="sp_blog_title">', $blog['owner']['link'], '</span><br /> ', $blog['article']['link'], ' </td> </tr>'; } echo ' </table>'; } } }
/** * Loads all the comments that an article has generated * * @param int|null $article_id * @param int|null $limit limit the number of results * @param int|null $start start number for pages */ function sportal_get_comments($article_id = null, $limit = null, $start = null) { global $scripturl, $user_info, $color_profile; $db = database(); $request = $db->query('', ' SELECT spc.id_comment, IFNULL(spc.id_member, 0) AS id_author, IFNULL(m.real_name, spc.member_name) AS author_name, spc.body, spc.log_time, m.avatar, m.email_address, a.id_attach, a.attachment_type, a.filename FROM {db_prefix}sp_comments AS spc LEFT JOIN {db_prefix}members AS m ON (m.id_member = spc.id_member) LEFT JOIN {db_prefix}attachments AS a ON (a.id_member = m.id_member) WHERE spc.id_article = {int:article_id} ORDER BY spc.id_comment' . (!empty($limit) ? ' LIMIT {int:start}, {int:limit}' : ''), array('article_id' => (int) $article_id, 'limit' => (int) $limit, 'start' => (int) $start)); $return = array(); $member_ids = array(); while ($row = $db->fetch_assoc($request)) { if (!empty($row['id_author'])) { $member_ids[$row['id_author']] = $row['id_author']; } $return[$row['id_comment']] = array('id' => $row['id_comment'], 'body' => parse_bbc($row['body']), 'time' => htmlTime($row['log_time']), 'author' => array('id' => $row['id_author'], 'name' => $row['author_name'], 'href' => $scripturl . '?action=profile;u=' . $row['id_author'], 'link' => $row['id_author'] ? '<a href="' . $scripturl . '?action=profile;u=' . $row['id_author'] . '">' . $row['author_name'] . '</a>' : $row['author_name'], 'avatar' => determineAvatar(array('avatar' => $row['avatar'], 'filename' => $row['filename'], 'id_attach' => $row['id_attach'], 'email_address' => $row['email_address'], 'attachment_type' => $row['attachment_type']))), 'can_moderate' => allowedTo('sp_admin') || allowedTo('sp_manage_articles') || !$user_info['is_guest'] && $user_info['id'] == $row['id_author']); } $db->free_result($request); // Colorization if (!empty($member_ids) && sp_loadColors($member_ids) !== false) { foreach ($return as $key => $value) { if (!empty($color_profile[$value['author']['id']]['link'])) { $return[$key]['author']['link'] = $color_profile[$value['author']['id']]['link']; } } } return $return; }
/** * Article Block, show the list of articles in the system * * @param mixed[] $parameters * 'category' => list of categories to choose article from * 'limit' => number of articles to show * 'type' => 0 latest 1 random * 'length' => length for the body text preview * 'avatar' => whether to show the author avatar or not * * @param int $id - not used in this block * @param boolean $return_parameters if true returns the configuration options for the block */ function sp_articles($parameters, $id, $return_parameters = false) { global $scripturl, $txt, $color_profile; $block_parameters = array('category' => array(0 => $txt['sp_all']), 'limit' => 'int', 'type' => 'select', 'length' => 'int', 'avatar' => 'check'); if ($return_parameters) { require_once SUBSDIR . '/PortalAdmin.subs.php'; $categories = sp_load_categories(); foreach ($categories as $category) { $block_parameters['category'][$category['id']] = $category['name']; } return $block_parameters; } // Needed utilities require_once SUBSDIR . '/Post.subs.php'; require_once SUBSDIR . '/PortalArticle.subs.php'; // Set up for the query $category = empty($parameters['category']) ? 0 : (int) $parameters['category']; $limit = empty($parameters['limit']) ? 5 : (int) $parameters['limit']; $type = empty($parameters['type']) ? 0 : 1; $length = isset($parameters['length']) ? (int) $parameters['length'] : 250; $avatar = empty($parameters['avatar']) ? 0 : (int) $parameters['avatar']; $articles = sportal_get_articles(null, true, true, $type ? 'RAND()' : 'spa.date DESC', $category, $limit); $colorids = array(); foreach ($articles as $article) { if (!empty($article['author']['id'])) { $colorids[$article['author']['id']] = $article['author']['id']; } } // No articles in the system or none they can see if (empty($articles)) { echo ' ', $txt['error_sp_no_articles_found']; return; } // Doing the color thing if (!empty($colorids) && sp_loadColors($colorids) !== false) { foreach ($articles as $k => $p) { if (!empty($color_profile[$p['author']['id']]['link'])) { $articles[$k]['author']['link'] = $color_profile[$p['author']['id']]['link']; } } } // Not showing avatars, just use a compact link view if (empty($avatar)) { echo ' <ul class="sp_list">'; foreach ($articles as $article) { echo ' <li>', sp_embed_image('topic'), ' ', $article['link'], '</li>'; } echo ' </ul>'; } else { echo ' <table class="sp_fullwidth">'; foreach ($articles as $article) { // Using the cutoff tag? $limited = false; if (($cutoff = Util::strpos($article['body'], '[cutoff]')) !== false) { $article['body'] = Util::substr($article['body'], 0, $cutoff); preparsecode($article['body']); $limited = true; } // Good time to do this is ... now censorText($article['subject']); censorText($article['body']); $article['body'] = sportal_parse_content($article['body'], $article['type'], 'return'); // Shorten the text, link the ellipsis, etc as needed if ($limited || !empty($length)) { $ellip = '<a href="' . $scripturl . '?article=' . $article['article_id'] . '">…</a>'; $article['body'] = $limited ? $article['body'] . $ellip : Util::shorten_html($article['body'], $length, $ellip, false); } echo ' <tr class="sp_articles_row"> <td class="sp_articles centertext">'; // If we have an avatar to show, show it if ($avatar && !empty($article['author']['avatar']['href'])) { echo ' <a href="', $scripturl, '?action=profile;u=', $article['author']['id'], '"> <img src="', $article['author']['avatar']['href'], '" alt="', $article['author']['name'], '" style="max-width:40px" /> </a>'; } echo ' </td> <td> <span class="sp_articles_title">', $article['author']['link'], '</span><br /> ', $article['link'], ' </td> <td>', $article['body'], '</td> </tr> <tr> <td colspan="3" class="sp_articles_row"></td> </tr>'; } echo ' </table>'; } }
function sportal_articles() { global $smcFunc, $context, $modSettings, $article_request; loadLanguage('Stats'); loadTemplate('PortalArticles'); $context['sub_template'] = 'articles'; if (empty($modSettings['articleactive'])) { return; } $request = $smcFunc['db_query']('', ' SELECT COUNT(*) FROM {db_prefix}sp_articles as a INNER JOIN {db_prefix}sp_categories AS c ON (c.id_category = a.id_category) INNER JOIN {db_prefix}messages AS m ON (m.id_msg = a.id_message) INNER JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board) WHERE {query_see_board} AND a.approved = {int:approved} AND publish = {int:publish}', array('approved' => 1, 'publish' => 1)); list($totalArticles) = $smcFunc['db_fetch_row']($request); $smcFunc['db_free_result']($request); $modSettings['articleperpage'] = isset($modSettings['articleperpage']) ? (int) $modSettings['articleperpage'] : 5; $context['start'] = !empty($_REQUEST['articles']) ? (int) $_REQUEST['articles'] : 0; if (!empty($modSettings['articleperpage']) && $totalArticles > 0) { $context['page_index'] = constructPageIndex($context['portal_url'] . '?articles=%1$d', $context['start'], $totalArticles, $modSettings['articleperpage'], true); } if (empty($modSettings['sp_disableColor'])) { $members_request = $smcFunc['db_query']('', ' SELECT m.id_member FROM {db_prefix}sp_articles AS a INNER JOIN {db_prefix}messages AS m ON (m.id_msg = a.id_message) INNER JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board) INNER JOIN {db_prefix}sp_categories AS c ON (c.id_category = a.id_category) WHERE {query_see_board} AND a.approved = {int:approved} AND publish = {int:publish} AND m.id_member != {int:guest} ORDER BY a.id_message DESC' . (empty($modSettings['articleperpage']) ? '' : ' LIMIT {int:start}, {int:end}'), array('approved' => 1, 'publish' => 1, 'start' => $context['start'], 'end' => $modSettings['articleperpage'], 'guest' => 0)); $colorids = array(); while ($row = $smcFunc['db_fetch_assoc']($members_request)) { $colorids[] = $row['id_member']; } $smcFunc['db_free_result']($members_request); if (!empty($colorids)) { sp_loadColors($colorids); } } $article_request = $smcFunc['db_query']('', ' SELECT a.id_article, a.id_category, a.id_message, a.approved, c.name as cname, c.picture, m.id_member, IFNULL(mem.real_name, m.poster_name) AS poster_name, m.icon, m.subject, m.body, m.poster_time, m.smileys_enabled, t.id_topic, t.num_replies, t.num_views, t.locked, b.id_board, b.name as bname, mem.avatar, at.id_attach, at.attachment_type, at.filename FROM {db_prefix}sp_articles AS a INNER JOIN {db_prefix}sp_categories AS c ON (c.id_category = a.id_category) INNER JOIN {db_prefix}messages AS m ON (m.id_msg = a.id_message) INNER JOIN {db_prefix}topics AS t ON (t.id_first_msg = a.id_message) INNER JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board) LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member) LEFT JOIN {db_prefix}attachments AS at ON (at.id_member = mem.id_member) WHERE {query_see_board} AND a.approved = {int:approved} AND publish = {int:publish} ORDER BY a.id_message DESC' . (empty($modSettings['articleperpage']) ? '' : ' LIMIT {int:start}, {int:end}'), array('approved' => 1, 'publish' => 1, 'start' => $context['start'], 'end' => $modSettings['articleperpage'])); $context['get_articles'] = 'sportal_articles_callback'; }