Seite 1 von 1

Wie schreib ich das Kontaktmodul richtig zu einem LoginModul

Verfasst: Mi 16. Jan 2013, 19:38
von contenidoAmateur
Hallo, ich habe mal versucht ein Loginmodul aus dem Kontaktmodul zu bauen. (Keinen richtigen Login, sondern eine Überprüfung der Eingabe und Weiterleitung auf eine externe Seite)

Würde mich freuen wenn Ihr mir ein wenig weiterhelfen könnt :)

Hier ist schon einmal der Code den ich angepasst habe aber er leitet noch nicht weiter...:

Code: Alles auswählen

<?php
/**
* $RCSfile$
*
* Description: Contact Form Output
*
* @version 1.0.0
* @author Andreas Lindner
* @copyright four for business AG <www.4fb.de>
*
* {@internal
* created 2005-08-12
* modified 2008-04-11 Rudi Bieller Changes concerning new layout
* }}
*
* $Id$
*/

if (!isset($tpl) || !is_object($tpl)) {
    $tpl = new Template();
}
else
{
    $tpl->reset();
}

if (!isset ($_POST['send'])) {
   //Form has not been sent yet
    //Create contact form
    $sFormAction = $sess->url("front_content.php?idcat=$idcat&idart=$idart&parentid=$parentid");
    $tpl->set("s", "BENUTZERNAME", mi18n("Benutzername"));
    $tpl->set("s", "PASSWORT", mi18n("Passwort"));
    $tpl->set("s", "ABSCHICKEN", mi18n("Login"));

    $tpl->generate($cfgClient[$client]["path"]["frontend"]."templates/loginFormular.html");
} elseif ($_POST['send'] == 1) {
    //Form has been sent

    //Check user input
    $noerrors = true;
    $msg = '';
    if ($_POST['bn'] == 'admin') {
        $noerrors = true;
    }
    if ($_POST['bn'] != 'admin') {
        $noerrors = false;
        $msg .= mi18n("Bitte geben Sie den richtigen Benutzernamen ein!")."<br/>";
    }
	
	if ($_POST['pw'] == '121314') {
        $noerrors = true;
    }
    if ($_POST['pw'] != '121314') {
        $noerrors = false;
        $msg .= mi18n("Bitte geben Sie das richtige Passwort ein!")."<br/>";
    }
	

    if ($noerrors == false) {
        echo "<p>";
        //Errors have been found
        echo '<strong><div id="headfehlerMSGkf"><img src="http://www.domain.de/cms/images/falseNewsletter.png" />'.mi18n("Beim Versenden sind folgende Fehler aufgetreten:").'</div></strong><br>';
        echo '<div class="fehlerMSGkf">'.$msg.'</div><br/>';
        echo '<div id="zurueckLink" ><a href="javascript:history.back();">&lsaquo; '.mi18n("zur&uuml;ck").'</a></div>';
    } else {
        header('Location: http://www.google.com/');
    }
}
?>
Danke :)

Re: Wie schreib ich das Kontaktmodul richtig zu einem LoginM

Verfasst: Mi 16. Jan 2013, 21:48
von xmurrix
Hallo contenidoAmateur,

in CONTENIDO werden Modulcodes in das Layout eingebettet, also an der Stelle wo du sie im Template konfiguriert hast.

Wenn das Modul ausgeführt wird, hat PHP schon eine Ausgabe gemacht, d. h. es hat einen Teil der Seite ausgegeben. Wenn also vorher schon eine Ausgabe stattfindet (auch ein einfacher Zeilenwechsel am Anfang des Layouts ist schon eine Ausgabe!), kann man in keine HTTP-Weiterleitung machen, die Weiterleitung muss vor der Ausgabe stattfinden.

Du hast eine der folgenden Möglichkeiten:
  • Du kannst ein Plugin (Beispiel http://forum.contenido.org/viewtopic.php?f=64&t=22487) erstellen und darin deine Logik nur für die Weiterleitung einbauen. Plugins werden ziemlich am Anfang verarbeitet, also vor dem Layout und der Ausgabe.
  • Du kannst im Mandantenordner, also im Ordner "cms" eine Datei mit dem Namen "config.local.php" erstellen und darin deine Logik nur für die Weiterleitung einbauen. Die Datei "config.local.php" wird ziemlich am Anfang eingebunden, also auch vor dem Layout und der Ausgabe.
  • Du kannst im entsprechenden Layout mit Ausgabepuffer arbeiten, da musst du am Anfang deines Layouts

    Code: Alles auswählen

    <?php
    ob_start();
    ?>
    
    und am Ende des Layouts

    Code: Alles auswählen

    <?php
    $output = ob_get_contents();
    ob_end_clean();
    echo $output;
    ?>
    
    einbauen. Dann wird die gesammte Ausgabe der Seite in den Puffer geschrieben, auch die in Modulen und erst am Ende wird die Seite ausgegeben. Wenn irgendein Modul eine Weiterleitung macht, ist es kein Problem, da vorher keine Ausgabe stattgefunden hat.
  • Die PHP-Einstellung (php.ini) "output_buffering" auf "On" oder auf einen hohen numerischen Wert Setzen, z. B. 4096. Dann werden bis zu 4096 Zeichen im Ausgabepuffer gehalten, bis die Ausgabe stattfindet.
  • Du teilst dein Modul auf, die Logik für Weiterleitung machst du als separates Modul und konfiguriest es als erstes Modul im Template. Das Layout dazu muss gleich am Anfang einen Modulcontainer enthalten und achte darauf, dass keine unnötigen Leerzeichen/Zeilenwechsel vorkommen

    Code: Alles auswählen

    <container id="1" name="Loginredirect" types="Content" mode="fixed" default="Loginredirect">Loginredirect</container>
    <!-- im Layout zuerst Modulcontainer für das Modul "Loginredirect" definieren und dann das Markup der Seite -->
    <!DOCTYPE html>
    ...
    
Gruß
xmurrix

Re: Wie schreib ich das Kontaktmodul richtig zu einem LoginM

Verfasst: Do 17. Jan 2013, 11:19
von Spider IT
Kommt denn überhaupt die Fehlermeldung "Headers already sent"?
Generell sollte Contenido eigentlich in der Lage sein (und ich hatte noch keine Probleme damit) aus Module den header() Befehl zu setzen, denn der gesamte Seitencontent (HTML-Code) wird erst noch durch die Chains geschleppt, der header() Befehl aber sofort ausgeführt.

@contenidoAmateur: Du solltest deine IF-Konstrukte nochmal überdenken, denn so reicht es schon wenn das Passwort richtig ist.

Gruß
René

Re: Wie schreib ich das Kontaktmodul richtig zu einem LoginM

Verfasst: Fr 18. Jan 2013, 16:27
von contenidoAmateur
Warum? Beim Kontaktformular reicht die Struktur aber auch ?

Re: Wie schreib ich das Kontaktmodul richtig zu einem LoginM

Verfasst: Fr 18. Jan 2013, 17:11
von Spider IT
Weil mit Login Test und Passwort 121314 folgendes passiert:

Code: Alles auswählen

    if ($_POST['bn'] == 'admin') {   # Trifft nicht zu
        $noerrors = true;
    }
    if ($_POST['bn'] != 'admin') {   # Trifft zu, also $noerrors = false
        $noerrors = false;
        $msg .= mi18n("Bitte geben Sie den richtigen Benutzernamen ein!")."<br/>";
    }
   
   if ($_POST['pw'] == '121314') {   # Trifft zu, also $noerrors = true
        $noerrors = true;
    }
    if ($_POST['pw'] != '121314') {  # Trifft nicht zu
        $noerrors = false;
        $msg .= mi18n("Bitte geben Sie das richtige Passwort ein!")."<br/>";
    }
Gruß
René