php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 27.02.2009, 16:51  
Neuer Benutzer
 
Registriert seit: 27.02.2009
Beiträge: 13
cp_toby ist zur Zeit noch ein unbeschriebenes Blatt
Standard Formulargenerierung + Validierung

Hallo zusammen,

bin ganz neu hier . deshalb stelle ich mich euch kurz vor:
Ich bin 21 Jahre alt,
heiße Toby,
komme aus Bayern(Mittelfranken) und programmiere so etwa seit 2 Jahren in PHP.
Beruf: Mediengestalter Mediendesign Non-Print.

Habe mich das letzte halbe Jahr nun konkret in die OOP eingelesen.
Da mir Dr. E. und sein Framework doch sehr beeindruckt haben - dachte ich - ich könnt mir mit Sicherheit weiterhelfen.

Zu meiner Überlegung:
Ich möchte in meiner Applikation die Möglichkeit haben, dynamisch Formulare zu generieren und diese immer vollautomatisch über einen verwendeten Validator laufen zu lassen. Bedeutet, dass der Entwickler sich keine Sorgen um die Validierung machen muss sondern bloß noch über diverse Kommandos das gewünschte Ergebnis erzielt.

Konzeptionelle Gedanken:
- Eine Klasse die das generieren der Formulare übernimmt
- Einen abstrakten Validator
- Eine konkrete Validatorklasse, welche dann tatsächliche die bestimmten Plausibilitätsprüfungen übernimmt.

Habe das mal so angefangen:
Klasse zum generieren:

PHP-Code:
<?

#formular generator

class coreForm extends Core {
    
    private 
$__SpecialTags = array();
    private 
$__SelectOptions = array();    
    public 
$returnPath "index.php";
    public 
$returnTime "2";
    
    function 
registerApp($key$value)
    {
    
coreRegistry::registerApp($key$value);
    }
    
    public function 
__construct()
    {
    
self::registerApp("INSTANCE_coreForm""1");
    }
    
    
    public function 
__setReturnPath($returnpath$time)
    {
        
$this->returnPath $returnpath;
        
$this->returnTime $time;
    }
    
    public function 
displayErrors()
    {
        
$errors formParser::displayErrors();
        echo 
$errors;
    }
    
    public function 
_startForm($name "default"$action "index.php?action=parseForm"$method "post")
    {
    echo 
'<form name="'.$name.'" method="'.$method.'" action="'.$action.'">';
    }
    
    public function 
_endForm()
    {
    
    echo 
'<input type="hidden" name="returnpath" value="'.$this->returnPath.'">';
    echo 
'<input type="hidden" name="returntime" value="'.$this->returnTime.'">';    
    echo 
'</form>';
    }
        

    public function 
__setSelectOption($formElement$label$value)
    {
        
$this->__SelectOptions[][$formElement][$label] = $value;
    }
    
    public function 
__setOptionsArray($array)
    {
        foreach(
$array as $formElement => $selects)
        {
            foreach(
$selects as $test => $test2)
            {
                
self::__setSelectOption($formElement$test2['name'], $test2['value']);
                
            }
        }
    }
    
    
    public function 
__setSpecialTag($formElement$key$value)
    {

        
$this->__SpecialTags[][$formElement][$key] = $value;

    }
    
    public function 
_drawInput($type "text"$name "default"$id=false$size=false$maxlength=false$value=false$style=false$validation false)
    {
        if(
$type == "textarea")
        {
            
$html '<textarea ';
        }
        if(
$type == "select")
        {
            
$html '<select ';
        }
        if(
$type != "textarea" AND $type != "select")
        {
            
$html =    '<input type="'.$type.'" ';
        }

        
$html .= ($name) ? ' name="'.$name.'" ' "";
        
$html .= ($id) ? ' id="'.$id.'" ' "";
        
$html .= ($size) ? ' size="'.$size.'" ' "";
        
$html .= ($maxlength) ? ' maxlength="'.$maxlength.'" ' "";
            if(
$type != "textarea" OR $type != "select")
            {
            
$html .= ($value) ? ' value="'.$value.'" ' "";
            }
        
$html .= ($style) ? ' style="'.$style.'" ' "";
            
            foreach(
$this->__SpecialTags as $SpecialTags)
            {
                foreach(
$SpecialTags as $inputName => $array)
                {
                    if(
$inputName == $name)
                    {
                        foreach(
$array as $key => $value)
                        {
                        
$html .= ' '.$key.'="'.$value.'" ';
                        }
                    }
                }
                
            
            }
        
$html .= '>';

        if(
$type == "textarea")
        {
            
$html .= ($value) ? $value "";
            
$html .= '</textarea>';
        }        
        if(
$type == "select")
        {
            foreach(
$this->__SelectOptions as $SelectOptions)
            {
                foreach(
$SelectOptions as $inputName => $array)
                {
                    if(
$inputName == $name)
                    {                    
                        foreach(
$array as $label => $value)
                        {
                        
$html .= '<option value="'.$value.'">'.$label.'</option>';
                        }
                    }
                }
            }
            
$html .= '</select>';
        }
        
            if(
$validation)
            {
                
$html .= '<input type="hidden" value="'.$validation.'" name="validation_'.$name.'">';
            }
        
        echo 
$html;
    }
    

