phpmyadmin/phpmyadmin

View on GitHub
src/Config/PageSettings.php

Summary

Maintainability
A
25 mins
Test Coverage
<?php
/**
 * Page-related settings
 */

declare(strict_types=1);

namespace PhpMyAdmin\Config;

use PhpMyAdmin\Config;
use PhpMyAdmin\Config\Forms\Page\PageFormList;
use PhpMyAdmin\Message;
use PhpMyAdmin\ResponseRenderer;
use PhpMyAdmin\UserPreferences;

use function __;

/**
 * Page-related settings
 */
class PageSettings
{
    /**
     * Contains id of the form element
     */
    private string $elemId = 'page_settings_modal';

    /**
     * Name of the group to show
     */
    private string $groupName = '';

    /**
     * Contains HTML of errors
     */
    private string $errorHTML = '';

    /**
     * Contains HTML of settings
     */
    private string $HTML = '';

    public function __construct(private UserPreferences $userPreferences)
    {
    }

    /**
     * @param string      $formGroupName The name of config form group to display
     * @param string|null $elemId        Id of the div containing settings
     */
    public function init(string $formGroupName, string|null $elemId = null): void
    {
        $formClass = PageFormList::get($formGroupName);
        if ($formClass === null) {
            return;
        }

        if (isset($_REQUEST['printview']) && $_REQUEST['printview'] == '1') {
            return;
        }

        if ($elemId !== null && $elemId !== '') {
            $this->elemId = $elemId;
        }

        $this->groupName = $formGroupName;

        $configFile = new ConfigFile(Config::getInstance()->baseSettings);
        $this->userPreferences->pageInit($configFile);

        $formDisplay = new $formClass($configFile);

        // Process form
        $error = null;
        if (isset($_POST['submit_save']) && $_POST['submit_save'] == $formGroupName) {
            $error = $this->processPageSettings($formDisplay, $configFile);
        }

        // Display forms
        $this->HTML = $this->getPageSettingsDisplay($formDisplay, $error);
    }

    /**
     * Process response to form
     *
     * @param FormDisplay $formDisplay Form
     * @param ConfigFile  $cf          Configuration file
     */
    private function processPageSettings(FormDisplay $formDisplay, ConfigFile $cf): Message|null
    {
        if (! $formDisplay->process(false) || $formDisplay->hasErrors()) {
            return null;
        }

        // save settings
        $result = $this->userPreferences->save($cf->getConfigArray());
        if ($result === true) {
            // reload page
            $response = ResponseRenderer::getInstance();
            $response->redirect($response->getSelfUrl());
            $response->callExit();
        }

        return $result;
    }

    /**
     * Store errors in _errorHTML
     *
     * @param FormDisplay  $formDisplay Form
     * @param Message|null $error       Error message
     */
    private function storeError(FormDisplay $formDisplay, Message|null $error): void
    {
        $retval = '';
        if ($error !== null) {
            $retval .= $error->getDisplay();
        }

        if ($formDisplay->hasErrors()) {
            // form has errors
            $retval .= '<div class="alert alert-danger config-form" role="alert">'
                . '<b>' . __('Cannot save settings, submitted configuration form contains errors!') . '</b>'
                . $formDisplay->displayErrors()
                . '</div>';
        }

        $this->errorHTML = $retval;
    }

    /**
     * Display page-related settings
     *
     * @param FormDisplay  $formDisplay Form
     * @param Message|null $error       Error message
     */
    private function getPageSettingsDisplay(FormDisplay $formDisplay, Message|null $error): string
    {
        $response = ResponseRenderer::getInstance();

        $retval = '';

        $this->storeError($formDisplay, $error);

        $retval .= '<div id="' . $this->elemId . '">';
        $retval .= '<div class="page_settings">';
        $retval .= $formDisplay->getDisplay(false, $response->getSelfUrl(), ['submit_save' => $this->groupName]);
        $retval .= '</div>';
        $retval .= '</div>';

        return $retval;
    }

    /**
     * Get HTML output
     */
    public function getHTML(): string
    {
        return $this->HTML;
    }

    /**
     * Get error HTML output
     */
    public function getErrorHTML(): string
    {
        return $this->errorHTML;
    }
}