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 04.01.2009, 14:56  
Erfahrener Benutzer
 
Registriert seit: 06.09.2008
Beiträge: 189
#Avedo befindet sich auf einem aufstrebenden Ast
Standard

Naja unter Mischmasch zwischen Formularausgabe und Validierung verstehe ich, dass dies in einer Klasse gebündelt ist. Das ist ja aber nicht der Fall. Die Klasse, die die Validatoren aufruft und die das Formular ausgeben soll, ist nur teilweise die selbe. Die Validatoren sind allerdings alles eigenständige Klassen.

Zudem wird es noch zwei drei Filter-Klassen geben, die es erlauben zum Beispiel einen String in Kleinbuchstaben umzuwandeln.

Die Ausgabe des Formulars über diese Klasse ermögliche ich, da ich kein großer Freund von HTML-Formularen bin. Macht mir einfach keinen Spaß. Da brüte ich doch lieber an einer neuen Klasse in PHP. Natürlich müssen Anpassungen via CSS möglich sein. Deshalb lege ich ein Standard-Layout fest und weise automatisch css-Klassen und IDs zu. Zudem gibt es noch die Möglichkeit HTML-Attribute, wie zum Beispiel size hinzuzufügen. So ist das Formular gut Anpassbar und ich hab keinen Stress. Vielleicht ermögliche ich es noch anstatt Deinition Lists Tabellen zu nutzen.

MfG, Andy
__________________
I'm so tired of slitting the throats of people calling me a violent psychopath.
#Avedo ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 04.01.2009, 16:00  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.798
PHP-Kenntnisse:
Fortgeschritten
robo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblick
Standard

Es besteht ja immernoch die Möglichkeit im View sich die Elemente einzeln aus dem Formular zu holen element zu ziehen oder auch das formular händisch zu machen, wenn man es denn unbedingt braucht.

Ansonsten mit ein paar Standard-Dekoratoren kann man im üblichen das meiste erreichen.
robo47 ist offline   Mit Zitat antworten
Alt 04.01.2009, 17:54  
Erfahrener Benutzer
 
Registriert seit: 06.09.2008
Beiträge: 189
#Avedo befindet sich auf einem aufstrebenden Ast
Standard

Danke. Das ist eine gute Idee. Denke auch, dass die standard Dekoratoren ausreichen. Und du hast recht. Mann kann das Layout immernoch per Hand machen. Werde mich also nun noch an die letzten Form_Element_* - Klassen setzen und noch die Möglichkeit Filter zu nutzen implementieren. An dieser Stelle würde mich noch interessieren, welche Filter ihr für Sinnvoll haltet.
  • Filter_ToLower
  • Filter_ToUpper
  • Filter_UcFirst
Das waren die, die mir vorerst eingefallen sind. Habt ihr noch eine Idee? Freue mich auf eure Anregungen.
MfG, Andy
__________________
I'm so tired of slitting the throats of people calling me a violent psychopath.
#Avedo ist offline   Mit Zitat antworten
Alt 04.01.2009, 18:03  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.798
PHP-Kenntnisse:
Fortgeschritten
robo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblick
Standard

mir fällt spontan ein:

Filter_Trim
Filter_StripTags
robo47 ist offline   Mit Zitat antworten
Alt 05.01.2009, 09:27  
Neuer Benutzer
 
Registriert seit: 27.12.2008
Beiträge: 23
Bleda befindet sich auf einem aufstrebenden Ast
Standard

String kürzen (abschneiden)
str_replace
preg_replace
bestimmte zeichen entfernen/austauschen
Bleda ist offline   Mit Zitat antworten
Alt 05.01.2009, 16:51  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Vereinheitlichung von Daten, für die mehrere Eingabe-Formate gültig sind:
- Datumsangaben
- Telefonnummern
- Währungen ohne Nachkommastellen > Float
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 16.01.2009, 08:58  
Erfahrener Benutzer
 
Registriert seit: 06.09.2008
Beiträge: 189
#Avedo befindet sich auf einem aufstrebenden Ast
Standard

Danke fuer eure Anregungen werde mich mal die Tage an die Implementierung setzen. Habe allerdings vorher noch eine kleine Frage. Haltet ihr es fuer sinnvoll in der abstrakten Klasse Validator noch ein error-Attribut hinzuzufuegen, dass die Standrad-Fehlermeldung enthaelt, die jedoch ueber eine Methode angepasst werden kann?

MfG, Andy
__________________
I'm so tired of slitting the throats of people calling me a violent psychopath.
#Avedo ist offline   Mit Zitat antworten
Alt 16.01.2009, 11:48  
Neuer Benutzer
 
Registriert seit: 27.12.2008
Beiträge: 23
Bleda befindet sich auf einem aufstrebenden Ast
Standard