    public function 
echoAll()
    {
    echo 
"<pre>";
    
print_r($this->__SelectOptions);
    echo 
"</pre>";
    }

}



?>

Klasse zum Validieren (nur angefangen):
PHP-Code:
<?

#formular generator


class formParser extends Core {
    
    function 
registerApp($key$value)
    {
    
coreRegistry::registerApp($key$value);
    }
    
    public function 
__construct()
    {
    
self::registerApp("INSTANCE_coreForm""1");
    }
    
    
    
    public function 
displayErrors()
    {
        if(isset(
$_POST['submit']))
        {
            echo 
"error";
        }
    }    


}



?>
und die Klasse die es testet:

PHP-Code:
    /*
    * Wie benutze ich den coreForm?
    * Dynamische Erstellung von Formularen inkl. Validierung!
    */
    
    # coreForm muss instanziert und gestartet werden!
    # Anwendung:
    # $objektReferenz = new coreForm();
    # $objektReferenz -> _startForm("FORMNAME", "ACTION = DEFAULT @ PARSER", "METHOD = DEFAULT @ POST");
    
    # coreForm Anwendungsfälle
    # Inputfelder erstellen
    # Typen:
    # - text || Textfeld.
    # - textarea || Textbox.
    # - checkbox 
    # - radiobutton
    # - select || Liste
    # - hidden || versteckt.
    # - submit || Abschicken Button
    # - reset || Reset Button

    # $objektReferenz -> _drawInput("TYP", "NAME", "ID", "SIZE", "MAXLENGTH", "VALUE", "STYLE", "VALIDATION");
    
    # VORSICHT! Anwendung bei Select-Variante
    # Bei der Selectvariante müssen vorher Werte definiert werden.
    # Möglichkeit 1:
    
    # Die Werte werden einzeln deklariert!
    # $objectReferenz ->__setSelectOption("NAME DES SELECT FELDES", "BESCHRIFTUNG", "AKTIVER WERT");
    
    # Möglichkeit 2:
    # Die Werte gesammelt in einem Array übergeben!
    # $objektReferenz ->__setOptionsArray($array);
    # Hierbei muss das Array wie folgt aufgebaut sein!
    # $array["NAME DES SELECT FEDLES"][] = array("name" => "BESCHRIFTUNG", "value" => "AKTIVER WERT");
    
    # Validationstypen (noch nicht fertig):
    # - email
    # - telefonnummer
    # - etc. etc. muss alles entsprechend integriert werden!
    
    # Spezielle HTML Tags einfügen, wie z.B. Javascript etc.
    # Sie haben die Möglichkeit auch einzelne Tags oder spezielle hinzuzufügen.
    # Anwendung
    # $objektReferenz ->__setSpecialTag("NAME DES INPUT FELDES", "TAG", "TAG-WERT");
    # z.B. $objektReferenz ->__setSpecialTag("selectfeld", "onchange", "javascript:alert(document.getElementById('1').value)");
    
    # Um eventuelle Fehler aus der Validation anzuzeigen platzieren Sie folgendes Kommando.
    # $objektReferenz -> displayErrors();
    
    # Um ein Formular abzuschließen benutzen Sie bitte:
    # $objektReferenz -> _endForm();
    
    # Den Returnpath legen!
    # $objectReferenz -> __setReturnPath("URL", "ZEIT IN SEKUNDEN");

    #### Beispiel zu mysql_Con
    
echo "<h2>Beispiel zu coreForm</h2>";
    
    
#coreForm instanzieren
    
$cForm = new coreForm();
    
#Formular starten!
    
$cForm -> _startForm("Beispielformular");
    
    
#Returnpath setzen!
    
$cForm -> __setReturnPath("index.php""4");
    
    
#Inputfelder ohne Validierung erzeugen!
    
