Paludalein (mal wieder): Automatische Update Anzeige?

Hallo zusammen

Gibt es eine möglichkeit, eine Grafik einzubauen, die das jeweils neuste Update-Datum anzeigt? Also in form von: letztes update: xx xx xx oder so, die sich jeweils selbst aktualisiert bei FTP tätigkeit?

Unter dem Suchbegriff "update" finden sichnur irgendwelche Strings, mit denen ich nichts anfangen kann, bin also froh um eure Hilfe.

  1. Hallo,

    Gibt es eine möglichkeit, eine Grafik einzubauen, die das jeweils neuste Update-Datum anzeigt? Also in form von: letztes update: xx xx xx oder so, die sich jeweils selbst aktualisiert bei FTP tätigkeit?

    sowas? http://selfhtml.teamone.de/javascript/objekte/document.htm#last_modified
    wenn schon grafiken, da kannst du sie ja je nach datum aus kleineren zusammenstellen.

    Grüße aus Düsseldorf,

    --
    Aleksej
    1. hmmm ja sowas in der Art, aber: da steht, es gilt nur für die Datei, in die das eingebaut ist, nicht aber für alle Seiten eines Webprojekts.

      Ich suche nach etwas, das auf jeden neuen upload reagiert, oder kann man das LastModified so umbauen?

  2. Moin, moin!

    Wenn Du anzeigen lassen möchtest, wann zuletzt irgendeine Datei Deiner Seiten geändert wurde, kommst Du wohl an einer serverbasierten Lösung nicht vorbei. Das bedeutet z.B. per SSI die Ausgabe eines Perl-Skriptes in den Quelltext zu integrieren. Ein solches Beispiel könnte ich liefern. Aber dazu solltest Du klären, ob Du SSI und Perl/CGI nutzen kannst.

    Norbert

    1. »»SSI
      -> keine Ahnung, muss erst mal rausfinden was das ist :)

      »»und Perl/CGI nutzen kannst.

      CGI kann ich nutzen, kein Problem.

      1. Nochmals moin, moin!

        Wenn Du CGI nutzen kannst, wird wohl auch SSI funktionieren. Bei meiner Lösung müßtest Du in eine Seite etwas einbauen wie
          Letztes Update: <!--#include virtual="/cgi-bin/update.pl"-->

        Und so sähe das Skript /cgi-bin/update.pl aus:

        #!/usr/bin/perl
        print "Content-type: text/html\n\n";

        benötigte Module einbinden

        use File::stat;
        use Time::localtime;

        oberstes zu berücksichtigendes Verzeichnis benennen ("..", wenn dieses Skript in /cgi-bin liegt)

        @startverzeichnis = "..";

        Variable für die neueste Zeitangabe

        $maxtimestamp = 0;

        #Dateien und Verzeichnisse, die fuer das Aenderungsdatum nicht beruecksichtigt werden sollen
        @ignorieren       = (
                              "cgi-bin/counter.pl",
                              ".log"
                            );
        for ($ignoriername=0; $ignoriername<=$#ignorieren; $ignoriername++)
        { $ignorierstring .= uc($ignorieren[$ignoriername])."|"; }
        $ignorierstring = substr($ignorierstring, 0, length($ignorierstring)-1);
        $ignorierstring =~ s///\//ig;
        $ignorierstring =~ s/./\./ig;

        Alle Dateien in allen Verzeichnisse durchgehen

        while ($startverzeichnis[$i])
        {
          @direct = ();
          @direct = &Getdir($startverzeichnis[$i]);
          if (@direct)
          {
            foreach $datei (@direct)
            {
              $vollname = $startverzeichnis[$i]."/".$datei;
              if ((-r $vollname) && (not (-d $vollname)) && (not (-l $vollname)))
              { # wenn es sich um eine Datei handelt

        # Timestamp lesen
         $filetime = stat($vollname)->mtime;

        # Timestamp speichern, wenn die Datei nicht ignoriert werden soll  und es der bisher höchste ist
         if ($filetime > $maxtimestamp && !($vollname =~ /$ignorierstring/i)) {$maxtimestamp = $filetime}
              }
              if ((-d $vollname) && (not (-l $vollname)) && ($datei !~ /^./) && (-x $vollname))
              { # wenn es sich um ein Unterverzeichnis handelt, muß es ebenfalls betrachtet werden
         push(@startverzeichnis,$vollname);
              }
            }
          }
          $i++;
        }

        Timestamp in Zeitpunkt-Angabe umwandeln

        $date_string = ctime($maxtimestamp);

        Monatbezeichnungen durch numerische Werte ersetzen

        $date_string =~ s/Jan/01/;
        $date_string =~ s/Feb/02/;
        $date_string =~ s/Mar/03/;
        $date_string =~ s/Apr/04/;
        $date_string =~ s/May/05/;
        $date_string =~ s/Jun/06/;
        $date_string =~ s/Jul/07/;
        $date_string =~ s/Aug/08/;
        $date_string =~ s/Sep/09/;
        $date_string =~ s/Oct/10/;
        $date_string =~ s/Nov/11/;
        $date_string =~ s/Dec/12/;

        Zeitpunkt-Angabe in Bestandteile aufsplitten

        @Zeit = split(/ +/,$date_string);

        Tagesdatum stets 2-stellig

        if ($Zeit[2] < 10) { print "0"; }

        relevante Bestandteile und trennende Punkte ausgeben

        print "$Zeit[2].$Zeit[1].$Zeit[4]";

        Unterverzeichnis bearbeiten

        sub Getdir
        {
          my ($verzeichnissname) = $_[0];
          my @dirent ="";
          if (-d $verzeichnissname)
          {
            if (not (-r $verzeichnissname)) { return ""; } # Verzeichnis nicht lesbar
            if (-l $verzeichnissname)       { return ""; } # keinen Links folgen
            opendir(DH,$verzeichnissname);
            @dirent = sort grep(!/^./, readdir(DH));
            closedir DH;
            return @dirent;
          }
          else { return ""; }
        }

        Alles klar?
        Norbert

        1. Nochmals moin, moin!

          Wenn Du CGI nutzen kannst, wird wohl auch SSI funktionieren. Bei meiner Lösung müßtest Du in eine Seite etwas einbauen wie
            Letztes Update: <!--#include virtual="/cgi-bin/update.pl"-->

          Soweit klar...

          Und so sähe das Skript /cgi-bin/update.pl aus:

          benötigte Module einbinden

          use File::stat;
          use Time::localtime;

          was sind des für Module?

          Variable für die neueste Zeitangabe

          $maxtimestamp = 0;

          immer = 0?

          #Dateien und Verzeichnisse, die fuer das Aenderungsdatum nicht beruecksichtigt werden sollen
          @ignorieren       = (
                                "cgi-bin/counter.pl",
                                ".log"
                              );
          for ($ignoriername=0; $ignoriername<=$#ignorieren; $ignoriername++)
          { $ignorierstring .= uc($ignorieren[$ignoriername])."|"; }
          $ignorierstring = substr($ignorierstring, 0, length($ignorierstring)-1);
          $ignorierstring =~ s///\//ig;
          $ignorierstring =~ s/./\./ig;

          kann ich weglassen... oder? entweder das oben oder das unten eingeben?

          Alle Dateien in allen Verzeichnisse durchgehen

          while ($startverzeichnis[$i])
          {
            @direct = ();
            @direct = &Getdir($startverzeichnis[$i]);
            if (@direct)
            {
              foreach $datei (@direct)
              {
                $vollname = $startverzeichnis[$i]."/".$datei;
                if ((-r $vollname) && (not (-d $vollname)) && (not (-l $vollname)))
                { # wenn es sich um eine Datei handelt

          # Timestamp lesen
           $filetime = stat($vollname)->mtime;

          # Timestamp speichern, wenn die Datei nicht ignoriert werden soll  und es der bisher höchste ist
           if ($filetime > $maxtimestamp && !($vollname =~ /$ignorierstring/i)) {$maxtimestamp = $filetime}
                }
                if ((-d $vollname) && (not (-l $vollname)) && ($datei !~ /^./) && (-x $vollname))
                { # wenn es sich um ein Unterverzeichnis handelt, muß es ebenfalls betrachtet werden
           push(@startverzeichnis,$vollname);
                }
              }
            }
            $i++;
          }

          Kann ich das gleich so übernehmen? Macht es da alles automatisch? Da habe ich nämlich null Ahnung von.

          Timestamp in Zeitpunkt-Angabe umwandeln

          $date_string = ctime($maxtimestamp);

          Monatbezeichnungen durch numerische Werte ersetzen

          $date_string =~ s/Jan/01/;
          $date_string =~ s/Feb/02/;
          $date_string =~ s/Mar/03/;
          $date_string =~ s/Apr/04/;
          $date_string =~ s/May/05/;
          $date_string =~ s/Jun/06/;
          $date_string =~ s/Jul/07/;
          $date_string =~ s/Aug/08/;
          $date_string =~ s/Sep/09/;
          $date_string =~ s/Oct/10/;
          $date_string =~ s/Nov/11/;
          $date_string =~ s/Dec/12/;

          muss ich hier noch was dran ändern/modifizieren?

          Zeitpunkt-Angabe in Bestandteile aufsplitten

          @Zeit = split(/ +/,$date_string);

          Tagesdatum stets 2-stellig

          if ($Zeit[2] < 10) { print "0"; }

          relevante Bestandteile und trennende Punkte ausgeben

          print "$Zeit[2].$Zeit[1].$Zeit[4]";

          wie oben...

          Unterverzeichnis bearbeiten

          sub Getdir
          {
            my ($verzeichnissname) = $_[0];
            my @dirent ="";
            if (-d $verzeichnissname)
            {
              if (not (-r $verzeichnissname)) { return ""; } # Verzeichnis nicht lesbar
              if (-l $verzeichnissname)       { return ""; } # keinen Links folgen
              opendir(DH,$verzeichnissname);
              @dirent = sort grep(!/^./, readdir(DH));
              closedir DH;
              return @dirent;
            }
            else { return ""; }
          }

          Was mach ich hiermit?

          1. Moin!

            Nochmals moin, moin!

            Wenn Du CGI nutzen kannst, wird wohl auch SSI funktionieren. Bei meiner Lösung müßtest Du in eine Seite etwas einbauen wie
              Letztes Update: <!--#include virtual="/cgi-bin/update.pl"-->

            Die einfachste Lösung (und vor allem die performanteste) dürfte sein, einfach mit
            <!--#include virtual="/datum.txt"-->
            einen kurzen Textschnippsel an gewünschter Stelle einzufügen, und dort manuell das Datum reinzuschreiben.

            Das kann auch durch z.B. Phase 5 automatisiert geschehen, indem man diese Datei immer mit ändert (bzw. "nur" neu speichert).

            Wahlweise kann man sie durch ein manuell gestartetes Skript auch automatisch berechnen lassen.

            Nur würde ich nicht für solch ein dummes Datum sämtliche Verzeichnisse mit sämtlichen Dateien des gesamten Webauftritts durchgehen, nur um solch eine (IMHO auch verzichtbare bzw. nicht wirklich 100% exakt notwendige) Angabe zu generieren.

            Zumindest gehört in das Skript noch ein Caching-Mechanismus, der das aufwendige  Generieren des Datum nur _einmal_ pro Tag anstößt (üblicherweise wird das beim ersten Seitenaufruf gleich nach Mitternacht sein), und ansonsten einfach nur kurz eine Textdatei mit dem gespeicherten Datum auswirft.

            - Sven Rautenberg

            --
            Diese Signatur gilt nur am Freitag.
          2. Moin, moin!

            Die Module werden gebraucht, um die Timestamps der Dateien lesen und diese Angaben in ein Datumsformat konvertieren zu können. Du wirst Dich nicht weiter darum kümmern müssen, da diese Module in der Regel installiert sind.

            $maxtimestamp setze ich nur anfänglich auf 0 und überschreibe den Wert immer, wenn ich einen höheren Timestamp gefunden habe.

            Den Block, den ich mit "#Dateien und Verzeichnisse, die fuer das Aenderungsdatum nicht beruecksichtigt werden sollen" überschrieben habe, kannst Du weglassen, wenn wirklich alle Dateien berücksichtigt werden sollen. In diesem Fall kann später noch in einer if-Abfrage der Teil "&& !($vollname =~ /$ignorierstring/i" entfernt werden.

            Der ganze Rest des Quelltextes kommt in eine Datei, die in meinem Beispiel "update.pl" heißen un dim Verzeichnis /cgi-bin liegen müßte. Weitere Änderungen sind nicht erforderlich.

            Diese Lösung ist praktikabel, wenn es sich nicht um Seiten handelt, die aus tausenden von Dateien bestehen. Sie hat den Vorteil, daß niemand daran denken muß, nach einer Aktualisierung irgendwo auch noch ein Datum zu ändern. Und sie zeigt das Updatedatum sofort nach einer Änderung an, nicht erst am nächsten Tag.

            Norbert

  3. Hallo zusammen

    Gibt es eine möglichkeit, eine Grafik einzubauen, die das jeweils neuste Update-Datum anzeigt? Also in form von: letztes update: xx xx xx oder so, die sich jeweils selbst aktualisiert bei FTP tätigkeit?

    Nun ja, vielleicht ein wenig "altbacken", aber ich habe in meinen Seiten eine Variable von meinem Editor reisetzen lassen (Phase5), die sich nach dem ändern und speichern der bearbeiteten Seite aktualisiert. Ist ja eigentlich auch Sinn und Zweck der Sache.

    LG André