Browse Source

Update pagex.class.php

Fix deprecated dynamic property creation and week calculation in relativeTime function

- Resolved deprecated warning by avoiding dynamic property creation on DateInterval object.
- Calculated weeks separately and included them correctly in the output string.
- Adjusted the logic to handle weeks within the string array without creating a dynamic property.
- Ensured compatibility with PHP 8.2 and higher, where dynamic properties are deprecated.

This fix prevents the "Deprecated: Creation of dynamic property DateInterval::$w is deprecated" warning and correctly formats the relative time string.
basteyy 1 year ago
parent
commit
593f5b3aed
1 changed files with 39 additions and 32 deletions
  1. 39 32
      bl-kernel/pagex.class.php

+ 39 - 32
bl-kernel/pagex.class.php

@@ -543,38 +543,45 @@ class Page
 	// $complete = false : short version
 	// $complete = true  : full version
 	public function relativeTime($complete = false)
-	{
-		$current = new DateTime;
-		$past    = new DateTime($this->getValue('dateRaw'));
-		$elapsed = $current->diff($past);
-
-		$elapsed->w  = floor($elapsed->d / 7);
-		$elapsed->d -= $elapsed->w * 7;
-
-		$string = array(
-			'y' => 'year',
-			'm' => 'month',
-			'w' => 'week',
-			'd' => 'day',
-			'h' => 'hour',
-			'i' => 'minute',
-			's' => 'second',
-		);
-
-		foreach ($string as $key => &$value) {
-			if ($elapsed->$key) {
-				$value = $elapsed->$key . ' ' . $value . ($elapsed->$key > 1 ? 's' : ' ');
-			} else {
-				unset($string[$key]);
-			}
-		}
-
-		if (!$complete) {
-			$string = array_slice($string, 0, 1);
-		}
-
-		return $string ? implode(', ', $string) . ' ago' : 'Just now';
-	}
+    	{
+        	$current = new DateTime;
+	        $past    = new DateTime($this->getValue('dateRaw'));
+	        $elapsed = $current->diff($past);
+	
+	        // Calculate weeks separately
+	        $weeks = floor($elapsed->d / 7);
+	        $elapsed->d -= $weeks * 7;
+	
+	        $string = array(
+	            'y' => 'year',
+	            'm' => 'month',
+	            'w' => $weeks,
+	            'd' => 'day',
+	            'h' => 'hour',
+	            'i' => 'minute',
+	            's' => 'second',
+	        );
+
+	        foreach ($string as $key => &$value) {
+	            if ($key == 'w') {
+	                if ($weeks > 0) {
+	                    $value = $weeks . ' week' . ($weeks > 1 ? 's' : '');
+	                } else {
+	                    unset($string[$key]);
+	                }
+	            } elseif ($elapsed->$key) {
+	                $value = $elapsed->$key . ' ' . $value . ($elapsed->$key > 1 ? 's' : '');
+	            } else {
+	                unset($string[$key]);
+	            }
+	        }
+	
+	        if (!$complete) {
+	            $string = array_slice($string, 0, 1);
+	        }
+	
+	        return $string ? implode(', ', $string) . ' ago' : 'Just now';
+    	}
 
 	// Returns the value from the field, false if the fields doesn't exists
 	// If you set the $option as TRUE, the function returns an array with all the values of the field