$cForm ->__setSpecialTag("Beispiel_1""value""Ich bin das Beispiel 1");
    
$cForm ->_drawInput("text""Beispiel_1""1");
    
$cForm ->__setSpecialTag("Beispiel_2""value""Ich bin das Beispiel 2");
    
$cForm ->_drawInput("text""Beispiel_2""2");
    echo 
"<br><br>";
    
$cForm ->_drawInput("textarea""Beispieltextarea");
    echo 
"<br>";
    
    
#Inputfelder mit Validierung (PLZ) erzeugen!
    
echo "Mit Validation:";
    
$cForm ->_drawInput("text""Beispiel_mit_validation""3"falsefalsefalsefalse"plz");
    echo 
"<br>";
    echo 
"Mit Validation:";
    
$cForm ->_drawInput("text""Beispiel_mit_validation2""4"falsefalsefalsefalse"handynummer");
    
    echo 
"<br>";
    
# Abschicken Button
    
$cForm -> __setSpecialTag("submit""value""Testformular abschicken!");
    
$cForm ->_drawInput("submit""submit");
    
    
# Reset Button
    
$cForm -> __setSpecialTag("reset""value""Zurücksetzen");
    
$cForm ->_drawInput("reset""reset");
    
    
    
    echo 
"<br><br><br>";
    
#Errors anzeigen
    
$cForm -> displayErrors();
    
    
#Formular beenden
    
$cForm -> _endForm(); 
und die anwendete Validator File
PHP-Code:
$test = new formParser;
echo 
"parseForm meldet:";

    echo 
"<pre>";
    
print_r($_POST);
    echo 
"</pre>";

echo 
"<br><br> RETURNING IN ".$_POST['returntime']." SEC. TO:";
echo 
$_POST['returnpath'];
print 
'<meta http-equiv="refresh" content="'.$_POST['returntime'].'; url='.$_POST['returnpath'].'"> '
Jetzt soll natürlich der Validator(parser) entsprechend auf seine Ergebnisse reagieren und wenn nötig in die displayErrors() den Fehler schreiben.

Was haltet ihr davon??
cp_toby ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.02.2009, 17:52  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.709
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Hi und willkommen!
Das Thema Formularvalidierung und daraus entstanden auch -generierung hatten wir vor einiger Zeit schon einmal: http://www.php.de/software-design/50...lidierung.html (Formular Validierung)
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Alt 27.02.2009, 18:33  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

Bevor du das Rad neu erfindest, schau dir vielleicht auch mal Zend_Form an, bietet Generierung (html-code) über Decoratoren, Filterung, Validierung und Fehler-Ausgabe. Mit Zend_Form_Dojo kann das ganze dann noch mit dem Dojo-JS-Framework für Validierung ohne Reloads und ähnliches genutzt werden.
robo47 ist offline   Mit Zitat antworten
Alt 27.02.2009, 20:09  
Neuer Benutzer
 
Registriert seit: 27.02.2009
Beiträge: 13
cp_toby ist zur Zeit noch ein unbeschriebenes Blatt
Standard

hey danke!!
naja es geht mir natürlich nicht darum das rad neu zu erfinden. sondern eigentlich um die vertiefung meiner oop-kentnisse.
vielleicht hätte ich eher sagen sollen, dass ihr die codeschnipsel bewertet. bzw. einen ansatz erkennt.

wäre mir wichtig ob ich so auf dem richtigen weg bin.
zend_form schaut wirklich sehr gut aus
cp_toby ist offline   Mit Zitat antworten
Alt 28.02.2009, 12:51  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Toby,

du solltest dir wirklich den von Mank verlinkten Thread ansehen. Dein Code geht exakt wie auch Zend_Form in Richtung "viel PHP-Code für wenig Formular". Das ist IMHO ineffizient.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 01.03.2009, 16:08  
Neuer Benutzer
 
Registriert seit: 27.02.2009
Beiträge: 13
cp_toby ist zur Zeit noch ein unbeschriebenes Blatt
Standard

danke dr.e. ...

alles klar. werde mir das mal genauer ansehen.
aber mir stellt sich trotzdem die frage, wie man es effizienter auf diese weise lösen könnte.
habe schon soviele methoden gespart wie mir möglich erschien.

trotzdem danke!
cp_toby ist offline   Mit Zitat antworten
Alt 01.03.2009, 17:19  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Toby,

sofern du die von dir verwendete Methode effizienter gestalten willst, muss ein Formular - ähnlich dem Zend_Form-Ansatz - abstrahierbar sein. Sprich ein Formular muss als Objekt behandelbar sein und verschiedene API-Funktionen unterstützen.

