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 int $contactID
97 * Defaults to the current user.
102 public static function getContactDashlets($contactID = NULL) {
103 $contactID = $contactID ?
$contactID : CRM_Core_Session
::singleton()->getLoggedInContactID();
106 // Get contact dashboard dashlets.
107 $results = civicrm_api3('DashboardContact', 'get', array(
108 'contact_id' => $contactID,
110 'dashboard_id.is_active' => 1,
111 'options' => array('sort' => 'weight'),
118 'dashboard_id.label',
120 'dashboard_id.fullscreen_url',
121 'dashboard_id.cache_minutes',
122 'dashboard_id.permission',
123 'dashboard_id.permission_operator',
127 foreach ($results['values'] as $item) {
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'],
133 'name' => $item['dashboard_id.name'],
134 'label' => $item['dashboard_id.label'],
135 'url' => $item['dashboard_id.url'],
136 'cache_minutes' => $item['dashboard_id.cache_minutes'],
137 'fullscreen_url' => $item['dashboard_id.fullscreen_url'],
142 // If empty, then initialize default dashlets for this user.
143 if (!$results['count']) {
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();
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'],
161 'name' => $item['name'],
162 'title' => $item['label'],
163 'url' => self
::parseUrl($item['url']),
164 'cacheMinutes' => $item['cache_minutes'],
165 'fullscreenUrl' => self
::parseUrl($item['fullscreen_url']),
172 * Setup default dashlets for new users.
174 * When a user accesses their dashboard for the first time, set up
175 * the default dashlets.
178 * Array of dashboard_id's
179 * @throws \CiviCRM_API3_Exception
181 public static function initializeDashlets() {
183 $getDashlets = civicrm_api3("Dashboard", "get", array(
184 'domain_id' => CRM_Core_Config
::domainID(),
187 $contactID = CRM_Core_Session
::singleton()->getLoggedInContactID();
188 $allDashlets = CRM_Utils_Array
::index(array('name'), $getDashlets['values']);
189 $defaultDashlets = array();
190 $defaults = array('blog' => 1, 'getting-started' => '0');
191 foreach ($defaults as $name => $column) {
192 if (!empty($allDashlets[$name]) && !empty($allDashlets[$name]['id'])) {
193 $defaultDashlets[$name] = array(
194 'dashboard_id' => $allDashlets[$name]['id'],
196 'column_no' => $column,
197 'contact_id' => $contactID,
201 CRM_Utils_Hook
::dashboard_defaults($allDashlets, $defaultDashlets);
202 if (is_array($defaultDashlets) && !empty($defaultDashlets)) {
203 foreach ($defaultDashlets as $id => $defaultDashlet) {
204 $dashboard_id = $defaultDashlet['dashboard_id'];
205 $dashlet = $getDashlets['values'][$dashboard_id];
206 if (!self
::checkPermission(CRM_Utils_Array
::value('permission', $dashlet), CRM_Utils_Array
::value('permission_operator', $dashlet))) {
210 $assignDashlets = civicrm_api3("dashboard_contact", "create", $defaultDashlet);
211 $values = $assignDashlets['values'][$assignDashlets['id']];
212 $dashlets[$assignDashlets['id']] = array(
213 'dashboard_id' => $values['dashboard_id'],
214 'weight' => $values['weight'],
215 'column_no' => $values['column_no'],
216 'name' => $dashlet['name'],
217 'label' => $dashlet['label'],
218 'cache_minutes' => $dashlet['cache_minutes'],
219 'url' => $dashlet['url'],
220 'fullscreen_url' => $dashlet['fullscreen_url'],
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);
241 * Check dashlet permission for current user.
243 * @param string $permission
244 * Comma separated list.
245 * @param string $operator
248 * true if use has permission else false
250 public static function checkPermission($permission, $operator) {
252 $permissions = explode(',', $permission);
253 $config = CRM_Core_Config
::singleton();
255 static $allComponents;
256 if (!$allComponents) {
257 $allComponents = CRM_Core_Component
::getNames();
260 $hasPermission = FALSE;
261 foreach ($permissions as $key) {
264 $componentName = NULL;
265 if (strpos($key, 'access') === 0) {
266 $componentName = trim(substr($key, 6));
267 if (!in_array($componentName, $allComponents)) {
268 $componentName = NULL;
272 // hack to handle case permissions
273 if (!$componentName && in_array($key, array(
274 'access my cases and activities',
275 'access all cases and activities',
278 $componentName = 'CiviCase';
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)
286 $showDashlet = FALSE;
287 if ($operator == 'AND') {
292 $hasPermission = TRUE;
295 elseif (!CRM_Core_Permission
::check($key)) {
296 $showDashlet = FALSE;
297 if ($operator == 'AND') {
302 $hasPermission = TRUE;
306 if (!$showDashlet && !$hasPermission) {
314 // if permission is not set consider everyone has permission to access it.
320 * Save changes made by user to the Dashlet.
322 * @param array $columns
324 * @param int $contactID
326 * @throws RuntimeException
328 public static function saveDashletChanges($columns, $contactID = NULL) {
330 $contactID = CRM_Core_Session
::getLoggedInContactID();
333 if (empty($contactID)) {
334 throw new RuntimeException("Failed to determine contact ID");
337 $dashletIDs = array();
338 if (is_array($columns)) {
339 foreach ($columns as $colNo => $dashlets) {
340 if (!is_int($colNo)) {
344 foreach ($dashlets as $dashletID => $isMinimized) {
345 $dashletID = (int) $dashletID;
346 $query = "INSERT INTO civicrm_dashboard_contact
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";
350 // fire update query for each column
351 CRM_Core_DAO
::executeQuery($query);
353 $dashletIDs[] = $dashletID;
359 // Disable inactive widgets
360 $dashletClause = $dashletIDs ?
"dashboard_id NOT IN (" . implode(',', $dashletIDs) . ")" : '(1)';
361 $updateQuery = "UPDATE civicrm_dashboard_contact
363 WHERE $dashletClause AND contact_id = {$contactID}";
365 CRM_Core_DAO
::executeQuery($updateQuery);
371 * @param array $params
374 * $dashlet returns dashlet object
376 public static function addDashlet(&$params) {
378 // special case to handle duplicate entries for report instances
379 $dashboardID = CRM_Utils_Array
::value('id', $params);
381 if (!empty($params['instanceURL'])) {
383 FROM `civicrm_dashboard`
384 WHERE url LIKE '" . CRM_Utils_Array
::value('instanceURL', $params) . "&%'";
385 $dashboardID = CRM_Core_DAO
::singleValueQuery($query);
388 $dashlet = new CRM_Core_DAO_Dashboard();
391 // check url is same as exiting entries, if yes just update existing
392 if (!empty($params['name'])) {
393 $dashlet->name
= CRM_Utils_Array
::value('name', $params);
394 $dashlet->find(TRUE);
397 $dashlet->url
= CRM_Utils_Array
::value('url', $params);
398 $dashlet->find(TRUE);
400 if (empty($params['domain_id'])) {
401 $dashlet->domain_id
= CRM_Core_Config
::domainID();
405 $dashlet->id
= $dashboardID;
408 if (is_array(CRM_Utils_Array
::value('permission', $params))) {
409 $params['permission'] = implode(',', $params['permission']);
411 $dashlet->copyValues($params);
414 // now we need to make dashlet entries for each contact
415 self
::addContactDashlet($dashlet);
421 * Update contact dashboard with new dashlet.
423 * @param object $dashlet
425 public static function addContactDashlet($dashlet) {
426 $admin = CRM_Core_Permission
::check('administer CiviCRM');
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();
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}
439 $dao = CRM_Core_DAO
::executeQuery($query);
440 while ($dao->fetch()) {
441 $contactIDs[] = $dao->contact_id
;
445 //Get the id of Logged in User
446 $session = CRM_Core_Session
::singleton();
447 $contactID = $session->get('userID');
448 if (!empty($contactID)) {
449 $contactIDs[] = $session->get('userID');
453 if (!empty($contactIDs)) {
454 foreach ($contactIDs as $contactID) {
455 $valuesArray[] = " ( {$dashlet->id}, {$contactID} )";
458 $valuesString = implode(',', $valuesArray);
460 INSERT INTO civicrm_dashboard_contact ( dashboard_id, contact_id )
461 VALUES {$valuesString}";
463 CRM_Core_DAO
::executeQuery($query);
468 * @param array $params
469 * Each item is a spec for a dashlet on the contact's dashboard.
472 public static function addContactDashletToDashboard(&$params) {
473 $valuesString = NULL;
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;
481 self
::saveDashletChanges($columns, $contactID);
488 * @param int $dashletID
492 public static function deleteDashlet($dashletID) {
493 $dashlet = new CRM_Core_DAO_Dashboard();
494 $dashlet->id
= $dashletID;