NumberScopeValidator - Zahl in einem bestimmten Bereich

Dieser Bereich dient dazu, neue Features zu diskutieren und für die Entwicklung zu dokumentieren. // This area is dedicated to new features including proposals and documentation.
Gesperrt
Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

NumberScopeValidator - Zahl in einem bestimmten Bereich

Beitrag von jwlighting » 02.01.2013, 21:39:53

Hallo zusammen,

brauchte vorhin für ein Projekt einen Validator, der überprüft ob ein Formularfeld mit einer Zahl in einem angegebenen Bereich gefüllt ist.
Es lassen sich obere und untere Grenze definieren - es müssen aber nicht beide genutzt werden. Außerdem können nur ganze Zahlen zugelassen werden.
Defaultwerte sind 0 und 65535 (maximaler Wert in 16-bit).

Ich stelle die Implementierung mal hier zur Diskussion - danach kann sie dann (hoffentlich) zu den anderen Validatoren nach tools::form::validator.

LG :)
Jan

Code: Alles auswählen

/**
 * @package tools::form::validator
 * @class NumberScopeValidator
 *
 * Validates a given form control to contain a number within a defined scope.
 * The default min value is 0, the default max value 65535 (maximum value in
 * 16-bit integer). Define the upper/lower limit by using the attributes
 * <em>minvalue</em> and <em>maxvalue</em> in the target control. Use the
 * string 'null' to indicate an infinite upper/lower limit.
 *
 *
 * @author Jan Wiese
 * @version
 * Version 0.1, 02.01.2013<br />
 */
class NumberScopeValidator extends TextFieldValidator {

   private static $MIN_VALUE_ATTRIBUTE_NAME = 'minvalue';

   private static $MAX_VALUE_ATTRIBUTE_NAME = 'maxvalue';

   private static $ONLY_INTEGER_ATTRIBUTE_NAME = 'integer';

   private static $ONLY_INTEGER_ATTRIBUTE_VALUE = 'yes';


   /**
    * @public
    *
    * Re-implements the <em>validate()</em> method for the number scope validator.
    * Supports min and max value definition of the number to validate.
    *
    * @param string $input The number to validate.
    * @return boolean true, in case the control to validate is considered valid, false otherwise.
    *
    * @author Jan Wiese
    * @version
    * Version 0.1, 02.01.2013<br />
    */
   public function validate($input) {
      
      // check if only integers are accepted
      if ($this->onlyIntegers()) {

         // check for integer
         if(!($input === ((string)(int) $input))){
            return false;
         }
         
         // convert input from string to int
         $input = (int) $input;

      }
      else {

         // check for numberic value (int/float)
         if (is_numeric($input)) {
            return false;
         }

         // convert input from string to float
         $input = (float) $input;

      }

      
      
      // get limiting values
      $minvalue = $this->getMinValue();
      $maxvalue = $this->getMaxValue();

      // check lower limit
      if ($minvalue !== null) {
         if ($input < $minvalue) {
            return false;
         }
      }

      // check upper limit
      if ($maxvalue !== null) {
         if ($input > $maxvalue) {
            return false;
         }
      }

      return true;
   }


   /**
    * @protected
    *
    * Returns the min number value, that must be defined within the target control.
    * Tries to load the min value from the <em>minvalue</em> attribute within the
    * target form control definition. Default value is 0. Infinite lower limit is
    * indicated by string 'null'.
    *
    * @return float The min value.
    *
    * @author Jan Wiese
    * @version
    * Version 0.1, 02.01.2013<br />
    */
   protected function getMinValue() {
      $minValue = $this->__Control->getAttribute(self::$MIN_VALUE_ATTRIBUTE_NAME);

      if ($minValue === null) {
         $minValue = 0;
      }
      if ($minValue === 'null') {
         return null;
      }

      return (float) $minValue;
   }


