q-list.php 7.56 KB
<?php
/*
	Question2Answer by Gideon Greenspan and contributors
	http://www.question2answer.org/

	Description: Controller for most question listing pages, plus custom pages and plugin pages


	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 2
	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.

	More about this license: http://www.question2answer.org/license.php
*/

if (!defined('QA_VERSION')) { // don't allow this page to be requested directly from browser
	header('Location: ../../');
	exit;
}


/**
 * Returns the $qa_content structure for a question list page showing $questions retrieved from the
 * database. If $pagesize is not null, it sets the max number of questions to display. If $count is
 * not null, pagination is determined by $start and $count. The page title is $sometitle unless
 * there are no questions shown, in which case it's $nonetitle. $navcategories should contain the
 * categories retrived from the database using qa_db_category_nav_selectspec(...) for $categoryid,
 * which is the current category shown. If $categorypathprefix is set, category navigation will be
 * shown, with per-category question counts if $categoryqcount is true. The nav links will have the
 * prefix $categorypathprefix and possible extra $categoryparams. If $feedpathprefix is set, the
 * page has an RSS feed whose URL uses that prefix. If there are no links to other pages, $suggest
 * is used to suggest what the user should do. The $pagelinkparams are passed through to
 * qa_html_page_links(...) which creates links for page 2, 3, etc..
 * @param $questions
 * @param $pagesize
 * @param $start
 * @param $count
 * @param $sometitle
 * @param $nonetitle
 * @param $navcategories
 * @param $categoryid
 * @param $categoryqcount
 * @param $categorypathprefix
 * @param $feedpathprefix
 * @param $suggest
 * @param $pagelinkparams
 * @param $categoryparams
 * @param $dummy
 * @return array
 */
function qa_q_list_page_content($questions, $pagesize, $start, $count, $sometitle, $nonetitle,
	$navcategories, $categoryid, $categoryqcount, $categorypathprefix, $feedpathprefix, $suggest,
	$pagelinkparams = null, $categoryparams = null, $dummy = null)
{
	if (qa_to_override(__FUNCTION__)) { $args=func_get_args(); return qa_call_override(__FUNCTION__, $args); }

	require_once QA_INCLUDE_DIR . 'app/format.php';
	require_once QA_INCLUDE_DIR . 'app/updates.php';
	require_once QA_INCLUDE_DIR . 'app/posts.php';

	$userid = qa_get_logged_in_userid();


	// Chop down to size, get user information for display

	if (isset($pagesize)) {
		$questions = array_slice($questions, 0, $pagesize);
	}

	$usershtml = qa_userids_handles_html(qa_any_get_userids_handles($questions));


	// Prepare content for theme

	$qa_content = qa_content_prepare(true, array_keys(qa_category_path($navcategories, $categoryid)));

	$qa_content['q_list']['form'] = array(
		'tags' => 'method="post" action="' . qa_self_html() . '"',

		'hidden' => array(
			'code' => qa_get_form_security_code('vote'),
		),
	);

	$qa_content['q_list']['qs'] = array();

	if (!empty($questions)) {
		$qa_content['title'] = $sometitle;

		$defaults = qa_post_html_defaults('Q');
		if (isset($categorypathprefix)) {
			$defaults['categorypathprefix'] = $categorypathprefix;
		}

		foreach ($questions as $question) {
			$fields = qa_any_to_q_html_fields($question, $userid, qa_cookie_get(), $usershtml, null, qa_post_html_options($question, $defaults));

			if (qa_post_is_closed($question)) {
				$fields['closed'] = array(
					'state' => qa_lang_html('main/closed'),
				);
			}

			$qa_content['q_list']['qs'][] = $fields;
		}
	} else {
		$qa_content['title'] = $nonetitle;
	}

	if (isset($userid) && isset($categoryid)) {
		$favoritemap = qa_get_favorite_non_qs_map();
		$categoryisfavorite = @$favoritemap['category'][$navcategories[$categoryid]['backpath']];

		$qa_content['favorite'] = qa_favorite_form(QA_ENTITY_CATEGORY, $categoryid, $categoryisfavorite,
			qa_lang_sub($categoryisfavorite ? 'main/remove_x_favorites' : 'main/add_category_x_favorites', $navcategories[$categoryid]['title']));
	}

	if (isset($count) && isset($pagesize)) {
		$qa_content['page_links'] = qa_html_page_links(qa_request(), $start, $pagesize, $count, qa_opt('pages_prev_next'), $pagelinkparams);
	}

	$qa_content['canonical'] = qa_get_canonical();

	if (empty($qa_content['page_links'])) {
		$qa_content['suggest_next'] = $suggest;
	}

	if (qa_using_categories() && count($navcategories) && isset($categorypathprefix)) {
		$qa_content['navigation']['cat'] = qa_category_navigation($navcategories, $categoryid, $categorypathprefix, $categoryqcount, $categoryparams);
	}

	// set meta description on category pages
	if (!empty($navcategories[$categoryid]['content'])) {
		$qa_content['description'] = qa_html($navcategories[$categoryid]['content']);
	}

	if (isset($feedpathprefix) && (qa_opt('feed_per_category') || !isset($categoryid))) {
		$qa_content['feed'] = array(
			'url' => qa_path_html(qa_feed_request($feedpathprefix . (isset($categoryid) ? ('/' . qa_category_path_request($navcategories, $categoryid)) : ''))),
			'label' => strip_tags($sometitle),
		);
	}

	return $qa_content;
}


/**
 * Return the sub navigation structure common to question listing pages
 * @param $sort
 * @param $categoryslugs
 * @return array
 */
function qa_qs_sub_navigation($sort, $categoryslugs)
{
	$request = 'questions';

	if (isset($categoryslugs)) {
		foreach ($categoryslugs as $slug) {
			$request .= '/' . $slug;
		}
	}

	$navigation = array(
		'recent' => array(
			'label' => qa_lang('main/nav_most_recent'),
			'url' => qa_path_html($request),
		),

		'hot' => array(
			'label' => qa_lang('main/nav_hot'),
			'url' => qa_path_html($request, array('sort' => 'hot')),
		),

		'votes' => array(
			'label' => qa_lang('main/nav_most_votes'),
			'url' => qa_path_html($request, array('sort' => 'votes')),
		),

		'answers' => array(
			'label' => qa_lang('main/nav_most_answers'),
			'url' => qa_path_html($request, array('sort' => 'answers')),
		),

		'views' => array(
			'label' => qa_lang('main/nav_most_views'),
			'url' => qa_path_html($request, array('sort' => 'views')),
		),
	);

	if (isset($navigation[$sort])) {
		$navigation[$sort]['selected'] = true;
	} else {
		$navigation['recent']['selected'] = true;
	}

	if (!qa_opt('do_count_q_views')) {
		unset($navigation['views']);
	}

	return $navigation;
}


/**
 * Return the sub navigation structure common to unanswered pages
 * @param $by
 * @param $categoryslugs
 * @return array
 */
function qa_unanswered_sub_navigation($by, $categoryslugs)
{
	$request = 'unanswered';

	if (isset($categoryslugs)) {
		foreach ($categoryslugs as $slug) {
			$request .= '/' . $slug;
		}
	}

	$navigation = array(
		'by-answers' => array(
			'label' => qa_lang('main/nav_no_answer'),
			'url' => qa_path_html($request),
		),

		'by-selected' => array(
			'label' => qa_lang('main/nav_no_selected_answer'),
			'url' => qa_path_html($request, array('by' => 'selected')),
		),

		'by-upvotes' => array(
			'label' => qa_lang('main/nav_no_upvoted_answer'),
			'url' => qa_path_html($request, array('by' => 'upvotes')),
		),
	);

	if (isset($navigation['by-' . $by])) {
		$navigation['by-' . $by]['selected'] = true;
	} else {
		$navigation['by-answers']['selected'] = true;
	}

	if (!qa_opt('voting_on_as')) {
		unset($navigation['by-upvotes']);
	}

	return $navigation;
}