Erster Anlauf für das Bewertungsformular mit Template Override

Ich habe ja noch keinen vernünftigen Ansatz dafür gefunden, wie man ein Webform-Formular in ein Template einbindet, und bin ganz stark in Versuchung, den „kleinen Dienstweg“ zu nehmen und mein Formulärchen einfach per selbstgebauter PHP-Funktion einzubinden, so wie ich das in Joomla schon gemacht habe, näheres dazu in diesem Artikel.

Ich brauche Titel und/oder ID

Der Knackpunkt bei der Sache ist, beim Abschicken des Formulars brauche ich den Titel oder wenigstens die ID des Rezeptes, von dem aus das Formular verschickt wurde, sonst taugt das alles nix.

Ich probiers mal mit einem Template-Override

Der geht nämlich in Drupal gar nicht schwer. Um einen Override für den Inhaltstyp Blogeintrag anzulegen, geht man im Verzeichnis themes->[dein_theme]->templates hin und legt sich eine Kopie der Datei node.tpl.php an. Diese benennt man um in node–blog.tpl.php (doppelter Strich!), und jetzt kann man werken. Ich hab mal ein kleines Formular reingesetzt, und zwar nach nach der Div für den Content, also nach dem Block:

<div class="content clearfix"<?php print $content_attributes; ?>>
    <?php
      // We hide the comments and links now so that we can render them later.
      hide($content['comments']);
      hide($content['links']);
      print render($content);
    ?>

Hier sitzt jetzt mein kleines Formulärchen, das sieht so aus:

  <h2>Ihre Meinung ist mir wichtig – bitte bewerten Sie dieses Rezept!</h2>
 <form action='#' method='post'>
    <br>
    <input type='radio' name='Bewertung' value='War nix'>War nix<br>
    <input type='radio' name='Bewertung' value='War prima'>War prima<br>
    <input type='submit' name='absenden' value='Bewertung absenden'>
</form>

Damit hätten wir es schon mal an der richtigen Stelle platziert, zumindest wenn man das ganze Rezept anschaut:

bewertungsformular
bewertungsformular

Was mir weniger gefällt ist, dass das Formular so auch in der Blog-Ansicht nach dem Teaser auftaucht:

blog_mit_form
blog_mit_form

Aber darum kümmere ich mich später, jetzt holen wir uns erstmal den Titel des Rezeptes, der steckt nämlich praktischerweise in einer der verfügbaren Variablen – nachzulesen im Header der Template-Datei, ganz oben, da isser: $title.

Da haben wir doch schon alles: Mail kann verschickt werden

Und zwar mit dem selben simplen PHP-Scripterl, das ich schon in Joomla verwendet habe:

 <?php

        if (isset($_POST['absenden'])){
        if (isset($_POST['Bewertung'])){
            $note = $_POST['Bewertung'];
            echo 'Vielen Dank für Ihre Bewertung: '.$note;

             //hier kommt die Mechanik fürs Wegschreiben hin
             // Die Nachricht
                $nachricht = $title." ".$note;
                $nachricht = wordwrap($nachricht, 70);

                // Send
                mail('evi.s.leu@gmx.de', 'Rezeptbewertung', $nachricht);

        }
        else{
        echo 'Bitte eine Bewertung auswählen!';
        }
}
?>

Damit landet in meinem Mail-Output zum Beispiel:

To: evi.s.leu@gmx.de
Subject: Rezeptbewertung
X-PHP-Originating-Script: 0:node--blog.tpl.php

Bärli-Spezial - viele-Kräuter-Sauce War prima

Das erfüllt seinen Zweck, mehr brauch ich eigentlich gar nicht. Aber: es funktioniert nur in der ganzen Ansicht eines Rezeptes richtig!

Jetzt muss das Formular dringend aus der Blogansicht raus

Und zwar wirklich ganz dringend, weil es sonst nämlich E-Mails für alle 10 auf der Seite sichtbaren Rezepte verschickt! Ich glaube, ich hab da auch schon eine Lösung, aber dafür gönn ich mir eine kleine Pause und einen frischen Kaffee.

Na bitte geht doch: mit $view_mode

Ich hab mir die verfügbaren Variablen im Template nochmal genau angeguckt, und bin da auf die sehr praktische Sache mit dem view_mode gestossen:

$view_mode: View mode; for example, "full", "teaser".

Dann hab ich mein Formular samt Auswertungslogik in eine Funktion gepackt, die in meine Bibliothek evismodule.module reingestellt und rufe im Template jetzt nur noch die Funktion mit dem Parameter $title auf, und zwar nur im Full mode:

if ($view_mode == 'full'){
    bewertungsformular($title);
  }

Das war schon der ganze Zauber! Jetzt ist das Formular aus der Blogansicht draussen, in der ganzseitigen Ansicht drin, und verschickt brav nur eine einzelne E-Mail. Perfetto! Das hatte ich mir schwieriger vorgestellt.

Und was ist mit der Datenbank?

Ja klar wollen wir die abgeschickten Formulare auch in einer Tabelle speichern, das gelingt mit folgendem Code, der kommt direkt nach der mail-Anweisung rein:

$nid = db_insert('rezeptbewertungen')
                  ->fields(array(
                    'titel' => $titel,
                    'note' => $note,
                    'datum' => $datum,
                  ))
                  ->execute();

Das hab ich direkt aus der Drupal-Doku zum Thema Insert Queries übernommen. Sehr straightforward, gefällt mir sehr gut. Das setzt natürlich voraus, dass eine Tabelle namens rezeptbewertungen auch existiert und mindestens die drei Felder titel, note und datum hat, aber das sollte ja hinzukriegen sein.

Damit funktioniert unser Bewertungsformular so wie es soll, und ich mach hier einen Break.

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert