Likes::_action_showGiven()   B
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 96
Code Lines 62

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 28
CRAP Score 1.0002

Importance

Changes 0
Metric Value
cc 1
eloc 62
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 96
rs 8.829
ccs 28
cts 30
cp 0.9333
crap 1.0002

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * Used to allow users to like or unlike a post or an entire topic
5
 *
6
 * @package   ElkArte Forum
7
 * @copyright ElkArte Forum contributors
8
 * @license   BSD http://opensource.org/licenses/BSD-3-Clause (see accompanying LICENSE.txt file)
9
 *
10
 * @version 2.0 dev
11
 *
12
 */
13
14
namespace ElkArte\Controller;
15
16
use ElkArte\AbstractController;
17
use ElkArte\Action;
18
use ElkArte\Exceptions\Exception;
19
use ElkArte\Languages\Txt;
20
use ElkArte\MembersList;
21
use ElkArte\Notifications\Notifications;
22
use ElkArte\Notifications\NotificationsTask;
23
use ElkArte\User;
24
25
/**
26
 * This class contains one likable use, which allows members to like a post
27
 *
28
 * @package Likes
29
 */
30
class Likes extends AbstractController
31
{
32
	/** @var array Holds the ajax response  */
33
	protected $_likes_response = [];
34
35
	/** @var int The id of the message being liked  */
36
	protected $_id_liked;
37
38
	/**
39
	 * Entry point function for likes, permission checks, just makes sure its on
40
	 */
41
	public function pre_dispatch()
42
	{
43
		global $modSettings;
44
45
		// If likes are disabled, we don't go any further
46
		if (empty($modSettings['likes_enabled']))
47 4
		{
48
			throw new Exception('feature_disabled', true);
49 4
		}
50
	}
51
52 4
	/**
53
	 * Default action method, if a specific methods was not
54
	 * directly called already. Simply forwards to likepost.
55
	 *
56 4
	 * @see AbstractController::action_index
57
	 */
58
	public function action_index()
59
	{
60
		global $context;
61
62
		$subActions = array(
63
			'likepost' => array($this, 'action_likepost'),
64
			'unlikepost' => array($this, 'action_unlikepost'),
65
			'likestats' => array($this, 'action_likestats'),
66
		);
67
68
		// We may or may not like you.
69
		$action = new Action('likes');
70
		$subAction = $action->initialize($subActions, 'likepost');
71
		$context['sub_action'] = $subAction;
72
73
		$action->dispatch($subAction);
74
	}
75
76
	/**
77
	 * Likes a post due to its awesomeness
78
	 *
79
	 * What it does:
80
	 *
81
	 * - Permission checks are done in prepare_likes
82
	 * - It redirects back to the referrer afterward.
83
	 * - It is accessed via ?action=like,sa=likepost
84
	 */
85
	public function action_likepost()
86
	{
87
		global $topic;
88
89
		if ($this->getApi() === 'json')
90
		{
91
			$this->action_likepost_api();
92
			return;
93
		}
94
95
		$this->_doLikePost('+', 'likemsg');
96
97
		redirectexit('topic=' . $topic . '.msg' . $this->_id_liked . '#msg' . $this->_id_liked);
98
	}
99 2
100
	/**
101 2
	 * Actually perform the "like" operation.
102
	 *
103 2
	 * Fills $_likes_response that can be used by likeResponse() in order to
104
	 * return a JSON response
105
	 *
106 2
	 * @param string $sign '+' or '-'
107 2
	 * @param string $type the type of like 'likemsg' or 'rlikemsg'
108
	 *
109
	 * @return bool
110 2
	 */
111
	protected function _doLikePost($sign, $type)
112 2
	{
113 2
		global $modSettings;
114
115
		$this->_id_liked = $this->_req->getPost('msg', 'intval', (isset($this->_req->query->msg) ? (int) $this->_req->query->msg : 0));
116 2
117 2
		// We like these
118
		require_once(SUBSDIR . '/Likes.subs.php');
119
		require_once(SUBSDIR . '/Messages.subs.php');
120 2
121
		// Have to be able to access it to like/unlike it
122
		if ($this->prepare_like() && canAccessMessage($this->_id_liked))
123
		{
124
			$liked_message = basicMessageInfo($this->_id_liked, true, true);
125
			if ($liked_message && empty($liked_message['locked']))
126
			{
127
				// Like it
128
				$likeResult = likePost($this->user->id, $liked_message, $sign);
129
130
				// Lets add in a mention to the member that just had their post liked/unliked
131
				if (($likeResult === true) && !empty($modSettings['mentions_enabled']))
132 2
				{
133
					$notifier = Notifications::instance();
134
					$notifier->add(new NotificationsTask(
135
						$type,
136
						$this->_id_liked,
137
						$this->user->id,
138
						array('id_members' => array($liked_message['id_member']), 'rlike_notif' => $type === 'rlikemsg', 'subject' => $liked_message['subject'])
139
					));
140
				}
141
142 2
				return true;
143
			}
144 2
		}
145
146 2
		return false;
147
	}
148
149 2
	/**
150
	 * Checks that few things are in order (in addition to permissions) for likes.
151
	 */
152 2
	private function prepare_like()
153 2
	{
154
		global $modSettings, $txt;
155
156 2
		$check = true;
157
158
		// Valid request
159 2
		checkSession('get');
160
161
		// If you're a guest or simply can't do this, we stop
162 2
		is_not_guest();
163
		isAllowedTo('like_posts');
164
165
		// Load up the helpers
166
		require_once(SUBSDIR . '/Likes.subs.php');
167
168
		// Maintain our log
169 2
		clearLikes(empty($modSettings['likeWaitTime']) ? 0 : $modSettings['likeWaitTime']);
170
171
		// Not a moderator/administrator then we do some checking
172
		if (!empty($modSettings['likeRestrictAdmins']) || !allowedTo('moderate_forum'))
173
		{
174
			// Find out if this user has done this recently...
175 2
			$check = lastLikeOn($this->user->id);
176
		}
177
178
		// Past the post threshold?
179
		if ($this->user->is_admin === false && !empty($modSettings['likeMinPosts']) && $this->user->posts < $modSettings['likeMinPosts'])
180
		{
181
			$check = false;
182
		}
183 2
184
		// If they have exceeded their limits, provide a message for the ajax response
185
		if ($check === false)
186
		{
187
			Txt::load('Errors');
188
			$wait = $modSettings['likeWaitTime'] > 60 ? round($modSettings['likeWaitTime'] / 60, 2) : $modSettings['likeWaitTime'];
189
			$error = sprintf($txt['like_wait_time'], $wait, ($modSettings['likeWaitTime'] < 60 ? strtolower($txt['minutes']) : $txt['hours']));
190
			$this->_likes_response = array('result' => false, 'data' => $error);
191
		}
192 2
193
		return $check;
194 2
	}
195
196
	/**
197 2
	 * Liking a post via ajax
198
	 *
199
	 * Calls the standard like method and then the api return method
200
	 */
201
	public function action_likepost_api()
202
	{
203
		global $txt;
204
205
		// An error if not possible to like.
206 2
		if (!$this->_doLikePost('+', 'likemsg') && empty($this->_likes_response)) {
207 2
      Txt::load('Errors');
208
      $this->_likes_response = array('result' => false, 'data' => $txt['like_unlike_error']);
209
  }
210
211
		$this->likeResponse();
212
	}
213 2
214
	/**
215 2
	 * When liking / unliking via ajax, clears the templates and returns a json
216
	 * response to the page
217
	 */
218 2
	private function likeResponse()
219 2
	{
220
		global $context, $txt;
221
222 2
		// Make room for ajax
223
		setJsonTemplate();
224 2
225 2
		// No errors, build the new button tag
226 2
		if (empty($this->_likes_response))
227 2
		{
228 2
			$details = loadLikes($this->_id_liked, true);
229 2
			$count = empty($details) ? 0 : $details[$this->_id_liked]['count'];
230 2
			$youLiked = $count !== 0 && array_key_exists(User::$info->id , $details[$this->_id_liked]['member']);
0 ignored issues
show
Bug Best Practice introduced by
The property id does not exist on ElkArte\Helper\ValuesContainer. Since you implemented __get, consider adding a @property annotation.
Loading history...
231 2
			$text = $count !== 0 ? ($youLiked ? $txt['unlike_post'] : $txt['likes']) : $txt['like_post'];
232 2
			$title = empty($details) ? '' : $txt['liked_by'] . ' ' . implode(', ', $details[$this->_id_liked]['member']);
233
			$this->_likes_response = [
234
				'result' => true,
235
				'text' => $text,
236
				'count' => $count,
237 2
				'title' => $title
238 2
			];
239
		}
240
241
		// Provide the response
242
		$context['json_data'] = $this->_likes_response;
243
	}
244
245
	/**
246
	 * Un liking a post via ajax
247
	 *
248
	 * Calls the standard unlike method and then the api return method
249
	 */
250
	public function action_unlikepost_api()
251
	{
252
		global $txt;
253
254
		// An error if not possible to like.
255
		if (!$this->_doLikePost('-', 'rlikemsg') && empty($this->_likes_response)) {
256
      Txt::load('Errors');
257
      $this->_likes_response = array('result' => false, 'data' => $txt['like_unlike_error']);
258
  }
259
260
		$this->likeResponse();
261
	}
262
263
	/**
264
	 * Unlikes a post that you previously liked ... no negatives though, hurts feelings :'(
265
	 *
266
	 * - It redirects back to the referrer afterward.
267
	 * - It is accessed via ?action=like,sa=unlikepost.
268
	 */
269
	public function action_unlikepost()
270
	{
271
		global $topic;
272
273
		if ($this->getApi() === 'json')
274
		{
275
			$this->action_unlikepost_api();
276
			return;
277
		}
278
279
		$this->_doLikePost('-', 'rlikemsg');
280
281
		// No longer liked, return to whence you came
282
		if (!isset($this->_req->query->profile))
283
		{
284
			redirectexit('topic=' . $topic . '.msg' . $this->_id_liked . '#msg' . $this->_id_liked);
285
		}
286
		else
287
		{
288 2
			redirectexit('action=profile;area=showlikes;sa=given;u=' . $this->user->id);
289
		}
290
	}
291 2
292
	/**
293 2
	 * Dispatch to show all the posts you liked OR all your posts liked
294
	 */
295
	public function action_showProfileLikes()
296
	{
297
		// Load in our helper functions
298
		require_once(SUBSDIR . '/Likes.subs.php');
299 2
300
		if ($this->_req->getQuery('sa') === 'received')
301 2
		{
302
			$this->_action_showReceived();
303
		}
304
		else
305
		{
306
			$this->_action_showGiven();
307
		}
308
	}
309
310
	/**
311
	 * Shows all posts that others have liked of theirs
312
	 */
313
	private function _action_showReceived()
314
	{
315
		global $context, $txt;
316
317
		$memID = currentMemberID();
318
		$name = MembersList::get($memID)->real_name;
0 ignored issues
show
Bug Best Practice introduced by
The property real_name does not exist on anonymous//sources/ElkArte/MembersList.php$0. Since you implemented __get, consider adding a @property annotation.
Loading history...
319
320
		// Build the listoption array to display the data
321
		$listOptions = array(
322
			'id' => 'view_likes',
323
			'title' => $txt['likes'],
324
			'items_per_page' => 25,
325
			'no_items_label' => $txt['likes_none_received'],
326
			'base_href' => getUrl('profile', ['action' => 'profile', 'area' => 'showlikes', 'sa' => 'received', 'u' => $memID, 'name' => $name]),
327
			'default_sort_col' => 'subject',
328
			'get_items' => array(
329
				'function' => fn($start, $items_per_page, $sort, $memberID) => $this->list_loadLikesReceived($start, $items_per_page, $sort, $memberID),
330
				'params' => array(
331
					$memID,
332
				),
333
			),
334
			'get_count' => array(
335
				'function' => fn($memberID, $given) => $this->list_getLikesCount($memberID, $given),
336
				'params' => array(
337
					$memID,
338
					false,
339
				),
340
			),
341
			'columns' => array(
342
				'subject' => array(
343
					'header' => array(
344
						'value' => $txt['subject'],
345
					),
346
					'data' => array(
347
						'db' => 'subject',
348
					),
349
					'sort' => array(
350
						'default' => 'm.subject DESC',
351
						'reverse' => 'm.subject',
352
					),
353
				),
354
				'name' => array(
355
					'header' => array(
356
						'value' => $txt['board'],
357
					),
358
					'data' => array(
359
						'db' => 'name',
360
					),
361
					'sort' => array(
362
						'default' => 'b.name',
363
						'reverse' => 'b.name DESC',
364
					),
365
				),
366
				'likes' => array(
367
					'header' => array(
368
						'value' => $txt['likes'],
369
					),
370
					'data' => array(
371
						'db' => 'likes',
372
					),
373
					'sort' => array(
374
						'default' => 'likes',
375
						'reverse' => 'likes DESC',
376
					),
377
				),
378
				'action' => array(
379
					'header' => array(
380
						'value' => $txt['show'],
381
						'class' => 'centertext',
382
					),
383
					'data' => array(
384
						'function' => static function ($row) {
385
          global $txt;
386
          return '<a href="' . $row['who'] . '" title="' . $txt['likes_show_who'] . '"><i class="icon i-users"></i></a>';
387
      },
388
						'class' => 'centertext',
389
						'style' => 'width: 10%',
390
					),
391
				),
392
			),
393
		);
394
395
		// Menu tabs
396
		$context[$context['profile_menu_name']]['object']->prepareTabData([
397
			'title' => $txt['likes'],
398
			'description' => $txt['likes_received'],
399
			'class' => 'i-thumbsup',
400
		]);
401
402
		// Set the context values
403
		$context['page_title'] = $txt['likes'];
404
		$context['sub_template'] = 'show_list';
405
		$context['default_list'] = 'view_likes';
406
407
		// Create the list.
408
		createList($listOptions);
409
	}
410
411
	/**
412
	 * Callback for createList()
413
	 * Returns a list of received likes based on posts
414
	 *
415
	 * @param int $start The item to start with (for pagination purposes)
416
	 * @param int $items_per_page The number of items to show per page
417
	 * @param string $sort A string indicating how to sort the results
418
	 * @param int $memberID
419
	 *
420
	 * @return array
421
	 */
422
	public function list_loadLikesReceived($start, $items_per_page, $sort, $memberID)
423
	{
424
		// Get a list of all posts (of a members) that have been liked
425
		return likesPostsReceived($start, $items_per_page, $sort, $memberID);
426
	}
427
428
	/**
429
	 * Callback for createList(),
430
	 * Returns the number of likes a member has given if given = true
431
	 * else the number of posts (not likes) of theirs that have been liked
432
	 *
433
	 * @param int $memberID
434
	 * @param bool $given
435 2
	 *
436
	 * @return int
437 2
	 */
438
	public function list_getLikesCount($memberID, $given)
439
	{
440
		return likesCount($memberID, $given);
441
	}
442
443 2
	/**
444
	 * Shows all posts that they have liked
445 2
	 */
446
	private function _action_showGiven()
447 2
	{
448 2
		global $context, $txt;
449
450
		$memID = currentMemberID();
451
		$name = MembersList::get($memID)->real_name;
0 ignored issues
show
Bug Best Practice introduced by
The property real_name does not exist on anonymous//sources/ElkArte/MembersList.php$0. Since you implemented __get, consider adding a @property annotation.
Loading history...
452 2
453 2
		// Build the listoption array to display the like data
454 2
		$listOptions = array(
455 2
			'id' => 'view_likes',
456 2
			'title' => $txt['likes'],
457 2
			'items_per_page' => 25,
458
			'no_items_label' => $txt['likes_none_given'],
459
			'base_href' => getUrl('profile', ['action' => 'profile', 'area' => 'showlikes', 'sa' => 'given', 'u' => $memID, 'name' => $name]),
460 2
			'default_sort_col' => 'subject',
461 2
			'get_items' => array(
462
				'function' => fn($start, $items_per_page, $sort, $memberID) => $this->list_loadLikesPosts($start, $items_per_page, $sort, $memberID),
463 2
				'params' => array(
464
					$memID,
465
				),
466
			),
467
			'get_count' => array(
468 2
				'function' => fn($memberID, $given) => $this->list_getLikesCount($memberID, $given),
469 2
				'params' => array(
470
					$memID,
471 2
					true
472
				),
473
			),
474
			'columns' => array(
475
				'subject' => array(
476
					'header' => array(
477
						'value' => $txt['subject'],
478 2
					),
479
					'data' => array(
480
						'db' => 'subject',
481
					),
482
					'sort' => array(
483
						'default' => 'm.subject DESC',
484
						'reverse' => 'm.subject',
485
					),
486
				),
487
				'name' => array(
488
					'header' => array(
489
						'value' => $txt['board'],
490 2
					),
491
					'data' => array(
492
						'db' => 'name',
493
					),
494
					'sort' => array(
495
						'default' => 'b.name ',
496
						'reverse' => 'b.name DESC',
497
					),
498
				),
499
				'poster_name' => array(
500
					'header' => array(
501
						'value' => $txt['username'],
502 2
					),
503
					'data' => array(
504
						'db' => 'poster_name',
505
					),
506
					'sort' => array(
507
						'default' => 'm.poster_name ',
508
						'reverse' => 'm.poster_name DESC',
509
					),
510
				),
511
				'action' => array(
512
					'header' => array(
513
						'value' => $txt['delete'],
514 2
						'class' => 'centertext',
515 2
					),
516
					'data' => array(
517
						'function' => static function ($row) {
518
          global $txt;
519
          return '<a href="' . $row['delete'] . '" onclick="return confirm(\'' . $txt['likes_confirm_delete'] . '\');" title="' . $txt['likes_delete'] . '"><i class="icon i-delete"></i></a>';
520
      },
521
						'class' => 'centertext',
522 2
						'style' => 'width: 10%',
523 2
					),
524 2
				),
525
			),
526
		);
527
528
		// Menu tabs
529
		$context[$context['profile_menu_name']]['object']->prepareTabData([
530
			'title' => $txt['likes'],
531 2
			'description' => $txt['likes_given'],
532 2
			'class' => 'i-thumbsup',
533 2
		]);
534
535
		// Set the context values
536
		$context['page_title'] = $txt['likes'];
537 2
		$context['sub_template'] = 'show_list';
538 2
		$context['default_list'] = 'view_likes';
539 2
540
		// Create the list.
541
		createList($listOptions);
542 2
	}
543 2
544
	/**
545
	 * Callback for createList()
546
	 * Returns a list of liked posts for a member
547
	 *
548
	 * @param int $start The item to start with (for pagination purposes)
549
	 * @param int $items_per_page The number of items to show per page
550
	 * @param string $sort A string indicating how to sort the results
551
	 * @param int $memberID
552
	 *
553
	 * @return array
554
	 */
555
	public function list_loadLikesPosts($start, $items_per_page, $sort, $memberID)
556 2
	{
557
		// Get all of our liked posts
558
		return likesPostsGiven($start, $items_per_page, $sort, $memberID);
559 2
	}
560
561
	/**
562
	 * Function to return an array of users that liked a particular message.
563
	 *
564
	 * - Used in profile so a user can see the full list of members, vs the
565
	 * truncated (optional) one shown in message display
566
	 * - Accessed by ?action=likes;sa=showWhoLiked;msg=x
567
	 */
568
	public function action_showWhoLiked()
569
	{
570
		global $context, $txt;
571
572
		require_once(SUBSDIR . '/Likes.subs.php');
573
		Txt::load('Profile');
574
575
		// Get the message in question
576
		$message = $this->_req->getQuery('msg', 'intval', 0);
577
578
		// Build the listoption array to display the data
579
		$listOptions = array(
580
			'id' => 'view_likers',
581
			'title' => $txt['likes_by'],
582
			'items_per_page' => 25,
583
			'no_items_label' => $txt['likes_none_given'],
584
			'base_href' => getUrl('action', ['action' => 'likes', 'sa' => 'showWhoLiked', 'msg' => $message]),
585
			'default_sort_col' => 'member',
586
			'get_items' => array(
587
				'function' => fn($start, $items_per_page, $sort, $messageID) => $this->list_loadPostLikers($start, $items_per_page, $sort, $messageID),
588
				'params' => array(
589
					$message,
590
				),
591
			),
592
			'get_count' => array(
593
				'function' => fn($messageID) => $this->list_getMessageLikeCount($messageID),
594
				'params' => array(
595
					$message,
596
				),
597
			),
598
			'columns' => array(
599
				'member' => array(
600
					'header' => array(
601
						'value' => $txt['members'],
602
						'class' => 'lefttext',
603
					),
604
					'data' => array(
605
						'db' => 'link',
606
					),
607
					'sort' => array(
608
						'default' => 'm.real_name DESC',
609
						'reverse' => 'm.real_name',
610
					),
611
				),
612
			),
613
			'additional_rows' => array(
614
				array(
615
					'position' => 'below_table_data',
616
					'class' => 'submitbutton',
617
					'value' => '<a class="linkbutton" href="javascript:history.go(-1)">' . $txt['back'] . '</a>',
618
				),
619
			),
620
		);
621
622
		// Set the context values
623
		$context['page_title'] = $txt['likes_by'];
624
		$context['sub_template'] = 'show_list';
625
		$context['default_list'] = 'view_likers';
626
627
		// Create the list.
628
		createList($listOptions);
629
	}
630
631
	/**
632
	 * Callback for createList()
633
	 * Returns a list of members that liked a post
634
	 *
635
	 * @param int $start The item to start with (for pagination purposes)
636
	 * @param int $items_per_page The number of items to show per page
637
	 * @param string $sort A string indicating how to sort the results
638
	 * @param int $messageID
639
	 *
640
	 * @return array
641
	 */
642
	public function list_loadPostLikers($start, $items_per_page, $sort, $messageID)
643
	{
644
		// Get a list of this posts likers
645
		return postLikers($start, $items_per_page, $sort, $messageID);
646
	}
647
648
	/**
649
	 * Callback for createList(),
650
	 * Returns the number of likes a message has received
651
	 *
652
	 * @param int $messageID
653
	 *
654
	 * @return int
655
	 */
656
	public function list_getMessageLikeCount($messageID)
657
	{
658
		return messageLikeCount($messageID);
659
	}
660
661
	/**
662
	 * Like stats controller function, used by API calls.
663
	 *
664
	 * What it does:
665
	 *
666
	 * - Validates whether user is allowed to see stats or not.
667
	 * - Decides which tab data to fetch and show to user.
668
	 */
669
	public function action_likestats_api()
670
	{
671
		global $context;
672
673
		checkSession('get');
674
675
		Txt::load('LikePosts');
676
677
		$subActions = array(
678
			'messagestats' => array($this, 'action_messageStats'),
679
			'topicstats' => array($this, 'action_topicStats'),
680
			'boardstats' => array($this, 'action_boardStats'),
681
			'mostlikesreceiveduserstats' => array($this, 'action_mostLikesReceivedUserStats'),
682
			'mostlikesgivenuserstats' => array($this, 'action_mostLikesGivenUserStats'),
683
		);
684
685
		// Set up the action controller
686
		$action = new Action('likesstats');
687
688
		// Pick the correct sub-action, call integrate_sa_likesstats
689
		$subAction = $action->initialize($subActions, 'messagestats', 'area');
690
		$context['sub_action'] = $subAction;
691
692
		// Call the right function for this sub-action.
693
		$action->dispatch($subAction);
694
	}
695
696
	/**
697
	 * Like stats controller function.
698
	 *
699
	 * What it does:
700
	 *
701
	 * - Validates whether user is allowed to see stats or not.
702
	 * - Presents a general page without data that will be fully loaded by API calls.
703
	 * - Used when call is made from the main menu selection
704
	 */
705
	public function action_likestats()
706
	{
707
		global $context, $txt, $modSettings;
708
709
		require_once(SUBSDIR . '/Likes.subs.php');
710
711
		// Likes are not on, your quest for statistics ends here
712
		if (empty($modSettings['likes_enabled']))
713
		{
714
			throw new Exception('feature_disabled', true);
715
		}
716
717
		// Worthy to view like statistics?
718
		isAllowedTo('like_posts_stats');
719
720
		if ($this->getApi() === 'json')
721
		{
722
			$this->action_likestats_api();
723
			return;
724
		}
725
726
		// Load the required files
727
		Txt::load('LikePosts');
728
		loadJavascriptFile('like_posts.js');
729
		theme()->getTemplates()->load('LikePostsStats');
730
731
		// Template and tab data
732
		$context['page_title'] = $txt['like_post_stats'];
733
		$context['like_posts']['tab_desc'] = $txt['like_posts_stats_desc'];
734
		$context['lp_stats_tabs'] = array(
735
			'messagestats' => array(
736
				'label' => $txt['like_post_message'],
737
				'id' => 'messagestats',
738
			),
739
			'topicstats' => array(
740
				'label' => $txt['like_post_topic'],
741
				'id' => 'topicstats',
742
			),
743
			'boardstats' => array(
744
				'label' => $txt['like_post_board'],
745
				'id' => 'boardstats',
746
			),
747
			'usergivenstats' => array(
748
				'label' => $txt['like_post_tab_mlmember'],
749
				'id' => 'mostlikesreceiveduserstats',
750
			),
751
			'userreceivedstats' => array(
752
				'label' => $txt['like_post_tab_mlgmember'],
753
				'id' => 'mostlikesgivenuserstats',
754
			),
755
		);
756
		$context['sub_template'] = 'lp_stats';
757
	}
758
759
	/**
760
	 * Determines the most liked message in the system
761
	 *
762
	 * What it does:
763
	 *
764
	 * - Fetches the most liked message data
765
	 * - Returns the data via ajax
766
	 */
767
	public function action_messageStats()
768
	{
769
		global $txt;
770
771
		// Lets get the statistics!
772
		$data = dbMostLikedMessage();
773
774
		// Set the response
775
		if (!empty($data))
776
		{
777
			$this->_likes_response = array('result' => true, 'data' => $data);
778
		}
779
		else
780
		{
781
			$this->_likes_response = array('result' => false, 'error' => $txt['like_post_error_something_wrong']);
782
		}
783
784
		// Off we go
785
		$this->likeResponse();
786
	}
787
788
	/**
789
	 * Determine the most liked topics in the system
790
	 *
791
	 * What it does:
792
	 *
793
	 * - Gets the most liked topics in the system
794
	 * - Returns the data via ajax
795
	 */
796
	public function action_topicStats()
797
	{
798
		global $txt;
799
800
		$data = dbMostLikedTopic();
801
802
		if (!empty($data))
803
		{
804
			$this->_likes_response = array('result' => true, 'data' => $data);
805
		}
806
		else
807
		{
808
			$this->_likes_response = array('result' => false, 'error' => $txt['like_post_error_something_wrong']);
809
		}
810
811
		$this->likeResponse();
812
	}
813
814
	/**
815
	 * Fetches the most liked board data
816
	 * Returns the data via ajax
817
	 */
818
	public function action_boardStats()
819
	{
820
		global $txt;
821
822
		$data = dbMostLikedBoard();
823
824
		if (!empty($data))
825
		{
826
			$this->_likes_response = array('result' => true, 'data' => $data);
827
		}
828
		else
829
		{
830
			$this->_likes_response = array('result' => false, 'error' => $txt['like_post_error_something_wrong']);
831
		}
832
833
		$this->likeResponse();
834
	}
835
836
	/**
837
	 * Fetches the data for the highest likes received user
838
	 * Returns the data via ajax
839
	 */
840
	public function action_mostLikesReceivedUserStats()
841
	{
842
		global $txt;
843
844
		$data = dbMostLikesReceivedUser();
845
846
		if (!empty($data))
847
		{
848
			$this->_likes_response = array('result' => true, 'data' => $data);
849
		}
850
		else
851
		{
852
			$this->_likes_response = array('result' => false, 'error' => $txt['like_post_error_something_wrong']);
853
		}
854
855
		$this->likeResponse();
856
	}
857
858
	/**
859
	 * Retrieves the most like giving user
860
	 *
861
	 * Returns the data via ajax
862
	 */
863
	public function action_mostLikesGivenUserStats()
864
	{
865
		global $txt;
866
867
		$data = dbMostLikesGivenUser();
868
869
		if (!empty($data))
870
		{
871
			$this->_likes_response = array('result' => true, 'data' => $data);
872
		}
873
		else
874
		{
875
			$this->_likes_response = array('result' => false, 'error' => $txt['like_post_error_something_wrong']);
876
		}
877
878
		$this->likeResponse();
879
	}
880
}
881