From 016fb6be654f6b27219894709b31dec5e5de8983 Mon Sep 17 00:00:00 2001 From: Matthew Barbour Date: Thu, 10 Oct 2019 10:25:11 -0500 Subject: [PATCH 1/8] Small fixes and corrections --- core/polyfills.php | 3 ++- ext/rating/main.php | 4 ++-- ext/upload/main.php | 3 --- themes/danbooru2/ext_manager.theme.php | 2 +- themes/danbooru2/view.theme.php | 6 ++++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core/polyfills.php b/core/polyfills.php index 87e739e3..c39ec13a 100644 --- a/core/polyfills.php +++ b/core/polyfills.php @@ -281,6 +281,7 @@ const MIME_TYPE_MAP = [ 'mpg' => 'video/mpeg', 'mpeg' => 'video/mpeg', 'mov' => 'video/quicktime', + 'flv' => 'video/x-flv', 'php' => 'text/x-php', 'mp4' => 'video/mp4', 'ogv' => 'video/ogg', @@ -502,7 +503,7 @@ function bool_escape($input): bool */ if (is_bool($input)) { return $input; - } elseif (is_int($input)) { + } elseif (is_numeric($input)) { return ($input === 1); } else { $value = filter_var($input, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); diff --git a/ext/rating/main.php b/ext/rating/main.php index 66778d91..2386c3b0 100644 --- a/ext/rating/main.php +++ b/ext/rating/main.php @@ -341,7 +341,7 @@ class Ratings extends Extension $old = $_POST["rating_old"]; $new = $_POST["rating_new"]; - if ($user->can("bulk_edit_image_rating")) { + if($user->can(Permissions::BULK_EDIT_IMAGE_RATING)) { $database->execute("UPDATE images SET rating = :new WHERE rating = :old", ["new"=>$new, "old"=>$old ]); } @@ -506,7 +506,7 @@ class Ratings extends Extension private function can_rate(): bool { global $user; - if ($user->can("edit_image_rating")) { + if ($user->can(Permissions::EDIT_IMAGE_RATING)) { return true; } return false; diff --git a/ext/upload/main.php b/ext/upload/main.php index 25a0daf9..9c7879ad 100644 --- a/ext/upload/main.php +++ b/ext/upload/main.php @@ -35,9 +35,6 @@ class DataUploadEvent extends Event assert(is_array($metadata["tags"])); assert(is_string($metadata["source"]) || is_null($metadata["source"])); - // DB limits to 64 char filenames - $metadata['filename'] = substr($metadata['filename'], 0, 63); - $this->metadata = $metadata; $this->set_tmpname($tmpname); diff --git a/themes/danbooru2/ext_manager.theme.php b/themes/danbooru2/ext_manager.theme.php index 247406c8..270ec929 100644 --- a/themes/danbooru2/ext_manager.theme.php +++ b/themes/danbooru2/ext_manager.theme.php @@ -8,7 +8,7 @@ class CustomExtManagerTheme extends ExtManagerTheme parent::display_table($page, $extensions, $editable); } - public function display_doc(Page $page, ExtensionInfo $info) + public function display_doc(Page $page, ExtensionManagerInfo $info) { $page->disable_left(); parent::display_doc($page, $info); diff --git a/themes/danbooru2/view.theme.php b/themes/danbooru2/view.theme.php index c655ecb6..89266795 100644 --- a/themes/danbooru2/view.theme.php +++ b/themes/danbooru2/view.theme.php @@ -51,8 +51,10 @@ class CustomViewImageTheme extends ViewImageTheme if ($image->rating == null || $image->rating == "?") { $image->rating = "?"; } - $h_rating = Ratings::rating_to_human($image->rating); - $html .= "
Rating: $h_rating"; + if (Extension::is_enabled(RatingsInfo::KEY)) { + $h_rating = Ratings::rating_to_human($image->rating); + $html .= "
Rating: $h_rating"; + } } return $html; From c2d6f1a5fa45621eb0af7de04c15dada8e9511fd Mon Sep 17 00:00:00 2001 From: Matthew Barbour Date: Mon, 14 Oct 2019 13:35:33 -0500 Subject: [PATCH 2/8] New "Approval" extension --- ext/approval/info.php | 20 ++++ ext/approval/main.php | 204 +++++++++++++++++++++++++++++++++++++++++ ext/approval/theme.php | 41 +++++++++ 3 files changed, 265 insertions(+) create mode 100644 ext/approval/info.php create mode 100644 ext/approval/main.php create mode 100644 ext/approval/theme.php diff --git a/ext/approval/info.php b/ext/approval/info.php new file mode 100644 index 00000000..e07d1341 --- /dev/null +++ b/ext/approval/info.php @@ -0,0 +1,20 @@ + + * Description: Provides "Trash" or "Recycle Bin"-type functionality, storing delete images for later recovery + * Documentation: + */ + +class ApprovalInfo extends ExtensionInfo +{ + public const KEY = "approval"; + + public $key = self::KEY; + public $name = "Approval"; + public $authors = ["Matthew Barbour"=>"matthew@darkholme.net"]; + public $license = self::LICENSE_WTFPL; + public $description = "Adds an approval step to the upload/import process."; + public $db_support = [DatabaseDriver::MYSQL, DatabaseDriver::PGSQL]; +} diff --git a/ext/approval/main.php b/ext/approval/main.php new file mode 100644 index 00000000..496ea73e --- /dev/null +++ b/ext/approval/main.php @@ -0,0 +1,204 @@ +set_default_bool(ApprovalConfig::IMAGES, false); + $config->set_default_bool(ApprovalConfig::COMMENTS, false); + + if ($config->get_int(ApprovalConfig::VERSION) < 1) { + $this->install(); + } + } + + public function onPageRequest(PageRequestEvent $event) + { + global $page, $user; + + if ($event->page_matches("approve_image") && $user->can(Permissions::APPROVE_IMAGE)) { + // Try to get the image ID + $image_id = int_escape($event->get_arg(0)); + if (empty($image_id)) { + $image_id = isset($_POST['image_id']) ? $_POST['image_id'] : null; + } + if (empty($image_id)) { + throw new SCoreException("Can not approve image: No valid Image ID given."); + } + + self::approve_image($image_id); + $page->set_mode(PageMode::REDIRECT); + $page->set_redirect(make_link("post/view/".$image_id)); + } + } + + public function onAdminBuilding(AdminBuildingEvent $event) + { + $this->theme->display_admin_form(); + } + + public function onAdminAction(AdminActionEvent $event) + { + global $database, $user; + + $action = $event->action; + $event->redirect = true; + if($action==="approval") { + $approval_action = $_POST["approval_action"]; + switch ($approval_action) { + case "approve_all": + $database->set_timeout(300000); // These updates can take a little bit + $database->execute($database->scoreql_to_sql( + "UPDATE images SET approved = SCORE_BOOL_Y, approved_by_id = :approved_by_id WHERE approved = SCORE_BOOL_N"), + ["approved_by_id"=>$user->id] + ); + break; + case "de_approve_all": + $database->set_timeout(300000); // These updates can take a little bit + $database->execute($database->scoreql_to_sql( + "UPDATE images SET approved = SCORE_BOOL_N, approved_by_id = NULL WHERE approved = SCORE_BOOL_Y")); + break; + default: + + break; + } + } + } + + public function onDisplayingImage(DisplayingImageEvent $event) + { + global $user, $page; + + if ($event->image->approved===false && !$user->can(Permissions::APPROVE_IMAGE)) { + $page->set_mode(PageMode::REDIRECT); + $page->set_redirect(make_link("post/list")); + } + } + + public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) + { + global $user; + if($event->parent=="posts") { + if($user->can(Permissions::APPROVE_IMAGE)) { + $event->add_nav_link("posts_unapproved", new Link('/post/list/approved%3Ano/1'), "Pending Approval",null, 60); + } + } + } + + + const SEARCH_REGEXP = "/^approved:(yes|no)/"; + public function onSearchTermParse(SearchTermParseEvent $event) + { + global $user, $database; + + $matches = []; + + if (is_null($event->term) && $this->no_approval_query($event->context)) { + $event->add_querylet(new Querylet($database->scoreql_to_sql("approved = SCORE_BOOL_Y "))); + } + + + if (preg_match(self::SEARCH_REGEXP, strtolower($event->term), $matches)) { + if ($user->can(Permissions::APPROVE_IMAGE)&&$matches[1]=="no") { + $event->add_querylet(new Querylet($database->scoreql_to_sql("approved = SCORE_BOOL_N "))); + } else { + $event->add_querylet(new Querylet($database->scoreql_to_sql("approved = SCORE_BOOL_Y "))); + } + } + } + + public function onHelpPageBuilding(HelpPageBuildingEvent $event) + { + global $user; + if ($event->key===HelpPages::SEARCH) { + if ($user->can(Permissions::APPROVE_IMAGE)) { + $block = new Block(); + $block->header = "Approval"; + $block->body = $this->theme->get_help_html(); + $event->add_block($block); + } + } + } + + + private function no_approval_query(array $context): bool + { + foreach ($context as $term) { + if (preg_match(self::SEARCH_REGEXP, $term)) { + return false; + } + } + return true; + } + + public static function approve_image($image_id) + { + global $database, $user; + + $database->execute($database->scoreql_to_sql( + "UPDATE images SET approved = SCORE_BOOL_Y, approved_by_id = :approved_by_id WHERE id = :id AND approved = SCORE_BOOL_N"), + ["approved_by_id"=>$user->id, "id"=>$image_id] + ); + } + public function onImageAdminBlockBuilding(ImageAdminBlockBuildingEvent $event) + { + global $user; + if ($event->image->approved===false && $user->can(Permissions::APPROVE_IMAGE)) { + $event->add_part($this->theme->get_image_admin_html($event->image->id)); + } + } + + public function onBulkActionBlockBuilding(BulkActionBlockBuildingEvent $event) + { + global $user; + + if ($user->can(Permissions::APPROVE_IMAGE)&&in_array("approved:no", $event->search_terms)) { + $event->add_action("bulk_approve_image", "Approve", "a"); + } + } + + public function onBulkAction(BulkActionEvent $event) + { + global $user; + + switch ($event->action) { + case "bulk_approve_image": + if ($user->can(Permissions::APPROVE_IMAGE)) { + $total = 0; + foreach ($event->items as $image) { + self::approve_image($image->id); + $total++; + } + flash_message("Approved $total items"); + } + break; + } + } + + + private function install() + { + global $database, $config; + + if ($config->get_int(ApprovalConfig::VERSION) < 1) { + $database->Execute($database->scoreql_to_sql( + "ALTER TABLE images ADD COLUMN approved SCORE_BOOL NOT NULL DEFAULT SCORE_BOOL_N" + )); + $database->Execute($database->scoreql_to_sql( + "ALTER TABLE images ADD COLUMN approved_by_id INTEGER NULL" + )); + + $database->Execute("CREATE INDEX images_approved_idx ON images(approved)"); + $config->set_int(ApprovalConfig::VERSION, 1); + } + } +} diff --git a/ext/approval/theme.php b/ext/approval/theme.php new file mode 100644 index 00000000..bb55a646 --- /dev/null +++ b/ext/approval/theme.php @@ -0,0 +1,41 @@ + + + + "; + + return $html; + } + + + public function get_help_html() + { + return '

Search for images that are approved/not approved.

+
+
approved:yes
+

Returns images that have been approved.

+
+
+
approved:no
+

Returns images that have not been approved.

+
+ '; + } + + public function display_admin_form() + { + global $page; + $html = make_form(make_link("admin/approval"), "POST"); + $html .= "
"; + $html .= ""; + $html .= "\n"; + $page->add_block(new Block("Approval", $html)); + } +} From 2b46ede09849aa84b6c3f566824c0ea6060998cd Mon Sep 17 00:00:00 2001 From: Matthew Barbour Date: Mon, 14 Oct 2019 13:43:49 -0500 Subject: [PATCH 3/8] approval permissions --- core/permissions.php | 3 +++ core/userclass.php | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/core/permissions.php b/core/permissions.php index e546236b..66b92b7c 100644 --- a/core/permissions.php +++ b/core/permissions.php @@ -81,4 +81,7 @@ abstract class Permissions public const POOLS_ADMIN = "pools_admin"; public const TIPS_ADMIN = "tips_admin"; public const CRON_ADMIN = "cron_admin"; + public const APPROVE_IMAGE = "approve_image"; + public const APPROVE_COMMENT = "approve_comment"; + } diff --git a/core/userclass.php b/core/userclass.php index 2207fa63..f474d154 100644 --- a/core/userclass.php +++ b/core/userclass.php @@ -151,6 +151,9 @@ new UserClass("base", null, [ Permissions::POOLS_ADMIN => false, Permissions::TIPS_ADMIN => false, Permissions::CRON_ADMIN => false, + + Permissions::APPROVE_IMAGE => false, + Permissions::APPROVE_COMMENT => false, ]); new UserClass("anonymous", "base", [ @@ -228,6 +231,8 @@ new UserClass("admin", "base", [ Permissions::POOLS_ADMIN => true, Permissions::TIPS_ADMIN => true, Permissions::CRON_ADMIN => true, + Permissions::APPROVE_IMAGE => true, + Permissions::APPROVE_COMMENT => true, ]); new UserClass("hellbanned", "user", [ From 5f89420fabaac7d9b42f99c2782e80fa57122dd2 Mon Sep 17 00:00:00 2001 From: Matthew Barbour Date: Mon, 14 Oct 2019 14:40:15 -0500 Subject: [PATCH 4/8] Approval enable option --- ext/approval/main.php | 37 ++++++++++++++++++++++--------------- ext/approval/theme.php | 8 ++++++++ 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/ext/approval/main.php b/ext/approval/main.php index 496ea73e..48f067a6 100644 --- a/ext/approval/main.php +++ b/ext/approval/main.php @@ -41,6 +41,11 @@ class Approval extends Extension } } + public function onSetupBuilding(SetupBuildingEvent $event) + { + $this->theme->display_admin_block($event); + } + public function onAdminBuilding(AdminBuildingEvent $event) { $this->theme->display_admin_form(); @@ -98,21 +103,23 @@ class Approval extends Extension const SEARCH_REGEXP = "/^approved:(yes|no)/"; public function onSearchTermParse(SearchTermParseEvent $event) { - global $user, $database; + global $user, $database, $config; - $matches = []; + if($config->get_bool(ApprovalConfig::IMAGES)) { + $matches = []; - if (is_null($event->term) && $this->no_approval_query($event->context)) { - $event->add_querylet(new Querylet($database->scoreql_to_sql("approved = SCORE_BOOL_Y "))); - } - - - if (preg_match(self::SEARCH_REGEXP, strtolower($event->term), $matches)) { - if ($user->can(Permissions::APPROVE_IMAGE)&&$matches[1]=="no") { - $event->add_querylet(new Querylet($database->scoreql_to_sql("approved = SCORE_BOOL_N "))); - } else { + if (is_null($event->term) && $this->no_approval_query($event->context)) { $event->add_querylet(new Querylet($database->scoreql_to_sql("approved = SCORE_BOOL_Y "))); } + + + if (preg_match(self::SEARCH_REGEXP, strtolower($event->term), $matches)) { + if ($user->can(Permissions::APPROVE_IMAGE) && $matches[1] == "no") { + $event->add_querylet(new Querylet($database->scoreql_to_sql("approved = SCORE_BOOL_N "))); + } else { + $event->add_querylet(new Querylet($database->scoreql_to_sql("approved = SCORE_BOOL_Y "))); + } + } } } @@ -151,17 +158,17 @@ class Approval extends Extension } public function onImageAdminBlockBuilding(ImageAdminBlockBuildingEvent $event) { - global $user; - if ($event->image->approved===false && $user->can(Permissions::APPROVE_IMAGE)) { + global $user, $config; + if ($event->image->approved===false && $user->can(Permissions::APPROVE_IMAGE) && $config->get_bool(ApprovalConfig::IMAGES)) { $event->add_part($this->theme->get_image_admin_html($event->image->id)); } } public function onBulkActionBlockBuilding(BulkActionBlockBuildingEvent $event) { - global $user; + global $user, $config; - if ($user->can(Permissions::APPROVE_IMAGE)&&in_array("approved:no", $event->search_terms)) { + if ($user->can(Permissions::APPROVE_IMAGE)&&in_array("approved:no", $event->search_terms)&& $config->get_bool(ApprovalConfig::IMAGES)) { $event->add_action("bulk_approve_image", "Approve", "a"); } } diff --git a/ext/approval/theme.php b/ext/approval/theme.php index bb55a646..5c807f8c 100644 --- a/ext/approval/theme.php +++ b/ext/approval/theme.php @@ -29,9 +29,17 @@ class ApprovalTheme extends Themelet '; } + public function display_admin_block(SetupBuildingEvent $event) + { + $sb = new SetupBlock("Approval"); + $sb->add_bool_option(ApprovalConfig::IMAGES, "Images: "); + $event->panel->add_block($sb); + } + public function display_admin_form() { global $page; + $html = make_form(make_link("admin/approval"), "POST"); $html .= "
"; $html .= ""; From 4dfb2761ab86c4deaa2b894d66934fe270294839 Mon Sep 17 00:00:00 2001 From: Matthew Barbour Date: Mon, 14 Oct 2019 14:46:42 -0500 Subject: [PATCH 5/8] More approval enable option consequences --- ext/approval/main.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ext/approval/main.php b/ext/approval/main.php index 48f067a6..58428b54 100644 --- a/ext/approval/main.php +++ b/ext/approval/main.php @@ -48,6 +48,8 @@ class Approval extends Extension public function onAdminBuilding(AdminBuildingEvent $event) { + global $config; + $this->theme->display_admin_form(); } @@ -81,9 +83,9 @@ class Approval extends Extension public function onDisplayingImage(DisplayingImageEvent $event) { - global $user, $page; + global $user, $page, $config; - if ($event->image->approved===false && !$user->can(Permissions::APPROVE_IMAGE)) { + if ( $config->get_bool(ApprovalConfig::IMAGES) && $event->image->approved===false && !$user->can(Permissions::APPROVE_IMAGE)) { $page->set_mode(PageMode::REDIRECT); $page->set_redirect(make_link("post/list")); } @@ -125,9 +127,9 @@ class Approval extends Extension public function onHelpPageBuilding(HelpPageBuildingEvent $event) { - global $user; + global $user, $config; if ($event->key===HelpPages::SEARCH) { - if ($user->can(Permissions::APPROVE_IMAGE)) { + if ($user->can(Permissions::APPROVE_IMAGE) && $config->get_bool(ApprovalConfig::IMAGES)) { $block = new Block(); $block->header = "Approval"; $block->body = $this->theme->get_help_html(); From 1565b8570bc2773932068d636d97e35d5febab57 Mon Sep 17 00:00:00 2001 From: Matthew Barbour Date: Fri, 1 Nov 2019 23:45:28 -0500 Subject: [PATCH 6/8] Added disapproving controls to approval extension --- ext/approval/main.php | 50 +++++++++++++++++++++++++++++++++++++----- ext/approval/theme.php | 19 +++++++++++----- 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/ext/approval/main.php b/ext/approval/main.php index 58428b54..05e7b426 100644 --- a/ext/approval/main.php +++ b/ext/approval/main.php @@ -37,6 +37,21 @@ class Approval extends Extension self::approve_image($image_id); $page->set_mode(PageMode::REDIRECT); + $page->set_redirect(make_link("post/view/" . $image_id)); + } + + if ($event->page_matches("disapprove_image") && $user->can(Permissions::APPROVE_IMAGE)) { + // Try to get the image ID + $image_id = int_escape($event->get_arg(0)); + if (empty($image_id)) { + $image_id = isset($_POST['image_id']) ? $_POST['image_id'] : null; + } + if (empty($image_id)) { + throw new SCoreException("Can not disapprove image: No valid Image ID given."); + } + + self::disapprove_image($image_id); + $page->set_mode(PageMode::REDIRECT); $page->set_redirect(make_link("post/view/".$image_id)); } } @@ -69,7 +84,7 @@ class Approval extends Extension ["approved_by_id"=>$user->id] ); break; - case "de_approve_all": + case "disapprove_all": $database->set_timeout(300000); // These updates can take a little bit $database->execute($database->scoreql_to_sql( "UPDATE images SET approved = SCORE_BOOL_N, approved_by_id = NULL WHERE approved = SCORE_BOOL_Y")); @@ -158,11 +173,22 @@ class Approval extends Extension ["approved_by_id"=>$user->id, "id"=>$image_id] ); } + + public static function disapprove_image($image_id) + { + global $database, $user; + + $database->execute($database->scoreql_to_sql( + "UPDATE images SET approved = SCORE_BOOL_N, approved_by_id = NULL WHERE id = :id AND approved = SCORE_BOOL_Y"), + ["id"=>$image_id] + ); + } + public function onImageAdminBlockBuilding(ImageAdminBlockBuildingEvent $event) { global $user, $config; - if ($event->image->approved===false && $user->can(Permissions::APPROVE_IMAGE) && $config->get_bool(ApprovalConfig::IMAGES)) { - $event->add_part($this->theme->get_image_admin_html($event->image->id)); + if($user->can(Permissions::APPROVE_IMAGE) && $config->get_bool(ApprovalConfig::IMAGES)) { + $event->add_part($this->theme->get_image_admin_html($event->image)); } } @@ -170,8 +196,12 @@ class Approval extends Extension { global $user, $config; - if ($user->can(Permissions::APPROVE_IMAGE)&&in_array("approved:no", $event->search_terms)&& $config->get_bool(ApprovalConfig::IMAGES)) { - $event->add_action("bulk_approve_image", "Approve", "a"); + if ($user->can(Permissions::APPROVE_IMAGE)&& $config->get_bool(ApprovalConfig::IMAGES)) { + if(in_array("approved:no", $event->search_terms)) { + $event->add_action("bulk_approve_image", "Approve", "a"); + } else { + $event->add_action("bulk_disapprove_image", "Disapprove"); + } } } @@ -190,6 +220,16 @@ class Approval extends Extension flash_message("Approved $total items"); } break; + case "bulk_disapprove_image": + if ($user->can(Permissions::APPROVE_IMAGE)) { + $total = 0; + foreach ($event->items as $image) { + self::disapprove_image($image->id); + $total++; + } + flash_message("Disapproved $total items"); + } + break; } } diff --git a/ext/approval/theme.php b/ext/approval/theme.php index 5c807f8c..0879d1b1 100644 --- a/ext/approval/theme.php +++ b/ext/approval/theme.php @@ -2,14 +2,23 @@ class ApprovalTheme extends Themelet { - public function get_image_admin_html(int $image_id) + public function get_image_admin_html(Image $image) { - $html = " - ".make_form(make_link('approve_image/'.$image_id), 'POST')." - + if($image->approved===true) { + $html = " + ".make_form(make_link('disapprove_image/'.$image->id), 'POST')." + + + + "; + } else { + $html = " + ".make_form(make_link('approve_image/'.$image->id), 'POST')." + "; + } return $html; } @@ -42,7 +51,7 @@ class ApprovalTheme extends Themelet $html = make_form(make_link("admin/approval"), "POST"); $html .= "
"; - $html .= ""; + $html .= ""; $html .= "\n"; $page->add_block(new Block("Approval", $html)); } From 6e320a090e2b8214391761576861b18ed8739c25 Mon Sep 17 00:00:00 2001 From: Matthew Barbour Date: Fri, 1 Nov 2019 23:42:11 -0500 Subject: [PATCH 7/8] Better help page nav system integration --- ext/help_pages/main.php | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/ext/help_pages/main.php b/ext/help_pages/main.php index ac7f4cf1..90206d00 100644 --- a/ext/help_pages/main.php +++ b/ext/help_pages/main.php @@ -33,22 +33,40 @@ class HelpPages extends Extension { public const SEARCH = "search"; + private $pages; + + private function get_pages(): array + { + if($this->pages==null) { + $e = new HelpPageListBuildingEvent(); + send_event($e); + $this->pages = $e->pages; + } + return $this->pages; + } + public function onPageRequest(PageRequestEvent $event) { global $page; + $pages = $this->get_pages(); + if ($event->page_matches("help")) { - $e = new HelpPageListBuildingEvent(); - send_event($e); - $page->set_mode(PageMode::PAGE); + if ($event->count_args() == 0) { - $this->theme->display_list_page($e->pages); + $name = array_key_first($pages); + $page->set_mode(PageMode::REDIRECT); + $page->set_redirect(make_link("help/".$name)); + return; } else { + $page->set_mode(PageMode::PAGE); $name = $event->get_arg(0); $title = $name; - if (array_key_exists($name, $e->pages)) { - $title = $e->pages[$name]; + if(array_key_exists($name, $pages)) { + $title = $pages[$name]; + } else { + return; } $this->theme->display_help_page($title); @@ -77,6 +95,16 @@ class HelpPages extends Extension $event->add_nav_link("help", new Link('help'), "Help"); } + public function onPageSubNavBuilding(PageSubNavBuildingEvent $event) + { + if($event->parent=="help") { + $pages = $this->get_pages(); + foreach ($pages as $key=>$value) { + $event->add_nav_link("help_".$key, new Link('help/'.$key),$value); + } + } + } + public function onUserBlockBuilding(UserBlockBuildingEvent $event) { $event->add_link("Help", make_link("help")); From 6b22f6da3f95e912a0887fbfc00dc79a7e5b2c0e Mon Sep 17 00:00:00 2001 From: Matthew Barbour Date: Fri, 1 Nov 2019 23:52:57 -0500 Subject: [PATCH 8/8] Cleanup --- core/polyfills.php | 1 - ext/approval/info.php | 7 ------- 2 files changed, 8 deletions(-) diff --git a/core/polyfills.php b/core/polyfills.php index c39ec13a..b5ec84c8 100644 --- a/core/polyfills.php +++ b/core/polyfills.php @@ -281,7 +281,6 @@ const MIME_TYPE_MAP = [ 'mpg' => 'video/mpeg', 'mpeg' => 'video/mpeg', 'mov' => 'video/quicktime', - 'flv' => 'video/x-flv', 'php' => 'text/x-php', 'mp4' => 'video/mp4', 'ogv' => 'video/ogg', diff --git a/ext/approval/info.php b/ext/approval/info.php index e07d1341..c2af31cd 100644 --- a/ext/approval/info.php +++ b/ext/approval/info.php @@ -1,12 +1,5 @@ - * Description: Provides "Trash" or "Recycle Bin"-type functionality, storing delete images for later recovery - * Documentation: - */ - class ApprovalInfo extends ExtensionInfo { public const KEY = "approval";