AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [PHP] Klassenstruktur für Adressdatenbank
Thema durchsuchen
Ansicht
Themen-Optionen

[PHP] Klassenstruktur für Adressdatenbank

Offene Frage von "Luckie"
Ein Thema von Luckie · begonnen am 3. Feb 2012 · letzter Beitrag vom 24. Mär 2012
Antwort Antwort
Benutzerbild von Valle
Valle

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

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
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 22. Mär 2012, 18:22
Besten Dank. ja, wo ich was ändern muss, damit es bei mir läuft habe ich schon rausgefunden und was die debug.php macht.

Ich werde mal sehen, ob ich damit klar komme. Jedenfalls habe ich schon viel gelernt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 22. Mär 2012, 20:02
Da stimmt aber irgendwas nicht:
Code:
Warning: include(MeineApp/Form/Address.php): failed to open stream: No such file or directory in /var/www/l3s11195/html/Admin/luckie/debug.php on line 27 Warning: include(MeineApp/Form/Address.php): failed to open stream: No such file or directory in /var/www/l3s11195/html/Admin/luckie/debug.php on line 27 Warning: include(): Failed opening 'MeineApp/Form/Address.php' for inclusion (include_path='.:/usr/share/php:app/:lib/') in /var/www/l3s11195/html/Admin/luckie/debug.php on line 27 Fatal error: Uncaught exception 'Exception' with message 'Cannot load class MeineApp_Form_Address from MeineApp/Form/Address.php' in /var/www/l3s11195/html/Admin/luckie/debug.php:29 Stack trace: #0 /var/www/l3s11195/html/Admin/luckie/debug.php(58): __autoload('MeineApp_Form_A...') #1 {main} thrown in /var/www/l3s11195/html/Admin/luckie/debug.php on line 29
Ich habe nur folgendes gemacht:
PHP-Quellcode:
/* $form = new MeineApp_Form_Irgendwas(array(
    'vorname' => "Valentin",
    'name' => "Voigt",
    'priv_email1' => "mail@..."
));

if ($form->is_valid()) {
    $a = new MeineApp_Model_Address($form->cleaned_data);
    $a->save();
} else {
    // ans View übergeben
    foreach ($form->fields as $field)
        echo implode("\n", $field->errors);
}*/


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

$this->view->form = $form;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

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

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 22. Mär 2012, 20:26
Du hast den include_path nicht gesetzt. Lies doch die Fehlermeldung.

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

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 22. Mär 2012, 21:03
Di ahbe ich ja gelesen. Nur dachte ich das hätte ich gemacht, Deswegen werde ich ja nicht so ganz schlau aus der fehlermeldung:
PHP-Quellcode:
set_include_path(get_include_path() . PATH_SEPARATOR . "app/");
set_include_path(get_include_path() . PATH_SEPARATOR . "lib/");
Bevor ich das mit der Form eingefügt hatte hat es ja funktioniert.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

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

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 22. Mär 2012, 21:07
Ups, jetzt habe ich geschlafen. Es hat funktioniert, weil keine nicht-existierende Klasse verwendet wurde. Schau doch mal ob die gesuchte Datei "Address.php" im angegebenen Ordner denn wirklich existiert. Außerdem bietet es sich an im include_path absolute Pfade zu verwenden.

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

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 22. Mär 2012, 21:28
OK, bin ein Stück weiter:
Code:
Fatal error: Uncaught exception 'Exception' with message 'Cannot load class MeineApp_Form_Address from MeineApp/Form/Address.php' in /var/www/l3s11195/html/Admin/luckie/debug.php:29 Stack trace: #0 /var/www/l3s11195/html/Admin/luckie/debug.php(58): __autoload('MeineApp_Form_A...') #1 {main} thrown in /var/www/l3s11195/html/Admin/luckie/debug.php on line 29
Aber die Datei existiert an der Stelle und auch die Klasse in der Datei. Das macht mich etwas ratlos.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz