Files
wp-multisite-waas/inc/admin-pages/class-hosting-integration-wizard-admin-page.php
2025-02-15 23:19:24 -07:00

361 lines
7.7 KiB
PHP

<?php
/**
* WP Multisite WaaS Dashboard Admin Page.
*
* @package WP_Ultimo
* @subpackage Admin_Pages
* @since 2.0.0
*/
namespace WP_Ultimo\Admin_Pages;
// Exit if accessed directly
defined('ABSPATH') || exit;
/**
* WP Multisite WaaS Dashboard Admin Page.
*/
class Hosting_Integration_Wizard_Admin_Page extends Wizard_Admin_Page {
/**
* Holds the ID for this page, this is also used as the page slug.
*
* @var string
*/
protected $id = 'wp-ultimo-hosting-integration-wizard';
/**
* Is this a top-level menu or a submenu?
*
* @since 1.8.2
* @var string
*/
protected $type = 'submenu';
/**
* Is this a top-level menu or a submenu?
*
* @since 1.8.2
* @var string
*/
protected $parent = 'none';
/**
* This page has no parent, so we need to highlight another sub-menu.
*
* @since 2.0.0
* @var string
*/
protected $highlight_menu_slug = 'wp-ultimo-settings';
/**
* If this number is greater than 0, a badge with the number will be displayed alongside the menu title
*
* @since 1.8.2
* @var integer
*/
protected $badge_count = 0;
/**
* Holds the admin panels where this page should be displayed, as well as which capability to require.
*
* To add a page to the regular admin (wp-admin/), use: 'admin_menu' => 'capability_here'
* To add a page to the network admin (wp-admin/network), use: 'network_admin_menu' => 'capability_here'
* To add a page to the user (wp-admin/user) admin, use: 'user_admin_menu' => 'capability_here'
*
* @since 2.0.0
* @var array
*/
protected $supported_panels = [
'network_admin_menu' => 'manage_network',
];
/**
* Current integration being setup.
*
* @since 2.0.0
* @var WP_Ultimo\Integrations\Host_Providers\Base_Host_Provider
*/
protected $integration;
/**
* Allow child classes to add further initializations.
*
* @since 1.8.2
* @return void
*/
public function page_loaded(): void {
if (isset($_GET['integration'])) {
$domain_manager = \WP_Ultimo\Managers\Domain_Manager::get_instance();
$this->integration = $domain_manager->get_integration_instance($_GET['integration']);
}
if ( ! $this->integration) {
wp_redirect(network_admin_url('admin.php?page=wp-ultimo-settings'));
exit;
}
parent::page_loaded();
}
/**
* Returns the title of the page.
*
* @since 2.0.0
* @return string Title of the page.
*/
public function get_title(): string {
return sprintf(__('Integration Setup', 'wp-multisite-waas'));
}
/**
* Returns the title of menu for this page.
*
* @since 2.0.0
* @return string Menu label of the page.
*/
public function get_menu_title() {
return __('Host Provider Integration', 'wp-multisite-waas');
}
/**
* Returns the sections for this Wizard.
*
* @since 2.0.0
* @return array
*/
public function get_sections() {
$sections = [
'activation' => [
'title' => __('Activation', 'wp-multisite-waas'),
'view' => [$this, 'section_activation'],
'handler' => [$this, 'handle_activation'],
],
'instructions' => [
'title' => __('Instructions', 'wp-multisite-waas'),
'view' => [$this, 'section_instructions'],
],
'config' => [
'title' => __('Configuration', 'wp-multisite-waas'),
'view' => [$this, 'section_configuration'],
'handler' => [$this, 'handle_configuration'],
],
'testing' => [
'title' => __('Testing Integration', 'wp-multisite-waas'),
'view' => [$this, 'section_test'],
],
'done' => [
'title' => __('Ready!', 'wp-multisite-waas'),
'view' => [$this, 'section_ready'],
],
];
/*
* Some host providers require no instructions.
*/
if ($this->integration->supports('no-instructions')) {
unset($sections['instructions']);
}
/*
* Some host providers require no additional setup.
*/
if ($this->integration->supports('no-config')) {
unset($sections['config']);
}
return $sections;
}
/**
* Displays the content of the activation section.
*
* @since 2.0.0
* @return void
*/
public function section_activation(): void {
$explainer_lines = $this->integration->get_explainer_lines();
wu_get_template(
'wizards/host-integrations/activation',
[
'screen' => get_current_screen(),
'page' => $this,
'integration' => $this->integration,
'will' => $explainer_lines['will'],
'will_not' => $explainer_lines['will_not'],
]
);
}
/**
* Displays the contents of the instructions section.
*
* @since 2.0.0
* @return void
*/
public function section_instructions(): void {
call_user_func([$this->integration, 'get_instructions']);
$this->render_submit_box();
}
/**
* Displays the content of the configuration section.
*
* @since 2.0.0
* @return void
*/
public function section_configuration(): void {
$fields = $this->integration->get_fields();
foreach ($fields as $field_constant => &$field) {
$field['value'] = defined($field_constant) && constant($field_constant) ? constant($field_constant) : '';
}
$form = new \WP_Ultimo\UI\Form(
$this->get_current_section(),
$fields,
[
'views' => 'admin-pages/fields',
'classes' => 'wu-widget-list wu-striped wu-m-0 wu--mt-2 wu--mb-3 wu--mx-3',
'field_wrapper_classes' => 'wu-w-full wu-box-border wu-items-center wu-flex wu-justify-between wu-px-6 wu-py-4 wu-m-0 wu-border-t wu-border-l-0 wu-border-r-0 wu-border-b-0 wu-border-gray-300 wu-border-solid',
]
);
if (wu_request('manual')) {
wu_get_template(
'wizards/host-integrations/configuration-results',
[
'screen' => get_current_screen(),
'page' => $this,
'integration' => $this->integration,
'form' => $form,
'post' => $_GET['post'],
]
);
return;
}
wu_get_template(
'wizards/host-integrations/configuration',
[
'screen' => get_current_screen(),
'page' => $this,
'integration' => $this->integration,
'form' => $form,
]
);
}
/**
* Displays the content of the final section.
*
* @since 2.0.0
* @return void
*/
public function section_ready(): void {
wu_get_template(
'wizards/host-integrations/ready',
[
'screen' => get_current_screen(),
'page' => $this,
'integration' => $this->integration,
]
);
}
/**
* Handles the activation of a given integration.
*
* @since 2.0.0
* @return void
*/
public function handle_activation(): void {
$is_enabled = $this->integration->is_enabled();
if ($is_enabled) {
$this->integration->disable();
return;
}
$this->integration->enable();
wp_redirect($this->get_next_section_link());
exit;
}
/**
* Handles the configuration of a given integration.
*
* @since 2.0.0
* @return void
*/
public function handle_configuration(): void {
if (wu_request('submit') == '0') { // phpcs:ignore
$redirect_url = add_query_arg(
[
'manual' => '1',
'post' => $_POST,
]
);
wp_redirect($redirect_url);
exit;
}
if (wu_request('submit') == '1') { // phpcs:ignore
$this->integration->setup_constants($_POST);
}
$redirect_url = $this->get_next_section_link();
$redirect_url = remove_query_arg('post', $redirect_url);
$redirect_url = remove_query_arg('manual', $redirect_url);
wp_redirect($redirect_url);
exit;
}
/**
* Handles the testing of a given configuration.
*
* @todo Move Vue to a scripts management class.
* @since 2.0.0
* @return void
*/
public function section_test(): void {
wp_enqueue_script('wu-vue');
wu_get_template(
'wizards/host-integrations/test',
[
'screen' => get_current_screen(),
'page' => $this,
'integration' => $this->integration,
]
);
}
}