Wie schreib ich das Kontaktmodul richtig zu einem LoginModul

Gesperrt
contenidoAmateur

Wie schreib ich das Kontaktmodul richtig zu einem LoginModul

Beitrag von contenidoAmateur » Mi 16. Jan 2013, 19:38

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 :)

xmurrix
Beiträge: 3154
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Wie schreib ich das Kontaktmodul richtig zu einem LoginM

Beitrag von xmurrix » Mi 16. Jan 2013, 21:48

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
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Spider IT
Beiträge: 1416
Registriert: Fr 3. Dez 2004, 10:15

Re: Wie schreib ich das Kontaktmodul richtig zu einem LoginM

Beitrag von Spider IT » Do 17. Jan 2013, 11:19

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é

contenidoAmateur

Re: Wie schreib ich das Kontaktmodul richtig zu einem LoginM

Beitrag von contenidoAmateur » Fr 18. Jan 2013, 16:27

Warum? Beim Kontaktformular reicht die Struktur aber auch ?

Spider IT
Beiträge: 1416
Registriert: Fr 3. Dez 2004, 10:15

Re: Wie schreib ich das Kontaktmodul richtig zu einem LoginM

Beitrag von Spider IT » Fr 18. Jan 2013, 17:11

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é

Gesperrt