2013-04-18 4 views
0

У меня проблема с правилом пользовательских проверок в торте 2.XCake правило PHP пользовательских проверок

Я хочу, чтобы проверить введенный почтовый индекс является действительным, и, следовательно, функцией в классе почтового индексе вызываются из класса поста ,

Но валидация возвращает false все время.

AppModel в классе пост (правило-3 это):

'DELIVERYAREA' => array(
     'rule-1' => array(
      'rule' => array('between', 5, 5), 
      'message' => 'Bitte eine fünfstellige Postleitzahl eingeben' 
     ), 
     'rule-2' => array(
      'rule' => 'Numeric', 
      'message' => 'Bitte nur Zahlen eingeben' 
     ), 
     'rule-3' => array(
      'exists' => array(
       'rule' => 'ZipExists', 
       'message' => 'Postleitzahl existiert nicht!' 
      ) 
     ) 
    ), 

AppModel в классе почтовый индекс:

class Zipcode extends AppModel { 
    var $name = 'Zipcode'; 

    var $validate = array(
    'zipcode' => array(
     'length' => array(
       'rule' => array('maxLength', 5), 
       'message' => 'Bitte einen Text eingeben' 
     ), 
     'exists' => array(
      'rule' => array('ZipExists'), 
      'message' => 'Postleitzahl existiert nicht!' 

     ) 
    )   
); 

    function ZipExists($zipcode){ 

    $valid = $this->find('count', array('conditions'=> array('Zipcode.zipcode' =>$zipcode))); 
    if ($valid >= 1){ 
     return true; 
    } 
    else{ 
     return false; 
    } 
    } 

Я надеюсь подмигнули что-то тупо легко? Заранее спасибо

+0

- проверка длины работает или нет? – liyakat

+0

Я не знаю, что вы имеете в виду. Каждое другое заданное правило работает нормально. – Karl

+0

вы должны добавить «last => true» в правило проверки длины. нет необходимости запускать вызовы db, если индекс zip-кода имеет недопустимую длину в первую очередь. – mark

ответ

0

Я нашел решение. Торт хочет, чтобы пользовательские правила проверки были в определенном классе, где вызывается правило. Таким образом, когда вы вызываете пользовательское правило в post-классе, пользовательская функция должна быть записана в сообщение класса, иначе торт не найдет ее и не будет проверять ее на false каждый раз.

Магия здесь заключается в том, чтобы импортировать класс appmodel, который вы хотите использовать в классе, вызываемом функцией валидации. Это работает со следующим утверждением:

$ Zipcode = ClassRegistry :: init ('Класс для использования - в моем случае "Zipcode"');

Но если ваши таблицы связаны друг с другом с помощью hasAny или принадлежит и тому подобное, пользовательская функция работает без этого. Еще один важный момент, который вы не должны пропустить, заключается в том, что все функции проверки должны быть введены с помощью «public function xyz», иначе торт не найдет их.

0

Я думаю, что это:

'Zipcode.zipcode' =>$zipcode

... должно быть таким:

'Zipcode.zipcode' =>$zipcode['zipcode']

+0

Нет, не работает. Функция ZipExists отлично работает, потому что я называю ее где-то еще. – Karl

0

Тщательное, что вы ожидаете в правила проверки. Используйте debug() и т. Д., Чтобы узнать, что именно происходит. $ Data всегда является массивом здесь.

public function zipExists($data) { 
    $zipcode = array_shift($data); // use the value of the key/value pair 
    $code = $this->find('first', array('conditions'=> array('Zipcode.zipcode' =>$zipcode))); 
    return !empty($code); 
} 
+0

Проблема в том, что Cake говорит: «Не удалось найти помощника проверки» blabla. Я попробовал его сейчас с проверки с контроллера. См. Мой новый вопрос: http://stackoverflow.com/questions/16078182/cake-php-validation-error-not-shown-although-existing-in-array – Karl

+0

какой помощник проверки?обратите внимание на корпус, ваш метод проверки должен быть camelBacked '' rule '=>' zipExists ', 'then, также. – mark

+0

Проблема с обработчиком проверки (извините, я имел в виду обработчик, а не помощник): Предупреждение (512): Не удалось найти обработчик проверки ZipExists для DELIVERYAREA [CORE/Cake/Model/Validator/CakeValidationRule.php, строка 277]. Соответствующий код, который (в AppModel в DELIVERYAREA): 'Правило-3' => массив ( \t \t \t \t 'правило' => Array ('ZipExists'), \t \t \t \t 'сообщение' => ' Postleitzahl existiert nicht! ' \t \t \t) – Karl

0

попробуйте это только для проверки модели.

function ZipExists(){ 

    $valid = $this->find('count', array('conditions'=> array('Zipcode.zipcode' =>$this->data['Zipcode']['zipcode']))); 
    if ($valid >= 1){ 
     return true; 
    } 
    else{ 
     return false; 
    } 
+0

Проблема в том, что Cake говорит: «Не удалось найти помощника проверки» blabla. Я попробовал его сейчас с проверки с контроллера. См. Мой новый вопрос: http://stackoverflow.com/questions/16078182/cake-php-validation-error-not-shown-although-existing-in-array – Karl