Formulare erstellen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Formulare erstellen

    Wie macht ihr das immer mit euren Formularen?
    Habt ihr dafür eine Klasse und wie sieht sie denn aus und wie funktioniert sie?

    Also es muß ja jedesmal geprüft werden,
    wenn das Formular ankommt und denn muß ja auch immer das jeweilige Feld gekennzeichnet werden, welches Feld falsch war.
    Ich habe mir erstmal eine kleine Klasse geschrieben und. Erstmal nur mit einem input Feld und einem submit Feld zum testen.

    Die 2 Dateien....

    class:
    PHP-Code:
    <?php
    /**
    *
    * @version 1.0
    * @package form
    */
    class form
    {
      
    /**
      * @access privat
      * @var int (Fehler die auftreten werden hier intern gezählt)
      */  
      
    var $_fehler 0;
      
      
    /**
      * @access privat
      * @var array (Fehler die auftreten werden hier intern gezählt)
      */                    
      
    var $_elemente = array();  // Gesendete Elemente werden gezählt und der Name der einzelnen Elemente würd gespeichert
      
      /**
      * @access privat
      * @var array (Bei mehreren Submit Knöpfen muß mindestens einer übertragen werden, ansonsten Fehlermeldung)
      */  
      
    var $_submit = array();  
      
      
    /**
      * @access privat
      * @var string
      */   
      
    var $_method "";       
      
      
    /**
      * @access public
      * @param string (post, data, get)
      * @return string
      */     
      
    function formstart($p)
      {                                                 
        switch(
    $p) {
          case
    'post' $this->_method $_POST;
                       return 
    "<form name=\"form\" style=\"margin:0px; \" action=\"".$_SERVER['PHP_SELF']."\" method=\"POST\">"
                       break;
          case
    'data' $this->_method $_POST;
                       return 
    "<form style=\"margin:0px;\" action=\"".$_SERVER['PHP_SELF']."\" method=\"POST\" enctype=\"multipart/form-data\">";         
                       break;    
          case
    'get'  $this->_method $_GET;
                       return 
    "<form name=\"form\" style=\"margin:0px;\" action=\"".$_SERVER['PHP_SELF']."\" method=\"GET\">"
                       break;                        
        }          
      }
      
      
    /**
      * @access public
      * @param array
      * @return string
      */    
      
    function input(&$d) {  
        
    $d['name']       = isset($d['name'])       ? $d['name']       : "input";  
        
    $d['true']       = isset($d['true'])       ? $d['true']       : "style=\"font-size: 11px; width:120;\"";
        
    $d['false']      = isset($d['false'])      ? $d['false']      : "style=\"font-size: 11px; width:120; border:2px solid red; background-color:#FFE8E8;\"";        
        
    $d['maxlength']  = isset($d['maxlength'])  ? $d['maxlength']  : 30;        // Mehr Zeichen können nicht in das Feld eingetragen werden
        
    $d['php_min']    = isset($d['php_min'])    ? $d['php_min']    : 1;         // Weniger Zeichen gelten als Fehler
        
    $d['php_max']    = isset($d['php_max'])    ? $d['php_max']    : 30;        // Mehr Zeichn gelten als Fehler
        
    $d['preg_match'] = isset($d['preg_match']) ? $d['preg_match'] : "/´|\?|\+|&|%|\^|\||!|:|\\$|;|<|>|\\\\|{|}|[|]|°|#|~|§/"// Wenn es zutrifft, dann erfolgt Fehlermeldung                          
        
    $this->_elemente[] = $d['name'];                                      
        
    $v = isset($this->_method[$d['name']]) ? $this->_method[$d['name']] : "";                                                   
        
    $p count($this->_method) != true false;                                             
        if (
    $p
          
    $c preg_match($d['preg_match'], $v) || strlen($v) < $d['php_min'] || strlen($v) > $d['php_max'] ? false true;
        else
          
    $c = (strlen($v) < $d['php_min'] || strlen($v) > $d['php_max']) && $p false true;                                                                                                                         
        if (!
    $c$this->_fehler++;                                                                                                                        
        return 
    "<input type=text name=".$d['name'].($c " ".$d['true'] : " ".$d['false']).(isset($this->_method[$d['name']]) ? " value=\"".$this->_method[$d['name']]."\"" "")." maxlength=".$d['maxlength'].">";
      }    

      
    /**
      * @access public
      * @param string
      * @param string
      * @return string
      */    
      
    function submit($nameundvalue) {
        
    $this->_submit[]   = $nameundvalue;  
        return 
    "<input type=\"submit\" style=\"font-size: 11px;\" name=\"".$nameundvalue."\" value=\"".$nameundvalue."\">";
      }  
      
      
    /**
      * @access public
      * @return string
      */     
      
    function formende() {  
        return 
    "</form>";
      } 
      
      
    /**
      * @access public
      * @return bool
      */   
      
    function check() {
        
    $key_method      array_keys($this->_elemente);
        
    $anzahl_elemente count($this->_elemente);    
        for (
    $i 0$i $anzahl_elemente$i++) 
          if (isset(
    $this->_elemente[$i]) && !isset($this->_method[$this->_elemente[$i]])) return false;                    
        if (
    count($this->_submit) == 0)   return false;     
        if (
    $this->_fehler != 0)          return false# Fehler aufgetreten
        
    if (count($_POST) - count($this->_elemente) != 1) return false;
        
    $key_submit    array_keys($this->_submit);
        
    $anzahl_submit count($this->_submit);  
        
    $submit 0;
        for (
    $i 0$i $anzahl_submit$i++) 
          if (isset(
    $this->_submit[$i]) && isset($this->_method[$this->_submit[$i]])) $submit 1;
        if (
    $submit != 1) return false;     
        return 
    true;
      }
      
      
    /**
      * @access public
      * @return string
      */   
      
    function fehler()
      { 
        if (
    $this->_fehler == 0) return "";
        if (
    $this->_fehler == 1) return "Es trat 1 Fehler auf.";
        if (
    $this->_fehler >  1) return sprintf('Es traten %s Fehler auf.'$this->_fehler);              
      }  
    }
    ?>
    Testseite
    PHP-Code:
    <?php
    include('form.inc.php');

    $oform = new form;

    $formstart $oform->formstart('post');

    $daten['name'] = "user";

    $input    $oform->input($daten);

    $submit   $oform->submit('login''login');

    $formende $oform->formende();

    $fehler "";

    if (
    $oform->check()) {
      echo 
    "Es wurde alles geprüft. Speichern und wegschicken.";
    } else {
      
    $fehler $oform->fehler();
    }

    ?>
    <html>
    <head>

    </head>
    <body>
    <?php 
    echo "<p>".$fehler."</p>";

    echo 
    $formstart;

    echo 
    $input."<br>";

    echo 
    $submit;

    echo 
    $formende;
    ?>
    </body>
    </html>
    Zuletzt geändert von martinm79; 20.07.2011, 18:13.
    Gut geraten ist halb gewußt.

  • #2
    Also, das würde ich nochmal überdenken:
    PHP-Code:
    <?php 
    case'post' $this->_method $_POST
    ?>
    Macht irgendwie keinen Sinn.

    Dann solltest du dir den Aufbau deiner Klasse nochmal überdenken.
    Es macht mehr Sinn eine abstrakte Klasse zu definieren, die die Grundeigenschaften und Methoden eines Teils (Objekts) des Formulars enthält.
    Die einzelnen Eingabefeld-Typen und anderes können diese Klasse dann implementieren.
    Das gleiche gilt für die Regeln was, wie eingegeben werden muss.
    Überleg dir auch, ob eine Regel ihr Objekt "kennt" (also direkten zugriff auf das Objekt hat) oder nur den Namen (und wie die Regel dann an das Objekt kommt).
    Dazu solltest du zumindest einiges Basiswissen über OOP Entwurfsmuster mitbringen oder dir aneignen.

    Die Basisklasse (ähnlich deiner) entscheidet nur wie das Formular selbst aussehen wird und über die Basisklasse werden einzelne Formular-Objekte und Regeln hinzugefügt.

    Noch ein paar Hinweise:
    - Formular-Objekte müssen nicht zwangsläufig Eingabefelder sein.
    - Formular-Objekte können Beschriftungen haben, diese können unterschiedlich aussehen (eventuell auch nochmal mit verschiedenen Objekt-typen?)
    - Regeln geben Fehlermeldungen zurück und/oder ändern direkt die Beschriftungen der Formular-Objekte

    Das sind ein paar Ansätze die du dir gut durch den Kopf gehen lassen solltest. Im Zweifelsfall immer schön das Problem abstrahieren und auch an andere Möglichkeiten denken.

    Mir selbst nimmt eine solche Klasse extrem viel Arbeit und Schweiss und Tränen ab, da die Formularvalidierung nicht mehr dummen Flüchtigkeitsfehlern unterliegt und man so extrem schnell Formulare erstellen kann. Mein größter Liebling ist mein Select-Feld, dass seine Auswahlmöglichkeiten aus aus der DB gelesenen Daten erstellt

    Kommentar


    • #3
      Danke rythms für diese ausführliche Antwort.
      Das hilft einem schon mal über alles nachzudenken. Werde das mit der abstrakte Klasse mal berücksichtigen.
      Gut geraten ist halb gewußt.

      Kommentar


      • #4
        Habe mir nochmal alles durch den Kopf gehen lassen.

        An welcher Stelle definierst du dein Formular. Also wo sagst du deiner Klasse/Klassen wieviel input, select usw Felder du haben möchtest? In der Datei, wo du das Formular einsetzten willst, bestimmst du nur die Eigenschaften des "Formulares" oder wie? Und die Klasse gibt dir dann das fertige Formular aus?
        Und dann würde mich mal interessieren, wie IHR/DU das mit den select Feldern machst. Die Daten in einer DB anzulegen ist schon sauber. Und ihr holt die denn schon bei jedem Formularaufruf aus der db?
        Gut geraten ist halb gewußt.

        Kommentar


        • #5
          PHP-Code:
          <?php
          $form 
          = new form('name''/url/to/form/falls/anders''weitere attribute, auch als array möglich');
          $form->add('elementtyp''name''label'weitere attribute);
          $form->rule('regeltyp''name_des_elements');

          if(
          $form->validate()) {
              
          // do something
          } else {
              return 
          $form->display();
          }
          ?>
          So in etwa der (Pseudo)code.
          Sowohl bei der Methode "add" als auch "rule" werden die Parameter (und noch mehr) an ein neues Objekt weitergegeben und das Objekt in einem Array gespeichert.

          Die Daten aus der DB werden natürlich immer beim anzeigen aus der DB gelesen, schliesslich können die sich schnell ändern. Aber eben erst beim anzeigen, nicht beim überprüfen der Regeln (validate).

          Momentan habe ich noch eine methode $form->surround() der drei strings übergeben werden, was vor dem label steht, was zwischen label und element steht und was nach dem element steht.
          Als ich die erste antwort geschrieben habe, hab ich aber die Idee bekommen das mit einem Objekt zu machen, wird sich also noch ändern
          Das "Surround"-Objekt wird intern dann dem Element-Objekt immer übergeben und beim anzeigen eines Elements auch eine Methode des Surround-Objekts aufgerufen.
          Da könnte man dann entscheiden ob das label vor dem element oder nach dem element stehen soll, ob man ein richtiges <label> element benutzen will (und dann die #id rausziehen oder automatisch setzen) oder sonstwas. Das legt man alles in verschiedenen "Surround"-Klassen fest (und hat auch hier wieder eine abstrakte Klasse die die Methoden definiert).

          Kommentar

          Lädt...
          X