Skip to content

Commit

Permalink
admin panel: files: improved pagination, added filters, added sorting,
Browse files Browse the repository at this point in the history
admin panel: users: added pagination, added filters, added sorting
  • Loading branch information
Dennis Bruenig committed Dec 24, 2011
1 parent ff3eaba commit 84d3a0f
Show file tree
Hide file tree
Showing 11 changed files with 537 additions and 327 deletions.
23 changes: 19 additions & 4 deletions app/controllers/Admin.php
Expand Up @@ -44,21 +44,35 @@ public function indexAction () {
* List files, display stats.
*/
public function filesAction () {
$this->setToken();
$this->secure ('admin');

$this->setToken();

// check input vars
if (!array_key_exists('currentPage',$_POST)
|| !is_int((int)$_POST['currentPage']) || $_POST['currentPage'] <= 0)
$currentPage = 1;
else
$currentPage = $_POST['currentPage'];

if (array_key_exists('isDeleted', $_COOKIE) && $_COOKIE['isDeleted'] == 'true')
$isDeleted = true;
else
$isDeleted = false;

$files = Fz_Db::getTable ('File')->find($currentPage, $isDeleted);
$filesOrder = 'name';
if (array_key_exists('filesOrder',$_COOKIE))
$filesOrder = $_COOKIE['filesOrder'];

$filesOrderDirection = 'asc';
if (array_key_exists('filesOrderDirection',$_COOKIE))
$filesOrderDirection = $_COOKIE['filesOrderDirection'];

$filesNameFilter = '';
if (array_key_exists('filesNameFilter',$_COOKIE))
$filesNameFilter = $_COOKIE['filesNameFilter'];

$files = Fz_Db::getTable ('File')->find($currentPage, $isDeleted,
$filesOrder, $filesOrderDirection, $filesNameFilter);

if ($this->isXhrRequest()) {
$err = false;
Expand All @@ -77,7 +91,8 @@ public function filesAction () {
return json ($response);
} else {
set ('files', $files);
set ('numberOfFiles', Fz_Db::getTable ('File')->getNumberOfFiles($isDeleted));
set ('numberOfFiles',
Fz_Db::getTable ('File')->getNumberOfFiles($isDeleted, $filesNameFilter));
return html('file/index.php');
}
}
Expand Down
67 changes: 56 additions & 11 deletions app/controllers/User.php
Expand Up @@ -34,9 +34,52 @@ public function init () {
*/
public function indexAction () {
$this->secure ('admin');
set ('users', Fz_Db::getTable ('User')->findAll ()); // TODO paginate
set ('isInternal', $this->getUserFactory ()->isInternal ());
return html('user/index.php');
$this->setToken();

// check input vars
if (!array_key_exists('currentPage',$_POST)
|| !is_int((int)$_POST['currentPage']) || $_POST['currentPage'] <= 0)
$currentPage = 1;
else
$currentPage = $_POST['currentPage'];

$usersOrder = 'name';
if (array_key_exists('usersOrder',$_COOKIE))
$usersOrder = $_COOKIE['usersOrder'];

$usersOrderDirection = 'asc';
if (array_key_exists('usersOrderDirection',$_COOKIE))
$usersOrderDirection = $_COOKIE['usersOrderDirection'];

$usersNameFilter = '';
if (array_key_exists('usersNameFilter',$_COOKIE))
$usersNameFilter = $_COOKIE['usersNameFilter'];

$users = Fz_Db::getTable ('User')->find($currentPage, $usersOrder,
$usersOrderDirection, $usersNameFilter);

if ($this->isXhrRequest()) {
$err = false;
$response = '';
$response['items'] = '';
foreach ($users as $user_item) {
$response['items'] .=
partial('user/_user_row.php', array ('user_item' => $user_item));
}
if ($err == false) {
$response ['status'] = 'success';
} else {
$response ['status'] = 'error';
$response ['statusText'] = __('Error while processing data');
}
return json ($response);
} else {
set ('isInternal', $this->getUserFactory ()->isInternal ());
set ('numberOfUsers',
Fz_Db::getTable ('User')->getNumberOfUsers($usersNameFilter));
set ('users', $users);
return html('user/index.php');
}
}

/**
Expand All @@ -56,17 +99,19 @@ public function postnewAction () {

$this->secure ('admin');
$user = new App_Model_User ();
$user->setUsername ($_POST ['username']);
$user->setPassword ($_POST ['password']);
$user->setFirstname ($_POST ['firstname']);
$user->setLastname ($_POST ['lastname']);
$user->setIsAdmin ($_POST ['is_admin'] == 'on' ? 1 : 0);
$user->setIsLocked ($_POST ['is_locked'] == 'on' ? 1 : 0);
$user->setEmail ($_POST ['email']);
$user->setUsername (array_key_exists('username',$_POST)?$_POST ['username']:'');
$user->setPassword (array_key_exists('password',$_POST)?$_POST ['password']:'');
$user->setFirstname (array_key_exists('firstname',$_POST)?$_POST ['firstname']:'');
$user->setLastname (array_key_exists('lastname',$_POST)?$_POST ['lastname']:'');
$isAdmin = array_key_exists('is_admin',$_POST)?$_POST ['is_admin']:0;
$isLocked = array_key_exists('is_locked',$_POST)?$_POST ['is_locked']:0;
$user->setIsAdmin ($isAdmin == 'on' ? 1 : 0);
$user->setIsLocked ($isLocked == 'on' ? 1 : 0);
$user->setEmail (array_key_exists('email',$_POST)?$_POST ['email']:'');

// TODO improve form check
// for example : test if the email and the username are not already in DB
if(filter_var($_POST ['email'], FILTER_VALIDATE_EMAIL) && null!=$_POST ['username'] && (3 <= strlen($_POST['password'])) ){
if(filter_var($user->email, FILTER_VALIDATE_EMAIL) && null!=$_POST ['username'] && (3 <= strlen($_POST['password'])) ){
$user->save ();
return redirect_to ('/admin');
}
Expand Down
68 changes: 46 additions & 22 deletions app/models/DbTable/File.php
Expand Up @@ -120,12 +120,39 @@ public function findById ($id) {
}

/**
* Retrieve all rows of the current table
* @param integer $currentPage the current page to fetch items from
* @param boolean $isDeleted include deleted files, default: false
* Retrieve rows of the current table under certain conditions
* @param $currentPage integer the current page to fetch items from
* @param $isDeleted boolean include deleted files, default: false
* @param $filesOrder string order result by $filesOrder
* {for legal values see below}
* @param $filesOrderDirection string direction of ordering
* @return array Array of Fz_Table_Row_Abstrat
*/
public function find ($currentPage, $isDeleted = false) {
public function find ($currentPage, $isDeleted = false,
$filesOrder, $filesOrderDirection, $filesNameFilter) {
// only allow minimal set of characters for search
$nameCondition = '';
if ($filesNameFilter != '') {
$filesNameFilter = preg_replace('/[^A-Za-z0-9_ ]/', '', $filesNameFilter);
$nameCondition = "AND file_name LIKE '%" . $filesNameFilter . "%'";
}

$orderBy = array (
'name' => 'file_name',
'availability' => 'available_from',
'size' => 'file_size',
'downloadCounter' => 'download_count'
);
if (array_key_exists($filesOrder, $orderBy)) {
$order = " ORDER BY " . $orderBy[$filesOrder] . ' ';
if ($filesOrderDirection == 'asc')
$order .= 'ASC ';
else
$order .= 'DESC ';
} else {
$order = '';
}

$itemsPerPage = (int)(fz_config_get('app','items_per_page'));
if (!is_int($itemsPerPage))
$itemsPerPage = 10;
Expand All @@ -135,15 +162,15 @@ public function find ($currentPage, $isDeleted = false) {
if ($isDeleted == false)
$deletedCondition = ' AND isDeleted = 0';
$sql = "SELECT * FROM ".$this->getTableName ()
. " WHERE 1=1 $deletedCondition $limit";
. " WHERE 1=1 $deletedCondition $nameCondition $order $limit";
return Fz_Db::findObjectsBySQL ($sql, $this->getRowClass ());
}

/**
* Return all file owned by $uid which are available (not deleted)
*
* @param App_Model_User $user
* @param boolean $expired only count expired files
* @param $expired boolean only count expired files
* @return array of App_Model_File
*/
public function findFilesByOwnerOrderByUploadDateDesc (
Expand Down Expand Up @@ -264,27 +291,24 @@ public function shorthandSizeToBytes ($size) {
* @param $includeDeleted include deleted files, default: false
* @return integer number of files
*/
public function getNumberOfFiles ($includeDeleted = false) {
$condition = '';
public function getNumberOfFiles ($includeDeleted = false, $filesNameFilter='') {
$deletedCondition = '';
if ($includeDeleted == false)
$condition = ' WHERE isDeleted = 0';
$sql = 'SELECT COUNT(*) AS count ' . 'FROM '.$this->getTableName () . $condition;
$deletedCondition = ' AND isDeleted = 0';

$nameCondition = '';
if ($filesNameFilter != '') {
$filesNameFilter = preg_replace('/[^A-Za-z0-9_ ]/', '', $filesNameFilter);
$nameCondition = "AND file_name LIKE '%" . $filesNameFilter . "%'";
}
$sql = 'SELECT COUNT(*) AS count '
. 'FROM '.$this->getTableName () . ' WHERE 1=1 '
. $deletedCondition
. $nameCondition;
$res = Fz_Db::findAssocBySQL($sql);
return $res[0]['count'];
}

/**
* Count the number of files including deleted files
*
* @return integer number of files
*/
public function getNumberOfFilesIncludingDeleted () {
$sql = 'SELECT COUNT(*) AS count '
. 'FROM '.$this->getTableName ();
$res = Fz_Db::findAssocBySQL($sql);
return $res[0]['count'];
}

/**
* Return disk space used by everybody
*
Expand Down
58 changes: 56 additions & 2 deletions app/models/DbTable/User.php
Expand Up @@ -62,11 +62,65 @@ public function findByEmail ($email) {
*
* @return integer number of users
*/
public function getNumberOfUsers () {
$sql = 'SELECT COUNT(*) AS count FROM '.$this->getTableName ();
public function getNumberOfUsers ($usersNameFilter='') {
$nameCondition = '';
if ($usersNameFilter != '') {
$usersNameFilter = preg_replace('/[^A-Za-z0-9_ ]/', '', $usersNameFilter);
$nameCondition = "AND (firstname LIKE '%" . $usersNameFilter . "%'"
. "OR lastname LIKE '%" . $usersNameFilter . "%')";
}
$sql = 'SELECT COUNT(*) AS count FROM '.$this->getTableName ()
. ' WHERE 1=1 '
. $nameCondition;
$res = Fz_Db::findAssocBySQL($sql);
return $res[0]['count'];
}

/**
* Retrieve rows of the current table under certain conditions
* @param $currentPage integer the current page to fetch items from
* @param $isDeleted boolean include deleted files, default: false
* @param $filesOrder string order result by $filesOrder
* {for legal values see below}
* @param $filesOrderDirection string direction of ordering
* @return array Array of Fz_Table_Row_Abstrat
*/
public function find ($currentPage, $usersOrder, $usersOrderDirection,
$usersNameFilter) {
// only allow minimal set of characters for search
$nameCondition = '';
if ($usersNameFilter != '') {
$usersNameFilter = preg_replace('/[^A-Za-z0-9_ ]/', '', $usersNameFilter);
$nameCondition = "AND (firstname LIKE '%" . $usersNameFilter . "%'"
. "OR lastname LIKE '%" . $usersNameFilter . "%')";
}

$orderBy = array (
'name' => 'lastname',
'email' => 'email',
'role' => 'is_admin'
);
if (array_key_exists($usersOrder, $orderBy)) {
$order = " ORDER BY " . $orderBy[$usersOrder] . ' ';
if ($usersOrderDirection == 'asc')
$order .= 'ASC ';
else
$order .= 'DESC ';
} else {
$order = '';
}

$itemsPerPage = (int)(fz_config_get('app','items_per_page'));
if (!is_int($itemsPerPage))
$itemsPerPage = 10;
$currentPage = ($currentPage-1) * $itemsPerPage;
$limit = ' LIMIT ' . $currentPage .',' . $itemsPerPage;

$sql = "SELECT * FROM ".$this->getTableName ()
. " WHERE 1=1 $nameCondition $order $limit";
return Fz_Db::findObjectsBySQL ($sql, $this->getRowClass ());
}

}


Expand Down

0 comments on commit 84d3a0f

Please sign in to comment.