microcrud for user list
This commit is contained in:
		
							parent
							
								
									4e03d3cce3
								
							
						
					
					
						commit
						d2b50573c6
					
				
							
								
								
									
										18
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										18
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							| @ -342,16 +342,16 @@ | |||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "name": "shish/ffsphp", |             "name": "shish/ffsphp", | ||||||
|             "version": "v0.0.1", |             "version": "v0.0.2", | ||||||
|             "source": { |             "source": { | ||||||
|                 "type": "git", |                 "type": "git", | ||||||
|                 "url": "https://github.com/shish/ffsphp.git", |                 "url": "https://github.com/shish/ffsphp.git", | ||||||
|                 "reference": "6b1874cf05b0b6bbdf7b118ca081097d1f830cd7" |                 "reference": "16c98d57c80bb4848f20253c8c1e5fe7f6c5823f" | ||||||
|             }, |             }, | ||||||
|             "dist": { |             "dist": { | ||||||
|                 "type": "zip", |                 "type": "zip", | ||||||
|                 "url": "https://api.github.com/repos/shish/ffsphp/zipball/6b1874cf05b0b6bbdf7b118ca081097d1f830cd7", |                 "url": "https://api.github.com/repos/shish/ffsphp/zipball/16c98d57c80bb4848f20253c8c1e5fe7f6c5823f", | ||||||
|                 "reference": "6b1874cf05b0b6bbdf7b118ca081097d1f830cd7", |                 "reference": "16c98d57c80bb4848f20253c8c1e5fe7f6c5823f", | ||||||
|                 "shasum": "" |                 "shasum": "" | ||||||
|             }, |             }, | ||||||
|             "require": { |             "require": { | ||||||
| @ -380,7 +380,7 @@ | |||||||
|             ], |             ], | ||||||
|             "description": "A collection of workarounds for stupid PHP things", |             "description": "A collection of workarounds for stupid PHP things", | ||||||
|             "homepage": "https://github.com/shish/ffsphp", |             "homepage": "https://github.com/shish/ffsphp", | ||||||
|             "time": "2019-11-25T15:37:09+00:00" |             "time": "2019-11-29T12:00:09+00:00" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "name": "shish/microcrud", |             "name": "shish/microcrud", | ||||||
| @ -388,12 +388,12 @@ | |||||||
|             "source": { |             "source": { | ||||||
|                 "type": "git", |                 "type": "git", | ||||||
|                 "url": "https://github.com/shish/microcrud.git", |                 "url": "https://github.com/shish/microcrud.git", | ||||||
|                 "reference": "7c917baa46f137c5e0f6bd4d9874b1c61014797e" |                 "reference": "2a7ae6efe5b2c8aa9d68436cfa310cea5ad0e653" | ||||||
|             }, |             }, | ||||||
|             "dist": { |             "dist": { | ||||||
|                 "type": "zip", |                 "type": "zip", | ||||||
|                 "url": "https://api.github.com/repos/shish/microcrud/zipball/7c917baa46f137c5e0f6bd4d9874b1c61014797e", |                 "url": "https://api.github.com/repos/shish/microcrud/zipball/2a7ae6efe5b2c8aa9d68436cfa310cea5ad0e653", | ||||||
|                 "reference": "7c917baa46f137c5e0f6bd4d9874b1c61014797e", |                 "reference": "2a7ae6efe5b2c8aa9d68436cfa310cea5ad0e653", | ||||||
|                 "shasum": "" |                 "shasum": "" | ||||||
|             }, |             }, | ||||||
|             "require": { |             "require": { | ||||||
| @ -429,7 +429,7 @@ | |||||||
|                 "crud", |                 "crud", | ||||||
|                 "generator" |                 "generator" | ||||||
|             ], |             ], | ||||||
|             "time": "2019-11-28T21:02:52+00:00" |             "time": "2019-11-29T21:15:17+00:00" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "name": "shish/microhtml", |             "name": "shish/microhtml", | ||||||
|  | |||||||
| @ -2,6 +2,61 @@ | |||||||
| 
 | 
 | ||||||
| require_once "events.php"; | 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 | class UserCreationException extends SCoreException | ||||||
| { | { | ||||||
| } | } | ||||||
| @ -51,36 +106,15 @@ class UserPage extends Extension | |||||||
|             } elseif ($event->get_arg(0) == "create") { |             } elseif ($event->get_arg(0) == "create") { | ||||||
|                 $this->page_create(); |                 $this->page_create(); | ||||||
|             } elseif ($event->get_arg(0) == "list") { |             } elseif ($event->get_arg(0) == "list") { | ||||||
|                 $limit = 50; |                 $t = new UserTable($database->raw_db()); | ||||||
| 
 |                 $t->token = $user->get_auth_token(); | ||||||
|                 $page_num = $event->try_page_num(1); |                 $t->inputs = $_GET; | ||||||
|                 $offset = ($page_num-1) * $limit; |                 if ($user->can(Permissions::DELETE_USER)) { | ||||||
| 
 |                     $col = new TextColumn("email", "Email"); | ||||||
|                 $q = "WHERE 1=1"; |                     // $t->columns[] = $col;
 | ||||||
|                 $a = []; |                     array_splice($t->columns, 2, 0, [$col]); | ||||||
| 
 |  | ||||||
|                 if (@$_GET['username']) { |  | ||||||
|                     $q .= " AND SCORE_STRNORM(name) LIKE SCORE_STRNORM(:name)"; |  | ||||||
|                     $a["name"] = '%' . $_GET['username'] . '%'; |  | ||||||
|                 } |                 } | ||||||
| 
 |                 $this->theme->display_user_list($page, $t->table($t->query()), $t->paginator()); | ||||||
|                 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); |  | ||||||
|             } elseif ($event->get_arg(0) == "logout") { |             } elseif ($event->get_arg(0) == "logout") { | ||||||
|                 $this->page_logout(); |                 $this->page_logout(); | ||||||
|             } |             } | ||||||
| @ -185,7 +219,6 @@ class UserPage extends Extension | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|     private function display_stats(UserPageBuildingEvent $event) |     private function display_stats(UserPageBuildingEvent $event) | ||||||
|     { |     { | ||||||
|         global $user, $page, $config; |         global $user, $page, $config; | ||||||
| @ -202,7 +235,6 @@ class UserPage extends Extension | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|         if ($user->id == $event->display_user->id) { |         if ($user->id == $event->display_user->id) { | ||||||
|             $ubbe = new UserBlockBuildingEvent(); |             $ubbe = new UserBlockBuildingEvent(); | ||||||
|             send_event($ubbe); |             send_event($ubbe); | ||||||
|  | |||||||
| @ -13,88 +13,12 @@ class UserPageTheme extends Themelet | |||||||
|         )); |         )); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     public function display_user_list(Page $page, $table, $paginator) | ||||||
|      * #param User[] $users
 |  | ||||||
|      */ |  | ||||||
|     public function display_user_list(Page $page, array $users, User $user, int $page_num, int $page_total) |  | ||||||
|     { |     { | ||||||
|         $page->set_title("User List"); |         $page->set_title("User List"); | ||||||
|         $page->set_heading("User List"); |         $page->set_heading("User List"); | ||||||
|         $page->add_block(new NavBlock()); |         $page->add_block(new NavBlock()); | ||||||
| 
 |         $page->add_block(new Block("Users", $table . $paginator)); | ||||||
|         $html = "<table class='zebra'>"; |  | ||||||
| 
 |  | ||||||
|         $html .= "<tr>"; |  | ||||||
|         $html .= "<td>Name</td>"; |  | ||||||
|         if ($user->can(Permissions::DELETE_USER)) { |  | ||||||
|             $html .= "<td>Email</td>"; |  | ||||||
|         } |  | ||||||
|         $html .= "<td>Class</td>"; |  | ||||||
|         $html .= "<td>Action</td>"; |  | ||||||
|         $html .= "</tr>"; |  | ||||||
| 
 |  | ||||||
|         $h_username = html_escape(@$_GET['username']); |  | ||||||
|         $h_email = html_escape(@$_GET['email']); |  | ||||||
|         $h_class = html_escape(@$_GET['class']); |  | ||||||
| 
 |  | ||||||
|         $html .= "<tr>" . make_form("user_admin/list", "GET"); |  | ||||||
|         $html .= "<td><input type='text' name='username' value='$h_username'/></td>"; |  | ||||||
|         if ($user->can(Permissions::DELETE_USER)) { |  | ||||||
|             $html .= "<td><input type='text' name='email' value='$h_email'/></td>"; |  | ||||||
|         } |  | ||||||
|         $html .= "<td><input type='text' name='class' value='$h_class'/></td>"; |  | ||||||
|         $html .= "<td><input type='submit' value='Search'/></td>"; |  | ||||||
|         $html .= "</form></tr>"; |  | ||||||
| 
 |  | ||||||
|         foreach ($users as $duser) { |  | ||||||
|             $h_name = html_escape($duser->name); |  | ||||||
|             $h_email = html_escape($duser->email); |  | ||||||
|             $h_class = html_escape($duser->class->name); |  | ||||||
|             $u_link = make_link("user/" . url_escape($duser->name)); |  | ||||||
|             $u_posts = make_link("post/list/user_id=" . url_escape($duser->id) . "/1"); |  | ||||||
| 
 |  | ||||||
|             $html .= "<tr>"; |  | ||||||
|             $html .= "<td><a href='$u_link'>$h_name</a></td>"; |  | ||||||
|             if ($user->can(Permissions::DELETE_USER)) { |  | ||||||
|                 $html .= "<td>$h_email</td>"; |  | ||||||
|             } |  | ||||||
|             $html .= "<td>$h_class</td>"; |  | ||||||
|             $html .= "<td><a href='$u_posts'>Show Posts</a></td>"; |  | ||||||
|             $html .= "</tr>"; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         $html .= "</table>"; |  | ||||||
| 
 |  | ||||||
|         $page->add_block(new Block("Users", $html)); |  | ||||||
|         $this->display_paginator($page, "user_admin/list", $this->get_args(), $page_num, $page_total); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     protected function ueie($var) |  | ||||||
|     { |  | ||||||
|         if (isset($_GET[$var])) { |  | ||||||
|             return $var."=".url_escape($_GET[$var]); |  | ||||||
|         } else { |  | ||||||
|             return ""; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     protected function get_args() |  | ||||||
|     { |  | ||||||
|         $args = ""; |  | ||||||
|         // Check if each arg is actually empty and skip it if so
 |  | ||||||
|         if (strlen($this->ueie("username"))) { |  | ||||||
|             $args .= $this->ueie("username")."&"; |  | ||||||
|         } |  | ||||||
|         if (strlen($this->ueie("email"))) { |  | ||||||
|             $args .= $this->ueie("email")."&"; |  | ||||||
|         } |  | ||||||
|         if (strlen($this->ueie("class"))) { |  | ||||||
|             $args .= $this->ueie("class")."&"; |  | ||||||
|         } |  | ||||||
|         // If there are no args at all, set $args to null to prevent an unnecessary ? at the end of the paginator url
 |  | ||||||
|         if (strlen($args) == 0) { |  | ||||||
|             $args = null; |  | ||||||
|         } |  | ||||||
|         return $args; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public function display_user_links(Page $page, User $user, $parts) |     public function display_user_links(Page $page, User $user, $parts) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user