Author: Maurício Meneghini Fauth (MauricioFauth)
Committer: GitHub (web-flow)
Pusher: saundefined
Date: 2024-11-11T11:50:15+03:00

Commit: 
https://github.com/php/web-php/commit/817a3e7fd91dfa280ef34e325f795559543840e4
Raw diff: 
https://github.com/php/web-php/commit/817a3e7fd91dfa280ef34e325f795559543840e4.diff

Move myphpnet_* functions to the UserPreferences class (#1075)

Changed paths:
  A  tests/Unit/UserPreferencesTest.php
  M  error.php
  M  include/langchooser.inc
  M  include/layout.inc
  M  include/prepend.inc
  M  my.php
  M  src/UserPreferences.php
  M  tests/Unit/LangChooserTest.php


Diff:

diff --git a/error.php b/error.php
index a5d4522989..2801188f14 100644
--- a/error.php
+++ b/error.php
@@ -725,7 +725,7 @@
 // ============================================================================
 // If no match was found till this point, the last action is to start a
 // search with the URI the user typed in
-$fallback = (myphpnet_urlsearch() === UserPreferences::URL_MANUAL ? 
"404manual" : "404quickref");
+$fallback = ($userPreferences->searchType === UserPreferences::URL_MANUAL ? 
"404manual" : "404quickref");
 mirror_redirect(
     '/search.php?show=' . $fallback . '&lang=' . urlencode($LANG) .
     '&pattern=' . substr($_SERVER['REQUEST_URI'], 1),
diff --git a/include/langchooser.inc b/include/langchooser.inc
index 230a3d707d..61def940f8 100644
--- a/include/langchooser.inc
+++ b/include/langchooser.inc
@@ -37,7 +37,7 @@ $_SERVER['STRIPPED_URI'] = 
htmlspecialchars($_SERVER['REQUEST_URI'], ENT_QUOTES,
 
 // The code is encapsulated in a function,
 // so the variable namespace is not polluted
-list($LANG, $EXPL_LANG) = (new LangChooser($LANGUAGES, 
$INACTIVE_ONLINE_LANGUAGES, myphpnet_language(), default_language() ?: 
''))->chooseCode(
+list($LANG, $EXPL_LANG) = (new LangChooser($LANGUAGES, 
$INACTIVE_ONLINE_LANGUAGES, $userPreferences->languageCode, default_language() 
?: ''))->chooseCode(
     $_REQUEST['lang'] ?? null,
     $_SERVER['REQUEST_URI'],
     $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? null,
diff --git a/include/layout.inc b/include/layout.inc
index 471d8eeaa3..5174395e40 100644
--- a/include/layout.inc
+++ b/include/layout.inc
@@ -425,13 +425,13 @@ EOT;
 
 function site_header(string $title = 'Hypertext Preprocessor', array $config = 
[]): void
 {
-    global $MYSITE;
+    global $MYSITE, $LANG;
 
     $meta_image_path = $MYSITE . 'images/meta-image.png';
     $meta_description = "PHP is a popular general-purpose scripting language 
that powers everything from your blog to the most popular websites in the 
world.";
 
     $defaults = [
-        "lang" => myphpnet_language(),
+        "lang" => $LANG,
         "current" => "",
         "meta-navigation" => [],
         'classes' => '',
diff --git a/include/prepend.inc b/include/prepend.inc
index eaf07cab4b..1ffd80f1b0 100644
--- a/include/prepend.inc
+++ b/include/prepend.inc
@@ -75,8 +75,10 @@ unset($COUNTRY);
 unset($ONLOAD);
 unset($LAST_UPDATED);
 
+$userPreferences = new UserPreferences();
+
 // Load the My PHP.net settings before any includes
-myphpnet_load();
+$userPreferences->load();
 
 // Site details (mirror site information)
 include __DIR__ . '/site.inc';
@@ -97,88 +99,6 @@ include __DIR__ . '/last_updated.inc';
 
 // 
-----------------------------------------------------------------------------
 
-// Load in the user preferences
-function myphpnet_load(): void
-{
-    UserPreferences::$languageCode = '';
-    UserPreferences::$searchType = UserPreferences::URL_NONE;
-    UserPreferences::$isUserGroupTipsEnabled = false;
-
-    if (!isset($_COOKIE['MYPHPNET']) || !is_string($_COOKIE['MYPHPNET']) || 
$_COOKIE['MYPHPNET'] === '') {
-        return;
-    }
-
-    /**
-     * 0 - Language code
-     * 1 - URL search fallback
-     * 2 - Mirror site (removed)
-     * 3 - User Group tips
-     * 4 - Documentation developmental server (removed)
-     */
-    $preferences = explode(",", $_COOKIE['MYPHPNET']);
-    UserPreferences::$languageCode = $preferences[0] ?? '';
-    if (isset($preferences[1]) && in_array($preferences[1], 
[UserPreferences::URL_FUNC, UserPreferences::URL_MANUAL], true)) {
-        UserPreferences::$searchType = $preferences[1];
-    }
-
-    UserPreferences::$isUserGroupTipsEnabled = isset($preferences[3]) && 
$preferences[3];
-}
-
-// Get preferred language code
-function myphpnet_language(): string
-{
-    return UserPreferences::$languageCode;
-}
-
-// Set URL search fallback preference
-function myphpnet_urlsearch($type = false)
-{
-    // Set type if specified and if correct
-    if ($type && in_array($type, [UserPreferences::URL_FUNC, 
UserPreferences::URL_MANUAL], true)) {
-        UserPreferences::$searchType = $type;
-    }
-
-    return UserPreferences::$searchType;
-}
-
-function myphpnet_showug($enable = null) {
-    if (isset($_GET["showug"])) {
-        $enable = true;
-    }
-
-    if (is_bool($enable)) {
-        UserPreferences::$isUserGroupTipsEnabled = $enable;
-    }
-
-    // Show the ug tips to lucky few, depending on time.
-    if ($_SERVER["REQUEST_TIME"] % 10) {
-        UserPreferences::$isUserGroupTipsEnabled = true;
-    }
-
-    return UserPreferences::$isUserGroupTipsEnabled;
-}
-
-// Save user settings in cookie
-function myphpnet_save(): void
-{
-    /**
-     * 0 - Language code
-     * 1 - URL search fallback
-     * 2 - Mirror site (removed)
-     * 3 - User Group tips
-     * 4 - Documentation developmental server (removed)
-     */
-    $preferences = [
-        UserPreferences::$languageCode,
-        UserPreferences::$searchType,
-        '',
-        UserPreferences::$isUserGroupTipsEnabled,
-    ];
-
-    // Set all the preferred values for a year
-    mirror_setcookie("MYPHPNET", join(",", $preferences), 60 * 60 * 24 * 365);
-}
-
 // Embed Google Custom Search engine
 function google_cse(): void {
     $cse_snippet = <<<EOF
diff --git a/my.php b/my.php
index 2a0ae0e39c..8ad08ded48 100644
--- a/my.php
+++ b/my.php
@@ -16,7 +16,7 @@
 if (isset($_POST['my_lang'], $langs[$_POST['my_lang']])) {
 
     // Set the language preference
-    UserPreferences::$languageCode = $_POST['my_lang'];
+    $userPreferences->languageCode = $_POST['my_lang'];
 
     // Add this as first option, selected
     $options[] = '<option value="' . $_POST['my_lang'] . '" selected>' .
@@ -27,14 +27,14 @@
 }
 
 // We have received a cookie and it is an available language
-elseif (isset($langs[myphpnet_language()])) {
+elseif (isset($langs[$userPreferences->languageCode])) {
 
     // Add this as first option, selected
-    $options[] = '<option value="' . myphpnet_language() . '" selected>' .
-                 $langs[myphpnet_language()] . "</option>\n";
+    $options[] = '<option value="' . $userPreferences->languageCode . '" 
selected>' .
+                 $langs[$userPreferences->languageCode] . "</option>\n";
 
     // Remove, so it is not listed two times
-    unset($langs[myphpnet_language()]);
+    unset($langs[$userPreferences->languageCode]);
 }
 
 // We have no cookie and no form submitted
@@ -54,18 +54,18 @@
 
 // Save URL shortcut fallback setting
 if (isset($_POST['urlsearch'])) {
-    myphpnet_urlsearch($_POST['urlsearch']);
+    $userPreferences->setUrlSearchType($_POST['urlsearch']);
 }
 
 if (isset($_POST["showug"])) {
-    myphpnet_showug($_POST["showug"] === "enable");
+    $userPreferences->setIsUserGroupTipsEnabled($_POST["showug"] === "enable");
 }
 
 // Prepare mirror array
 $mirror_sites = $MIRRORS;
 $mirror_sites["NONE"] = [7 => MIRROR_OK];
 
-myphpnet_save();
+$userPreferences->save();
 
 site_header("My PHP.net", ["current" => "community"]);
 ?>
@@ -177,7 +177,7 @@
 <div class="indent">
  Your setting: <input id="form-urlsearch-quickref" type="radio" 
name="urlsearch" value="quickref"
 <?php
-$type = myphpnet_urlsearch();
+$type = $userPreferences->searchType;
 if ($type === UserPreferences::URL_NONE || $type === 
UserPreferences::URL_FUNC) {
     echo ' checked="checked"';
 }
@@ -196,8 +196,8 @@
 We are experimenting with listing nearby user groups. This feature is highly 
experimental
 and will very likely change a lot and be broken at times.
 </p>
-<label for="showugenable">Enable UG tips</label> <input type="radio" 
name="showug" id="showugenable" value="enable" <?php echo myphpnet_showug() ? 
"checked=checked" : "" ?>><br>
-<label for="showugdisable">Disable UG tips</label> <input type="radio" 
name="showug" id="showugdisable" value="disable" <?php echo myphpnet_showug() ? 
"" : "checked=checked" ?>>
+<label for="showugenable">Enable UG tips</label> <input type="radio" 
name="showug" id="showugenable" value="enable" <?php echo 
$userPreferences->isUserGroupTipsEnabled ? "checked=checked" : "" ?>><br>
+<label for="showugdisable">Disable UG tips</label> <input type="radio" 
name="showug" id="showugdisable" value="disable" <?php echo 
$userPreferences->isUserGroupTipsEnabled ? "" : "checked=checked" ?>>
 
 <p class="center">
  <input type="submit" value="Set All Preferences">
diff --git a/src/UserPreferences.php b/src/UserPreferences.php
index 6b7b1eef60..60e3d42362 100644
--- a/src/UserPreferences.php
+++ b/src/UserPreferences.php
@@ -1,7 +1,15 @@
 <?php
 
+declare(strict_types=1);
+
 namespace phpweb;
 
+use function explode;
+use function in_array;
+use function is_string;
+use function join;
+use function mirror_setcookie;
+
 /**
  * Handles the "My PHP.net" preferences.
  */
@@ -13,14 +21,67 @@ final class UserPreferences
 
     public const URL_MANUAL = 'manual';
 
-    public static string $languageCode = '';
+    /** @param self::URL_* $searchType URL search fallback */
+    public function __construct(
+        public string $languageCode = '',
+        public string|false $searchType = self::URL_NONE,
+        public bool $isUserGroupTipsEnabled = false,
+    ) {
+    }
+
+    public function load(): void
+    {
+        $this->languageCode = '';
+        $this->searchType = self::URL_NONE;
+        $this->isUserGroupTipsEnabled = false;
+
+        if (!isset($_COOKIE['MYPHPNET']) || !is_string($_COOKIE['MYPHPNET']) 
|| $_COOKIE['MYPHPNET'] === '') {
+            return;
+        }
+
+        /**
+         * 0 - Language code
+         * 1 - URL search fallback
+         * 2 - Mirror site (removed)
+         * 3 - User Group tips
+         * 4 - Documentation developmental server (removed)
+         */
+        $preferences = explode(",", $_COOKIE['MYPHPNET']);
+        $this->languageCode = $preferences[0] ?? '';
+        $this->setUrlSearchType($preferences[1] ?? self::URL_NONE);
+        $this->isUserGroupTipsEnabled = isset($preferences[3]) && 
$preferences[3];
+    }
+
+    public function setUrlSearchType(mixed $type): void
+    {
+        if (!in_array($type, [self::URL_FUNC, self::URL_MANUAL, 
self::URL_NONE], true)) {
+            return;
+        }
+
+        $this->searchType = $type;
+    }
+
+    public function setIsUserGroupTipsEnabled(bool $enable): void {
+        // Show the ug tips to lucky few, depending on time.
+        if ($_SERVER["REQUEST_TIME"] % 10) {
+            $enable = true;
+        }
+
+        $this->isUserGroupTipsEnabled = $enable;
+    }
 
-    /**
-     * URL search fallback
-     *
-     * @var 'manual'|'quickref'|false
-     */
-    public static string|false $searchType = self::URL_NONE;
+    public function save(): void
+    {
+        /**
+         * 0 - Language code
+         * 1 - URL search fallback
+         * 2 - Mirror site (removed)
+         * 3 - User Group tips
+         * 4 - Documentation developmental server (removed)
+         */
+        $preferences = [$this->languageCode, $this->searchType, '', 
$this->isUserGroupTipsEnabled];
 
-    public static bool $isUserGroupTipsEnabled = false;
+        // Set all the preferred values for a year
+        mirror_setcookie("MYPHPNET", join(",", $preferences), 60 * 60 * 24 * 
365);
+    }
 }
diff --git a/tests/Unit/LangChooserTest.php b/tests/Unit/LangChooserTest.php
index 9706a67b50..8c8d3a60c2 100644
--- a/tests/Unit/LangChooserTest.php
+++ b/tests/Unit/LangChooserTest.php
@@ -6,7 +6,6 @@
 
 use phpweb\LangChooser;
 use PHPUnit\Framework;
-use phpweb\UserPreferences;
 
 #[Framework\Attributes\CoversClass(LangChooser::class)]
 class LangChooserTest extends Framework\TestCase
@@ -107,9 +106,7 @@ public function 
testChooseCodeWithLangParameterAndManualPath(): void
 
     public function testChooseCodeWithManualPathAndUserPreference(): void
     {
-        UserPreferences::$languageCode = 'en';
-
-        $langChooser = new LangChooser(self::DEFAULT_LANGUAGE_LIST, [], '', 
'en');
+        $langChooser = new LangChooser(self::DEFAULT_LANGUAGE_LIST, [], 'en', 
'en');
         $result = $langChooser->chooseCode('', '/manual/de', null);
 
         self::assertSame(['de', 'de'], $result);
diff --git a/tests/Unit/UserPreferencesTest.php 
b/tests/Unit/UserPreferencesTest.php
new file mode 100644
index 0000000000..f1df981bee
--- /dev/null
+++ b/tests/Unit/UserPreferencesTest.php
@@ -0,0 +1,94 @@
+<?php
+
+declare(strict_types=1);
+
+namespace phpweb\Test\Unit;
+
+use PHPUnit\Framework\Attributes\CoversClass;
+use PHPUnit\Framework\Attributes\DataProvider;
+use phpweb\UserPreferences;
+use PHPUnit\Framework\TestCase;
+
+#[CoversClass(UserPreferences::class)]
+final class UserPreferencesTest extends TestCase
+{
+    /** @param array<string, mixed> $cookie */
+    #[DataProvider('loadCookiesProvider')]
+    public function testLoad(
+        array $cookie,
+        string $languageCode,
+        string|false $searchType,
+        bool $isUserGroupTipsEnabled,
+    ): void {
+        $_COOKIE = $cookie;
+
+        $userPreferences = new UserPreferences();
+        $userPreferences->load();
+
+        self::assertSame($languageCode, $userPreferences->languageCode);
+        self::assertSame($searchType, $userPreferences->searchType);
+        self::assertSame($isUserGroupTipsEnabled, 
$userPreferences->isUserGroupTipsEnabled);
+    }
+
+    /** @return array<int, array{array<string, mixed>, string, string|false, 
bool}> */
+    public static function loadCookiesProvider(): array
+    {
+        return [
+            [[], '', UserPreferences::URL_NONE, false],
+            [['MYPHPNET' => ['en,manual,,1']], '', UserPreferences::URL_NONE, 
false],
+            [['MYPHPNET' => ''], '', UserPreferences::URL_NONE, false],
+            [['MYPHPNET' => ',,,'], '', UserPreferences::URL_NONE, false],
+            [['MYPHPNET' => ',,,0'], '', UserPreferences::URL_NONE, false],
+            [['MYPHPNET' => ',,ignored,,ignored'], '', 
UserPreferences::URL_NONE, false],
+            [['MYPHPNET' => 'en,,,'], 'en', UserPreferences::URL_NONE, false],
+            [['MYPHPNET' => ',manual,,'], '', UserPreferences::URL_MANUAL, 
false],
+            [['MYPHPNET' => ',quickref,,'], '', UserPreferences::URL_FUNC, 
false],
+            [['MYPHPNET' => ',invalid,,'], '', UserPreferences::URL_NONE, 
false],
+            [['MYPHPNET' => ',,,1'], '', UserPreferences::URL_NONE, true],
+            [['MYPHPNET' => 'en,manual,,1'], 'en', 
UserPreferences::URL_MANUAL, true],
+        ];
+    }
+
+    #[DataProvider('urlSearchTypeProvider')]
+    public function testSetUrlSearchType(mixed $type, string|false $expected): 
void
+    {
+        $userPreferences = new UserPreferences(searchType: 
UserPreferences::URL_NONE);
+        $userPreferences->setUrlSearchType($type);
+        self::assertSame($expected, $userPreferences->searchType);
+    }
+
+    /** @return array<int, array{mixed, string|false}> */
+    public static function urlSearchTypeProvider(): array
+    {
+        return [
+            ['manual', UserPreferences::URL_MANUAL],
+            ['quickref', UserPreferences::URL_FUNC],
+            [false, UserPreferences::URL_NONE],
+            ['', UserPreferences::URL_NONE],
+            ['invalid', UserPreferences::URL_NONE],
+            [['manual'], UserPreferences::URL_NONE],
+        ];
+    }
+
+    public function testSetIsUserGroupTipsEnabled(): void
+    {
+        $timeBackup = $_SERVER['REQUEST_TIME'];
+        $_SERVER['REQUEST_TIME'] = 1726600070;
+
+        $userPreferences = new UserPreferences(isUserGroupTipsEnabled: false);
+        $userPreferences->setIsUserGroupTipsEnabled(true);
+        self::assertTrue($userPreferences->isUserGroupTipsEnabled);
+
+        $userPreferences = new UserPreferences(isUserGroupTipsEnabled: true);
+        $userPreferences->setIsUserGroupTipsEnabled(false);
+        self::assertFalse($userPreferences->isUserGroupTipsEnabled);
+
+        $_SERVER['REQUEST_TIME'] = 1726600066;
+
+        $userPreferences = new UserPreferences(isUserGroupTipsEnabled: false);
+        $userPreferences->setIsUserGroupTipsEnabled(false);
+        self::assertTrue($userPreferences->isUserGroupTipsEnabled);
+
+        $_SERVER['REQUEST_TIME'] = $timeBackup;
+    }
+}

Reply via email to