Du könntest auch einfach die getError() Methode in der abstrakten Klasse schon so implementieren, dass sie eine Standardmeldung zurückgibt. In den abgeleiteten Klassen kannst du dann die Methode einfach überschreiben und damit machen was du willst. Wo du die Meldung selber ablegst ist natürlich wieder eine andere Frage (Im Code, Sprachfile...).
Bleda ist offline   Mit Zitat antworten
Alt 16.01.2009, 14:09  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.425
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

Möglich ist auch die Benutzung von GNU Gettext (entweder selbst implementieren oder sich mit den Gettext-Funktionen von PHP herumärgern).
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Alt 26.12.2009, 17:07  
Erfahrener Benutzer
 
Registriert seit: 05.09.2004
Beiträge: 106
PHP-Kenntnisse:
Fortgeschritten
MaMo-Net
Standard

Hallo,

mir ist bewusst, dass das Thema schon älter ist, aber ich möchte es dennoch nochmal aufgreifen, da ich mir auf Basis dieses Themas nun auch einen Validator (ohne Formulargenerierung) gebastelt habe, ich stehe jedoch noch vor einigen konzeptionellen Problemen.

Ich habe folgende Klassen:
Validator - Bündelt die einzelnen "Elemente" (jedes Formularfeld wäre ein Element), die validiert werden sollen
ValidatorElement - Entspricht dem o.g. "Element", bündelt die einzelnen Validationsregeln
AbstractValidator - Basisklasse für einzelne Validationsregeln
BetweenValidator (z.B.) - Spezielle Implementierung einer Validationsregel

Nutzen könne man das ganze z.B. so (vereinfacht, nur eine Regel):
PHP-Code:
<?php
$validator 
= new Validator($_REQUEST);
$validatorElement = new ValidatorElement('test');
$betweenValidator = new BetweenValidator(110);
$betweenValidator->setMessages(
    array(
        
'NOT_BETWEEN_INCLUSIVE' => 'Gegebener Wert nicht im passenden Bereich ...'
    
)
);
$validatorElement->addValidator($betweenValidator);
$validator->addElement($validatorElement);
if (
$validator->isValid() == false) {
    
$output $validator->getErrors();
}
else {
    
$output $validatorElement->getValue(); // anstatt $_REQUEST['test']
}
?>
Nun könnte man diese einzelne Regel auch nur mit dem BetweenValidator prüfen, aber das ist auch nur ein einfaches Beispiel, bei mehreren Validationsregeln und mehreren Feldern wird das ja erst sinnvoll. Nun ist das schon ein ziemlicher Klotz für ein wenig Validation, v.a. die Sprachbehandlung finde ich viel zu umständlich und würde die Nutzung gerne kompakter gestalten.
Schön kompakt wäre es z.B. so, aber einerseits ist das vllt. nicht allzu schön und die Sprachbehandlung fehlt auch noch:
PHP-Code:
<?php
$validatorElement 
= new ValidatorElement('test');
$validatorElement->addValidators(
    new 
BetweenValidator(110),
    new 
XYZValidator('Blubb'),
    
// ...
);
$validator = new Validator($_REQUEST);
$validator->addElements($validatorElement, ..., ...);
if (
$validator->isValid() == false) {
    
$output $validator->getErrors();
}
else {
    
$output $validatorElement->getValue(); // anstatt $_REQUEST['test']
}
?>
Hat jemand eine Idee, wie man das halbwegs kompakt, aber dennoch möglichst flexibel gestalten könnte?

Ansonsten würde ich auch gerne einmal wissen, ob sonstige konzeptionelle Verbesserung möglich wären.

Dank und Grüße
MaMo

Anhang: Source Code
PHP-Code:
<?php
/**
 * Validator class that bundles the ValidatorElement objects.
 *
 * Validation classes base on a concept discussed at php.de, see link.
 *
 * @package        Core
 * @subpackage    Security
 * @author        Matthias Mohr
 * @author        Andreas Wilhelm
 * @copyright    Copyright (c) 2004-2010, Viscacha.org
 * @since         1.0
 * @see            http://www.php.de/software-design/50128-formular-validierung.html
 */
class Validator {

