[web-php] master: Move myphpnet_* functions to the UserPreferences class (#1075)
| From: | Maurício Meneghini Fauth via GitHub | Date: | Mon, 11 Nov 2024 08:54:12 +0000 |
| Subject: | [web-php] master: Move myphpnet_* functions to the UserPreferences class (#1075) | ||
| Groups: | php.webmaster | ||
| Request: | Send a blank email to php-webmaster+get-32261@lists.php.net to get a copy of this message | ||
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;
+ }
+}