marvin: JS-Dropdown-Problem: PHP-Skript benötigt HTTP_REFERER

Hi, ich habe auf meiner Seite eine JS-Dropdown-Auswahlliste eingebaut. Darüber kann der User Funktionen zur Seite auswählen, wie z.B. drucken.

Leider funktioniert das Drucken nicht, da durch den Aufruf mit dem Javascript der HTTP_REFERER zu dem Druckscript "web2printer4.php" nicht übermittelt wird.

Also, es geht darum, über ein JS-Dropdown, ein Fenster für ein Druck-Vorschau zu öffnen. Die php-Datei "web2printer4.php" liesst dabei bestimmte Inhaltsfelder der Ursprungsseite aus, damit nicht die Navigation oder Kommentare mitgedruckt werden. Problem: Die Datei weiß durch den JS-Script-Aufruf anscheinend nicht, welche ihre Ursprungsseite ist und kann dadurch keine Inhalte anzeigen.

Durch einen "normalen" Hyperlink-Aufruf, weiß das Skript dagegen welches die Ursprungsseite ist.

Wie kriege ich über das JS-Dropdown trotzdem den richtigen Bezug zur Seite´?

Ich brauche in etwa eine Zeile wie diese, die ein richtiges "a href" enthält und nicht nur einfach ein "open":

{
window.open(<a href="web2printer4.php">drucken</a>,'_blank');
}

Auf der Druckvorschau-Seite selber befindet sich dann <a href="java script:window.print()">drucken</a> um die Seite auszudrucken.

