3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.7 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2016 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
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. |
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. |
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 +--------------------------------------------------------------------+
31 * @copyright CiviCRM LLC (c) 2004-2016
35 * Class contains Contact dashboard related functions.
37 class CRM_Core_BAO_Dashboard
extends CRM_Core_DAO_Dashboard
{
41 * @param array $params
47 public static function create($params) {
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);
56 * Get the list of dashlets enabled by admin.
60 * @param bool $checkPermission
61 * All or only authorized for the current user.
66 public static function getDashlets($all = TRUE, $checkPermission = TRUE) {
68 $dao = new CRM_Core_DAO_Dashboard();
74 $dao->domain_id
= CRM_Core_Config
::domainID();
77 while ($dao->fetch()) {
78 if ($checkPermission && !self
::checkPermission($dao->permission
, $dao->permission_operator
)) {
83 CRM_Core_DAO
::storeValues($dao, $values);
84 $dashlets[$dao->id
] = $values;
91 * Get the list of dashlets for the current user or the specified user.
93 * Additionlly, initializes the dashboard with defaults if this is the
94 * user's first visit to their dashboard.
96 * @param bool $flatFormat
97 * This is true if you want simple associated.
98 * array of all the contact's dashlets whether or not they are enabled.
100 * @param int $contactID
101 * Provide the dashlets for the contact id.
102 * passed rather than the current user.
107 public static function getContactDashlets($flatFormat = FALSE, $contactID = NULL) {
110 // Get contact dashboard dashlets.
111 $hasDashlets = FALSE;
112 $dao = new CRM_Contact_DAO_DashboardContact();
113 $dao->contact_id
= $contactID ?
$contactID : CRM_Core_Session
::singleton()->getLoggedInContactID();
114 $dao->orderBy('column_no asc, weight asc');
117 // The available list will only include those which are valid for the domain.
118 $availableDashlets = self
::getDashlets();
119 while ($dao->fetch()) {
120 // When a dashlet is removed, it stays in the table with status disabled,
121 // so even if a user decides not to have any dashlets show, they will still
122 // have records in the table to indicate that we are not newly initializing.
123 if ((!empty($availableDashlets[$dao->dashboard_id
]) && $availableDashlets[$dao->dashboard_id
]['is_active'])) {
126 if ($dao->is_active
) {
127 // append weight so that order is preserved.
128 $dashlets[$dao->column_no
]["{$dao->weight}-{$dao->dashboard_id}"] = $dao->is_minimized
;
132 $dashlets[$dao->dashboard_id
] = $dao->dashboard_id
;
141 // If empty, then initialize contact dashboard for this user.
143 return self
::initializeDashlets($flatFormat);
149 * Setup default dashlets for new users.
151 * When a user accesses their dashboard for the first time, set up
152 * the default dashlets.
154 * @param bool $flatFormat
157 * Array of dashboard_id's
158 * @throws \CiviCRM_API3_Exception
160 public static function initializeDashlets($flatFormat = FALSE) {
162 $getDashlets = civicrm_api3("Dashboard", "get", array(
163 'domain_id' => CRM_Core_Config
::domainID(),
166 $contactID = CRM_Core_Session
::singleton()->getLoggedInContactID();
167 $allDashlets = CRM_Utils_Array
::index(array('name'), $getDashlets['values']);
168 $defaultDashlets = array();
169 $defaults = array('blog' => 1, 'getting-started' => '0');
170 foreach ($defaults as $name => $column) {
171 if (!empty($allDashlets[$name])) {
172 $defaultDashlets[$name] = array(
173 'dashboard_id' => $allDashlets[$name]['id'],
175 'column_no' => $column,
176 'contact_id' => $contactID,
180 CRM_Utils_Hook
::dashboard_defaults($allDashlets, $defaultDashlets);
181 if (is_array($defaultDashlets) && !empty($defaultDashlets)) {
182 foreach ($defaultDashlets as $id => $defaultDashlet) {
183 $dashboard_id = $defaultDashlet['dashboard_id'];
184 if (!self
::checkPermission($getDashlets['values'][$dashboard_id]['permission'],
185 CRM_Utils_Array
::value('permission_operator', $getDashlets['values'][$dashboard_id]))
190 $assignDashlets = civicrm_api3("dashboard_contact", "create", $defaultDashlet);
192 $values = $assignDashlets['values'][$assignDashlets['id']];
193 $dashlets[$values['column_no']][$values['weight'] - $values['dashboard_id']] = $values['is_minimized'];
196 $dashlets[$dashboard_id] = $defaultDashlet['dashboard_id'];
206 * Check dashlet permission for current user.
208 * @param string $permission
209 * Comma separated list.
210 * @param string $operator
213 * true if use has permission else false
215 public static function checkPermission($permission, $operator) {
217 $permissions = explode(',', $permission);
218 $config = CRM_Core_Config
::singleton();
220 static $allComponents;
221 if (!$allComponents) {
222 $allComponents = CRM_Core_Component
::getNames();
225 $hasPermission = FALSE;
226 foreach ($permissions as $key) {
229 $componentName = NULL;
230 if (strpos($key, 'access') === 0) {
231 $componentName = trim(substr($key, 6));
232 if (!in_array($componentName, $allComponents)) {
233 $componentName = NULL;
237 // hack to handle case permissions
238 if (!$componentName && in_array($key, array(
239 'access my cases and activities',
240 'access all cases and activities',
243 $componentName = 'CiviCase';
246 //hack to determine if it's a component related permission
247 if ($componentName) {
248 if (!in_array($componentName, $config->enableComponents
) ||
249 !CRM_Core_Permission
::check($key)
251 $showDashlet = FALSE;
252 if ($operator == 'AND') {
257 $hasPermission = TRUE;
260 elseif (!CRM_Core_Permission
::check($key)) {
261 $showDashlet = FALSE;
262 if ($operator == 'AND') {
267 $hasPermission = TRUE;
271 if (!$showDashlet && !$hasPermission) {
279 // if permission is not set consider everyone has permission to access it.
285 * Get details of each dashlets.
287 * @param int $dashletID
291 * associted array title and content
293 public static function getDashletInfo($dashletID) {
294 $dashletInfo = array();
296 $params = array(1 => array($dashletID, 'Integer'));
297 $query = "SELECT name, label, url, fullscreen_url, is_fullscreen FROM civicrm_dashboard WHERE id = %1";
298 $dashboadDAO = CRM_Core_DAO
::executeQuery($query, $params);
299 $dashboadDAO->fetch();
302 $dao = new CRM_Contact_DAO_DashboardContact();
304 $session = CRM_Core_Session
::singleton();
305 $dao->contact_id
= $session->get('userID');
306 $dao->dashboard_id
= $dashletID;
309 //reset content based on the cache time set in config
310 $createdDate = strtotime($dao->created_date
);
311 $dateDiff = round(abs(time() - $createdDate) / 60);
313 $config = CRM_Core_Config
::singleton();
314 if ($config->dashboardCacheTimeout
<= $dateDiff) {
315 $dao->content
= NULL;
318 // if content is empty and url is set, retrieve it from url
319 if (!$dao->content
&& $dashboadDAO->url
) {
320 $url = $dashboadDAO->url
;
323 // -lets use relative url for internal use.
324 // -make sure relative url should not be htmlize.
325 if (substr($dashboadDAO->url
, 0, 4) != 'http') {
326 $urlParam = explode('?', $dashboadDAO->url
);
327 $url = CRM_Utils_System
::url($urlParam[0], $urlParam[1], TRUE, NULL, FALSE);
330 //get content from url
331 $dao->content
= CRM_Utils_System
::getServerResponse($url);
332 $dao->created_date
= date("YmdHis");
336 $dashletInfo = array(
337 'title' => $dashboadDAO->label
,
338 'name' => $dashboadDAO->name
,
339 'content' => $dao->content
,
342 if ($dashboadDAO->is_fullscreen
) {
343 $fullscreenUrl = $dashboadDAO->fullscreen_url
;
344 if (substr($fullscreenUrl, 0, 4) != 'http') {
345 $urlParam = explode('?', $dashboadDAO->fullscreen_url
);
346 $fullscreenUrl = CRM_Utils_System
::url($urlParam[0], $urlParam[1], TRUE, NULL, FALSE);
348 $dashletInfo['fullscreenUrl'] = $fullscreenUrl;
354 * Save changes made by use to the Dashlet.
356 * @param array $columns
358 * @param int $contactID
360 * @throws RuntimeException
362 public static function saveDashletChanges($columns, $contactID = NULL) {
363 $session = CRM_Core_Session
::singleton();
365 $contactID = $session->get('userID');
368 if (empty($contactID)) {
369 throw new RuntimeException("Failed to determine contact ID");
372 //we need to get existing dashlets, so we know when to update or insert
373 $contactDashlets = self
::getContactDashlets(TRUE, $contactID);
375 $dashletIDs = array();
376 if (is_array($columns)) {
377 foreach ($columns as $colNo => $dashlets) {
378 if (!is_int($colNo)) {
382 foreach ($dashlets as $dashletID => $isMinimized) {
383 $isMinimized = (int) $isMinimized;
384 if (in_array($dashletID, $contactDashlets)) {
385 $query = " UPDATE civicrm_dashboard_contact
386 SET weight = {$weight}, is_minimized = {$isMinimized}, column_no = {$colNo}, is_active = 1
387 WHERE dashboard_id = {$dashletID} AND contact_id = {$contactID} ";
390 $query = " INSERT INTO civicrm_dashboard_contact
391 ( weight, is_minimized, column_no, is_active, dashboard_id, contact_id )
392 VALUES( {$weight}, {$isMinimized}, {$colNo}, 1, {$dashletID}, {$contactID} )";
394 // fire update query for each column
395 $dao = CRM_Core_DAO
::executeQuery($query);
397 $dashletIDs[] = $dashletID;
403 if (!empty($dashletIDs)) {
404 // we need to disable widget that removed
405 $updateQuery = " UPDATE civicrm_dashboard_contact
407 WHERE dashboard_id NOT IN ( " . implode(',', $dashletIDs) . ") AND contact_id = {$contactID}";
410 // this means all widgets are disabled
411 $updateQuery = " UPDATE civicrm_dashboard_contact
413 WHERE contact_id = {$contactID}";
416 CRM_Core_DAO
::executeQuery($updateQuery);
422 * @param array $params
425 * $dashlet returns dashlet object
427 public static function addDashlet(&$params) {
429 // special case to handle duplicate entries for report instances
430 $dashboardID = CRM_Utils_Array
::value('id', $params);
432 if (!empty($params['instanceURL'])) {
434 FROM `civicrm_dashboard`
435 WHERE url LIKE '" . CRM_Utils_Array
::value('instanceURL', $params) . "&%'";
436 $dashboardID = CRM_Core_DAO
::singleValueQuery($query);
439 $dashlet = new CRM_Core_DAO_Dashboard();
442 // check url is same as exiting entries, if yes just update existing
443 if (!empty($params['name'])) {
444 $dashlet->name
= CRM_Utils_Array
::value('name', $params);
445 $dashlet->find(TRUE);
448 $dashlet->url
= CRM_Utils_Array
::value('url', $params);
449 $dashlet->find(TRUE);
451 if (empty($params['domain_id'])) {
452 $dashlet->domain_id
= CRM_Core_Config
::domainID();
456 $dashlet->id
= $dashboardID;
459 if (is_array(CRM_Utils_Array
::value('permission', $params))) {
460 $params['permission'] = implode(',', $params['permission']);
462 $dashlet->copyValues($params);
465 // now we need to make dashlet entries for each contact
466 self
::addContactDashlet($dashlet);
476 public static function getDashletName($url) {
477 $urlElements = explode('/', $url);
478 if ($urlElements[1] == 'dashlet') {
479 return $urlElements[2];
481 elseif ($urlElements[1] == 'report') {
482 return 'report/' . $urlElements[3];
488 * Update contact dashboard with new dashlet.
490 * @param object $dashlet
492 public static function addContactDashlet($dashlet) {
493 $admin = CRM_Core_Permission
::check('administer CiviCRM');
495 // if dashlet is created by admin then you need to add it all contacts.
496 // else just add to contact who is creating this dashlet
497 $contactIDs = array();
499 $query = "SELECT distinct( contact_id )
500 FROM civicrm_dashboard_contact
501 WHERE contact_id NOT IN (
502 SELECT distinct( contact_id )
503 FROM civicrm_dashboard_contact WHERE dashboard_id = {$dashlet->id}
506 $dao = CRM_Core_DAO
::executeQuery($query);
507 while ($dao->fetch()) {
508 $contactIDs[] = $dao->contact_id
;
512 //Get the id of Logged in User
513 $session = CRM_Core_Session
::singleton();
514 $contactID = $session->get('userID');
515 if (!empty($contactID)) {
516 $contactIDs[] = $session->get('userID');
520 if (!empty($contactIDs)) {
521 foreach ($contactIDs as $contactID) {
522 $valuesArray[] = " ( {$dashlet->id}, {$contactID} )";
525 $valuesString = implode(',', $valuesArray);
527 INSERT INTO civicrm_dashboard_contact ( dashboard_id, contact_id )
528 VALUES {$valuesString}";
530 CRM_Core_DAO
::executeQuery($query);
535 * @param array $params
536 * Each item is a spec for a dashlet on the contact's dashboard.
539 public static function addContactDashletToDashboard(&$params) {
540 $valuesString = NULL;
542 foreach ($params as $dashboardIDs) {
543 $contactID = CRM_Utils_Array
::value('contact_id', $dashboardIDs);
544 $dashboardID = CRM_Utils_Array
::value('dashboard_id', $dashboardIDs);
545 $column = CRM_Utils_Array
::value('column_no', $dashboardIDs, 0);
546 $columns[$column][$dashboardID] = 0;
548 self
::saveDashletChanges($columns, $contactID);
553 * Reset dashlet cache.
555 * @param int $contactID
556 * Reset cache only for specific contact.
558 public static function resetDashletCache($contactID = NULL) {
562 $whereClause = "WHERE contact_id = %1";
563 $params[1] = array($contactID, 'Integer');
565 $query = "UPDATE civicrm_dashboard_contact SET content = NULL $whereClause";
566 $dao = CRM_Core_DAO
::executeQuery($query, $params);
572 * @param int $dashletID
576 public static function deleteDashlet($dashletID) {
577 $dashlet = new CRM_Core_DAO_Dashboard();
578 $dashlet->id
= $dashletID;