    protected 
$data = array();
    protected 
$elements = array();
    protected 
$errors = array();

    
/**
     * @param array Array with data to validate
     */
    
public function __construct($data) {
        
$this->data $data;
    }

    
/**
     * Adds an element to the Validator.
     *
     * If you specify an Element with a name that was used by another element before, this element
     * won't overwrite the element specified before.
     *
     * @param ValidatorElement
     */
    
public function addElement(ValidatorElement $element) {
        
$name $element->getName();
        if (isset(
$this->data[$name]) == true) {
            
$element->setValue($this->data[$name]);
        }

        
// check if entry exists
        
if(!isset($this->elements[$name])) {
            
$this->elements[$name] = $element;
        }
        else {
            
// Write a message to the log file as this can lead to unapplied Validators (risky)!
            
ErrorHandling::getDebug()->addText(
                
"Validation: You specified an element multiple times, this can be a security hole!"
            
);
        }
    }

    
/**
     * Checks if any errors accured in this form.
     *
     * @return boolean
     */
    
public function isValid() {
        
$isValid true;
        foreach(
$this->elements as $element) {
            if(
$element->isValid() == false) {
                
$isValid false;
                
$this->errors[$element->getName()] = $element->getErrors();
            }
        }
        return 
$isValid;
    }

    
/**
     * Returns the errors accured in a validator.
     *
     * @return array
     */
    
public function getErrors() {
        return 
$this->errors;
    }
}
?>
PHP-Code:
<?php
/**
 * ValidatorElement class that bundles the validation rules and filters for this element.
 *
 * @package        Core
 * @subpackage    Security
 * @author        Andreas Wilhelm
 * @author        Matthias Mohr
 * @copyright    Copyright (c) 2004-2010, Viscacha.org
 * @since         1.0
 * @see            http://www.php.de/software-design/50128-formular-validierung.html
 */
class ValidatorElement {

    protected 
$name;
    protected 
$value;
    protected 
$validators;
    protected 
$errors;

    
/**
     * @param string Element name
     */
    
public function __construct($name$value null) {
        
$this->validators = array();
        
$this->errors = array();
        
$this->name $name;
        
$this->value $value;
    }

    
/**
     * Adds a validator to an element.
     *
     * @param AbstractValidator
     * @param boolean Make this Validator optional (true) or not (false, default).
     * @todo Find a better method for the in_array check (maybe a uniqueId method for validators)
     */
    
public function addValidator(AbstractValidator $validator$optional false) {
        
// Don't add a validator with the same data multiple times
        
if(in_array($validator$this->validators) == false) {
            
$validator->setOptional($optional);
            
$this->validators[] = $validator;
        }
    }

    
/**
     * Returns the name of an element.
     *
     * @return string
     */
    
public function getName() {
        return 
$this->name;
    }

    
/**
     * Returns the value of an element.
     *
     * @return mixed
     */
    
public function getValue() {
        return 
$this->value;
    }

    
/**
     * Assigns a value to an element.
     *
     * @param mixed
     */
    
public function setValue($value) {
        
$this->value $value;
    }

    
/**
    * Checks if any errrors accured in this element.
    *
    * @return Boolean
    */
    
public function isValid() {
        
$isValid true;
        foreach(
$this->validators as $validator) {
            if(
$validator->isValid($this->value) == false) {
                
$isValid false;
                
$this->errors array_merge($this->errors$validator->getErrors());
            }
        }
        return 
$isValid;
    }

    
/**
    * Returns the errors occured in an element.
    *
    * @access public
    * @return Array
    */
    
public function getErrors() {
        return 
$this->errors;
    }
}
?>
PHP-Code:
<?php
/**
 * Abstract validator that has to be extended by all Validator rule classes.
 *
 * @package        Core
 * @subpackage    Security
 * @author        Matthias Mohr
 * @copyright    Copyright (c) 2004-2010, Viscacha.org
 * @since         1.0
 * @see            http://www.php.de/software-design/50128-formular-validierung.html
 * @abstract
 */
abstract class AbstractValidator {

    private 
$errors;
    private 
$messages;
    protected 
$optional;

    
/**
     * Constructs a new validator rule.
     */
    
public function  __construct() {
        
$this->reset();
        
$this->messages = array();
    }

    
/**
     * Checks the specified parameter against the rules.
     *
     * @param mixed
     * @return boolean returns true if valid, false if invalid.
     */
    
public abstract function isValid($value);

    
/**
     * Sets whether this validator is optional or not.
     *
     * @param boolean true = optional, false = required
     */
    
public function setOptional($optional) {
        
$this->optional $optional;
    }

    
/**
     * Returns the error codes as array.
     *
     * @return array
     */
    
public function getErrors() {
        return 
$this->errors;
    }

    
/**
     * Returns the number of errors.
     *
     * @return int
     */
    
public function countErrors() {
        return 
count($this->errors);
    }

    
/**
     * Sets the human readable error messages.
     *
     * You have to specify an array with the error codes as keys and the messages itself as values.
     *
     * @param array
     */
    
public function setMessages(array $messages) {
        
$this->messages $messages;
    }

    
/**
     * Returns the error messages as array.
     *
     * The keys are the error codes and the values are the human readable messages.
     * You have to specify the messages before with AbstractValidator::setMessages().
     * If no error message is found for an error code the error code will be returned as value.
     *
     * @return array
     */
    
public function getMessages() {
        
$messages = array();
        foreach (
$this->errors as $code) {
            if (isset(
$this->messages[$code]) == true) {
                
$messages[$code] = $this->messages[$code];
            }
            else {
                
$messages[$code] = $code;
            }
        }
        return 
$messages;
    }

    
/**
     * Adds an error message to the error array.
     *
     * @param string Error code
     */
    
protected function setError($error) {
        
$this->errors[] = $error;
    }

    
/**
     * Resets the validator to be able to validate another value.
     */
    
protected function reset() {
        
$this->errors = array();
    }

}
?>
PHP-Code:
<?php
/**
 * Validates that a number is between two numbers.
 *
 * @package        Core
 * @subpackage    Security
 * @author        Matthias Mohr
 * @copyright    Copyright (c) 2004-2010, Viscacha.org
 * @since         1.0
 * @see            http://www.php.de/software-design/50128-formular-validierung.html
 */
