/
ThreadedList.php
130 lines (113 loc) · 3.61 KB
/
ThreadedList.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<?php
namespace Concrete\Core\Conversation\Message;
use Loader;
use Concrete\Core\Legacy\ItemList;
use Conversation;
use ConversationMessage;
class ThreadedList extends ItemList
{
protected $sortBy = 'cnvMessageDateCreated';
protected $sortByDirection = 'asc';
protected $cnvID;
public function __construct(Conversation $cnv)
{
$this->cnvID = $cnv->getConversationID();
$this->messages = $this->getMessages();
$this->total = $cnv->getConversationMessagesTotal();
}
public function sortByDateDescending()
{
$this->sortBy = 'date';
$this->sortByDirection = 'desc';
}
public function sortByDateAscending()
{
$this->sortBy = 'date';
$this->sortByDirection = 'asc';
}
public function sortByRating()
{
$this->sortBy = 'rating';
$this->sortByDirection = 'desc';
}
public function get($num = 0, $offset = 0)
{
$messages = $this->sortThreadedArrays($this->messages);
// now we turn the threaded messages array into the flat items array
$this->flattenMessages($messages);
return parent::get($num, $offset);
}
protected function sortThreadedArrays($messages)
{
usort($messages, array($this, 'sortItems'));
foreach ($messages as $m) {
if (is_array($m->messages) && count($m->messages)) {
$m->messages = $this->sortThreadedArrays($m->messages);
}
}
return $messages;
}
protected function flattenMessages($messages)
{
foreach ($messages as $m) {
$this->items[] = $m;
if (is_array($m->messages) && count($m->messages)) {
$this->flattenMessages($m->messages);
}
}
}
public function getTotal()
{
return $this->total;
}
protected function getMessages($cnvMessageParentID = 0)
{
$db = Loader::db();
$v = array($this->cnvID, $cnvMessageParentID);
$r = $db->Execute('select cnvMessageID from ConversationMessages where cnvID = ? and cnvMessageParentID = ?', $v);
$messages = array();
while ($row = $r->FetchRow()) {
$msg = ConversationMessage::getByID($row['cnvMessageID']);
if (is_object($msg)) {
$msg->messages = $this->getMessages($msg->getConversationMessageID());
$messages[] = $msg;
}
}
return $messages;
}
/**
* @param ConversationMessage $a
* @param ConversationMessage $b
*
* @return int
*/
protected function sortItems($a, $b)
{
$aSortVal = 0; //a sort value for a comparison check for the value of $a
$bSortVal = 0; //a sort value for a comparison check for the value of $b
if ($this->sortBy == 'date') {
$aSortVal = strtotime($a->getConversationMessageDateTime());
$bSortVal = strtotime($b->getConversationMessageDateTime());
} elseif ($this->sortBy == 'rating') {
$aSortVal = $a->getConversationMessagetotalRatingScore();
$bSortVal = $b->getConversationMessagetotalRatingScore();
}
if ($this->sortByDirection == 'asc') {
if ($aSortVal > $bSortVal) {
return 1;
} elseif ($aSortVal < $bSortVal) {
return -1;
} else {
return 0;
}
} else {
if ($aSortVal > $bSortVal) {
return -1;
} elseif ($aSortVal < $bSortVal) {
return 1;
} else {
return 0;
}
}
}
}