Просмотр исходного кода

[ZF-9605] Zend_Validate:

- added type validation to Isbn validator

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@21759 44c647ce-9c0f-0410-b52a-842ac1e357ba
thomas 16 лет назад
Родитель
Сommit
b187cbc71d
2 измененных файлов с 25 добавлено и 7 удалено
  1. 13 7
      library/Zend/Validate/Isbn.php
  2. 12 0
      tests/Zend/Validate/IsbnTest.php

+ 13 - 7
library/Zend/Validate/Isbn.php

@@ -36,6 +36,7 @@ class Zend_Validate_Isbn extends Zend_Validate_Abstract
     const ISBN10  = '10';
     const ISBN13  = '13';
     const INVALID = 'isbnInvalid';
+    const NO_ISBN = 'isbnNoIsbn';
 
     /**
      * Validation failure message template definitions.
@@ -43,7 +44,8 @@ class Zend_Validate_Isbn extends Zend_Validate_Abstract
      * @var array
      */
     protected $_messageTemplates = array(
-        self::INVALID => "'%value%' is no valid ISBN number",
+        self::INVALID => "Invalid type given, value should be string or integer",
+        self::NO_ISBN => "'%value%' is no valid ISBN number",
     );
 
     /**
@@ -145,21 +147,25 @@ class Zend_Validate_Isbn extends Zend_Validate_Abstract
     /**
      * Defined by Zend_Validate_Interface.
      *
-     * Returns true if and only if $value contains a valid ISBN.
+     * Returns true if and only if $value is a valid ISBN.
      *
      * @param  string $value
      * @return boolean
      */
     public function isValid($value)
     {
-        // save value
+        if (!is_string($value) && !is_int($value)) {
+            $this->_error(self::INVALID);
+            return false;
+        }
+
         $value = (string) $value;
         $this->_setValue($value);
 
         switch ($this->_detectFormat()) {
             case self::ISBN10:
                 // sum
-                $isbn10 = preg_replace('/[^0-9X]/', '', $value);
+                $isbn10 = str_replace($this->_separator, '', $value);
                 $sum    = 0;
                 for ($i = 0; $i < 9; $i++) {
                     $sum += (10 - $i) * $isbn10{$i};
@@ -176,7 +182,7 @@ class Zend_Validate_Isbn extends Zend_Validate_Abstract
 
             case self::ISBN13:
                 // sum
-                $isbn13 = preg_replace('/[^0-9]/', '', $value);
+                $isbn13 = str_replace($this->_separator, '', $value);
                 $sum    = 0;
                 for ($i = 0; $i < 12; $i++) {
                     if ($i % 2 == 0) {
@@ -193,13 +199,13 @@ class Zend_Validate_Isbn extends Zend_Validate_Abstract
                 break;
 
             default:
-                $this->_error(self::INVALID);
+                $this->_error(self::NO_ISBN);
                 return false;
         }
 
         // validate
         if (substr($this->_value, -1) != $checksum) {
-            $this->_error(self::INVALID);
+            $this->_error(self::NO_ISBN);
             return false;
         }
         return true;

+ 12 - 0
tests/Zend/Validate/IsbnTest.php

@@ -256,4 +256,16 @@ class Zend_Validate_IsbnTest extends PHPUnit_Framework_TestCase
         $this->assertFalse($validator->isValid('0 06 092987 1'));
         $this->assertTrue($validator->isValid('978 0 555023 40 2'));
     }
+
+    /**
+     * @group ZF-9605
+     */
+    public function testInvalidTypeGiven()
+    {
+        $validator = new Zend_Validate_Isbn();
+        $validator->setType(Zend_Validate_Isbn::ISBN13);
+
+        $this->assertFalse($validator->isValid((float) 1.2345));
+        $this->assertFalse($validator->isValid((object) 'Test'));
+    }
 }