* @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('
');
if (!qa_is_logged_in()) {
if (isset($this->content['navigation']['user']['login']) && !QA_FINAL_EXTERNAL_USERS) {
$login = $this->content['navigation']['user']['login'];
$this->output(
'
'
);
// remove regular navigation link to log in page
unset($this->content['navigation']['user']['login']);
}
}
$this->nav('user');
$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(' ', '');
}
}
}
/**
* 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'])
? ''
: '';
$this->output(
''
);
}
/**
* 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'])
? ''
: '';
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('');
}
$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('
');
}
$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(
''
);
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('');
$this->search();
$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
'';
}
}