class BetweenValidator extends AbstractValidator {

    const 
NOT_BETWEEN_EXCLUSIVE 'NOT_BETWEEN_EXCLUSIVE';
    const 
NOT_BETWEEN_INCLUSIVE 'NOT_BETWEEN_INCLUSIVE';

    protected 
$min;
    protected 
$max;
    protected 
$inclusive;

    public function  
__construct($min$max$inclusive true) {
        
parent::__construct();
        
$this->min $min;
        
$this->max $max;
        
$this->inclusive $inclusive;
    }

    public function 
isValid($value) {
        
$this->reset();
        if (
$this->optional == true && empty($value) == true) {
            return 
true;
        }
        if (
$this->inclusive == true) {
            if (
Numbers::isDecimal($value) == true && $this->min >= $value && $value <= $this->max) {
                return 
true;
            }
            else {
                
$this->setError(self::NOT_BETWEEN_INCLUSIVE);
                return 
false;
            }
        }
        else {
            if (
Numbers::isDecimal($value) == true && $this->min $value && $value $this->max) {
                return 
true;
            }
            else {
                
$this->setError(self::NOT_BETWEEN_EXCLUSIVE);
                return 
false;
            }
        }
    }

}
?>
MaMo-Net 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
PHP: Formular Generator Zergling-new Tutorials 16 06.07.2010 03:14
Ergebnis von Formular in iFrame zeigen PsychoEagle HTML, Usability und Barrierefreiheit 2 22.07.2009 21:07
Problem mit Formular, Daten an datenbank senden Aurec PHP Tipps 2008 11 20.11.2008 18:17
Formular Pflichtfelder für Frontpage Formular erstellen Caruso JavaScript, Ajax und mehr 5 21.06.2008 09:17
Wert aus Textfeld in neues Formular übernehmen (kein Submit) PsychoEagle HTML, Usability und Barrierefreiheit 9 02.01.2007 14:51
formular includen samspa5 PHP Tipps 2006 13 18.03.2006 11:37
[Erledigt] Formular in Formular HTML, Usability und Barrierefreiheit 4 19.10.2005 12:18
[Erledigt] PHP Formular ~~wichtig~~ PHP Tipps 2005 27 29.05.2005 19:38
[Erledigt] Im Formular user abfragen? Datenbanken 3 06.01.2005 10:51
[Erledigt] PHP Formular - Daten an nächsten Schritt weiter geben - Wie? PHP Tipps 2005 14 02.01.2005 20:05
[Erledigt] Daten in einem Formular ausgeben und ändern PHP Tipps 2004-2 7 07.12.2004 17:22
Wie implementiere ich mein Email Formular? PHP Tipps 2004-2 2 14.11.2004 17:02
Brauche PHP Formular Beitragsarchiv 9 16.08.2004 16:23
[Erledigt] Formular mit Daten werden auf anderer Seite zusammengefasst PHP Tipps 2004 4 15.08.2004 15:44
[Erledigt] Daten in neuem Formular anzeigen PHP Tipps 2004 6 21.07.2004 10:44

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
validierung klasse php kommazahlen, addvalidator inarray, \währungen ohne nachkommastellen\, validierung formularfeld php html, zend validator währung, formular validierung html, php feld buchstabe an bestimmter position, software validierung formblatt, validator nachkommastellen zend, zend validate währung, zend elemente einzeln ausgeben, zend framework validation umlaute, name validieren filtern php, php validierung mehrerer felder, zend validator error messages umlaute, php formular validierung mit fehlerausgabe, zend geterrors ausgeben, zend formular validieren, $validation->geterrors() php, zend error message deutsche umlaute

Alle Zeitangaben in WEZ +1. Es ist jetzt 05:33 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