/** * Display member quotas * * @return void */ public function displayTask() { // Incoming $filters = array('search' => urldecode(Request::getState($this->_option . '.quotas.search', 'search', '')), 'search_field' => urldecode(Request::getState($this->_option . '.quotas.search_field', 'search_field', 'name')), 'sort' => Request::getState($this->_option . '.quotas.sort', 'filter_order', 'user_id'), 'sort_Dir' => Request::getState($this->_option . '.quotas.sortdir', 'filter_order_Dir', 'ASC'), 'class_alias' => Request::getState($this->_option . '.quotas.class_alias', 'class_alias', '')); $cats = Category::blank()->getTableName(); $users = Member::blank()->getTableName(); $entries = Quota::all(); $entries->select($entries->getTableName() . '.*')->select($cats . '.alias', 'class_alias')->select($users . '.name')->select($users . '.username')->join($cats, $cats . '.id', $entries->getTableName() . '.class_id', 'left')->join($users, $users . '.id', $entries->getTableName() . '.user_id', 'left'); if ($filters['search']) { $entries->whereLike($users . '.name', strtolower((string) $filters['search']), 1)->orWhereLike($users . '.username', strtolower((string) $filters['search']), 1)->resetDepth(); } if ($filters['class_alias']) { $entries->whereEquals('class_alias', $filters['class_alias']); } // Get records $rows = $entries->order($filters['sort'], $filters['sort_Dir'])->paginated('limitstart', 'limit')->rows(); $classes = Category::all()->ordered()->rows(); // Output the HTML $this->view->set('rows', $rows)->set('classes', $classes)->set('filters', $filters)->display(); }
/** * Run Export * * @return void */ public function runTask() { $skip = array('password', 'params', 'usertype'); $keys = array(); $tags = array(); $members = Member::blank(); $attribs = $members->getStructure()->getTableColumns($members->getTableName()); foreach ($attribs as $key => $desc) { if (in_array(strtolower($key), $skip)) { continue; } $keys[$key] = $key; //array_push($keys, $key); } $attribs = Field::all()->ordered()->rows(); foreach ($attribs as $attrib) { if ($attrib->get('type') == 'tags') { array_push($tags, $attrib->get('name')); } if ($attrib->get('type') == 'address') { $keys[$attrib->get('name')] = $attrib->get('name') . ' Street 1'; $keys['_' . $attrib->get('name') . '_address2'] = $attrib->get('name') . ' Street 2'; $keys['_' . $attrib->get('name') . '_city'] = $attrib->get('name') . ' City'; $keys['_' . $attrib->get('name') . '_postal'] = $attrib->get('name') . ' Post Code'; $keys['_' . $attrib->get('name') . '_region'] = $attrib->get('name') . ' Region'; $keys['_' . $attrib->get('name') . '_country'] = $attrib->get('name') . ' Country'; $keys['_' . $attrib->get('name') . '_latitude'] = $attrib->get('name') . ' Latitude'; $keys['_' . $attrib->get('name') . '_longitude'] = $attrib->get('name') . ' Longitude'; continue; } $keys[$attrib->get('name')] = $attrib->get('name'); //array_push($keys, $attrib->get('name')); } // Get request vars $delimiter = Request::getVar('delimiter', ','); $csv = array(); $rows = $members->ordered()->rows(); // Convert to array and bind to object below // This may seem counter-intuitive but it's for // performance reasons. Otherwise, all the circular // references eat up memery. $rows = $rows->toArray(); // Gather up member information foreach ($rows as $row) { $member = Member::blank()->set($row); $tmp = array(); foreach ($keys as $key => $label) { if (substr($key, 0, 1) == '_') { if (!isset($tmp[$key])) { $tmp[$key] = ''; } continue; } if (in_array($key, $tags)) { $val = $member->tags('string'); } else { $val = $member->get($key); } if (is_array($val)) { $val = implode(';', $val); } else { if (strstr($val, '{')) { $v = json_decode((string) $val, true); if (!$v || json_last_error() !== JSON_ERROR_NONE) { // Nothing else to do } else { $i = 0; foreach ($v as $nm => $vl) { $k = '_' . $key . '_' . $nm; if ($i == 0) { $k = $key; } $tmp[$k] = $vl; $i++; } continue; } } } $tmp[$key] = $val; } unset($member); array_push($csv, $tmp); } //output csv directly as a download @ob_end_clean(); header("Pragma: public"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Expires: 0"); header("Content-Transfer-Encoding: binary"); header('Content-type: text/comma-separated-values'); header('Content-disposition: attachment; filename="members.csv"'); $out = fopen('php://output', 'w'); fputcsv($out, $keys); foreach ($csv as $row) { fputcsv($out, $row, $delimiter); } exit; }
/** * Serve up an example CSV file * * @return void */ public function sampleTask() { $skip = array('gid', 'gidnumber', 'regIP', 'regHost', 'modifiedDate', 'proxypassword', 'loginshell', 'ftpshell', 'shadowexpire', 'params', 'proxyuidnumber'); $fields = array(); $row = array(); $member = Member::blank(); $attribs = $member->getStructure()->getTableColumns($member->getTableName()); foreach ($attribs as $key => $desc) { if (in_array(strtolower($key), $skip)) { continue; } $example = 'Example'; $desc = preg_replace('/\\(.*\\)/', '', $desc); if (in_array($desc, array('int', 'tinyint', 'float'))) { $example = '1'; } array_push($row, $example); array_push($fields, $key); } $attribs = Field::all()->including(['options', function ($option) { $option->select('*'); }])->ordered()->rows(); foreach ($attribs as $field) { $key = $field->get('name'); if (in_array(strtolower($key), $skip)) { continue; } $example = 'Example'; if ($field->options->count() || in_array($field->get('type'), array('select', 'dropdown', 'list', 'radio', 'radios', 'checkbox', 'checkboxes'))) { $example = 'example;example;example'; } array_push($row, $example); array_push($fields, $key); } // Output header @ob_end_clean(); header("Pragma: public"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Expires: 0"); header("Content-Transfer-Encoding: binary"); header('Content-type: text/comma-separated-values'); header('Content-disposition: attachment; filename="members.csv"'); echo $this->quoteCsvRow($fields); //array_map('ucfirst', $fields)); echo $this->quoteCsvRow($row); exit; }
/** * Return results for autocompleter * * @return void */ public function autocompleteTask() { if (User::isGuest()) { return; } $restrict = ''; $referrer = Request::getVar('HTTP_REFERER', NULL, 'server'); if ($referrer && preg_match('/members\\/\\d+\\/messages/i', $referrer)) { if (!User::authorise('core.admin', $this->_option) && !User::authorise('core.manage', $this->_option)) { switch ($this->config->get('user_messaging')) { case 2: $restrict = " AND u.access=1"; break; case 1: default: $profile = User::groups(); $usersgroups = array(); if (!empty($xgroups)) { foreach ($xgroups as $group) { if ($group->regconfirmed) { $usersgroups[] = $group->gidNumber; } } } $members = null; if (!empty($usersgroups)) { $query = "SELECT DISTINCT uidNumber\n\t\t\t\t\t\t\t\t\tFROM `#__xgroups_members`\n\t\t\t\t\t\t\t\t\tWHERE gidNumber IN (" . implode(',', $usersgroups) . ")"; $this->database->setQuery($query); $members = $this->database->loadColumn(); } if (!$members || empty($members)) { $members = array(User::get('id')); } $restrict = " AND u.id IN (" . implode(',', $members) . ")"; break; } } } $filters = array(); $filters['limit'] = 20; $filters['start'] = 0; $filters['search'] = strtolower(trim(Request::getString('value', ''))); $originalQuery = $filters['search']; // match against orcid id if (preg_match('/\\d{4}-\\d{4}-\\d{4}-\\d{4}/', $filters['search'])) { $query = "SELECT u.id, u.name, u.username, u.access\n\t\t\t\t\tFROM `#__users` AS u\n\t\t\t\t\tWHERE u.block = 0 AND orcid= " . $this->database->quote($filters['search']) . " AND u.activation>0 {$restrict}\n\t\t\t\t\tORDER BY u.name ASC\n\t\t\t\t\tLIMIT " . $filters['start'] . "," . $filters['limit']; } else { // add trailing wildcard //$filters['search'] = $filters['search'] . '*'; // match member names on all three name parts //$match = "MATCH(u.givenName,u.middleName,u.surname) AGAINST(" . $this->database->quote($filters['search']) . " IN BOOLEAN MODE)"; $match = "LOWER(u.name) LIKE " . $this->database->quote('%' . strtolower($filters['search']) . '%'); $query = "SELECT u.id, u.name, u.username, u.access, {$match} as rel\n\t\t\t\t\tFROM `#__users` AS u\n\t\t\t\t\tWHERE {$match} AND u.block=0 AND u.activation>0 AND u.email NOT LIKE '%@invalid' {$restrict}\n\t\t\t\t\tORDER BY rel DESC, u.name ASC\n\t\t\t\t\tLIMIT " . $filters['start'] . "," . $filters['limit']; } $this->database->setQuery($query); $rows = $this->database->loadObjectList(); // Output search results in JSON format $json = array(); if (count($rows) > 0) { foreach ($rows as $row) { $user = Member::blank()->set($row); $obj = array(); $obj['id'] = $user->get('id'); $obj['name'] = $user->name; $obj['org'] = in_array($user->get('access'), User::getAuthorisedViewLevels()) ? $user->get('organization', '') : ''; $obj['picture'] = $user->picture(); $json[] = $obj; } } // formats names in the autocompleter if (!\Hubzero\Utility\Validate::email($originalQuery) && str_word_count($originalQuery) >= 2) { $originalQuery = ucwords($originalQuery); } //original query $obj = array(); $obj['name'] = $originalQuery; $obj['id'] = $originalQuery; $obj['org'] = ''; $obj['picture'] = ''; $obj['orig'] = true; //add back original query // [!] Removing. Seems to confuse people. //array_unshift($json, $obj); echo json_encode($json); }