Marcus Vieß: Daten in Html ausgabe auf mehrere Seiten verteilen.

Hallo,

Ich habe einen kleinen hänger.
Bzw. ich bin gerade am anfang von Perl und sitzte jetzt vor einem kleinen Problem.
Pro Woche können da so um die 10-600 Bilder dazukommen.
ab 150 Bilder aufwärts fängts auch bei 4 Kb Thumbs an weh zu tun.
150 x 4 KB = 600 Kb auf der Seite zu laden. sind es noch mehr ...
Naja Ihr seht könnt ja rechnen. (Und nicht jeder hat ADSL)
Jetzt würde ich dieses kleine Script gerne dazu bekommen das er mir
ab 50 Thumbs eine neue Seite baut.
Also 1-50 auf Seite 1, 51-100 auf Seite 2 usw.

Könnt Ihr mir da ne kleine hilfe geben was ich hier noch machen muss.
Denkt bitte auch daran das die Link Seiten ja dynamisch sind also.
Mal sind es ja bei 150 z.B 3 Seiten, bei 100 sinds 2 usw.

Ich weiß nicht weiter ...
Für jede hilfe wäre ich sehr dankbar ...
So hab ich das bissher gemacht :

open(file, "$filename");
@lines=<file>;
close(file);

foreach $line (@lines)
{
@fields=split(/\s*|\s*/,$line);
$thumb=$fields[5];
print <<HTMLF;
<table><tr>
<td><center>Categorie Button: <br><b>$fields[2]</b></td>
<td><center>Item Description: <br><b>$fields[3]</b></td>
<td><center>Thumbnail:<br><a href="www.xxx.de/pics/$fields[1]">
<img src="www.xxx.de/pics/$fields[1]" border=0></a>
</tr><tr></table><hr>
HTMLF
}
exit;

  1. open(file, "$filename");
    @lines=<file>;
    close(file);

    foreach $line (@lines)
    {
    @fields=split(/\s*|\s*/,$line);
    $thumb=$fields[5];
    print <<HTMLF;
    <table><tr>
    <td><center>Categorie Button: <br><b>$fields[2]</b></td>
    <td><center>Item Description: <br><b>$fields[3]</b></td>
    <td><center>Thumbnail:<br><a href="www.xxx.de/pics/$fields[1]">
    <img src="www.xxx.de/pics/$fields[1]" border=0></a>
    </tr><tr></table><hr>
    HTMLF
    }
    exit;

    Mit einem Parameter kannst du ja den Index übergeben:

    www.xxx.de/cgi-bin/thumb.cgi?Index=51
    dann zeigt er z. B. 50 Thumbs ab dem Index 51 an.
    Ist der Parameter Index undefiniert, wird einfach Index=1 bzw 0 gesetzt.
    Programmierung: @lines = splice(@lines, $Index, $Index+51)
    somit eliminierst du alle Angaben, die nicht in der Page ausgegeben werden sollen
    HTML: Unten an der Seite kannst du dann einfach noch zwei/o. mehrere Links ausgeben:

    $indexBack=$Index-50;
    if ($Index < 0) {$Index=0}
    print "<a href="/cgi-bin/thumb.cgi?Index=$indexBack">50 zurück</a>";

    Hoffe, dass dies verständlich ist

    ---Philipp

    1. Ha, nicht ganz.

      Er zeigt zwar bei keiner parameterangabe Thumb 1-80 an.

      Sobald ich aber ?Index=-80 oder aber überhaupt mit dem Parameter arbeite kommt eine leere HTML seite.

      im mom sieht das script so aus :

      open(file, "$filename");
      @lines=<file>;
      close(file);

      foreach $line (@lines)
      {
      @fields=split(/\s*|\s*/,$line);
      @lines = splice(@lines, $Index, $Index+81);
      $thumb=$fields[5];
      print <<HTMLF;
      <blablablabla>
      HTMLF

      $indexBack=$Index-80;
      if ($Index < 0) {$Index=0}
      print "<a href="http://www.pbtoys.de/cgi-bin/newitemsneu.cgi?Index=$indexBack">80 zurück</a>";
      }

      kannst du mir nochmal kurz helfen.
      Scheint ja nur ne Kleinigkeit noch zu fehlen.

      1. Sobald ich aber ?Index=-80 oder aber überhaupt mit dem Parameter arbeite kommt eine leere HTML seite.

        Dann hast du wohl vergessen den Parameter überhaupt zu holen???
        z. B.:

        %Parameter = split(/=/, $ENV{'QUERY_STRING'});
        $Index = $Parameter{'Index'};
        if ($Index eq '')
        {
           $Index = 0;
        }

        $indexBack=$Index-80;
        if ($Index < 0) {$Index=0}
        print "<a href="http://www.pbtoys.de/cgi-bin/newitemsneu.cgi?Index=$indexBack">80 zurück</a>";
        }

        hier sollte es so sein:
        $indexBack=$Index-80;
        if ($indexBack < 0) { $indexBack=0 }
        ...

        kannst du mir nochmal kurz helfen.
        Scheint ja nur ne Kleinigkeit noch zu fehlen.

        eigentlich ja, sonst finde ich nichts, was das Problem verursachen könnte

        Viele Grüsse und Glück

        Philipp

        1. Hallo,

          %Parameter = split(/=/, $ENV{'QUERY_STRING'});
          $Index = $Parameter{'Index'};
          if ($Index eq '')
          {
             $Index = 0;
          }

          Ich denke doch, daß sich inzwischen das Modul CGI für die behandlung der CGI-Parameter durchgesetzt haben sollte.
          Das was Du hier vorschlägst ist absolut nicht krisensicher, sondern funktioniert nur richtig , wenn es maximal einen Parameter gibt.

          Scheint ja nur ne Kleinigkeit noch zu fehlen.

          eigentlich ja, sonst finde ich nichts, was das Problem verursachen könnte

          Naja,

          foreach $line (@lines)
          {
          @fields=split(/\s*|\s*/,$line);
          @lines = splice(@lines, $Index, $Index+81);
          $thumb=$fields[5];
          print <<HTMLF;
          <blablablabla>
          HTMLF

          $indexBack=$Index-80;
          if ($Index < 0) {$Index=0}
          print "<a href="http://www.pbtoys.de/cgi-bin/newitemsneu.cgi?Index=$indexBack">80 zurück</a>";
          }

          Hier liegt der Fehler wohl darin, daß das splice innerhalb der Arrayabarbeitung verändert wird. Ich denke, daß da recht bal ein Array mit leerem Inhalt die Folge ist.
          Richtiger wäre:

          #schmeissen wir mal alles weg was wir nicht brauchen
          @lines = splice(@lines, $Index, $Index+81);

          foreach $line (@lines)
          {
          #hier wird die Ausgabe der Zeileninhalte durchgeführt
          }

          Abgesehen davon vermisse ich schmerzlich 'use strict' bzw. ein my da oder dort (bzw. immer wenn eine Variable neu eingeführt wird).

          Grüße
            Klaus

          1. %Parameter = split(/=/, $ENV{'QUERY_STRING'});
            $Index = $Parameter{'Index'};
            if ($Index eq '')
            {
               $Index = 0;
            }

            Ich denke doch, daß sich inzwischen das Modul CGI für die behandlung der CGI-Parameter durchgesetzt haben sollte.
            Das was Du hier vorschlägst ist absolut nicht krisensicher, sondern funktioniert nur richtig , wenn es maximal einen Parameter gibt.

            Ist mir wohl bewusst! - Ich habe ja auch schon Programme mit mehreren Parametern verfasst... Nun, ich hatte mich nicht mehr an die Syntax errinnert, deshalb hab ich halt kurz ein anderes Konzept ausgedacht:

            Hier die bessere Variante:

            use CGI;
            $params = new CGI;
            $Index = $params->param('Index');

            und zufrieden? :-)

            Hier liegt der Fehler wohl darin, daß das splice innerhalb der Arrayabarbeitung verändert wird. Ich denke, daß da recht bal ein Array mit leerem Inhalt die Folge ist.
            Richtiger wäre:

            #schmeissen wir mal alles weg was wir nicht brauchen
            @lines = splice(@lines, $Index, $Index+81);
            foreach $line (@lines)
            {
            #hier wird die Ausgabe der Zeileninhalte durchgeführt
            }

            Oh, yehhh. Hast ja vollkommen recht! Ich entschuldige mich für den voreiligen Schluss. Natürlich, so hatte ich's eigentlich auch gedacht und habs dann auch gesehen (meine Phantomwahrnehmung, sorry).

            Abgesehen davon vermisse ich schmerzlich 'use strict' bzw. ein my da oder dort (bzw. immer wenn eine Variable neu eingeführt wird).

            Wäre schön, aber für dieses kleine (klein ist gut!) Programm wohl nicht sehr wichtig.

            Gruss

            Philipp

            1. Ist mir wohl bewusst! - Ich habe ja auch schon Programme mit mehreren Parametern verfasst... Nun, ich hatte mich nicht mehr an die Syntax errinnert, deshalb hab ich halt kurz ein anderes Konzept ausgedacht:

              Hier die bessere Variante:

              use CGI;
              $params = new CGI;
              $Index = $params->param('Index');

              und zufrieden? :-)

              nicht ganz [1] ;-)

              Oh, yehhh. Hast ja vollkommen recht! Ich entschuldige mich für den voreiligen Schluss. Natürlich, so hatte ich's eigentlich auch gedacht und habs dann auch gesehen (meine Phantomwahrnehmung, sorry).

              Hab mir sowas schon gedacht.

              Abgesehen davon vermisse ich schmerzlich 'use strict' bzw. ein my da oder dort (bzw. immer wenn eine Variable neu eingeführt wird).

              Wäre schön, aber für dieses kleine (klein ist gut!) Programm wohl nicht sehr wichtig.

              [1] Wenn man sowas nicht von Anfang konsequent umsetzt, ist das 'nachwässern' später um so mühsamer.
              Die Erfahrung hat mich gelehrt, daß oft sog. kleine Lösungen sich unheimlich hartnäckig gegen ihre 'Verschrottung' wehren und sich als langlebiger erweisen, als man Anfangs gedacht hat.

              Grüße
                Klaus

              1. Ich hab auch noch ein paar Fragen.

                Ich übergebe mit der Query noch andere Parameter.

                Wie trenne ich die ?

                Also ich habe im mom :

                use CGI;
                $params = new CGI;

                $Index = $params->param('Index');
                if ($Index eq ''){$Index = 0;}

                $wochen = $params->param('wochen');
                if ($wochen eq "1") {&viewentr1;}

                Ist jetzt der HTML Aufruf :

                http://www.pbtoys.de/cgi-bin/newitemsneu.cgi?wochen=1,Index=70

                z.B. in Ordnung ?

                und das zweite Problem ist das der jetzt wunderschön die thumbs teilt, aber auf der zweiten seite nicht mehr die Beschränkung von 70 Thumbs einhält.

                Also wenn ich so aufrufe =
                http://www.pbtoys.de/cgi-bin/newitemsneu.cgi?Index=30

                Dann macht er mit 110 Thumbs

                @lines = splice(@lines, $Index, $Index+70);
                $Index = $indexBack;
                foreach $line (@lines)
                {
                @fields=split(/\s*|\s*/,$line);
                $thumb=$fields[5];
                print <<HTMLF;
                <blablabla>
                HTMLF
                $indexBack=$Index-70;
                if ($indexBack < 1) { $indexBack=0 }

                print "<a href="http://www.pbtoys.de/cgi-bin/newitemsneu.cgi?Index=$indexBack">70 Products back / zurück</a>";
                }

                ??? Verstehe nicht woran das jetzt liegt ...

                1. Hallo,

                  Ich übergebe mit der Query noch andere Parameter.
                  Wie trenne ich die ?

                  Das erledigt, wenn alles richtig gemaicht wurde, das CGI-Modul.

                  Also ich habe im mom :

                  use CGI;
                  $params = new CGI;
                  $Index = $params->param('Index');
                  if ($Index eq ''){$Index = 0;}
                  $wochen = $params->param('wochen');
                  if ($wochen eq "1") {&viewentr1;}

                  fast richtig (ich steig nicht runter):

                  use strict;
                  use CGI;
                  my $params = new CGI; # $query wäre für micht klarer, aber bitte schön
                  my $Index = $params->param('Index');
                  if ($Index eq ''){$Index = 0;}
                  my $wochen = $params->param('wochen');
                  if ($wochen eq "1") {&viewentr1;} #der Stringvergleich ist auch nicht gerade schön

                  (Obwohl die Variablen nicht unbedingt benötigt werden würden. s.u.)

                  Ist jetzt der HTML Aufruf :

                  http://www.pbtoys.de/cgi-bin/newitemsneu.cgi?wochen=1,Index=70

                  z.B. in Ordnung ?

                  Grundsätzlich ja, aber es kommt nicht das raus was Du wahrscheinlich haben willst.
                  Hier steht nämlicht, daß der der CGI-Parameter 'wochen' auf '1,Index=70' gesetzt ist.

                  http://www.pbtoys.de/cgi-bin/newitemsneu.cgi?wochen=1&Index=70

                  ist, was Du willst. Warum das so ist, kannst Du beispielsweise unter http://selfhtml.teamone.de/cgiperl/intro/formularverarbeitung.htm#datenstrom nachlesen. [1]

                  und das zweite Problem ist das der jetzt wunderschön die thumbs teilt, aber auf der zweiten seite nicht mehr die Beschränkung von 70 Thumbs einhält.

                  Also wenn ich so aufrufe =
                  http://www.pbtoys.de/cgi-bin/newitemsneu.cgi?Index=30

                  Dann macht er mit 110 Thumbs

                  @lines = splice(@lines, $Index, $Index+70);
                  $Index = $indexBack;
                  foreach $line (@lines)
                  {
                  @fields=split(/\s*|\s*/,$line);
                  $thumb=$fields[5];
                  print <<HTMLF;
                  <blablabla>
                  HTMLF
                  $indexBack=$Index-70;
                  if ($indexBack < 1) { $indexBack=0 }

                  print "<a href="http://www.pbtoys.de/cgi-bin/newitemsneu.cgi?Index=$indexBack">70 Products back / zurück</a>";
                  }

                  ??? Verstehe nicht woran das jetzt liegt ...

                  Hmm, nicht wirklich, aber Alternative (Du ersparst Dir das Splice)

                  use strict;
                  use CGI;

                  my $query = new CGI;
                  my $images_per_page = 70;

                  das hier

                  &viewentr1 if $query->param('wochen') == 1;

                  anstelle von:

                  #my $wochen = $params->param('wochen');
                  #if ($wochen eq "1") {&viewentr1;}

                  my @lines = &readImageIndex(); # iergendeine Funktion, die eben Deine Index-Datei ausliest.

                  my $linecount;
                  my $maxcount = $query->param('Index')+ $line_per_pages;
                  $maxcount = $#lines if $maxcount>$#lines;

                  my $nextIndex = $maxcount+1;
                  my $prevIndex = $query->param('Index') - $line_per_pages;
                  $prevIndex = 0 if $prevIndex <0;

                  for($linecount = $query->param('Index');$linecount <$maxcount;$linecount++)
                    {
                    chomp $lines[$linecount]; # den Zeilenumbruch weg, falls vorhanden;
                    # hier die behandlung der Zeile $lines[$linecount]
                    }

                  Da fehlt jetzt noch einiges an behandlung der vor- und zurück-Links, aber das machst Du schon.
                  Ach ja, das erste Element eines Arrays hat den Index 0.

                  Grüße
                    Klaus

                  [1] Premiere, ich habe heute meinen ersten Link zu SelfHTML 8.0 gesetzt;-)

                  1. Jetzt hast du mich total überfordert !

                    Hilf bitte nochmal.

                    Ich zeig mal wie weit ich gekommen bin :

                    use CGI;

                    my $query = new CGI;
                    my $line_per_page = 70;

                    &viewentr if $query->param('wochen') == 1;

                    sub viewentr
                    {
                    open(file, "thumbdat.txt");
                    @lines=<file>;
                    close(file);

                    my $Index = $query->param('Index');
                    if ($Index eq ''){$Index = 0;}

                    my $linecount;
                    my $maxcount = $query->param('Index')+ $line_per_pages;
                    $maxcount = $#lines if $maxcount>$#lines;

                    my $nextIndex = $maxcount+1;
                    my $prevIndex = $query->param('Index') - $line_per_pages;
                    $prevIndex = 0 if $prevIndex <0;

                    for($linecount = $query->param('Index');$linecount <$maxcount;$linecount++)
                      {
                      chomp $lines[$linecount]; # den Zeilenumbruch weg, falls vorhanden;
                      # hier die behandlung der Zeile $lines[$linecount]
                      }

                    foreach $line (@lines)
                    {
                    @fields=split(/\s*|\s*/,$line);
                    $thumb=$fields[5];
                    $thumb=$thumb * 2;
                    $thumba=$thumb;
                    $thumba=$thumba / 2;

                    print <<HTMLF;
                    <blablabla>
                    HTMLF
                    $indexBack=$Index-70;
                    if ($indexBack < 1) { $indexBack=0 }

                    print "<a href="http://www.pbtoys.de/cgi-bin/newitemsneu.cgi?Index=$indexBack">70 Products back / zurück</a>";
                    }
                    exit;
                    }