   /**
    * @protected
    *
    * Returns the max number value, that must be defined within the target control.
    * Tries to load the max value from the <em>maxvalue</em> attribute within the
    * target form control definition. Default value is 65535. Infinite upper limit is
    * indicated by string 'null'.
    *
    * @return float The max value.
    *
    * @author Jan Wiese
    * @version
    * Version 0.1, 02.01.2013<br />
    */
   protected function getMaxValue() {
      $maxValue = $this->__Control->getAttribute(self::$MAX_VALUE_ATTRIBUTE_NAME);

      if ($maxValue === null) {
         $maxValue = 65535;
      }
      if ($maxValue === 'null') {
         return null;
      }

      return (float) $maxValue;
   }


   /**
    * @protected
    *
    * Returns if only integers are accepted as target control value.
    * Tries to load from the <em>integers</em> attribute within the target control
    * definition. Default
    *
    * @return bool True if only integers are accepted, false otherwise.
    *
    * @author Jan Wiese
    * @version
    * Version 0.1, 02.01.2013<br />
    */
   protected function onlyIntegers() {
      $onlyIntegers = $this->__Control->getAttribute(self::$ONLY_INTEGER_ATTRIBUTE_NAME);

      if ($onlyIntegers == self::$ONLY_INTEGER_ATTRIBUTE_VALUE) {
         return true;
      }

      return false;
   }

}
 

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4538
Registriert: 04.11.2007, 16:13:53

Re: NumberScopeValidator - Zahl in einem bestimmten Bereich

Beitrag von dr.e. » 03.01.2013, 00:00:33

Hallo Jan,

vielen Dank für deinen Vorschlag der Erweiterung der Validatoren. Freue mich, das du den Code dem APF beisteuern möchtest und nehme ihn sehr gerne in auf. :)

Schaue mir den Code in den nächsten Tagen genauer an und gebe dir Feedback.
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4538
Registriert: 04.11.2007, 16:13:53

Re: NumberScopeValidator - Zahl in einem bestimmten Bereich

Beitrag von dr.e. » 03.01.2013, 17:43:48

Hallo Jan,

hier mein Feedback:
  • Die Methode onlyIntegers() kannst du wie folgt verkürzen:

    Code: Alles auswählen

    return $this->control->getAttribute(self::$ONLY_INTEGER_ATTRIBUTE_NAME) == self::$ONLY_INTEGER_ATTRIBUTE_VALUE; 
  • Das Tag-Attribut "integer" würde ich "integers-only" nennen, ist etwas beschreibender.
Ansonsten gefällt mir die Implementierung sehr gut. Magst du noch einen entsprechenden Doku-Text für das Kapitel
http://adventure-php-framework.org/Seit ... alidatoren in Deutsch und Englisch schreiben?

PS: den Code habe ich bereits ins SVN integriert.
Viele Grüße,
Christian

Benutzeravatar
jwlighting
Beiträge: 466
Registriert: 14.07.2010, 14:23:58
Wohnort: LK Oldenburg
Kontaktdaten:

Re: NumberScopeValidator - Zahl in einem bestimmten Bereich

Beitrag von jwlighting » 03.01.2013, 18:59:15

Hallo Christian,

Dank dir fürs Feedback und Integrieren.
Ich hab mir deine korrigierte Version aus dem SVN gezogen.
Das Tag-Attribut "integer" würde ich "integers-only" nennen, ist etwas beschreibender.
Genau so hieß er während der Entwicklung mal :) Ich wollte ihn dann aber kurz halten. Meinetwegen dann auch "integers-only".
Magst du noch einen entsprechenden Doku-Text für das Kapitel http://adventure-php-framework.org/Seit ... alidatoren in Deutsch und Englisch schreiben?
Klar. Den englischen Text solltest du dir dann aber nochmal angucken :oops: .

LG :)

Menschen irren - Politiker sind Menschen.
Für den Norddeutschen ist 1kW = 2 Pfund Schlick.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4538
Registriert: 04.11.2007, 16:13:53

Re: NumberScopeValidator - Zahl in einem bestimmten Bereich

Beitrag von dr.e. » 03.01.2013, 22:54:42

Ok. Sollte dein SVN noch nicht funktionieren, dann poste die Texte einfach hier und ich baue sie dann ein.
Viele Grüße,
Christian

Gesperrt

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast