Einzelnen Beitrag anzeigen

Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#48

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 22. Mär 2012, 18:04
Zitat von Luckie:
Hallo valle,
vielen Dank für deine Mühe.

Ich habe es jetzt mit meiner Datenbank zum Laufen gebracht. Aber wie erstelle ich ein neues leeres Formular und wie bekomme ich einen Datensatz zum Ändern angezeigt und wie kann ich einen Datensatz suchen? Da bin ich noch nicht so richtig durchgestiegen, wie das funktioniert.
Ich hoffe es ist in Ordnung dass ich hier im Thread auf deine Frage in der PM antworte. Das Zeichenlimit für die PM habe ich leider überschritten und ich denke jeder sollte etwas davon haben.

vielleicht verwirrt das drumherum in meiner Ordnerstruktur etwas. Der eigentliche Beispielcode befindet sich in der debug.php. Hier habe ich rumgespielt bis es lief wie es sollte. Wie man das Beispiel genau anwendet erkläre ich gleich. Neu ist noch die Trennung von Projekt ("app(lication)") und Framework ("lib"). Ersteres beinhaltet alles spezifische für dein Projekt. Letzteres ist allgemein gehalten und sollte bei einem vollständigem Framework ohne jegliche Änderung in jedes andere Projekt übernommen werden können. Quasi die VCL, wenn ich das als nicht-Delphianer richtig verstanden habe.

Außerdem neu ist der Autoloader. Der besteht aus einer einfachen Funktion, dessen Name __autoload sein muss. Diese wird immer dann aufgerufen, wenn auf einen Klassen-Namen zugegriffen wird, der nicht existiert. Diese wird als Parameter an die Funktion übergeben. Die Aufgabe der Funktion ist es, diese Klasse zu laden. Das klappt nur dann, wenn der Name der Klasse einem Schema folgt. Dazu erstellt man zwei Pfade für Projektdateien (lib und app eben), in denen automatisch gesucht wird, wenn man require bzw. include benutzt. Ein Unterstrich im Klassennamen repräsentiert einen untergeordneten Ordner. Somit wird nach Meine_tolle_Klasse in /lib/Meine/tolle/Klasse.php und in /app/Meine/tolle/Klasse.php gesucht. Das ist nützlich, damit man sich so die ganzen includes spart und gezwungen ist, seine Klassen sinnvoll zu benennen. Sinnvoll ist hierbei, Framework und App jeweils einen Präfix zu geben. Heißt das Framework der DP beispielsweise "Asdf", so heißt eine Klasse im Framework zum Beispiel Asdf_Db_Table. Eine Klasse des Projekts dann DP_Form_NewAddress. Ich persönliche liebe diesen Autoloader und würde nicht mehr ohne in PHP arbeiten. Vielleicht teilst du diese Idee mit mir.

Zurück zu den Forms: Eigentlich kannst du die Klassen so anwenden wie ich es beschrieben habe. Du überprüfst also zuerst, ob bereits ein Formular angesendet wurde. Das macht man am besten indem man schaut ob GET oder POST verwendet wurde. Anschließend erstellst du eine Instanz des speziellen Formulars. Je nach HTTP-Methode übergibst du entweder die Daten an das Formular ($form = new MeineApp_Form_NewAddess($_POST); ) oder lässt das Formular leer ($form = new MeineApp_Form_NewAddess(); ). Falls du Daten übergeben hast, prüfst du, ob die Daten im Formular valide sind. Sind sie es, führst du entsprechende Schritte aus (Eintrag in DB) und leitest auf eine Bestätigungsseite weiter. Sind sie es nicht, oder wurde das Formular noch nicht ausgefüllt, übergibst du das Formular an ein View (Du brauchst sowas!) und lässt es (ggf. erneut) anzeigen. Im Ganzen sieht das dann etwa so aus:

PHP-Quellcode:
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $form = new MeineApp_Form_NewAddess($_POST);
    if ($form->is_valid()) {
        $address = new MeineApp_Model_Address($form->cleaned_data);
        $address->save();
        // redirect("/thanks/");
    }
} else {
    $form = new MeineApp_Form_NewAddess();
}

$this->view->form = $form;
Die letzte Zeile, also die Übergabe des Formulars an das View macht hier mehr als man denkt. Das View ist in diesem Fall eine Eigenschaft des Controllers, die automatisch vor dem Aufruf des Controllers erstellt wird. So mache ich und die meisten Frameworks das immer. Nach dem Aufruf des Controllers wird (falls es keinen Fehler und keinen Redirect gab) das View aufgerufen. Der Hauptcode des Projekte sollte also etwa so aussehen:

PHP-Quellcode:
$controller = get_the_right_controller_instance_from_url();
$controller->pre_exec(); // erstellt View
$controller->exec(); // führt den Controller aus
$controller->post_exec(); // lässt das View rendern
Nach Ausführung der Hauptmethode des Controllers sollte das View das Formular rendern. Hier gilt in etwa folgendes Vorgehen:

PHP-Quellcode:
public function post_exec() {
    echo $this->view->render();
}
Das View kann man auf verschiedene Weisen machen, zum Beispiel über eine Template Engine wie Smarty. Ich mag diese Engines aber nicht, da ich keinen Vorteil in Ihnen sehe und sie langsamer sind als nötig. Ich realisieren Views immer als HTML-PHP-Gemisch-Dateien. Das View würde also zum Beispiel sowas machen:

PHP-Quellcode:
<h1><? echo $this->headline; </h1>
<form action="/a/s/d/f" method="post">
    <? echo $this->form->fields['name']->render(); ?>
    <span class="error"><? echo $this->form->fields['name']->errors; ?></span>
</form>
Man sieht deutlich, dass die einzelnen Teile des Formulars zwar vom View zusammengesetzt werden, die Formularfelder aber vom Formular selbst erstellt werden. Diese Trennung macht die Sache sehr flexibel. Das Formular selbst weiß am besten welche Datentypen die Felder haben und ob etwas im Feld drin steht, oder ob es leer ist. Diese Arbeit gehört nicht in das View und wird so besonders gut getrennt.

So, genug Lese- und Lernstoff für die nächste Zeit, oder? Ich hoffe es ist etwas klarer. Gern kann ich auch rudimentär ein Beispiel für die Controller und Views machen, da mir das doch ziemlich Spaß macht. Ich würde behaupten, sobald du diese Vorgehensweisen verstanden hast und sie anwenden kannst, kannst du professionell mit PHP Webseiten entwickeln. Also lass dich nicht entmutigen. Einfach irgendwas zusammenfriemeln kann jeder.

Liebe Grüße,
Valentin
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat