qa-layer-voters-flaggers.php 6.17 KB
Newer Older
Scott committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
<?php
/*
	Question2Answer by Gideon Greenspan and contributors
	http://www.question2answer.org/

	File: qa-include/qa-layer-voters-flaggers.php
	Description: Theme layer class for viewing voters and flaggers


	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
*/

Scott committed
23 24 25 26
class qa_html_theme_layer extends qa_html_theme_base
{
	private $qa_voters_flaggers_queue=array();
	private $qa_voters_flaggers_cache=array();
Scott committed
27 28


Scott committed
29
//	Collect up all required postids for the entire page to save DB queries - common case where whole page output
Scott committed
30

Scott committed
31 32 33 34 35
	public function main()
	{
		foreach ($this->content as $key => $part) {
			if (strpos($key, 'q_list')===0)
				$this->queue_raw_posts_voters_flaggers(@$part['qs']);
Scott committed
36

Scott committed
37 38 39
			elseif (strpos($key, 'q_view')===0) {
				$this->queue_post_voters_flaggers($part['raw']);
				$this->queue_raw_posts_voters_flaggers($part['c_list']['cs']);
Scott committed
40

Scott committed
41 42 43
			} elseif (strpos($key, 'a_list')===0) {
				if (!empty($part)) {
					$this->queue_raw_posts_voters_flaggers($part['as']);
Scott committed
44

Scott committed
45 46
					foreach ($part['as'] as $a_item)
						$this->queue_raw_posts_voters_flaggers(@$a_item['c_list']['cs']);
Scott committed
47 48 49 50
				}
			}
		}

Scott committed
51 52
		qa_html_theme_base::main();
	}
Scott committed
53 54


Scott committed
55
//	Other functions which also collect up required postids for lists to save DB queries - helps with widget output and Ajax calls
Scott committed
56

Scott committed
57 58 59
	public function q_list_items($q_items)
	{
		$this->queue_raw_posts_voters_flaggers($q_items);
Scott committed
60

Scott committed
61 62
		qa_html_theme_base::q_list_items($q_items);
	}
Scott committed
63

Scott committed
64 65 66
	public function a_list_items($a_items)
	{
		$this->queue_raw_posts_voters_flaggers($a_items);
Scott committed
67

Scott committed
68 69
		qa_html_theme_base::a_list_items($a_items);
	}
Scott committed
70

Scott committed
71 72 73
	public function c_list_items($c_items)
	{
		$this->queue_raw_posts_voters_flaggers($c_items);
Scott committed
74

Scott committed
75 76
		qa_html_theme_base::c_list_items($c_items);
	}
Scott committed
77 78


Scott committed
79
//	Actual output of the voters and flaggers
Scott committed
80

Scott committed
81 82 83
	public function vote_count($post)
	{
		$votersflaggers=$this->get_post_voters_flaggers($post['raw'], @$post['vote_opostid'] ? $post['raw']['opostid'] : $post['raw']['postid']);
Scott committed
84

Scott committed
85
		$tooltip='';
Scott committed
86

Scott committed
87 88 89
		if (isset($votersflaggers)) {
			$uphandles='';
			$downhandles='';
Scott committed
90

Scott committed
91 92 93
			foreach ($votersflaggers as $voterflagger) {
				if ($voterflagger['vote']>0)
					$uphandles.=(strlen($uphandles) ? ', ' : '').qa_html($voterflagger['handle']);
Scott committed
94

Scott committed
95 96
				if ($voterflagger['vote']<0)
					$downhandles.=(strlen($downhandles) ? ', ' : '').qa_html($voterflagger['handle']);
Scott committed
97

Scott committed
98 99
				$tooltip=trim((strlen($uphandles) ? ('&uarr; '.$uphandles) : '')."\n\n".(strlen($downhandles) ? ('&darr; '.$downhandles) : ''));
			}
Scott committed
100 101
		}

Scott committed
102
		$post['vote_count_tags']=@$post['vote_count_tags'].' title="'.$tooltip.'"';
Scott committed
103

Scott committed
104 105
		qa_html_theme_base::vote_count($post);
	}
Scott committed
106

Scott committed
107 108 109 110 111
	public function post_meta_flags($post, $class)
	{
		$postid=@$post['raw']['opostid'];
		if (!isset($postid))
			$postid=@$post['raw']['postid'];
Scott committed
112

Scott committed
113
		$tooltip='';
Scott committed
114

Scott committed
115 116
		if (isset($postid)) {
			$votersflaggers=$this->get_post_voters_flaggers($post, $postid);
Scott committed
117

118 119
			if (isset($votersflaggers)) {
				foreach ($votersflaggers as $voterflagger) {
Scott committed
120 121
					if ($voterflagger['flag']>0)
						$tooltip.=(strlen($tooltip) ? ', ' : '').qa_html($voterflagger['handle']);
122 123
				}
			}
Scott committed
124 125
		}

Scott committed
126 127
		if (strlen($tooltip))
			$this->output('<span title="&#9873; '.$tooltip.'">');
Scott committed
128

Scott committed
129
		qa_html_theme_base::post_meta_flags($post, $class);
Scott committed
130

Scott committed
131 132 133
		if (strlen($tooltip))
			$this->output('</span>');
	}
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220


//	Utility functions for this layer

	/**
	 * @deprecated This function will become private in Q2A 1.8. It is specific to this plugin and
	 * should not be used by outside code.
	 */
	public function queue_post_voters_flaggers($post)
	{
		if (!qa_user_post_permit_error('permit_view_voters_flaggers', $post)) {
			$postids=array(@$post['postid'], @$post['opostid']); // opostid can be relevant for flags

			foreach ($postids as $postid) {
				if (isset($postid) && !isset($this->qa_voters_flaggers_cache[$postid]))
					$this->qa_voters_flaggers_queue[$postid]=true;
			}
		}
	}

	/**
	 * @deprecated This function will become private in Q2A 1.8. It is specific to this plugin and
	 * should not be used by outside code.
	 */
	public function queue_raw_posts_voters_flaggers($posts)
	{
		if (is_array($posts)) {
			foreach ($posts as $post) {
				if (isset($post['raw']))
					$this->queue_post_voters_flaggers($post['raw']);
			}
		}
	}

	/**
	 * @deprecated This function will become private in Q2A 1.8. It is specific to this plugin and
	 * should not be used by outside code.
	 */
	public function retrieve_queued_voters_flaggers()
	{
		if (count($this->qa_voters_flaggers_queue)) {
			require_once QA_INCLUDE_DIR.'db/votes.php';

			$postids=array_keys($this->qa_voters_flaggers_queue);

			foreach ($postids as $postid)
				$this->qa_voters_flaggers_cache[$postid]=array();

			$newvotersflaggers=qa_db_uservoteflag_posts_get($postids);

			if (QA_FINAL_EXTERNAL_USERS) {
				$keyuserids=array();
				foreach ($newvotersflaggers as $voterflagger)
					$keyuserids[$voterflagger['userid']]=true;

				$useridhandles=qa_get_public_from_userids(array_keys($keyuserids));
				foreach ($newvotersflaggers as $index => $voterflagger)
					$newvotersflaggers[$index]['handle']=@$useridhandles[$voterflagger['userid']];
			}

			foreach ($newvotersflaggers as $voterflagger)
				$this->qa_voters_flaggers_cache[$voterflagger['postid']][]=$voterflagger;

			$this->qa_voters_flaggers_queue=array();
		}
	}

	/**
	 * @deprecated This function will become private in Q2A 1.8. It is specific to this plugin and
	 * should not be used by outside code.
	 */
	public function get_post_voters_flaggers($post, $postid)
	{
		require_once QA_INCLUDE_DIR.'util/sort.php';

		if (!isset($this->qa_voters_flaggers_cache[$postid])) {
			$this->queue_post_voters_flaggers($post);
			$this->retrieve_queued_voters_flaggers();
		}

		$votersflaggers=@$this->qa_voters_flaggers_cache[$postid];

		if (isset($votersflaggers))
			qa_sort_by($votersflaggers, 'handle');

		return $votersflaggers;
	}
Scott committed
221
}