Commit | Line | Data |
---|---|---|
6a488035 TO |
1 | <?php |
2 | /* | |
3 | +--------------------------------------------------------------------+ | |
7e9e8871 | 4 | | CiviCRM version 4.7 | |
6a488035 | 5 | +--------------------------------------------------------------------+ |
fa938177 | 6 | | Copyright CiviCRM LLC (c) 2004-2016 | |
6a488035 TO |
7 | +--------------------------------------------------------------------+ |
8 | | This file is a part of CiviCRM. | | |
9 | | | | |
10 | | CiviCRM is free software; you can copy, modify, and distribute it | | |
11 | | under the terms of the GNU Affero General Public License | | |
12 | | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. | | |
13 | | | | |
14 | | CiviCRM is distributed in the hope that it will be useful, but | | |
15 | | WITHOUT ANY WARRANTY; without even the implied warranty of | | |
16 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | | |
17 | | See the GNU Affero General Public License for more details. | | |
18 | | | | |
19 | | You should have received a copy of the GNU Affero General Public | | |
20 | | License and the CiviCRM Licensing Exception along | | |
21 | | with this program; if not, contact CiviCRM LLC | | |
22 | | at info[AT]civicrm[DOT]org. If you have questions about the | | |
23 | | GNU Affero General Public License or the licensing of CiviCRM, | | |
24 | | see the CiviCRM license FAQ at http://civicrm.org/licensing | | |
25 | +--------------------------------------------------------------------+ | |
d25dd0ee | 26 | */ |
6a488035 TO |
27 | |
28 | /** | |
29 | * | |
30 | * @package CRM | |
fa938177 | 31 | * @copyright CiviCRM LLC (c) 2004-2016 |
6a488035 TO |
32 | */ |
33 | ||
34 | /** | |
192d36c5 | 35 | * Class contains Contact dashboard related functions. |
6a488035 TO |
36 | */ |
37 | class CRM_Core_BAO_Dashboard extends CRM_Core_DAO_Dashboard { | |
3cfa8e5e | 38 | /** |
fe482240 | 39 | * Add Dashboard. |
3cfa8e5e | 40 | * |
6a0b768e TO |
41 | * @param array $params |
42 | * Values. | |
3cfa8e5e | 43 | * |
3cfa8e5e EM |
44 | * |
45 | * @return object | |
46 | */ | |
00be9182 | 47 | public static function create($params) { |
3cfa8e5e EM |
48 | $hook = empty($params['id']) ? 'create' : 'edit'; |
49 | CRM_Utils_Hook::pre($hook, 'Dashboard', CRM_Utils_Array::value('id', $params), $params); | |
50 | $dao = self::addDashlet($params); | |
51 | CRM_Utils_Hook::post($hook, 'Dashboard', $dao->id, $dao); | |
52 | return $dao; | |
53 | } | |
6a488035 TO |
54 | |
55 | /** | |
fe482240 | 56 | * Get the list of dashlets enabled by admin. |
6a488035 | 57 | * |
6a0b768e TO |
58 | * @param bool $all |
59 | * All or only active. | |
60 | * @param bool $checkPermission | |
61 | * All or only authorized for the current user. | |
6a488035 | 62 | * |
a6c01b45 CW |
63 | * @return array |
64 | * array of dashlets | |
6a488035 | 65 | */ |
00be9182 | 66 | public static function getDashlets($all = TRUE, $checkPermission = TRUE) { |
6a488035 TO |
67 | $dashlets = array(); |
68 | $dao = new CRM_Core_DAO_Dashboard(); | |
69 | ||
70 | if (!$all) { | |
71 | $dao->is_active = 1; | |
72 | } | |
73 | ||
74 | $dao->domain_id = CRM_Core_Config::domainID(); | |
75 | ||
76 | $dao->find(); | |
77 | while ($dao->fetch()) { | |
ee117e9c | 78 | if ($checkPermission && !self::checkPermission($dao->permission, $dao->permission_operator)) { |
6a488035 TO |
79 | continue; |
80 | } | |
81 | ||
82 | $values = array(); | |
83 | CRM_Core_DAO::storeValues($dao, $values); | |
84 | $dashlets[$dao->id] = $values; | |
85 | } | |
86 | ||
87 | return $dashlets; | |
88 | } | |
89 | ||
90 | /** | |
08727453 | 91 | * Get the list of dashlets for the current user or the specified user. |
6a488035 | 92 | * |
5aa910d4 JM |
93 | * Additionlly, initializes the dashboard with defaults if this is the |
94 | * user's first visit to their dashboard. | |
6a488035 | 95 | * |
6a0b768e | 96 | * @param int $contactID |
94864a5f | 97 | * Defaults to the current user. |
77b97be7 | 98 | * |
a6c01b45 CW |
99 | * @return array |
100 | * array of dashlets | |
6a488035 | 101 | */ |
94864a5f CW |
102 | public static function getContactDashlets($contactID = NULL) { |
103 | $contactID = $contactID ? $contactID : CRM_Core_Session::singleton()->getLoggedInContactID(); | |
6a488035 TO |
104 | $dashlets = array(); |
105 | ||
5aa910d4 | 106 | // Get contact dashboard dashlets. |
dd3770bc | 107 | $results = civicrm_api3('DashboardContact', 'get', array( |
94864a5f | 108 | 'contact_id' => $contactID, |
dd3770bc CW |
109 | 'is_active' => 1, |
110 | 'dashboard_id.is_active' => 1, | |
111 | 'options' => array('sort' => 'weight'), | |
112 | 'return' => array( | |
113 | 'id', | |
114 | 'weight', | |
115 | 'column_no', | |
dd3770bc CW |
116 | 'dashboard_id', |
117 | 'dashboard_id.name', | |
118 | 'dashboard_id.label', | |
119 | 'dashboard_id.url', | |
120 | 'dashboard_id.fullscreen_url', | |
a8f56d71 | 121 | 'dashboard_id.cache_minutes', |
dd3770bc CW |
122 | 'dashboard_id.permission', |
123 | 'dashboard_id.permission_operator', | |
124 | ), | |
94864a5f | 125 | )); |
5f3f6ec3 | 126 | |
94864a5f | 127 | foreach ($results['values'] as $item) { |
dd3770bc CW |
128 | if (self::checkPermission(CRM_Utils_Array::value('dashboard_id.permission', $item), CRM_Utils_Array::value('dashboard_id.permission_operator', $item))) { |
129 | $dashlets[$item['id']] = array( | |
130 | 'dashboard_id' => $item['dashboard_id'], | |
131 | 'weight' => $item['weight'], | |
132 | 'column_no' => $item['column_no'], | |
dd3770bc CW |
133 | 'name' => $item['dashboard_id.name'], |
134 | 'label' => $item['dashboard_id.label'], | |
135 | 'url' => $item['dashboard_id.url'], | |
a8f56d71 | 136 | 'cache_minutes' => $item['dashboard_id.cache_minutes'], |
dd3770bc CW |
137 | 'fullscreen_url' => $item['dashboard_id.fullscreen_url'], |
138 | ); | |
6a488035 TO |
139 | } |
140 | } | |
141 | ||
dd3770bc | 142 | // If empty, then initialize default dashlets for this user. |
94864a5f | 143 | if (!$results['count']) { |
dd3770bc CW |
144 | // They may just have disabled all their dashlets. Check if any records exist for this contact. |
145 | if (!civicrm_api3('DashboardContact', 'getcount', array('contact_id' => $contactID))) { | |
146 | $dashlets = self::initializeDashlets(); | |
147 | } | |
5aa910d4 | 148 | } |
94864a5f | 149 | |
5aa910d4 | 150 | return $dashlets; |
15d9b3ae N |
151 | } |
152 | ||
242055d3 CW |
153 | /** |
154 | * @return array | |
155 | */ | |
dd3770bc CW |
156 | public static function getContactDashletsForJS() { |
157 | $data = array(array(), array()); | |
158 | foreach (self::getContactDashlets() as $item) { | |
159 | $data[$item['column_no']][] = array( | |
160 | 'id' => (int) $item['dashboard_id'], | |
dd3770bc CW |
161 | 'name' => $item['name'], |
162 | 'title' => $item['label'], | |
163 | 'url' => self::parseUrl($item['url']), | |
a8f56d71 | 164 | 'cacheMinutes' => $item['cache_minutes'], |
dd3770bc CW |
165 | 'fullscreenUrl' => self::parseUrl($item['fullscreen_url']), |
166 | ); | |
167 | } | |
168 | return $data; | |
169 | } | |
170 | ||
b5c2afd0 | 171 | /** |
fe482240 | 172 | * Setup default dashlets for new users. |
b5c2afd0 | 173 | * |
5aa910d4 JM |
174 | * When a user accesses their dashboard for the first time, set up |
175 | * the default dashlets. | |
176 | * | |
a6c01b45 | 177 | * @return array |
ad37ac8e | 178 | * Array of dashboard_id's |
179 | * @throws \CiviCRM_API3_Exception | |
b5c2afd0 | 180 | */ |
94864a5f | 181 | public static function initializeDashlets() { |
5aa910d4 | 182 | $dashlets = array(); |
353ffa53 TO |
183 | $getDashlets = civicrm_api3("Dashboard", "get", array( |
184 | 'domain_id' => CRM_Core_Config::domainID(), | |
408b79bf | 185 | 'option.limit' => 0, |
353ffa53 | 186 | )); |
5f3f6ec3 | 187 | $contactID = CRM_Core_Session::singleton()->getLoggedInContactID(); |
15d9b3ae N |
188 | $allDashlets = CRM_Utils_Array::index(array('name'), $getDashlets['values']); |
189 | $defaultDashlets = array(); | |
c202dd9e | 190 | $defaults = array('blog' => 1, 'getting-started' => '0'); |
191 | foreach ($defaults as $name => $column) { | |
fbd19c80 | 192 | if (!empty($allDashlets[$name]) && !empty($allDashlets[$name]['id'])) { |
40c0dd53 | 193 | $defaultDashlets[$name] = array( |
194 | 'dashboard_id' => $allDashlets[$name]['id'], | |
195 | 'is_active' => 1, | |
196 | 'column_no' => $column, | |
197 | 'contact_id' => $contactID, | |
198 | ); | |
199 | } | |
15d9b3ae N |
200 | } |
201 | CRM_Utils_Hook::dashboard_defaults($allDashlets, $defaultDashlets); | |
202 | if (is_array($defaultDashlets) && !empty($defaultDashlets)) { | |
5aa910d4 JM |
203 | foreach ($defaultDashlets as $id => $defaultDashlet) { |
204 | $dashboard_id = $defaultDashlet['dashboard_id']; | |
dd3770bc CW |
205 | $dashlet = $getDashlets['values'][$dashboard_id]; |
206 | if (!self::checkPermission(CRM_Utils_Array::value('permission', $dashlet), CRM_Utils_Array::value('permission_operator', $dashlet))) { | |
15d9b3ae N |
207 | continue; |
208 | } | |
209 | else { | |
210 | $assignDashlets = civicrm_api3("dashboard_contact", "create", $defaultDashlet); | |
94864a5f | 211 | $values = $assignDashlets['values'][$assignDashlets['id']]; |
dd3770bc CW |
212 | $dashlets[$assignDashlets['id']] = array( |
213 | 'dashboard_id' => $values['dashboard_id'], | |
214 | 'weight' => $values['weight'], | |
215 | 'column_no' => $values['column_no'], | |
dd3770bc CW |
216 | 'name' => $dashlet['name'], |
217 | 'label' => $dashlet['label'], | |
a8f56d71 | 218 | 'cache_minutes' => $dashlet['cache_minutes'], |
dd3770bc CW |
219 | 'url' => $dashlet['url'], |
220 | 'fullscreen_url' => $dashlet['fullscreen_url'], | |
221 | ); | |
6a488035 | 222 | } |
6a488035 TO |
223 | } |
224 | } | |
5aa910d4 | 225 | return $dashlets; |
6a488035 | 226 | } |
08727453 | 227 | |
dd3770bc CW |
228 | /** |
229 | * @param $url | |
230 | * @return string | |
231 | */ | |
232 | public static function parseUrl($url) { | |
233 | if (substr($url, 0, 4) != 'http') { | |
234 | $urlParam = explode('?', $url); | |
235 | $url = CRM_Utils_System::url($urlParam[0], $urlParam[1], FALSE, NULL, FALSE); | |
236 | } | |
237 | return $url; | |
238 | } | |
6a488035 TO |
239 | |
240 | /** | |
fe482240 | 241 | * Check dashlet permission for current user. |
6a488035 | 242 | * |
6a0b768e TO |
243 | * @param string $permission |
244 | * Comma separated list. | |
c490a46a | 245 | * @param string $operator |
6a488035 | 246 | * |
408b79bf | 247 | * @return bool |
a6c01b45 | 248 | * true if use has permission else false |
6a488035 | 249 | */ |
00be9182 | 250 | public static function checkPermission($permission, $operator) { |
6a488035 TO |
251 | if ($permission) { |
252 | $permissions = explode(',', $permission); | |
253 | $config = CRM_Core_Config::singleton(); | |
254 | ||
255 | static $allComponents; | |
256 | if (!$allComponents) { | |
257 | $allComponents = CRM_Core_Component::getNames(); | |
258 | } | |
259 | ||
260 | $hasPermission = FALSE; | |
261 | foreach ($permissions as $key) { | |
262 | $showDashlet = TRUE; | |
263 | ||
264 | $componentName = NULL; | |
265 | if (strpos($key, 'access') === 0) { | |
266 | $componentName = trim(substr($key, 6)); | |
267 | if (!in_array($componentName, $allComponents)) { | |
268 | $componentName = NULL; | |
269 | } | |
270 | } | |
271 | ||
272 | // hack to handle case permissions | |
273 | if (!$componentName && in_array($key, array( | |
353ffa53 | 274 | 'access my cases and activities', |
408b79bf | 275 | 'access all cases and activities', |
353ffa53 TO |
276 | )) |
277 | ) { | |
6a488035 TO |
278 | $componentName = 'CiviCase'; |
279 | } | |
280 | ||
281 | //hack to determine if it's a component related permission | |
282 | if ($componentName) { | |
283 | if (!in_array($componentName, $config->enableComponents) || | |
284 | !CRM_Core_Permission::check($key) | |
285 | ) { | |
286 | $showDashlet = FALSE; | |
287 | if ($operator == 'AND') { | |
288 | return $showDashlet; | |
289 | } | |
290 | } | |
291 | else { | |
292 | $hasPermission = TRUE; | |
293 | } | |
294 | } | |
295 | elseif (!CRM_Core_Permission::check($key)) { | |
296 | $showDashlet = FALSE; | |
297 | if ($operator == 'AND') { | |
298 | return $showDashlet; | |
299 | } | |
300 | } | |
301 | else { | |
302 | $hasPermission = TRUE; | |
303 | } | |
304 | } | |
305 | ||
306 | if (!$showDashlet && !$hasPermission) { | |
307 | return FALSE; | |
308 | } | |
309 | else { | |
310 | return TRUE; | |
311 | } | |
312 | } | |
313 | else { | |
314 | // if permission is not set consider everyone has permission to access it. | |
315 | return TRUE; | |
316 | } | |
317 | } | |
318 | ||
319 | /** | |
242055d3 | 320 | * Save changes made by user to the Dashlet. |
6a488035 | 321 | * |
6a0b768e | 322 | * @param array $columns |
6a488035 | 323 | * |
100fef9d | 324 | * @param int $contactID |
77b97be7 EM |
325 | * |
326 | * @throws RuntimeException | |
6a488035 | 327 | */ |
2aa397bc | 328 | public static function saveDashletChanges($columns, $contactID = NULL) { |
15d9b3ae | 329 | if (!$contactID) { |
ce2cc43e | 330 | $contactID = CRM_Core_Session::getLoggedInContactID(); |
15d9b3ae N |
331 | } |
332 | ||
f583d89b TO |
333 | if (empty($contactID)) { |
334 | throw new RuntimeException("Failed to determine contact ID"); | |
335 | } | |
6a488035 | 336 | |
6a488035 TO |
337 | $dashletIDs = array(); |
338 | if (is_array($columns)) { | |
339 | foreach ($columns as $colNo => $dashlets) { | |
408b79bf | 340 | if (!is_int($colNo)) { |
6a488035 TO |
341 | continue; |
342 | } | |
343 | $weight = 1; | |
344 | foreach ($dashlets as $dashletID => $isMinimized) { | |
00c27b41 CW |
345 | $dashletID = (int) $dashletID; |
346 | $query = "INSERT INTO civicrm_dashboard_contact | |
242055d3 CW |
347 | (weight, column_no, is_active, dashboard_id, contact_id) |
348 | VALUES({$weight}, {$colNo}, 1, {$dashletID}, {$contactID}) | |
349 | ON DUPLICATE KEY UPDATE weight = {$weight}, column_no = {$colNo}, is_active = 1"; | |
6a488035 | 350 | // fire update query for each column |
00c27b41 | 351 | CRM_Core_DAO::executeQuery($query); |
6a488035 TO |
352 | |
353 | $dashletIDs[] = $dashletID; | |
354 | $weight++; | |
355 | } | |
356 | } | |
357 | } | |
358 | ||
00c27b41 CW |
359 | // Disable inactive widgets |
360 | $dashletClause = $dashletIDs ? "dashboard_id NOT IN (" . implode(',', $dashletIDs) . ")" : '(1)'; | |
361 | $updateQuery = "UPDATE civicrm_dashboard_contact | |
362 | SET is_active = 0 | |
363 | WHERE $dashletClause AND contact_id = {$contactID}"; | |
6a488035 TO |
364 | |
365 | CRM_Core_DAO::executeQuery($updateQuery); | |
366 | } | |
367 | ||
368 | /** | |
fe482240 | 369 | * Add dashlets. |
6a488035 | 370 | * |
6a0b768e | 371 | * @param array $params |
6a488035 | 372 | * |
a6c01b45 CW |
373 | * @return object |
374 | * $dashlet returns dashlet object | |
6a488035 | 375 | */ |
00be9182 | 376 | public static function addDashlet(&$params) { |
6a488035 | 377 | |
32c93376 | 378 | // special case to handle duplicate entries for report instances |
15d9b3ae N |
379 | $dashboardID = CRM_Utils_Array::value('id', $params); |
380 | ||
a7488080 | 381 | if (!empty($params['instanceURL'])) { |
6a488035 TO |
382 | $query = "SELECT id |
383 | FROM `civicrm_dashboard` | |
384 | WHERE url LIKE '" . CRM_Utils_Array::value('instanceURL', $params) . "&%'"; | |
385 | $dashboardID = CRM_Core_DAO::singleValueQuery($query); | |
386 | } | |
387 | ||
388 | $dashlet = new CRM_Core_DAO_Dashboard(); | |
389 | ||
390 | if (!$dashboardID) { | |
391 | // check url is same as exiting entries, if yes just update existing | |
a7488080 | 392 | if (!empty($params['name'])) { |
15d9b3ae N |
393 | $dashlet->name = CRM_Utils_Array::value('name', $params); |
394 | $dashlet->find(TRUE); | |
395 | } | |
396 | else { | |
397 | $dashlet->url = CRM_Utils_Array::value('url', $params); | |
398 | $dashlet->find(TRUE); | |
399 | } | |
3cfa8e5e EM |
400 | if (empty($params['domain_id'])) { |
401 | $dashlet->domain_id = CRM_Core_Config::domainID(); | |
402 | } | |
6a488035 TO |
403 | } |
404 | else { | |
405 | $dashlet->id = $dashboardID; | |
406 | } | |
407 | ||
408 | if (is_array(CRM_Utils_Array::value('permission', $params))) { | |
409 | $params['permission'] = implode(',', $params['permission']); | |
410 | } | |
411 | $dashlet->copyValues($params); | |
6a488035 TO |
412 | $dashlet->save(); |
413 | ||
414 | // now we need to make dashlet entries for each contact | |
415 | self::addContactDashlet($dashlet); | |
416 | ||
417 | return $dashlet; | |
418 | } | |
419 | ||
420 | /** | |
fe482240 | 421 | * Update contact dashboard with new dashlet. |
6a488035 | 422 | * |
192d36c5 | 423 | * @param object $dashlet |
6a488035 | 424 | */ |
00be9182 | 425 | public static function addContactDashlet($dashlet) { |
6a488035 TO |
426 | $admin = CRM_Core_Permission::check('administer CiviCRM'); |
427 | ||
428 | // if dashlet is created by admin then you need to add it all contacts. | |
429 | // else just add to contact who is creating this dashlet | |
430 | $contactIDs = array(); | |
431 | if ($admin) { | |
432 | $query = "SELECT distinct( contact_id ) | |
433 | FROM civicrm_dashboard_contact | |
434 | WHERE contact_id NOT IN ( | |
435 | SELECT distinct( contact_id ) | |
436 | FROM civicrm_dashboard_contact WHERE dashboard_id = {$dashlet->id} | |
437 | )"; | |
438 | ||
439 | $dao = CRM_Core_DAO::executeQuery($query); | |
440 | while ($dao->fetch()) { | |
441 | $contactIDs[] = $dao->contact_id; | |
442 | } | |
443 | } | |
444 | else { | |
445 | //Get the id of Logged in User | |
446 | $session = CRM_Core_Session::singleton(); | |
155a0ed0 | 447 | $contactID = $session->get('userID'); |
22e263ad | 448 | if (!empty($contactID)) { |
155a0ed0 JM |
449 | $contactIDs[] = $session->get('userID'); |
450 | } | |
6a488035 TO |
451 | } |
452 | ||
453 | if (!empty($contactIDs)) { | |
454 | foreach ($contactIDs as $contactID) { | |
455 | $valuesArray[] = " ( {$dashlet->id}, {$contactID} )"; | |
456 | } | |
457 | ||
458 | $valuesString = implode(',', $valuesArray); | |
459 | $query = " | |
460 | INSERT INTO civicrm_dashboard_contact ( dashboard_id, contact_id ) | |
461 | VALUES {$valuesString}"; | |
462 | ||
463 | CRM_Core_DAO::executeQuery($query); | |
464 | } | |
465 | } | |
466 | ||
dcf56200 | 467 | /** |
6a0b768e TO |
468 | * @param array $params |
469 | * Each item is a spec for a dashlet on the contact's dashboard. | |
dcf56200 TO |
470 | * @return bool |
471 | */ | |
00be9182 | 472 | public static function addContactDashletToDashboard(&$params) { |
15d9b3ae N |
473 | $valuesString = NULL; |
474 | $columns = array(); | |
475 | foreach ($params as $dashboardIDs) { | |
476 | $contactID = CRM_Utils_Array::value('contact_id', $dashboardIDs); | |
477 | $dashboardID = CRM_Utils_Array::value('dashboard_id', $dashboardIDs); | |
478 | $column = CRM_Utils_Array::value('column_no', $dashboardIDs, 0); | |
479 | $columns[$column][$dashboardID] = 0; | |
480 | } | |
481 | self::saveDashletChanges($columns, $contactID); | |
482 | return TRUE; | |
483 | } | |
484 | ||
6a488035 | 485 | /** |
fe482240 | 486 | * Delete Dashlet. |
6a488035 | 487 | * |
100fef9d | 488 | * @param int $dashletID |
2a6da8d7 | 489 | * |
192d36c5 | 490 | * @return bool |
6a488035 | 491 | */ |
00be9182 | 492 | public static function deleteDashlet($dashletID) { |
6a488035 TO |
493 | $dashlet = new CRM_Core_DAO_Dashboard(); |
494 | $dashlet->id = $dashletID; | |
495 | $dashlet->delete(); | |
15d9b3ae | 496 | return TRUE; |
6a488035 | 497 | } |
96025800 | 498 | |
6a488035 | 499 | } |