Nehmen wir an, deine Formular-Klasse besitzt die Methode display() um ein Formular darzustellen und addFormElement() um ein Formular-Element hinzuzufügen. In diesem Fall könntest du ein Formular auf folgende Weise definieren:

PHP-Code:
class MyForm extends Form
{
   public function 
__constructor(){
   }
   public function 
display(){
      
$this->addFormElement(...); // Benutzer
      
$this->addFormElement(...); // Passwort
      
$this->addFormElement(...); // Button
      
return parent::display();
   }
}

$form = new MyForm();
echo 
$form->display(); 
Möchtest du noch Validatoren für die Felder haben, könnte eine Methode addValidator() nützlich sein, der ein Feld mit einem Validator belegt. Diese Funktion könnte dann entweder in der display()-Methode oder in deinem Code stattfinden, sofern es eine lokale Spezialisierung ist.

Wichtig in diesem ganzen Ansatz ist, dass es nicht notwendig ist zig Zeilen PHP-Code für zwei Formular-Felder zu schreiben. Ganz schlimm ist dabei noch, wenn auch sämtliche Formatierungen noch mit im PHP-Code stehen.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Geändert von dr.e. (01.03.2009 um 18:21 Uhr).
dr.e. ist offline   Mit Zitat antworten
Alt 01.03.2009, 17:35  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

Würde es hier nicht mehr Sinn machen nicht gerade in der methode display() den ganzen kram erst zu deklarieren ?
Wenn ich von aussen darauf zugreifen will sollte eine Instanz von myForm doch schon nach der Instanzierung ihre Elemente besitzen.
robo47 ist offline   Mit Zitat antworten
Alt 01.03.2009, 18:23  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Klar. Vor Allem dann, wenn ich zwischen der Instanziierung und der Anzeige noch so etwas wie addValidator() aufrufen möchte.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 01.03.2009, 20:44  
Neuer Benutzer
 
Registriert seit: 27.02.2009
Beiträge: 13
cp_toby ist zur Zeit noch ein unbeschriebenes Blatt
Standard

hey zusammen,

ok, verstehe den sinn das ganze abstrakt zu gestalten. jetzt aber mein problem:
wenn ich doch in einem html template an einem bestimmten ort nur ein textfeld hinzufügen möchte, so geht dies doch nicht oder? schließlich zeigt er ja alles über die display methode an. er würde sie folglich irgendwo gruppiert darstellen oda?
cp_toby ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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 an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Formular Validierung #Avedo Software-Design 71 31.12.2009 23:51
XML Validierung über DTD maller86 PHP Tipps 2009 7 19.02.2009 10:40
[Erledigt] Validierung mit Arrays vyo PHP Tipps 2008 4 27.12.2008 18:39
Spam - aber wie ? phpels PHP Tipps 2008 50 09.12.2008 00:56
[Erledigt] Problem mit Umlauten äüöß. litterauspirna PHP Tipps 2008 9 16.10.2008 11:52
Formular; ich brauche mal euren Rat maeck PHP Tipps 2008 8 17.04.2008 23:58
PHP-Session Problem bei Validierung tomx992 PHP-Fortgeschrittene 9 13.09.2007 09:01
Validierung macht bei mir Fehler Wing HTML, Usability und Barrierefreiheit 4 05.06.2007 00:14
grundfrage wegen validierung bark HTML, Usability und Barrierefreiheit 2 03.07.2006 00:01
(X)HTML / CSS Validierung automatisieren ? Malfunction HTML, Usability und Barrierefreiheit 4 27.02.2005 08:14
[Erledigt] Mail Validierung PHP Tipps 2004 17 24.11.2004 13:43
Email validierung mit checkdnsrr reicht mir nicht.... PHP Tipps 2004-2 8 08.11.2004 16:58
CSS Validierung HTML, Usability und Barrierefreiheit 11 02.11.2004 20:20
[Erledigt] XML well-formedness und validierung PHP-Fortgeschrittene 0 28.09.2004 17:37
Mail Validierung PHP Tipps 2004 7 12.07.2004 23:44

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php validierung, php telefonnummer validieren, php validieren, validierung php, handynummer validieren, http://www.php.de/software-design/52334-formulargenerierung-validierung.html, telefonnummer validieren, php handynummer validieren, php name validieren, php validierung telefonnummer, validieren php, php namen validieren, php formular generator, telefonnummer validieren php, php formular validierung, php formular validieren, zend dynamisches formular, plz validieren, telefonnummer validierung php, validierung mit php

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:32 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum