/** * Provide the user list data via json * @return string|json */ public function data() { $page = $this->getRequestParameter('page'); $limit = $this->getRequestParameter('rows'); $sortBy = $this->getRequestParameter('sortby'); $sortOrder = $this->getRequestParameter('sortorder'); $filterQuery = $this->getRequestParameter('filterquery'); $filterColumns = $this->getRequestParameter('filtercolumns'); $start = $limit * $page - $limit; $fieldsMap = ['login' => PROPERTY_USER_LOGIN, 'firstname' => PROPERTY_USER_FIRSTNAME, 'lastname' => PROPERTY_USER_LASTNAME, 'email' => PROPERTY_USER_MAIL, 'dataLg' => PROPERTY_USER_DEFLG, 'guiLg' => PROPERTY_USER_UILG]; // sorting $order = array_key_exists($sortBy, $fieldsMap) ? $fieldsMap[$sortBy] : $fieldsMap['login']; // filtering $filters = [PROPERTY_USER_LOGIN => '*']; if ($filterQuery) { if (!$filterColumns) { // if filter columns not set, search by all columns $filterColumns = array_keys($fieldsMap); } $filters = array_flip(array_intersect_key($fieldsMap, array_flip($filterColumns))); array_walk($filters, function (&$row, $key) use($filterQuery) { $row = $filterQuery; }); } $options = array('recursive' => true, 'like' => true, 'chaining' => count($filters) > 1 ? 'or' : 'and', 'order' => $order, 'orderdir' => strtoupper($sortOrder)); // get total user count... $total = $this->userService->getCountUsers($options, $filters); // get the users using requested paging... $users = $this->userService->getAllUsers(array_merge($options, ['offset' => $start, 'limit' => $limit]), $filters); $rolesProperty = new core_kernel_classes_Property(PROPERTY_USER_ROLES); $response = new stdClass(); $readonly = array(); $index = 0; foreach ($users as $user) { $propValues = $user->getPropertiesValues(array(PROPERTY_USER_LOGIN, PROPERTY_USER_FIRSTNAME, PROPERTY_USER_LASTNAME, PROPERTY_USER_MAIL, PROPERTY_USER_DEFLG, PROPERTY_USER_UILG, PROPERTY_USER_ROLES)); $roles = $user->getPropertyValues($rolesProperty); $labels = array(); foreach ($roles as $uri) { $r = new core_kernel_classes_Resource($uri); $labels[] = $r->getLabel(); } $id = tao_helpers_Uri::encode($user->getUri()); $firstName = empty($propValues[PROPERTY_USER_FIRSTNAME]) ? '' : (string) current($propValues[PROPERTY_USER_FIRSTNAME]); $lastName = empty($propValues[PROPERTY_USER_LASTNAME]) ? '' : (string) current($propValues[PROPERTY_USER_LASTNAME]); $uiRes = empty($propValues[PROPERTY_USER_UILG]) ? null : current($propValues[PROPERTY_USER_UILG]); $dataRes = empty($propValues[PROPERTY_USER_DEFLG]) ? null : current($propValues[PROPERTY_USER_DEFLG]); $response->data[$index]['id'] = $id; $response->data[$index]['login'] = (string) current($propValues[PROPERTY_USER_LOGIN]); $response->data[$index]['firstname'] = $firstName; $response->data[$index]['lastname'] = $lastName; $response->data[$index]['email'] = (string) current($propValues[PROPERTY_USER_MAIL]); $response->data[$index]['roles'] = implode(', ', $labels); $response->data[$index]['dataLg'] = is_null($dataRes) ? '' : $dataRes->getLabel(); $response->data[$index]['guiLg'] = is_null($uiRes) ? '' : $uiRes->getLabel(); if ($user->getUri() == LOCAL_NAMESPACE . DEFAULT_USER_URI_SUFFIX) { $readonly[$id] = true; } $index++; } $response->page = floor($start / $limit) + 1; $response->total = ceil($total / $limit); $response->records = count($users); $response->readonly = $readonly; $this->returnJson($response, 200); }