File: qa-theme.php Version: CrazyToad 1.0 Description: Q2A theme class This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ /** * Snow theme extends * * Extends the core theme class qa_html_theme_base * * @package qa_html_theme_base * @subpackage qa_html_theme * @category Theme * @since Snow 1.0 * @version 1.4 * @author Q2A Market * @copyright (c) 2014, Q2A Market * @license http://www.gnu.org/copyleft/gpl.html */ class qa_html_theme extends qa_html_theme_base { // use local font files instead of Google Fonts private $localfonts = true; // theme subdirectories private $js_dir = 'js'; private $icon_url = 'images/icons'; private $fixed_topbar = false; private $welcome_widget_class = 'wet-asphalt'; private $ask_search_box_class = 'turquoise'; // Size of the user avatar in the navigation bar private $nav_bar_avatar_size = 52; /** * Adding aditional meta for responsive design * * @since Snow 1.4 */ public function head_metas() { $this->output(''); parent::head_metas(); } /** * Adding theme stylesheets * * @since Snow 1.4 */ public function head_css() { // add RTL CSS file if ($this->isRTL) $this->content['css_src'][] = $this->rooturl . 'qa-styles-rtl.css?' . QA_VERSION; // add Ubuntu font CSS file from Google Fonts if ($this->localfonts) $this->content['css_src'][] = $this->rooturl . 'fonts/ubuntu.css?' . QA_VERSION; else $this->content['css_src'][] = '//fonts.googleapis.com/css?family=Ubuntu:400,700,400italic,700italic'; parent::head_css(); // output some dynamic CSS inline $this->head_inline_css(); } /** * Adding theme javascripts * * @since Snow 1.4 */ public function head_script() { $jsUrl = $this->rooturl . $this->js_dir . '/snow-core.js?' . QA_VERSION; $this->content['script'][] = ''; parent::head_script(); } /** * Adding point count for logged in user * * @since Snow 1.4 */ public function logged_in() { parent::logged_in(); if (qa_is_logged_in()) { $userpoints = qa_get_logged_in_points(); $pointshtml = $userpoints == 1 ? qa_lang_html_sub('main/1_point', '1', '1') : qa_html(number_format($userpoints)) ; $this->output('
' . $pointshtml . '
'); } } /** * Adding body class dynamically. Override needed to add class on admin/approve-users page * * @since Snow 1.4 */ public function body_tags() { $class = 'qa-template-' . qa_html($this->template); if (isset($this->content['categoryids'])) { foreach ($this->content['categoryids'] as $categoryid) $class .= ' qa-category-' . qa_html($categoryid); } // add class if admin/appovoe-users page if ($this->template === 'admin' && qa_request_part(1) === 'approve') $class .= ' qam-approve-users'; if ($this->fixed_topbar) $class .= ' qam-body-fixed'; $this->output('class="' . $class . ' qa-body-js-off"'); } /** * Login form for user dropdown menu. * * @since Snow 1.4 */ public function nav_user_search() { // outputs login form if user not logged in $this->output('
'); $this->qam_user_account(); $this->output(' '); $this->output('
'); } /** * Modify markup for topbar. * * @since Snow 1.4 */ public function nav_main_sub() { $this->output('
'); $this->output('
'); $this->nav_user_search(); $this->logo(); $this->nav('main'); $this->output('
'); $this->nav('sub'); } /** * Remove the '-' from the note for the category page (notes). * * @since Snow 1.4 * @param type $navlink * @param type $class */ public function nav_link($navlink, $class) { if (isset($navlink['note']) && !empty($navlink['note'])) { $search = array(' - <', '> - '); $replace = array(' <', '> '); $navlink['note'] = str_replace($search, $replace, $navlink['note']); } parent::nav_link($navlink, $class); } /** * Rearranges the layout: * - Swaps the main() and sidepanel() functions * - Moves the header and footer functions outside qa-body-wrapper * - Keeps top/high and low/bottom widgets separated * * @since Snow 1.4 */ public function body_content() { $this->body_prefix(); $this->notices(); $this->widgets('full', 'top'); $this->header(); $this->output('
', ''); $this->widgets('full', 'high'); $this->output('
', ''); $this->main(); $this->sidepanel(); $this->output('
'); $this->widgets('full', 'low'); $this->output('
'); $this->footer(); $this->body_suffix(); } /** * Header in full width top bar * * @since Snow 1.4 */ public function header() { $class = $this->fixed_topbar ? ' fixed' : ''; $this->output('
'); $this->nav_main_sub(); $this->output('
'); $this->output($this->ask_button()); $this->qam_search('the-top', 'the-top-search'); } /** * Footer in full width bottom bar * * @since Snow 1.4 */ public function footer() { $this->output(' '); } /** * Overridden to customize layout and styling * * @since Snow 1.4 */ public function sidepanel() { // remove sidebar for user profile pages if ($this->template == 'user') return; $this->output('
'); $this->output('
'); $this->qam_search(); $this->widgets('side', 'top'); $this->sidebar(); $this->widgets('side', 'high'); $this->nav('cat', 1); $this->widgets('side', 'low'); if (isset($this->content['sidepanel'])) $this->output_raw($this->content['sidepanel']); $this->feed(); $this->widgets('side', 'bottom'); $this->output('
', ''); } /** * Allow alternate sidebar color. * * @since Snow 1.4 */ public function sidebar() { if (isset($this->content['sidebar'])) { $sidebar = $this->content['sidebar']; if (!empty($sidebar)) { $this->output('
'); $this->output_raw($sidebar); $this->output('
', ''); } } } /** * Add close icon * * @since Snow 1.4 * @param array $q_item */ public function q_item_title($q_item) { $closedText = qa_lang('main/closed'); $imgHtml = empty($q_item['closed']) ? '' : '' . $closedText . ''; $this->output( '
', // add closed note in title $imgHtml, '' . $q_item['title'] . '', '
' ); } /** * Add RSS feeds icon and closed icon for closed questions * * @since Snow 1.4 */ public function title() { $q_view = isset($this->content['q_view']) ? $this->content['q_view'] : null; // RSS feed link in title if (isset($this->content['feed']['url'])) { $feed = $this->content['feed']; $label = isset($feed['label']) ? $feed['label'] : ''; $this->output(''); } // link title where appropriate $url = isset($q_view['url']) ? $q_view['url'] : false; // add closed image $closedText = qa_lang('main/closed'); $imgHtml = empty($q_view['closed']) ? '' : '' . $closedText . ''; if (isset($this->content['title'])) { $this->output( $imgHtml, $url ? '' : '', $this->content['title'], $url ? '' : '' ); } } /** * Add view counter to question list * * @since Snow 1.4 * @param array $q_item */ public function q_item_stats($q_item) { $this->output('
'); $this->voting($q_item); $this->a_count($q_item); parent::view_count($q_item); $this->output('
'); } /** * Prevent display view counter on usual place * * @since Snow 1.4 * @param type $q_item */ public function view_count($q_item) {} /** * Add view counter to question view * * @since Snow 1.4 * @param type $q_view */ public function q_view_stats($q_view) { $this->output('
'); $this->voting($q_view); $this->a_count($q_view); parent::view_count($q_view); $this->output('
'); } /** * Modify user whometa, move to top * * @since Snow 1.4 * @param type $q_view */ public function q_view_main($q_view) { $this->output('
'); if (isset($q_view['main_form_tags'])) $this->output('
'); // form for buttons on question $this->post_avatar_meta($q_view, 'qa-q-view'); $this->q_view_content($q_view); $this->q_view_extra($q_view); $this->q_view_follows($q_view); $this->q_view_closed($q_view); $this->post_tags($q_view, 'qa-q-view'); $this->q_view_buttons($q_view); $this->c_list(isset($q_view['c_list']) ? $q_view['c_list'] : null, 'qa-q-view'); if (isset($q_view['main_form_tags'])) { if (isset($q_view['buttons_form_hidden'])) $this->form_hidden_elements($q_view['buttons_form_hidden']); $this->output('
'); } $this->c_form(isset($q_view['c_form']) ? $q_view['c_form'] : null); $this->output('
'); } /** * Move user whometa to top in answer * * @since Snow 1.4 * @param type $a_item */ public function a_item_main($a_item) { $this->output('
'); $this->post_avatar_meta($a_item, 'qa-a-item'); if (isset($a_item['main_form_tags'])) $this->output('
'); // form for buttons on answer if ($a_item['hidden']) $answerState = 'hidden'; elseif ($a_item['selected']) $answerState = 'selected'; else $answerState = null; if (isset($answerState)) $this->output('
'); $this->a_selection($a_item); if (isset($a_item['error'])) $this->error($a_item['error']); $this->a_item_content($a_item); if (isset($answerState)) $this->output('
'); $this->a_item_buttons($a_item); if (isset($a_item['c_list'])) $this->c_list($a_item['c_list'], 'qa-a-item'); if (isset($a_item['main_form_tags'])) { if (isset($a_item['buttons_form_hidden'])) $this->form_hidden_elements($a_item['buttons_form_hidden']); $this->output('
'); } $this->c_form(isset($a_item['c_form']) ? $a_item['c_form'] : null); $this->output('
'); } /** * Move user whometa to top in comment * * @since Snow 1.4 * @param type $c_item */ public function c_item_main($c_item) { $this->post_avatar_meta($c_item, 'qa-c-item'); if (isset($c_item['error'])) $this->error($c_item['error']); if (isset($c_item['expand_tags'])) $this->c_item_expand($c_item); elseif (isset($c_item['url'])) $this->c_item_link($c_item); else $this->c_item_content($c_item); $this->output(''); } /** * Q2A Market attribution. * I'd really appreciate you displaying this link on your Q2A site. Thank you - Jatin * * @since Snow 1.4 */ public function attribution() { // floated right $this->output( '
', 'CrazyToad on github', '
' ); parent::attribution(); } /** * User account navigation item. This will return based on login information. * If user is logged in, it will populate user avatar and account links. * If user is guest, it will populate login form and registration link. * * @since Snow 1.4 */ private function qam_user_account() { if (qa_is_logged_in()) { // get logged-in user avatar $handle = qa_get_logged_in_user_field('handle'); $toggleClass = 'qam-logged-in'; if (QA_FINAL_EXTERNAL_USERS) $tobar_avatar = qa_get_external_avatar_html(qa_get_logged_in_user_field('userid'), $this->nav_bar_avatar_size, true); else { $tobar_avatar = qa_get_user_avatar_html( qa_get_logged_in_user_field('flags'), qa_get_logged_in_user_field('email'), $handle, qa_get_logged_in_user_field('avatarblobid'), qa_get_logged_in_user_field('avatarwidth'), qa_get_logged_in_user_field('avatarheight'), $this->nav_bar_avatar_size, false ); } $avatar = strip_tags($tobar_avatar, ''); if (!empty($avatar)) $handle = ''; } else { // display login icon and label $handle = $this->content['navigation']['user']['login']['label']; $toggleClass = 'qam-logged-out'; $avatar = ''; } // finally output avatar with div tag $handleBlock = empty($handle) ? '' : '
' . qa_html($handle) . '
'; $this->output( '
', $avatar, $handleBlock, '
' ); } /** * Add search-box wrapper with extra class for color scheme * * @since Snow 1.4 * @version 1.0 */ private function qam_search($addon_class = null, $ids = null) { $id = isset($ids) ? ' id="' . $ids . '"' : ''; $this->output(''); } /** * Dynamic CSS based on options and other interaction with Q2A. * * @since Snow 1.4 * @version 1.0 * @return string The CSS code */ private function head_inline_css() { $css = array(''; $this->output_array($css); } /** * Custom ask button for medium and small screen * * @access private * @since Snow 1.4 * @version 1.0 * @return string Ask button html markup */ private function ask_button() { return ''; } }