Completed
Push — develop ( f6ad79...49e718 )
by Daniel
09:04
created

wordgraph::get_custom_sql_array()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 19
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 19
ccs 10
cts 10
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 12
nc 1
nop 1
crap 1
1
<?php
2
/**
3
 *
4
 * @package sitemaker
5
 * @copyright (c) 2013 Daniel A. (blitze)
6
 * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
7
 *
8
 */
9
10
namespace blitze\sitemaker\blocks;
11
12
use blitze\sitemaker\services\blocks\driver\block;
13
14
class wordgraph extends block
15
{
16
	/** @var \phpbb\db\driver\driver_interface */
17
	protected $db;
18
19
	/** @var \blitze\sitemaker\services\forum\data */
20
	protected $forum;
21
22
	/** @var string */
23
	protected $phpbb_root_path;
24
25
	/** @var string */
26
	protected $php_ext;
27
28
	/** @var int */
29
	protected $cache_time;
30
31
	/**
32
	 * Constructor
33
	 *
34
	 * @param \phpbb\db\driver\driver_interface			$db     			Database connection
35
	 * @param \blitze\sitemaker\services\forum\data		$forum				Forum Data object
36
	 * @param string									$phpbb_root_path	phpBB root path
37
	 * @param string									$php_ext			phpEx
38
	 * @param integer									$cache_time			Cache results for given time
39
	 */
40 3
	public function __construct(\phpbb\db\driver\driver_interface $db, \blitze\sitemaker\services\forum\data $forum, $phpbb_root_path, $php_ext, $cache_time)
41
	{
42 3
		$this->db = $db;
43 3
		$this->forum = $forum;
44 3
		$this->phpbb_root_path = $phpbb_root_path;
45 3
		$this->php_ext = $php_ext;
46 3
		$this->cache_time = $cache_time;
47 3
	}
48
49
	/**
50
	 * {@inheritdoc}
51
	 */
52 1
	public function get_config(array $settings)
53
	{
54
		return array(
55 1
			'legend1'			=> 'SETTINGS',
56 1
			'show_word_count'	=> array('lang' => 'SHOW_WORD_COUNT', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false, 'default' => 0),
57 1
			'max_num_words'		=> array('lang' => 'MAX_WORDS', 'validate' => 'int:0:255', 'type' => 'number:0:255', 'maxlength' => 2, 'explain' => false, 'default' => 15),
58 1
			'max_word_size'		=> array('lang' => 'WORD_MAX_SIZE', 'validate' => 'int:0:55', 'type' => 'number:0:55', 'maxlength' => 2, 'explain' => false, 'default' => 25, 'append' => 'PIXEL'),
59 1
			'min_word_size'		=> array('lang' => 'WORD_MIN_SIZE', 'validate' => 'int:0:20', 'type' => 'number:0:20', 'maxlength' => 2, 'explain' => false, 'default' => 9, 'append' => 'PIXEL'),
60 1
			'exclude_words'		=> array('lang' => 'EXCLUDE_WORDS', 'validate' => 'string', 'type' => 'textarea:5:50', 'maxlength' => 255, 'explain' => true, 'default' => ''),
61 1
		);
62
	}
63
64
	/**
65
	 * {@inheritdoc}
66
	 */
67 2
	public function display(array $bdata, $edit_mode = false)
68
	{
69 2
		$settings = $bdata['settings'];
70
		$block = array(
71 2
			'title'		=> 'WORDGRAPH',
72 2
			'content'	=> '',
73 2
		);
74
75 2
		$words_array = $this->get_words($settings);
76 2
		if (sizeof($words_array))
77 2
		{
78 2
			$this->show_graph($words_array, $settings);
79
80 2
			$block['content'] = $this->ptemplate->render_view('blitze/sitemaker', 'blocks/wordgraph.html', 'wordgraph_block');
81 2
		}
82
83 2
		return $block;
84
	}
85
86
	/**
87
	 * @param array $words_array
88
	 * @param array $settings
89
	 */
90 2
	protected function show_graph(array $words_array, array $settings)
91
	{
92 2
		$params = $this->get_graph_params($words_array, $settings);
93
94
		// Sort words in result
95 2
		$words = array_keys($words_array);
96 2
		sort($words);
97
98 2
		foreach ($words as $word)
99
		{
100 2
			$color = $params['min_sat'] + (($words_array[$word] - $params['min_count']) * $params['color_step']);
101 2
			$r = dechex($color);
102 2
			$b = dechex($params['max_sat'] - $color);
103 2
			$g = 'c';
104
105 2
			$this->ptemplate->assign_block_vars('wordgraph', array(
106 2
				'WORD'			=> $this->show_word($word, $words_array[$word], $settings['show_word_count']),
107 2
				'WORD_SIZE'		=> $settings['min_word_size'] + (($words_array[$word] - $params['min_count']) * $params['size_step']),
108 2
				'WORD_COLOR'	=> $r . $g . $b,
109 2
				'WORD_URL'		=> $this->get_url($word),
110 2
			));
111 2
		}
112 2
	}
113
114
	/**
115
	 * @param array $words_array
116
	 * @param array $settings
117
	 * @return array
118
	 */
119 2
	protected function get_graph_params(array $words_array, array $settings)
120
	{
121 2
		$max_sat = hexdec('f');
122 2
		$min_sat = hexdec(0);
123
124 2
		$max_count = max(array_values($words_array));
125 2
		$min_count = min(array_values($words_array));
126
127 2
		$spread = $max_count - $min_count;
128 2
		$spread = ($spread) ? $spread : 1;
129
130
		return array(
131 2
			'min_sat'	=> $min_sat,
132 2
			'max_sat'	=> $max_sat,
133
134 2
			'min_count'	=> $min_count,
135 2
			'max_count'	=> $max_count,
136
137 2
			'spread'	=> $spread,
138
139
			// determine the font-size increment
140 2
			'size_step'		=> ($settings['max_word_size'] - $settings['min_word_size']) / $spread,
141 2
			'color_step'	=> ($max_sat - $min_sat) / $spread,
142 2
		);
143
	}
144
145
	/**
146
	 * @param array $settings
147
	 * @return array
148
	 */
149 2
	protected function get_words(array $settings)
150
	{
151 2
		$sql_array = $this->forum->query(false, false)
152 2
			->fetch_custom($this->get_custom_sql_array($settings), array('SELECT'))
153 2
			->build(true, true, false)
154 2
			->get_sql_array();
155 2
		$sql = $this->db->sql_build_query('SELECT', $sql_array);
156 2
		$result = $this->db->sql_query_limit($sql, $settings['max_num_words'], 0, $this->cache_time);
157
158 2
		$words_array = array();
159 2
		while ($row = $this->db->sql_fetchrow($result))
160
		{
161 2
			$word = ucwords(strtolower($row['word_text']));
162 2
			$words_array[$word] = $row['word_count'];
163 2
		}
164 2
		$this->db->sql_freeresult($result);
165
166 2
		return $words_array;
167
	}
168
169
	/**
170
	 * @param array $settings
171
	 * @return array
172
	 */
173 2
	protected function get_custom_sql_array(array $settings)
174
	{
175
		return array(
176 2
			'SELECT'	=> array('l.word_text', 'l.word_count'),
177
			'FROM'		=> array(
178 2
				SEARCH_WORDLIST_TABLE	=> 'l',
179 2
				SEARCH_WORDMATCH_TABLE	=> 'm',
180 2
				TOPICS_TABLE			=> 't',
181 2
				POSTS_TABLE				=> 'p',
182 2
			),
183
			'WHERE'		=> 'l.word_common <> 1
184
				AND l.word_count > 0
185
				AND m.word_id = l.word_id
186
				AND m.post_id = p.post_id
187 2
				AND t.topic_id = p.topic_id' . $this->exclude_words_sql($settings['exclude_words']),
188 2
			'GROUP_BY'	=> 'l.word_text, l.word_count',
189
			'ORDER_BY'	=> 'l.word_count DESC'
190 2
		);
191
	}
192
193
	/**
194
	 * @param string $exclude_words Comma separated string of words
195
	 * @return string
196
	 */
197 2
	protected function exclude_words_sql($exclude_words)
198
	{
199 2
		$sql_where = '';
200
		if ($exclude_words)
201 2
		{
202 1
			$exclude_words = array_filter(explode(',', str_replace(' ', '', strtolower($exclude_words))));
203 1
			$sql_where = (sizeof($exclude_words)) ? ' AND ' . $this->db->sql_in_set('l.word_text', $exclude_words, true) : '';
204 1
		}
205
206 2
		return $sql_where;
207
	}
208
209
	/**
210
	 * @param string $word
211
	 * @param int $count
212
	 * @param bool $show_count
213
	 * @return string
214
	 */
215 2
	protected function show_word($word, $count, $show_count)
216
	{
217 2
		return censor_text(($show_count) ? $word . '(' . $count . ')' : $word);
218
	}
219
220
	/**
221
	 * @param string $word
222
	 * @return string
223
	 */
224 2
	protected function get_url($word)
225
	{
226 2
		return append_sid("{$this->phpbb_root_path}search.$this->php_ext", 'keywords=' . urlencode($word));
227
	}
228
}
229