microcrud for user list

This commit is contained in:
Shish
2019-12-01 00:46:54 +00:00
parent 4e03d3cce3
commit d2b50573c6
3 changed files with 74 additions and 118 deletions

View File

@ -2,6 +2,61 @@
require_once "events.php";
use function MicroHTML\A;
use MicroCRUD\Column;
use MicroCRUD\EnumColumn;
use MicroCRUD\TextColumn;
use MicroCRUD\Table;
class UserNameColumn extends TextColumn {
public function display(array $row) {
return A(["href"=>make_link("user/{$row[$this->name]}")], $row[$this->name]);
}
}
class UserLinksColumn extends Column {
public function __construct() {
parent::__construct("links", "User Links", "(1=1)");
$this->sortable = false;
}
public function create_input(array $inputs) {
return "";
}
public function read_input(array $inputs) {
return "";
}
public function display(array $row) {
return A(["href"=>make_link("post/list/user_id={$row['id']}/1")], "Posts");
}
}
class UserTable extends Table
{
public function __construct(\FFSPHP\PDO $db)
{
global $_shm_user_classes;
$classes = [];
foreach($_shm_user_classes as $cls) {
$classes[$cls->name] = $cls->name;
}
ksort($classes);
parent::__construct($db);
$this->table = "users";
$this->base_query = "SELECT * FROM users";
$this->size = 100;
$this->limit = 1000000;
$this->columns = [
new UserNameColumn("name", "Name"),
new EnumColumn("class", "Class", $classes),
// Added later, for admins only
// new TextColumn("email", "Email"),
new UserLinksColumn(),
];
$this->order_by = ["name"];
$this->table_attrs = ["class" => "zebra"];
}
}
class UserCreationException extends SCoreException
{
}
@ -51,36 +106,15 @@ class UserPage extends Extension
} elseif ($event->get_arg(0) == "create") {
$this->page_create();
} elseif ($event->get_arg(0) == "list") {
$limit = 50;
$page_num = $event->try_page_num(1);
$offset = ($page_num-1) * $limit;
$q = "WHERE 1=1";
$a = [];
if (@$_GET['username']) {
$q .= " AND SCORE_STRNORM(name) LIKE SCORE_STRNORM(:name)";
$a["name"] = '%' . $_GET['username'] . '%';
$t = new UserTable($database->raw_db());
$t->token = $user->get_auth_token();
$t->inputs = $_GET;
if ($user->can(Permissions::DELETE_USER)) {
$col = new TextColumn("email", "Email");
// $t->columns[] = $col;
array_splice($t->columns, 2, 0, [$col]);
}
if ($user->can(Permissions::DELETE_USER) && @$_GET['email']) {
$q .= " AND SCORE_STRNORM(email) LIKE SCORE_STRNORM(:email)";
$a["email"] = '%' . $_GET['email'] . '%';
}
if (@$_GET['class']) {
$q .= " AND class LIKE :class";
$a["class"] = $_GET['class'];
}
$where = $database->scoreql_to_sql($q);
$count = $database->get_one("SELECT count(*) FROM users $where", $a);
$a["offset"] = $offset;
$a["limit"] = $limit;
$rows = $database->get_all("SELECT * FROM users $where LIMIT :limit OFFSET :offset", $a);
$users = array_map("_new_user", $rows);
$this->theme->display_user_list($page, $users, $user, $page_num, $count/$limit);
$this->theme->display_user_list($page, $t->table($t->query()), $t->paginator());
} elseif ($event->get_arg(0) == "logout") {
$this->page_logout();
}
@ -185,7 +219,6 @@ class UserPage extends Extension
}
}
private function display_stats(UserPageBuildingEvent $event)
{
global $user, $page, $config;
@ -202,7 +235,6 @@ class UserPage extends Extension
}
}
if ($user->id == $event->display_user->id) {
$ubbe = new UserBlockBuildingEvent();
send_event($ubbe);