Bernd: Einträge hinzufügen

Hallo und guten Abend,

ich komme an einer Stelle nicht weiter. Folgenden Code habe ich

$lagerflaechen_Druck = lagerflaechen_Druck($mysqli, $_GET["lagerflaeche"]);
$ausgabe = array();
$arrayAmount = count($lagerflaechen_Druck);
$arrayAmount1 = $arrayAmount+5;
$lastPageNr = ($arrayAmount1 - 10)%10;
$lastPageNr = (count($arrayAmount1) - 10)%10;
 
$chunk = array_splice($lagerflaechen_Druck, 0, 10);

<page backtop="1%" backbottom="1%" backleft="5%" backright="5%">
 <?php foreach($chunk as $array){ ?>
 <?php } ?>
</page>

Für weitere Seiten geht es dann so weiter

<!-- Seite 2 -->
<?php 
while(count($lagerflaechen_Druck) > 0) {

$arrayAmount = count($lagerflaechen_Druck);
$lastPageNr = ($arrayAmount - 10)%10;
$lastPageNr = (count($arrayAmount) - 10)%10;

$chunk = array_splice($lagerflaechen_Druck, 0, 10); ?>
<page backtop="1%" backbottom="1%" backleft="5%" backright="5%"> 
  <?php foreach($chunk as $array){ ?>
  <?php } ?>
</page>

läuft auch alles wunderbar. Jetzt möchte ich gerne immer ans Ende noch 5 leere Zeilen einfügen. Diese sehen so aus

<tr>
			  <td style="width: 50px; border: 1px solid #000000; height: 30px; padding-left: 5px; padding-top: 5px"></td>
			  <td style="width: 420px; border: 1px solid #00000; height: 30px; padding-left: 5px; padding-top: 5px"></td>
			  <td style="width: 180px; border: 1px solid #000000; height: 30px; padding-left: 5px; padding-top: 5px"></td>
		  </tr>

Bei html2pdf muss ich leider inline-css nutzen.

Jetzt ist die Frage, wie hänge ich diese immer ans Ende, die Anzahl müsste ich ja dann um 5 erhöhen, denn es soll ja weiterhin dynamisch bleiben. Ich ich habe einfach keine Idee.

  1. Hallo Bernd,

    deine Frage ist - mit Verlaub - scheußlich. Du gibst viel zu wenig Informationen preis, als dass man irgendwas sinnvolles dazu sagen könnte.

    die Anzahl müsste ich ja dann um 5 erhöhen

    Die Anzahl wovon denn?

    wie hänge ich diese immer ans Ende

    Ans Ende wovon denn? Einfach unter die letzte Seite? Dann: Einfach da hin pinnen. Aber das scheint nicht deiner Absicht zu entsprechen.

    Meine Vermutung wäre ja, dass $lagerflaechen_Druck hier die zentrale Rolle spielt - aber was steht da drin? Scheinbar ist das ein Array aus Arrays, und du nimmst Dir immer 10 dieser Arrays als einen Chunk und verarbeitest ihn mit einer foreach-Schleife zu einer Seite. Aber wie? Wie steht ein Chunk oder ein Eintrag in einem der Arrays, aus dem er besteht, mit deinen Leerzeilen in Beziehung? Eigentlich müsstest Du, wenn Du uns das ordentlich beantworten kannst, die Antwort auf deine Leerzeilen automatisch finden.

    Rolf

    --
    sumpsi - posui - clusi
    1. Guten Morgen,

      mit dieser Zeile lese ich meine Einträge in der Datenbank aus

      $lagerflaechen_Druck = lagerflaechen_Druck($mysqli, $_GET["lagerflaeche"]);
      

      Mit dieser Zeile ermittel ich die Anzahl der Einträge die ich erhalte

      $arrayAmount = count($lagerflaechen_Druck);
      

      Hier dachte ich, dass ich auf die Anzahl +5 hinzufüge, was aber leider nicht funktioniert hat, kann ja auch nicht, denn die 5 leeren kommen ja nicht aus der Datenbank sondern diese füge ich händisch hinzu.

      $arrayAmount1 = $arrayAmount+5;
      

      Hier lege ich nun die Einträge für die erste Seite fest. In diesem Fall benötige ich für die erste Seite 10 Einträge.

      $lastPageNr = ($arrayAmount1 - 10)%10;
      $lastPageNr = (count($arrayAmount1) - 10)%10;
       
      $chunk = array_splice($lagerflaechen_Druck, 0, 10);
      

      Damit baue ich dann die PDF Seite zusammen. Mit foreach lese ich die Einträge aus dem Array aus und stelle diese da, diesen Bereich habe ich weg gelassen, da dieser hier uninteressant ist?

      <page backtop="1%" backbottom="1%" backleft="5%" backright="5%">
       <?php foreach($chunk as $array){ ?>
       <?php } ?>
      </page>
      

      Jetzt kommen wir zu der zweite bzw. zu den Fortlaufenden Seiten bis alle Einträge vollständig geladen sind, auch hier lese ich pro Seite 10 Einträge aus. Jetzt könnt ihr euch fragen warum dann so umständlich wenn auch auf Seite 1 10 Einträge ausgelesen werden. Es gibt immer mal wieder die Option dass ich auf der ersten Seite weniger Einträge benötige wie auf den fortlaufenden Seiten wenn ich z.B. eine Adresse mit ausdrucken möchte.

      <!-- Seite 2 -->
      <?php 
      while(count($lagerflaechen_Druck) > 0) {
      
      $arrayAmount = count($lagerflaechen_Druck);
      $lastPageNr = ($arrayAmount - 10)%10;
      $lastPageNr = (count($arrayAmount) - 10)%10;
      
      $chunk = array_splice($lagerflaechen_Druck, 0, 10); ?>
      <page backtop="1%" backbottom="1%" backleft="5%" backright="5%"> 
        <?php foreach($chunk as $array){ ?>
        <?php } ?>
      </page>
      

      So und jetzt sind wir wieder bei meinem Problem. Ich möchte nachdem alle Einträge ausgegeben sind noch zusätzlich 5 leere Einträge Anhängen. Die 5 Einträge erzeuge ich so

      <?php 
      $countInhaltLeer = 1;
      while($countInhaltLeer <= 5) { 
      ?>
      <tr>
        <td></td>
        <td></td>
        <td></td>
      </tr>
      <?php
        $countInhaltLeer ++; 
      } ?>
      

      Und mein Problem ist, ich weiß nicht wie ich es schaffe, diese immer ganz hinten anzuhängen. Die 5 müssen ja mit in die Berechnung einfließen, denn wenn auf der letzten Seite nur noch für 2 Platz sind, dann muss eine weitere Seite angehängt werden mit den letzten 3 leeren Einträge. Wenn nur noch für einen Platz ist, dann müssen die restlichen 4 leere Einträge auf einer weiteren Seite angezeigt werden usw ....

      1. Hallo Bernd,

        kann ja auch nicht, denn die 5 leeren kommen ja nicht aus der Datenbank sondern diese füge ich händisch hinzu.

        diesen Bereich habe ich weg gelassen, da dieser hier uninteressant ist?

        Doch, genau hier ist dein Eingreifpunkt. Da Du die Chunks basierend auf der Anzahl Einträge im $lagerflaechen_Druck Array erzeugst, müssen da die Einträge hinein, die nachher zu den Leerzeilen führen. Das Verarbeiten deiner Chunks ist mutmaßlich auf erster Seite und den Folgeseiten gleich, es wäre also praktisch, das Abarbeiten eines Chunks in eine Funktion auszulagern.

        Während der Chunk-Abarbeitung musst Du dann irgendwie erkennen, ob es eine normale Zeile ist oder eine Abschlussleerzeile und dann entsprechend die Ausgabe erzeugen. Eine Möglichkeit könnte sein, an das $lagerflaechen_Druck Array fünf Einträge mit Inhalt NULL oder FALSE anzuhängen; in der Chunk-Aufbereitung fragst Du das dann ab und erzeugst das eine oder andere.

        <page backtop="1%" backbottom="1%" backleft="5%" backright="5%"> 
          <?php RenderChunk($chunk); ?>
        </page>
        

        Im PHP Teil steht dann:

        function RenderChunk($chunkArray) 
        {
           foreach($chunk as $array)
           {
              if ($array === FALSE)
                 RenderEmptyEntry();
              else
                 RenderDataEntry($array);
           }
        }
        function RenderEmptyEntry($chunkArray) 
        {
           ...
        }
        function RenderDataEntry($chunkArray) 
        {
           ...
        }
        

        In RenderEmptyEntry erzeugst Du eine Leerzeile, in RenderDataEntry erzeugst Du eine Row mit Datenbankdaten. Namen sind Schall und Rauch - wenn Dir Die Namen nicht gefallen, mach Dir bessere :)

        Rolf

        --
        sumpsi - posui - clusi
        1. Hallo,

          danke für deine Erklärung. Ich verstehe allerdings nicht so recht, was in RenderEmptyEntry und in RenderDataEntry stehen muss / soll? Kommt hier meine HTML Ausgabe rein?

          Und es muss nicht immer sein, dass meine erste und zweite / fortlaufende Seiten gleich sind wie die erste. Nur in diesem Fall ist es zufällig so.

          1. Hallo,

            kann ich denn für mein Vorhaben nicht die array-push Funktion von PHP nutzen?

            In der Doku heißt es

            und fügt die übergebenen Variablen an das Ende von array an

            Und genau dieses benötige ich ja?

            1. Hallo Bernd,

              deine Fragen sind in meinem Posting eigentlich beantwortet. Lies es nochmal, langsam.

              RenderEmptyEntry und RenderDataEntry - Kommt hier meine HTML Ausgabe rein?

              Ja. Da tust Du das, was Du vorher im Kern der foreach-Schleife stehen hattest. Diese Schleife hast Du zweimal, und wenn im Kern der Schleife das gleiche steht, gehört das in eine Funktion ausgelagert. Wenn Du andere Dokumente hast, wo das nicht so ist, kannst Du es der Übersichtlichkeit halber trotzdem in Funktionen auslagern, nur eben dann unterschiedliche Funktionen für Seite 1 und die Folgeseiten. DOT[1] und DRY[2] - das sind die beiden Maximen beim Strukturieren eines Programms in Funktionen (bzw. Methoden, wenn's eine Klasse ist).

              kann ich denn (...) nicht array-push (...) nutzen?

              Doch, sicher. Warum nicht? Hat das einer bestritten? Über diesen Teil habe ich gar nichts geschrieben, ich habe angenommen dass Du weißt wie man ein Array ergänzt.

              Um Werte an ein Array anzuhängen, gibt es zwei synomyme Methoden: array_push und []. Beispiel:

              $a = [ 1, 2, 3 ];       // Moderne Form von $a = ARRAY(1, 2, 3);
              
              array_push($a, 47, 11);
              $a[] = 12345;
              $a[] = 54321;
              
              var_dump($a);
              

              ergibt (mit ein paar gelöschten Zeilenumbrüchen):

              array(5) {
                [0] => int(1)
                [1] => int(2)
                [2] => int(3)
                [3] => int(47)
                [4] => int(11)
                [5] => int(12345)
                [6] => int(54321)
              }
              

              Vorteil von array_push ist, dass man mehrere Werte auf einmal anhängen kann. Für deine 5 Werte also die bessere Lösung.

              Rolf

              --
              sumpsi - posui - clusi

              1. Do One Thing - eine Funktion kümmert sich um genau EINE Aufgabe. ↩︎

              2. Don't Repeat Yourself - wenn der gleiche Code mehrfach auftritt, gehört er in eine Funktion. ↩︎

              1. Hallo,

                meine Idee war so

                $lagerflaechen_Druck = lagerflaechen_Druck($mysqli, $_GET["lagerflaeche"]);
                $lagerflaechen_Druck = array_push($lagerflaechen_Druck,'','','','','');
                

                Da habe ich wohl zu einfach gedacht, denn dabei erhalte ich eine Fehlermeldung

                Warning: array_splice() expects parameter 1 to be array, integer given in Warning: Invalid argument supplied for foreach()

                1. Es muss ja auch so heißen

                  $lagerflaechen_Druck = lagerflaechen_Druck($mysqli, $_GET["lagerflaeche"]); array_push($lagerflaechen_Druck,'','','','','');

                  Jetzt erhalte ich aber noch folgende Meldung

                  Warning: Illegal string quote hereoffset 'a_id'

                  1. Hallo,

                    hier habe ich 20 Einträge

                    $lagerflaechen_Druck = lagerflaechen_Druck($mysqli, $_GET["lagerflaeche"]);
                    $arrayAmount = count($lagerflaechen_Druck);
                    echo $arrayAmount;
                    

                    Füge ich jetzt array_push hinzu erhalte ich 25 Einträge, was ja auch stimmt, denn ich sage 5 kommen hinzu

                    array_push($lagerflaechen_Druck,'','','','','');
                    

                    Jetzt beim Ausdruck der PDF Datei werden plötzlich 15 Einträge hinzugefügt, wie kann dieses sein?

                    EDIT: Mein Fehler, ich hatte noch folgende fest im Code stehen

                    $countInhaltLeer = 1;
                    while($countInhaltLeer <= 5) { 
                    ?>
                    <tr>
                     <td ></td>
                     <td ></td>
                     <td ></td>
                     </tr>
                    <?php
                    $countInhaltLeer ++; 
                    } ?>
                    

                    Danke dir mal wieder für deine Hilfe!

                  2. Hallo Bernd,

                    das ist nun mal so - bei jeder Funktion muss man genau wissen was sie tut. array_push liefert zurück, wieviele Elemente nun im Array sind, kein geändertes Array :)

                    Illegal string quote hereoffset sagt mir gar nichts, diese Fehlermeldung hat noch niemand auf der Welt ins Netz gepostet. Vermutlich irgendwo ein Semikolon vergessen oder ein Anführungszeichen, das bringt PHP immer gründlich in Verwirrung.

                    Danke dir mal wieder für deine Hilfe!

                    Soll ich jetzt das You're Welcome Lied aus Vaiana singen? 😂 Habe leider kein animiertes Tattoo.

                    Rolf

                    --
                    sumpsi - posui - clusi