Skip to content

Commit

Permalink
feat: add settings page
Browse files Browse the repository at this point in the history
  • Loading branch information
jeanfredrik committed Oct 18, 2021
1 parent 13883b4 commit 1af74ad
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 13 deletions.
2 changes: 1 addition & 1 deletion autoload/ci-notifier.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
use Whitespace\HeadlessCms\CiNotifier;

add_action("WhitespaceHeadlessCms/init", function ($pluginHandler) {
new CiNotifier($pluginHandler);
$ci_notifier = new CiNotifier($pluginHandler);
});
61 changes: 51 additions & 10 deletions src/CiNotifier.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,70 @@
class CiNotifier {
private $pluginHandler;

public const OPTION_SECTION = "ci-notifier";

public function __construct(PluginHandler $plugin_handler) {
$this->pluginHandler = $plugin_handler;

add_action("save_post", [$this, "onSavePost"], 10, 2);
add_action("admin_init", [$this, "onAdminInit"]);
add_filter("WhitespaceHeadlessCms/sanitize_option", [
$this,
"sanitizeOption",
]);
}

private static function splitUserInput($input, $delimiter = "") {
public function onAdminInit() {
add_settings_section(
self::OPTION_SECTION,
__("Headless settings", "whitespace-headless-cms"),
null,
$this->pluginHandler::OPTION_SECTIONS,
);

add_settings_field(
"ci_notify_urls",
__("CI Notify URLs", "whitespace-headless-cms"),
function () {
printf(
'<textarea id="%s" name="%s[%s]" rows="5" cols="40" placeholder="%s">%s</textarea>',
"ci_notify_urls",
$this->pluginHandler::OPTION_NAME,
"ci_notify_urls",
esc_attr(implode('\n', $this->getNotificationUrls())),
esc_attr(
implode(
'\n',
$this->pluginHandler->getOption("ci_notify_urls", []),
),
),
);
},
$this->pluginHandler::OPTION_SECTIONS,
self::OPTION_SECTION,
);
}

public function sanitizeOption($input) {
$input["ci_notify_urls"] = isset($input["ci_notify_urls"])
? $this->splitUserInput($input["ci_notify_urls"])
: [];
return $input;
}

private static function splitUserInput($input) {
if (empty($input)) {
return [];
}
preg_match_all(
"/\s*([^\R{$delimiter}\s][^\R{$delimiter}]*?)\s*(?:[\R{$delimiter}]|$)/x",
$input,
$matches,
);
return $matches[0] ?? [];
preg_match_all('/([^,\s][^,]+?)\s*(?:,|$)/m', $input, $matches);
return $matches[1] ?? [];
}

public function getNotificationUrls(): array {
if (defined("CI_NOTIFY_URLS")) {
$endpoints = constant("CI_NOTIFY_URLS");
if (defined("CI_NOTIFY_URLS") && !is_null(CI_NOTIFY_URLS)) {
$endpoints = constant(CI_NOTIFY_URLS);
if (!is_array($endpoints)) {
$endpoints = self::splitUserInput($endpoints, ",");
$endpoints = self::splitUserInput($endpoints);
}
} else {
$endpoints = $this->pluginHandler->getOption("ci_notify_urls", []);
Expand Down
44 changes: 42 additions & 2 deletions src/PluginHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,59 @@

class PluginHandler {
public const OPTION_NAME = "whitespace_headless_cms";
public const OPTION_GROUP = "whitespace_headless_cms";
public const OPTION_SECTIONS = "whitespace-headless-cms";

public function __construct() {
add_action("admin_menu", [$this, "onAdminMenu"]);
add_action("admin_init", [$this, "onAdminInit"]);
}

public function getOption(string $name = null, mixed $default = null): mixed {
public function onAdminMenu() {
add_options_page(
__("Headless", "whitespace-headless-cms"),
__("Headless settings", "whitespace-headless-cms"),
"manage_options",
__("whitespace-headless-cms"),
[$this, "renderOptionsPage"],
);
}
public function renderOptionsPage(): void {
?>
<div class="wrap">
<h1><?php _e("Headless settings", "whitespace-headless-cms"); ?></h1>
<form method="post" action="options.php">
<?php
// This prints out all hidden setting fields
settings_fields(self::OPTION_GROUP);
do_settings_sections(self::OPTION_SECTIONS);
submit_button();?>
</form>
</div>
<?php
}

public function onAdminInit() {
register_setting(self::OPTION_GROUP, self::OPTION_NAME, [
$this,
"sanitizeOption",
]);
}

public function sanitizeOption($input) {
$input = apply_filters("WhitespaceHeadlessCms/sanitize_option", $input);
return $input;
}

public function getOption(string $name = null, $default = null) {
$option_value = get_option(self::OPTION_NAME, []);
if ($name) {
$option_value = $option_value[$name] ?? $default;
}
return $option_value;
}

public function setOption(string $name, mixed $value): bool {
public function setOption(string $name, $value): bool {
$option_value = get_option(self::OPTION_NAME, []);
$option_value[$name] = $value;
return update_option(self::OPTION_NAME, $option_value);
Expand Down

0 comments on commit 1af74ad

Please sign in to comment.