Wenn ihr andere Lösungsansätze kennt, lasst sie mich bitte wissen. Danke!

  1. Hat denn wirklich keiner eine Idee? Oder ist die Schilderung zu kompliziert? Bitte helft doch!

  2. Hallo Marvin,

    Leider funktioniert das Drucken nicht, da durch den Aufruf mit dem Javascript der HTTP_REFERER zu dem Druckscript "web2printer4.php" nicht übermittelt wird.

    Dann sorge doch einfach dafür, dass die aufgerufenen Seite weiß, worum es geht. Dafür sollte dir ein Formular genügend Möglichkeiten bieten, die Auswertung des Referrers jedenfalls ist eine denkbar schlechte Wahl.

    Ein wenig Quelltext oder noch besser ein Link zur Problemseite wäre übrigens sehr hilfreich.

    Freundschaft!
    Siechfred

    --
    Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
    Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)
    ie:) fl:) br:? va:{ ls:? fo:§ rl:( n4:} ss:? de:µ js:{ ch:° sh:( mo:? zu:}
    1. Hallo Sichfred, danke für Deine Antwort. Leider weiß ich jetzt noch nicht so ganz, was ich damit anfangen kann. Deswegen hier ein wenig mehr Informationen. Das neue Fenster (also die web2printer4.php) öffnet sich und schimpft: "Sorry! We need an HTTP_REFERER or javascript enabled to print this page."

      Das Javascript-Dropdown:

      <script language="JavaScript"><!--

      function go()
      {
      if (document.formName8.selectName8.options.value == "drucken")
      {
      window.open("web2printer4.php?img=0&lnk=0&style=css/styles.css");
      }

      else
       {
        window.location.href =
          document.formName8.selectName8.options[
            document.formName8.selectName8.selectedIndex
          ].value;
      }
      }
      //--></script>

      <form name="formName8" action="" style="display:inline;">
      <table cellpadding="0" cellspacing="0" border="0">
        <tr>
          <td>

      <select name="selectName8">
      <option selected value="#">Diese Seite ...</option>
      <option value="$clinkform">kommentieren</option>
      <option value="drucken">drucken</option>
      <option value="front_content.php?client=1&lang=1&idcat=2&idart=15&send2friend=1&send2friend_client=1&send2friend_lang=1&send2friend_idcat=11&send2friend_idart=14">weiterempfehlen</option>
      </select>
          </td>
          <td><a href="JavaScript:go()"><img src="images/l.gif" width="3" height="1" border="0" alt="platzhalter"><img
      src="images/suche.gif" border="0"></a>
          </td>
        </tr>
      </table>
      </form>
      ";
      ?>

      1. Hallo Marvin.

        <script language="JavaScript"><!--

        Das type-Attribut ist zwingend erforderlich, language hingegen optional.

        window.open("web2printer4.php?img=0&lnk=0&style=css/styles.css");

        Warum übergibst du hier dem PHP-Script nicht einfach den Namen der Ressource und wertest ihn dann innerhalb des Scriptes aus? Damit umgehst du alle Unsicherheiten bei der Übertragung des Referrers.

        <table cellpadding="0" cellspacing="0" border="0">
        [...]

        Bitte beachte http://www.wob11.de/gesetze/a_bitv.html#PI-5.

        <select name="selectName8">
        <option selected value="#">Diese Seite ...</option>
        <option value="$clinkform">kommentieren</option>
        <option value="drucken">drucken</option>

        Oder du überträgst den 'Referrer' als verstecktes Eingabefeld:
        http://de.selfhtml.org/html/formulare/versteckte.htm#definieren

        Freundschaft!
        Siechfred

        --
        Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
        Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)
        ie:) fl:) br:? va:{ ls:? fo:§ rl:( n4:} ss:? de:µ js:{ ch:° sh:( mo:? zu:}
        1. Hallo Siechfred,

          ehrlich gesagt bin ich ein ziemlicher noob was php angeht. Ich verstehe zwar theoretisch was da steht, aber ich weiß nicht wie ich es anwenden soll. Ich wäre Dir sehr dankbar, wenn Du mir das Ganze vorkauen bzw. als Zeilen einsetzen könntest. Die zweite Lösung hat sich für mich einfacher angehehört: Ein Input Feld habe ich vor dem select-Feld plaziert und die Javascript-Zeile oben vor dem window.open eingesetzt. Nur weiss ich weder wie der refferer abgefragt noch übergeben wird. Bitte hilf mir:

          <script type="text/javascript"><!--

          function go()
          {
          if (document.formName8.selectName8.options.value == "drucken")
          {
          document.Feedback.refferer.value = ????????????????;
          window.open("http://web2printer4.php?img=0&lnk=0&style=css/styles.css");
          }

          else
           {
            window.location.href =
              document.formName8.selectName8.options[
                document.formName8.selectName8.selectedIndex
              ].value;
          }
          }
          //--></script>

          <form name="formName8" action="" style="display:inline;">
          <table cellpadding="0" cellspacing="0" border="0">
            <tr>
              <td>

          <input type="hidden" name="refferer" value=""></input>

          <select name="selectName8">
          <option selected value="#">Diese Seite ...</option>
          <option value="$clinkform">kommentieren</option>
          <option value="drucken">drucken</option>
          <option value="front_content.php?client=1&lang=1&idcat=2&idart=15&send2friend=1&send2friend_client=1&send2friend_lang=1&send2friend_idcat=11&send2friend_idart=14">weiterempfehlen</option>
          <option value="javascript:Favorites();">bookmarken</option>
          </select>

          </td>
              <td><a href="JavaScript:go()"><img src="images/l.gif" width="3" height="1" border="0" alt="platzhalter"><img
          src="images/suche.gif" border="0"></a>
              </td>
            </tr>
          </table>
          </form>

          1. Hallo Marvin.

            Dein Problem ist nicht das Formular an sich sondern die Frage, wie du dem PHP-Script mitteilen kannst, um welche Seite es überhaupt geht. Die zwei Möglichkeiten hatte ich dir ja bereits genannt, wobei ich persönlich dazu neige, ein verstecktes Eingabefeld zu verwenden. Da du das Formular mittels PHP generierst, könnten dir die vordefinierten PHP-Variablen helfen:

            http://de3.php.net/reserved.variables

            Das Ganze könnte dann so aussehen:

            <input type="hidden" name="url" value="<?php echo $_SERVER['PHP_SELF'] ?>">

            Nun noch das Formular absenden, ganz ohne JavaScript, wenn es unbedingt ein neues Fenster sein soll, kannst du im einleitenden form-Tag zusätzlich ein target-Attribut verwenden (ist zwar nicht ganz regelkonform, sollte aber den gewünschten Effekt erzielen).

            Im PHP-Script steht dir nun der Wert für die URL zur Verfügung, mit dem du dann weiterarbeiten kannst.

            Freundschaft!
            Siechfred

            --
            Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
            Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)
            ie:) fl:) br:? va:{ ls:? fo:§ rl:( n4:} ss:? de:µ js:{ ch:° sh:( mo:? zu:}
            1. sorry, ich hatte den ganzen tag stress, ich hoffe du antwortest noch.

              ich kriege das einfach nicht hin, weil mir das wissen fehlt. und ich würds ja gerne umsetzen. die input-zeile habe ich jetzt eingesetzt. wird mein formular denn nicht automatisch in meinem script abgesendet? wie übergebe ich den wert an den teil der funktion der ausgeführt wird? und ich habe auch keine ahnung, wie der wert dann in dem druckscript weiterverarbeitet wird. würdest du mir das bitte in den folgenden code einsetzen und in das druckskript, da ich sonst garnicht klar komme. Freundschaft und vielen Dank! Gruß marvin

              <?php

              $url2 = $_SERVER['PHP_SELF'];

              echo "
              <script language="JavaScript" type="text/javascript"><!--

              function go()
              {
              if (document.formName8.selectName8.options.value == "drucken")
              {
              window.open("drucken.php");
              }

              else
               {
                window.location.href =
                  document.formName8.selectName8.options[
                    document.formName8.selectName8.selectedIndex
                  ].value;
              }
              }
              //--></script>

              <form name="formName8" action="" style="display:inline;" target="_blank">
              <table cellpadding="0" cellspacing="0" border="0">
                <tr>
                  <td>

              <input type="hidden" name="url" value=$url2>

              <select name="selectName8">
              <option selected value="#">Diese Seite ...</option>
              <option value="$clinkform">kommentieren</option>
              <option value="drucken">drucken</option>
              </select>

              </td>
                  <td><a href="JavaScript:go()"><img src="images/l.gif" width="3" height="1" border="0" alt="platzhalter"><img
              src="images/suche.gif" border="0"></a>
                  </td>
                </tr>
              </table>
              </form>
              ";

              1. Hallo Marvin,

                wird mein formular denn nicht automatisch in meinem script abgesendet?

                Nein, du öffnest lediglich ein Fenster mit dem Inhalt von drucken.php, abgesandt wird hier nichts. Kann auch nicht, denn du hast weder ein Formularziel definiert (das action-Attribut ist leer) noch übergibst du dem Script drucken.php irgendwelche Formularwerte.

                Vom Ansatz her könnte ein Formular so aussehen:

                <form name="formName8" action="drucken.php" method="POST">
                  <input type="hidden" name="url" value="<?echo $_SERVER['PHP_SELF'] ?>">
                  <option selected value="#">Diese Seite ...</option>
                  <option value="$clinkform">kommentieren</option>
                  <option value="drucken">drucken</option>
                  <input type="submit" name="submit" value="Absenden">
                </form>

                Wird der Button "Absenden" gedrückt, werden dem Script "drucken.php" die im Formular gewählten Name/Werte-Paare einschließlich des versteckten Eingabefeldes übergeben.

                Im PHP-Script kannst du diese mit Hilfe der vordefinierten Variable $_POST['...'] abfragen, wobei der Wert in den eckigen Klammern genau dem Namen des Formularfeldes entspricht, so wie du ihn in deinem versendeten Formular festgelegt hast. Du könntest auch die Methode GET verwenden, die Variable in PHP würde dann $_GET['...'] lauten. Zum Unterschied der beiden Methoden siehe:

                http://de.selfhtml.org/cgiperl/intro/formularverarbeitung.htm#get_post

                Wie du ein Formular mit JS unter Zuhilfenahme von Eventhandlern und der Methode submit() versenden kannst, findest du hier beschrieben:

                http://de.selfhtml.org/javascript/sprache/eventhandler.htm
                http://de.selfhtml.org/javascript/objekte/forms.htm#submit

                Ist bis dahin alles i.O., lasse dir zur Kontrolle erstmal im Druck-Script die vom Formular übergebenen Werte anzeigen. Wenn das alles soweit funktioniert, sehen wir weiter :-)

                Freundschaft!
                Siechfred

                --
                Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
                Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)
                ie:) fl:) br:? va:{ ls:? fo:§ rl:( n4:} ss:? de:µ js:{ ch:° sh:( mo:? zu:}
                1. Hi Siechfred, mir fehlt im Moment etwas die Zeit. Ich werde aber am Ball bleiben. Bis hierhin nochmal recht vielen Dank!

    2. Achja, und hier noch das Druckscript, falls es hilft:

      <?php

      function text_ausschnitt($string, $beginn, $ende){
            $string = strchr($string, $beginn);
            $pos_ende = strpos($string, $ende);
            $string = substr($string, 0,$pos_ende);
            return $string;
         }
         $url = $_GET['url'];
         $beginn = "<!-- #PRINT -->";
         $ende = "<!-- ##PRINT -->";
         if($url != NULL){

      //      Öffne und lese die Seite
            $string = file_get_contents($url);
         }
      ?>
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
      "http://www.w3.org/TR/html4/loose.dtd">
      <html>

      <head>
         <title>Artikel Drucken</title>
         <meta name="author" content="Kevin Erhardt">
         <meta name="date" content="2004">
         <style type="text/css">
            body {
               font-family: "Verdana", Arial, Tahoma;
               font-size: 9pt;
               color: #000000;
            }
         </style>
      </head>

      <body>
      <?php echo text_ausschnitt($string, $beginn, $ende); ?>
      <br>
      <button onclick="self.print();">Drucken</button>
      </body>
      </html>

      1. Hallo Marvin,

        $url = $_GET['url'];

        Ja, schön, und wo innerhalb deines Formulares in https://forum.selfhtml.org/?t=87415&m=519656 ist ein Eingabefeld namens 'url' definiert?

        Freundschaft!
        Siechfred

        --
        Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
        Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)
        ie:) fl:) br:? va:{ ls:? fo:§ rl:( n4:} ss:? de:µ js:{ ch:° sh:( mo:? zu:}
  3. Also, es geht darum, über ein JS-Dropdown, ein Fenster für ein Druck-Vorschau zu öffnen. Die php-Datei "web2printer4.php" liesst dabei bestimmte Inhaltsfelder der Ursprungsseite aus, damit nicht die Navigation oder Kommentare mitgedruckt werden. Problem: Die Datei weiß durch den JS-Script-Aufruf anscheinend nicht, welche ihre Ursprungsseite ist und kann dadurch keine Inhalte anzeigen.

    Das kannst du ohne Probleme mit CSS machen, der User kann sich die Seite in der Druckvorschau betrachten.
    http://de.selfhtml.org/css/formate/einbinden.htm#media

    Struppi.