/**
  * returns a json object which hold the data of all existing usergroups
  * @param string $output the ajax output string
  */
 public static function getData()
 {
     if (BsCore::checkAccessAdmission('wikiadmin') === false) {
         return true;
     }
     global $wgGroupPermissions, $wgAdditionalGroups;
     $oStoreParams = BsExtJSStoreParams::newFromRequest();
     $iLimit = $oStoreParams->getLimit();
     $iStart = $oStoreParams->getStart();
     $sSort = $oStoreParams->getSort('group_name');
     $sDirection = $oStoreParams->getDirection();
     $aGroups = array();
     foreach (BsGroupHelper::getAvailableGroups() as $sGroup) {
         $aGroups['groups'][] = array('group_name' => $sGroup, 'additional_group' => isset($wgAdditionalGroups[$sGroup]));
     }
     if ($sDirection == 'DESC') {
         usort($aGroups['groups'], function ($a, $b) {
             return strnatcasecmp($b["group_name"], $a["group_name"]);
         });
     } else {
         usort($aGroups['groups'], function ($a, $b) {
             return strnatcasecmp($a["group_name"], $b["group_name"]);
         });
     }
     $aGroups['totalCount'] = sizeof($aGroups['groups']);
     // Apply limit and offset
     $aGroups['groups'] = array_slice($aGroups['groups'], $iStart, $iLimit);
     return FormatJson::encode($aGroups);
 }
 public static function ajaxGetArticlesByNamespaceId()
 {
     if (BsCore::checkAccessAdmission('edit') === false) {
         return true;
     }
     global $wgOut, $wgRequest;
     $wgOut->disable();
     $oParams = BsExtJSStoreParams::newFromRequest();
     $iStart = $wgRequest->getInt('start', 0);
     $sSort = $oParams->getSort('page_title');
     $sDirection = $oParams->getDirection();
     $iLimit = $wgRequest->getInt('limit', 25);
     $sDisplayMode = $wgRequest->getVal('displayMode', 'only-assigned');
     $iNamespaceId = $wgRequest->getInt('namespaceId', -99);
     $aActivatedNamespaces = BsConfig::get('MW::ResponsibleEditors::ActivatedNamespaces');
     $oResult = new stdClass();
     $aTables = array('bs_responsible_editors', 'user', 'page');
     $aVariables = array('page_id', 'page_title', 'page_namespace');
     $aConditions = array('page_namespace' => $aActivatedNamespaces);
     if ($sDisplayMode == 'only-assigned') {
         $aConditions[] = 're_user_id IS NOT NULL ';
     } else {
         if ($sDisplayMode == 'only-not-assigned') {
             $aConditions[] = 're_user_id IS NULL ';
         }
     }
     if ($iNamespaceId != -99) {
         $aConditions['page_namespace'] = $iNamespaceId;
     }
     $aOptions = array('ORDER BY' => $sSort . ' ' . $sDirection, 'LIMIT' => $iLimit, 'OFFSET' => $iStart, 'GROUP BY' => 'page_id');
     if ($sSort == 'user_displayname') {
         $aOptions['ORDER BY'] = 'user_real_name, user_name ' . $sDirection;
     }
     $aJoinOptions = array('user' => array('JOIN', 'user_id = re_user_id'), 'page' => array('RIGHT JOIN', 'page_id = re_page_id'));
     $dbr = wfGetDB(DB_SLAVE);
     //TODO: Rework "total" calculation. This seems very complicated but it
     //should be as easy as excuting the main query without LIMIT/OFFSET.
     if ($sDisplayMode == 'only-assigned' || $sDisplayMode == 'only-not-assigned') {
         $row = $dbr->select(array('page', 'bs_responsible_editors'), 'page_id AS cnt', $aConditions, __METHOD__, array('GROUP BY' => 'page_id'), array('page' => array('RIGHT JOIN', 'page_id = re_page_id')));
         $oResult->total = $row->numRows();
     }
     if ($sDisplayMode == 'all') {
         $aConditionsWithoutRePageID = $aConditions;
         unset($aConditionsWithoutRePageID[0]);
         $row = $dbr->selectRow('page', 'COUNT( page_id ) AS cnt', $aConditionsWithoutRePageID);
         $oResult->total = $row->cnt;
     }
     $res = $dbr->select($aTables, $aVariables, $aConditions, __METHOD__, $aOptions, $aJoinOptions);
     $oResult->pages = array();
     foreach ($res as $row) {
         $oTitle = Title::newFromId($row->page_id);
         $iPageId = $row->page_id;
         $sPageNsId = !empty($row->page_namespace) ? $row->page_namespace : 0;
         $sPageTitle = $row->page_title;
         $oPage = new stdClass();
         $oPage->page_id = $iPageId;
         $oPage->page_namespace = $sPageNsId;
         $oPage->page_title = $sPageTitle;
         $oPage->page_prefixedtext = $oTitle->getPrefixedText();
         $oPage->users = array();
         $aEditorIDs = BsExtensionManager::getExtension('ResponsibleEditors')->getResponsibleEditorIdsByArticleId($row->page_id);
         $aEditorIDs = array_unique($aEditorIDs);
         foreach ($aEditorIDs as $iEditorID) {
             $oUser = User::newFromId($iEditorID);
             if ($oUser == null) {
                 continue;
             }
             $oPage->users[] = array('user_id' => $iEditorID, 'user_page_link_url' => $oUser->getUserPage()->getFullUrl(), 'user_displayname' => BsCore::getUserDisplayName($oUser));
         }
         $oResult->pages[] = $oPage;
     }
     return FormatJson::encode($oResult);
 }
 public static function getUsers()
 {
     //if ( BsCore::checkAccessAdmission( 'wikiadmin' ) === false ) return true;
     $oStoreParams = BsExtJSStoreParams::newFromRequest();
     $iLimit = $oStoreParams->getLimit();
     $iStart = $oStoreParams->getStart();
     $sSort = $oStoreParams->getSort('user_name');
     $sDirection = $oStoreParams->getDirection();
     $aFilters = $oStoreParams->getFilter();
     $aSortingParams = FormatJson::decode($sSort);
     if (is_array($aSortingParams)) {
         $sSort = $aSortingParams[0]->property;
         $sDirection = $aSortingParams[0]->direction;
     }
     $dbr = wfGetDB(DB_SLAVE);
     global $wgDBtype, $wgDBprefix;
     //PW TODO: filter for oracle
     if ($wgDBtype == 'oracle') {
         $res = $dbr->query("SELECT * FROM\n\t\t\t\t\t(\n\t\t\t\t\t\tSELECT user_id,user_name,user_real_name,user_email,row_number() OVER (ORDER BY " . $sSort . " " . $sDirection . ") rnk\n\t\t\t\t\t\tFROM \"" . strtoupper($wgDBprefix) . "MWUSER\"\n\t\t\t\t\t)\n\t\t\t\tWHERE rnk BETWEEN " . ($iStart + 1) . " AND " . ($iLimit + $iStart));
     } else {
         $aTables = array('user');
         $aOptions = array('ORDER BY' => $sSort . ' ' . $sDirection, 'LIMIT' => $iLimit, 'OFFSET' => $iStart);
         $aJoins = array();
         $aConditions = array();
         if (!empty($aFilters)) {
             foreach ($aFilters as $oFilter) {
                 switch ($oFilter->field) {
                     case 'user_name':
                         $aConditions[] = "user_name LIKE '%" . trim($oFilter->value) . "%'";
                         break;
                     case 'user_real_name':
                         $aConditions[] = "user_real_name LIKE '%" . trim($oFilter->value) . "%'";
                         break;
                     case 'user_email':
                         $aConditions[] = "user_email LIKE '%" . trim($oFilter->value) . "%'";
                         break;
                     case 'groups':
                         $aTables[] = 'user_groups';
                         $aConditions[] = "ug_group IN ('" . implode("','", $oFilter->value) . "')";
                         $aJoins['user_groups'] = array('LEFT JOIN', 'ug_user=user_id');
                 }
             }
         }
         $res = $dbr->select($aTables, '*', $aConditions, __METHOD__, $aOptions, $aJoins);
     }
     $data = array();
     $data['users'] = array();
     while ($row = $res->fetchObject()) {
         $oUserTitle = Title::newFromText($row->user_name, NS_USER);
         $tmp = array();
         $tmp['user_id'] = $row->user_id;
         $tmp['user_name'] = $row->user_name;
         $tmp['user_page_link'] = Linker::link($oUserTitle, $row->user_name . ' ');
         //The whitespace is to aviod automatic rewrite to user_real_name by BSF
         $tmp['user_real_name'] = $row->user_real_name;
         $tmp['user_email'] = $row->user_email == null ? '' : $row->user_email;
         //PW: Oracle returns null when field is emtpy
         $tmp['groups'] = array();
         $res1 = $dbr->select('user_groups', 'ug_group', 'ug_user='******'groups'][] = ( !wfMessage( 'group-' . $row1->ug_group )->inContentLanguage()->isBlank() ) ? wfMessage( 'group-' . $row1->ug_group )->plain() : $row1->ug_group ;
             if (!wfMessage('group-' . $row1->ug_group)->inContentLanguage()->isBlank()) {
                 $tmp['groups'][] = array('group' => $row1->ug_group, 'displayname' => wfMessage('group-' . $row1->ug_group)->plain() . " (" . $row1->ug_group . ")");
             } else {
                 $tmp['groups'][] = array('group' => $row1->ug_group, 'displayname' => $row1->ug_group);
             }
         }
         if (is_array($tmp['groups'])) {
             sort($tmp['groups']);
         }
         $data['users'][] = $tmp;
     }
     $row = $dbr->selectRow('user', 'COUNT( user_id ) AS cnt', array());
     $data['totalCount'] = $row->cnt;
     $oUserManager = BsExtensionManager::getExtension('UserManager');
     wfRunHooks('BSWikiAdminUserManagerBeforeUserListSend', array($oUserManager, &$data));
     return FormatJson::encode($data);
 }
 /**
  * Get the pages for specialpage, called via ajax
  * @param string $sOutput Output to return
  * @return bool Always true
  */
 public static function getData($iUserID)
 {
     $oDbr = wfGetDB(DB_SLAVE);
     $oStoreParams = BsExtJSStoreParams::newFromRequest();
     $iLimit = $oStoreParams->getLimit();
     $iStart = $oStoreParams->getStart();
     $sSort = $oStoreParams->getSort('MAX(readers_ts)');
     $sDirection = $oStoreParams->getDirection();
     if ($sSort == 'pv_page') {
         $sSort = 'page_title';
     } elseif ($sSort == 'pv_ts') {
         $sSort = 'MAX( readers_ts )';
     }
     $res = $oDbr->select(array('page', 'bs_readers'), array('page_title', 'readers_page_id', 'readers_user_name', 'MAX( readers_ts ) as readers_ts'), array('readers_page_id = page_id', 'readers_user_id' => $iUserID), __METHOD__, array('GROUP BY' => 'readers_page_id', 'ORDER BY' => $sSort . " " . $sDirection, 'LIMIT' => $iLimit, 'OFFSET' => $iStart));
     $aPages = array();
     if ($oDbr->numRows($res) > 0) {
         $oLanguage = RequestContext::getMain()->getLanguage();
         foreach ($res as $row) {
             $oTitle = Title::newFromID($row->readers_page_id);
             $aTmpPage = array();
             $aTmpPage['pv_page'] = $oTitle->getLocalURL();
             $aTmpPage['pv_page_title'] = $oTitle->getPrefixedText();
             $aTmpPage['pv_ts'] = $oLanguage->timeanddate($row->readers_ts);
             $aPages['page'][] = $aTmpPage;
         }
     }
     $oDbr->freeResult($res);
     $rowCount = $oDbr->select('bs_readers', 'readers_page_id', array('readers_user_id' => $iUserID), __METHOD__, array('GROUP BY' => 'readers_page_id'));
     $aPages['totalCount'] = $oDbr->numRows($rowCount);
     $oDbr->freeResult($rowCount);
     return json_encode($aPages);
 }