WebsiteBaker Community Forum

WebsiteBaker Support (2.13.x) => General Help & Support => Hilfe & Support (deutsch) => Topic started by: hillschmidt on January 12, 2024, 05:28:33 PM

Title: EventCal Droplet enthält gmstrftime() - in PHP 8.1 deprecated
Post by: hillschmidt on January 12, 2024, 05:28:33 PM
Ein Droplet hat ein Problem (im Log): gmstrftime() is deprecated
Dies kommt im Droplet zum EventCal vor.

Wie kann ich generell diese Funktion ersetzen? Sooo weit reichen meine PHP Kenntnisse nicht.
gmdate() einzusetzen führte zu einer anderen Fehlermeldung und zeigte den Kalender (genutzt auf https://tv-bubenheim.de - Startseite) gar nicht mehr an, sondern einen echten Fehler ...
Title: Re: EventCal Droplet enthält gmstrftime() - in PHP 8.1 deprecated
Post by: dbs on January 14, 2024, 07:51:36 AM
Hi, den Code kannst gern mal posten. Nicht jeder hat das Droplet griffbereit oder installiert.
Title: Re: EventCal Droplet enthält gmstrftime() - in PHP 8.1 deprecated
Post by: hillschmidt on January 14, 2024, 04:28:17 PM
Hier der (lange) Code:
(so trotz des DEPRECATED genutzt auf der Startseite https://tv-bubenheim.de

Code: [Select]
//:Dieses Droplet zeigt die Events aus dem Event Calendar Modul an
//:Standardaufruf:
//:    [[EventCal]]
//:Zeigt alle Events des laufenden Monats. Alle bedeutet, daß bei mehrfacher Verwendung des Event Calendar Moduls auf verschiedenen Seiten die Termine von allen Sektionen verwendet werden.
//:SectionID angeben (Beispiel):
//:    [[EventCal?section=25]]
//:Monat explizit angeben (Beispiel):
//:    [[EventCal?month=5]]
//:Jahr explizit angeben (Beispiel):
//:    [[EventCal?year=2010]]
//:Alles kombinieren (Beispiel):
//:    [[EventCal?year=2010&month=5§ion=25]]
global $wb, $database;

$days = array();
$day_name_length = 2;
$month_href = NULL;
$where = NULL;
$first_day = 1;
$pn = array();
$events = 0;

$oldlocale = setlocale(LC_TIME, NULL); #save current locale
setlocale(LC_TIME, 'de_DE');

if(!isset($year))  {$year  = date('Y', time()); };
if(!isset($month)) {$month = date('n', time()); };
if ( isset( $section ) ) { $where = "AND section_id='$section'"; }

$today = date('j',time());

// Get Events from "Event Calendar" Module (1.8c)
$sql    = "SELECT DAY(date) AS day, event_desc AS descr, evweb_url AS url FROM ".TABLE_PREFIX."mod_event_dates WHERE YEAR(date) = '$year' AND MONTH(date) = '$month' $where ORDER BY date DESC";
$result = $database->query($sql);
if ( $result->numRows() > 0 ) {
    while( $row = $result->fetchRow() ) {
        $text = $row['day'];
        if ( ! empty( $row['descr'] ) ) {
            $text .= ' <span>'.$row['descr'].'</span>';
        }
        if ( ! empty( $row['url'] ) ) {
        //eingefuegt falls mehrere Termine an einem Tag liegen und eine URL existiert
            if (isset($days[ $row['day'] ])) {
        $days[ $row['day'] ]
             = array(
                  NULL,
                  NULL,
                  $days[ $row['day'] ][2]
                 . "<span style='font-weight: bold; border: 1px solid #f00;'>"
        . "<a class='tooltip' href='#' //
           >"         //".$row['url']."' target='_blank'
           //onmouseout='INFO.innerHTML=\"&nbsp;\"'
           //onmouseover='INFO.innerHTML=\"".$row['descr']."\"'>"
        . "<sup style='font-size:0.4em;'>*</sup>" //. $row['day']
        . "<span><b>".$row['day'].".".$month.".".$year."</b><br />".$row['descr']."</span>"  //eingefuegt
        . "</a></span>"
             );
    }
            else {
            //urspruengliche Definition des Arrays
            $days[ $row['day'] ]
                      = array(
   NULL,
                           NULL,
                           "<span style='font-weight: bold; border: 1px solid #f00;'>"
                         . "<a class='tooltip' href='#'
                           >"         //".$row['url']."' target='_blank'
                           //onmouseout='INFO.innerHTML=\"&nbsp;\"'
                           //onmouseover='INFO.innerHTML=\"".$row['descr']."\"'>"
                         . "<span><b>".$row['day'].".".$month.".".$year."</b><br />".$row['descr']."</span>"    // eingefuegt
                         . $row['day']
                         . "</a></span>"
                      );
            };
        }
        else {
        //eingefuegt falls mehrere Termine an einem Tag liegen und keine URL vorhanden ist   
     if (isset($days[ $row['day'] ])) {
         $days[ $row['day'] ]
              = array(
                   NULL,
                   NULL,
                   $days[ $row['day'] ][2]
      . "<span style='font-weight: bold; border: 1px solid #f00;'>"
                    . "<a class='tooltip' href='#'
                       >"
                      //onmouseout='INFO.innerHTML=\"&nbsp;\"'
                      //onmouseover='INFO.innerHTML=\"".$row['descr']."\"'>"
                    . "<sup style='font-size:0.4em;'>*</sup>" //. $row['day']
                 . "<span><b>".$row['day'].".".$month.".".$year."</b><br />".$row['descr']."</span>"
                 . "</a></span>"
                      );
       }
     else {
             //urspruengliche Definition des Arrays
  $days[ $row['day'] ]
                       = array(
                            NULL,
                            NULL,
                            "<span style='font-weight: bold; border: 1px solid #f00;'>"
                          . "<a class='tooltip' href='#'
                            >"
//                          onmouseout='INFO.innerHTML=\"&nbsp;\"'
//                          onmouseover='INFO.innerHTML=\"".$row['descr']."\"'>
  . $row['day']
                      . "<span><b>".$row['day'].".".$month.".".$year."</b><br />".$row['descr']."</span>"
                      . "</a></span>"
                       );
             };
        }
        $events++;
    }
}

if ( ! isset( $days[$today] ) ) {
    $days[$today] = array( NULL, 'calendar-today' );
}

$first_of_month = gmmktime(0,0,0,$month,1,$year);
#remember that mktime will automatically correct if invalid dates are entered
# for instance, mktime(0,0,0,12,32,1997) will be the date for Jan 1, 1998
# this provides a built in "rounding" feature to generate_calendar()

$day_names = array(); #generate all the day names according to the current locale
for($n=0,$t=(3+$first_day)*86400; $n<7; $n++,$t+=86400) #January 4, 1970 was a Sunday
   $day_names[$n] = ucfirst(gmstrftime('%A',$t)); #%A means full textual day name - deprec: gmstrftime

// reset locale
setlocale(LC_TIME, $oldlocale);

list($month, $year, $month_name, $weekday) = explode(',',gmstrftime('%m,%Y,%B,%w',$first_of_month)); #%A deprec gmstrftime
$weekday = ($weekday + 7 - $first_day) % 7; #adjust for $first_day
switch ($month_name) {
   case "January":
         $month_name="Januar";
         break;
   case "February":
         $month_name="Februar";
         break;
   case "March":
         $month_name="M\344rz";
         break;
   case "May":
         $month_name="Mai";
         break;
   case "June":
         $month_name="Juni";
         break;
   case "July":
         $month_name="Juli";
         break;
   case "October":
         $month_name="Oktober";
         break;
   case "December":
         $month_name="Dezember";
         break;
}
$title   = htmlentities(ucfirst($month_name)).'&nbsp;'.$year;  #note that some locales don't capitalize month and day names

#Begin calendar. Uses a real <caption>. See http://diveintomark.org/archives/2002/07/03
#@list($p, $pl) = each($pn); @list($n, $nl) = each($pn); #previous and next links, if applicable
$p = key($pn);
$pl = current($pn);
$n = key($pn);
$nl = current($pn);
if($p) $p = '<span class="calendar-prev">'.($pl ? '<a href="'.htmlspecialchars($pl).'">'.$p.'</a>' : $p).'</span>&nbsp;';
if($n) $n = '&nbsp;<span class="calendar-next">'.($nl ? '<a href="'.htmlspecialchars($nl).'">'.$n.'</a>' : $n).'</span>';
$calendar = '<div align="right" style="float:right;"><table class="calendar">'."\n".
   '<caption class="calendar-month">'.$p.($month_href ? '<a href="'.htmlspecialchars($month_href).'">'.$title.'</a>' : $title).$n."</caption>\n<tr>";

if($day_name_length){ #if the day names should be shown ($day_name_length > 0)
   #if day_name_length is >3, the full name of the day will be printed
   foreach($day_names as $d)
      $calendar .= '<th abbr="'.htmlentities($d).'">'.htmlentities($day_name_length < 4 ? substr($d,0,$day_name_length) : $d).'</th>';
   $calendar .= "</tr>\n<tr>";
}

if($weekday > 0) $calendar .= '<td colspan="'.$weekday.'">&nbsp;</td>'; #initial 'empty' days
for($day=1,$days_in_month=gmdate('t',$first_of_month); $day<=$days_in_month; $day++,$weekday++){
   if($weekday == 7){
      $weekday   = 0; #start a new week
      $calendar .= "</tr>\n<tr>";
   }
   if(isset($days[$day]) and is_array($days[$day])){
      @list($link, $classes, $content) = $days[$day];
      if(is_null($content))  $content  = $day;
      $calendar .= '<td'.($classes ? ' class="'.htmlspecialchars($classes).'">' : '>').
         ($link ? '<a href="'.htmlspecialchars($link).'">'.$content.'</a>' : $content).'</td>';
   }
   else $calendar .= "<td>$day</td>";
}
if($weekday != 7) $calendar .= '<td colspan="'.(7-$weekday).'">&nbsp;</td>'; #remaining "empty" days
$calendar .= "</tr>\n</table><div id='INFO'>&nbsp;</div><br />\n";

if ( $events == 0 ) {
    $calendar .= '<font class="INFO">Keine Termine f&uuml;r diesen Monat.<br /></font>';
}
else {
    $calendar .= '<font class="INFO">'.$events.' '.'Termin'
              .  ( $events > 1 ? 'e' : '' )
              .  ' f&uuml;r diesen Monat.<br /></font>';
}
$calendar .="</div>";
return $calendar;
Title: Re: EventCal Droplet enthält gmstrftime() - in PHP 8.1 deprecated
Post by: sternchen8875 on January 14, 2024, 06:09:30 PM
so trotz des DEPRECATED genutzt

DEPRECATED ist ein Hinweis auf eine in der nahen Zukunft folgenden Änderung. Im speziellen Fall ist es so, das die Funktionen strftime() und gmstrftime() mit PHP 9.0 abgeschaltet werden. Bis dahin ist also Zeit, dies zu reparieren

In deinem Fall geht es um gmstrftime() , das sorgt 2x für Ärger

einmal hier für die Tagesnamen in Kurzform (Mo, Di usw)
Code: [Select]
$day_names = array(); #generate all the day names according to the current locale
for($n=0,$t=(3+$first_day)*86400; $n<7; $n++,$t+=86400) #January 4, 1970 was a Sunday
   $day_names[$n] = ucfirst(gmstrftime('%A',$t)); #%A means full textual day name - deprec: gmstrftime

Da du wohl nur Deutsch als Sprache verwendest, eine einfache Lösung, die  oben genannten Zeile auskommentieren und mit diesem Code ersetzen
Code: [Select]
$day_names = array('Mo','Di','Mi','Do','Fr','Sa','So');
nächster Punkt wäre dieser hier, dein originaler Code
Code: [Select]
list($month, $year, $month_name, $weekday) = explode(',',gmstrftime('%m,%Y,%B,%w',$first_of_month));
ersetzen mit
Code: [Select]
list($month, $year, $month_name, $weekday) = explode(',',date('n,Y,F,N',$first_of_month));
Wenn ich nix vergessen hab, sollte es das gewesen sein
Title: Re: EventCal Droplet enthält gmstrftime() - in PHP 8.1 deprecated
Post by: hillschmidt on January 14, 2024, 07:46:21 PM
cool!
Ich warte noch einen Tag ab (LogEntries?), aber ich glaube, das hat PERFEKT geholfen - Vielen Dank!