Criando mensagens de validação automaticas no CakePHP

Uma das principais vantagens de usar um framework para o desenvolvimento de aplicações é sem dúvidas a não repetição de código e tarefas já feitas. Sendo assim, sempre que evitamos reescrever uma linha de código que seja, só aumentamos a vantagem de ter optado por usar certo framework no nosso projecto de desenvolvimento de aplicações.No CakePHP, normalmente temos de repetir a mesma mensagem de validação em cada modelo ou campo de formulário, pois o CakePHP não suporta mensagens de validação padrão nativamente. Por exemplo, sem queremos que o sistema emita a mensagem “Preencha este campo, por favor” em cada campo do formulário que não foi preenchido, teremos que escrever esta mensagem nas regras de validação de cada campo!Este problema pode ser solucionado com o código que se segue aqui, que não é nada mais que um ValidationMessage Behavior desenvolvido por um utilizador do CakePHP que decidiu compartilhar o código com a comunidade. O código é tão inteligente a ponto de só usar as mensagens definidas por padrão no caso de você não especificar nenhuma mensagem de validação no seu modelo ou formulário. Outra vantagem é que o código usa o sistema de internacionalização do CakePHP, com strings já imbutidas na função __() de tradução.Abaixo vai o código do arquivo validation_message.php que você deve colocar no directório de behaviors da sua aplicação:

<?php /**  * ValidationMessage behavior class.  *  * Display automatic validation message for core validation rules  *  * PHP versions 5  *  *  * Licensed under The MIT License  * Redistributions of files must retain the above copyright notice.  *  * @author        Md. Rayhan Chowdhury <ray@raynux.com>  * @copyright     Copyright 2010, Raynux.com.  * @package       cake  * @subpackage    cake.app.model.behaviors  * @since         CakePHP v 1.2.0.4487  * @license       MIT License (http://www.opensource.org/licenses/mit-license.php)  */ /**  * ValidateMessage Behavior  *  * @package       cake  * @subpackage    cake.appe.model.behaviors  */ class ValidationMessageBehavior extends ModelBehavior {     protected $_messages = array(         'notempty'      => "This field can't be left blank.",         'between'       => "Must be between %s and %s characters long.",         'email'         => "Please provide a valid email address.",         'alphanumeric'  => "Only alphabets and numbers allowed.",         'boolean'       => "Only boolean data allowed.",         'cc'            => "The credit card number you supplied was invalid.",         'comparison'    => 'The data you supplied are incorrect.',         'date'          => "Please provide date in correct format.",         "decimal"       => "Numeric value required.",         "equalto"       => "Value must be equal to %s",         "extension"     => "Please upload a valid file with supported extensions.",         "ip"            => "Please supply a valid IP address.",         "isunique"      => "This value has already been taken.",         "minlength"     => "Must be at least %s characters long.",         "maxlength"     => "Must be no larger than %s characters long.",         "money"         => "Please supply a valid monetary amount.",         "multiple"      => "Please select multiple options as specified.",         "inlist"        => "Invalid data provided, please try again.",         "numeric"       => "Only numeric value allowed.",         "phone"         => "Phone number is invalid.",         "postal"        => "Postal code is invalid.",         "range"         => "Please enter a value between %s and %s.",         "ssn"           => "Social Security Number is not valid.",         "url"           => "Please provide a valid URL.",         "slug"          => "Only alphabets, numbers, dash and underscore characters allowed",    );         /**          * Get the automatice validation message          *           * @param array $rule, string or array          * @return string internationalized          */         function _autoMessage($rule) {             $rule[0] = $this->_messages[strtolower($rule[0])];             return __(call_user_func_array('sprintf', $rule), true);         }         /**          * Attach automatic message for each validation          *          * @return void          * @access public          */     function  beforeValidate(&$model) {             parent::beforeValidate($model);                          if (!empty($model->validate)) {                 foreach ($model->validate as $fieldName => &$ruleSet) {                     // for single rule                     if (is_string($ruleSet) && !empty($this->_messages[strtolower($ruleSet)])) {                             $ruleSet = array('rule' => $ruleSet, 'message' => $this->_autoMessage(array($ruleSet)));                     }             // for array             if (is_array($ruleSet)) {                 if (isset($ruleSet['rule'])) {                     if (!isset($ruleSet['message'])) {                         $rule = is_string($ruleSet['rule'])? array($ruleSet['rule']) : $ruleSet['rule'];                         if (is_string($rule[0]) && !empty($this->_messages[strtolower($rule[0])])) {                             $ruleSet['message'] = $this->_autoMessage($rule);                         }                        }                 } else {                     // for multiple rules per field                     foreach ($ruleSet as $index => $rule) {                         if (!isset($rule['message'])) {                             $rule = is_string($rule['rule']) ? array($rule['rule']) : $rule['rule'];                             if (is_string($rule[0]) && !empty($this->_messages[strtolower($rule[0])])) {                                 $ruleSet[$index]['message'] = $this->_autoMessage($rule);                             }                         }                     }                 }             }         }     }     } } 

Agora você pode invocar este behavior em cada um dos seus modelos usando a seguinte declaração:

 public $actsAs = array('ValidationMessage'); 

Sim, tem razão, você pode poupar seu tempo e adicionar esta declaração no app_controller.php, para que funcione em todos os modelos da sua aplicação!Agora é a sua vez de escrever, dizendo o que achou deste artigo, nos comentários

Receba nossas actualizações por email

Ver Campanhas anteriores.

(Visited 64 times, 1 visits today)
Share