Sunday, June 14, 2015

Re: Is there a working Localized plugin for CakePHP 3.0?

Hi Anthony,

I am still trying to make the validation rule but it is not working. It says "Method personId does not exist".

I created a folder: /src/Model/Validation

inside I have 3 files:

BrValidation.php
LocalizedValidation.php
ValidationInterface.php


In BrValidation.php:

<?php
/**
 * Brazillian Localized Validation class. Handles localized validation for Brazil.
 *
 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 *
 * Licensed under The MIT License
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright    Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 * @link         http://cakephp.org
 * @since        Localized Plugin v 0.1
 * @license      http://www.opensource.org/licenses/mit-license.php MIT License
 */
App::uses('LocalizedValidation', 'Validation');
/**
 * BrValidation
 *
 */
class BrValidation extends LocalizedValidation {
/**
 * Checks a phone number for Brazil.
 *
 * @param string $check The value to check.
 * @return bool Success.
 */
    public static function phone($check) {
        return (bool)preg_match('/^(\+?\d{1,3}? ?)?(\(0?\d{2}\) ?)?9?\d{4}[-. ]?\d{4}$/', $check);
    }
/**
 * Checks a postal code (CEP) for Brazil.
 *
 * @param string $check The value to check.
 * @return bool Success.
 */
    public static function postal($check) {
        return (bool)preg_match('/^[0-9]{5}-?[0-9]{3}$/', $check);
    }
/**
 * Checks SSN for Brazil.
 *
 * @param string $check The value to check.
 * @return bool Success.
 * @throws NotImplementedException
 */
    public static function personId($check) {
        return BrValidation::cpf($check) || BrValidation::cnpj($check);
    }
/**
 * Checks CPF for Brazil.
 *
 * @param string $check The value to check.
 * @return bool Success.
 */
    public static function cpf($check) {
        $check = trim($check);
        // sometimes the user submits a masked CNPJ
        if (preg_match('/^\d\d\d.\d\d\d.\d\d\d\-\d\d/', $check)) {
            $check = str_replace(array('-', '.', '/'), '', $check);
        } elseif (!ctype_digit($check)) {
            return false;
        }
        if (strlen($check) != 11) {
            return false;
        }
        // repeated values are invalid, but algorithms fails to check it
        for ($i = 0; $i < 10; $i++) {
            if (str_repeat($i, 11) === $check) {
                return false;
            }
        }
        $dv = substr($check, -2);
        for ($pos = 9; $pos <= 10; $pos++) {
            $sum = 0;
            $position = $pos + 1;
            for ($i = 0; $i <= $pos - 1; $i++, $position--) {
                $sum += $check[$i] * $position;
            }
            $div = $sum % 11;
            if ($div < 2) {
                $check[$pos] = 0;
            } else {
                $check[$pos] = 11 - $div;
            }
        }
        $dvRight = $check[9] * 10 + $check[10];
        return ($dvRight == $dv);
    }
/**
 * Checks CNPJ for Brazil.
 *
 * @param string $check The value to check.
 * @return bool Success.
 */
    public static function cnpj($check) {
        $check = trim($check);
        // sometimes the user submits a masked CNPJ
        if (preg_match('/^\d\d.\d\d\d.\d\d\d\/\d\d\d\d\-\d\d/', $check)) {
            $check = str_replace(array('-', '.', '/'), '', $check);
        } elseif (!ctype_digit($check)) {
            return false;
        }
        if (strlen($check) != 14) {
            return false;
        }
        $firstSum = ($check[0] * 5) + ($check[1] * 4) + ($check[2] * 3) + ($check[3] * 2) +
            ($check[4] * 9) + ($check[5] * 8) + ($check[6] * 7) + ($check[7] * 6) +
            ($check[8] * 5) + ($check[9] * 4) + ($check[10] * 3) + ($check[11] * 2);
        $firstVerificationDigit = ($firstSum % 11) < 2 ? 0 : 11 - ($firstSum % 11);
        $secondSum = ($check[0] * 6) + ($check[1] * 5) + ($check[2] * 4) + ($check[3] * 3) +
            ($check[4] * 2) + ($check[5] * 9) + ($check[6] * 8) + ($check[7] * 7) +
            ($check[8] * 6) + ($check[9] * 5) + ($check[10] * 4) + ($check[11] * 3) +
            ($check[12] * 2);
        $secondVerificationDigit = ($secondSum % 11) < 2 ? 0 : 11 - ($secondSum % 11);
        return ($check[12] == $firstVerificationDigit) && ($check[13] == $secondVerificationDigit);
    }
}
?>


In LocalizedValidation.php:

<?php
/**
 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 *
 * Licensed under The MIT License
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 * @link          http://cakephp.org
 * @license       http://www.opensource.org/licenses/mit-license.php MIT License
 */
App::uses('ValidationInterface', 'Validation');
/**
 * Localized Validation base class.
 *
 */
abstract class LocalizedValidation implements ValidationInterface {
/**
 * Checks that a value is a valid identification number.
 * In the case of US this would be the Social Security Number (SSN).
 *
 * This is necessary for CakePHP2.x validation and BC compatibility.
 *
 * @param string $check The value to check.
 * @return bool Success.
 * @deprecated Use personId() instead.
 */
    public static function ssn($check) {
        return static::personId($check);
    }
}
?>

In ValidationInterface.php:

<?php
/**
 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 *
 * Licensed under The MIT License
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 * @link          http://cakephp.org
 * @license       http://www.opensource.org/licenses/mit-license.php MIT License
 */
/**
 * ValidationInterface defining some common base validation methods.
 *
 */
interface ValidationInterface {
/**
 * Checks a phone number.
 *
 * @param string $string The value to check.
 * @return bool Success.
 */
    public static function phone($string);
/**
 * Checks a postal code.
 *
 * @param string $string The value to check.
 * @return bool Success.
 */
    public static function postal($string);
/**
 * Checks a country specific identification number.
 *
 * @param string $string The value to check.
 * @return bool Success.
 */
    public static function personId($string);
}
?>

In the BuyersTable.php where I call the validation ->add('cpf','valid',['rule' => 'personId']);

<?php
namespace App\Model\Table;

use App\Model\Entity\Buyer;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
use Cake\Validation;


/**
 * Buyers Model
 */
class BuyersTable extends Table
{
       
    /**
     * Initialize method
     *
     * @param array $config The configuration for the Table.
     * @return void
     */
    public function initialize(array $config)
    {
        $this->table('buyers');
        $this->displayField('id');
        $this->primaryKey('id');
        $this->belongsTo('Users', [
            'foreignKey' => 'user_id',
            'joinType' => 'INNER'
        ]);
        $this->belongsToMany('Genres', [
            'foreignKey' => 'buyer_id',
            'targetForeignKey' => 'genre_id',
            'joinTable' => 'buyers_genres'
        ]);
    }

    /**
     * Default validation rules.
     *
     * @param \Cake\Validation\Validator $validator Validator instance.
     * @return \Cake\Validation\Validator
     */
     
    public function validationDefault(Validator $validator)
    {
        $validator
            ->add('id', 'valid', ['rule' => 'numeric'])
            ->allowEmpty('id', 'create');
           
        $validator
            ->requirePresence('cpf', 'create')
            ->notEmpty('cpf')
            ->add('cpf','valid',['rule' => 'personId']);
           
        $validator
            ->requirePresence('gender', 'create')
            ->notEmpty('gender');
           
        $validator
            ->add('birthdate', 'valid', ['rule' => 'date'])
            ->requirePresence('birthdate', 'create')
            ->notEmpty('birthdate');
           
        return $validator;
    }

    /**
     * Returns a rules checker object that will be used for validating
     * application integrity.
     *
     * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
     * @return \Cake\ORM\RulesChecker
     */
    public function buildRules(RulesChecker $rules)
    {
        $rules->add($rules->existsIn(['user_id'], 'Users'));
        $rules->add($rules->isUnique(['cpf']));
        return $rules;
    }
}








2015-06-13 14:03 GMT-03:00 Anthony GRASSIOT <antograssiot@gmail.com>:

well it can be anywhere. Personally I baked a plugin and put my class under src/Model/Validation/FrenchValidation.php under the App/Model/Validation namespace for example.

Le 13 juin 2015 17:52, "Paulo Terra" <pterra@gmail.com> a écrit :
Hi José and Anthony, Thank you for your help, but the explanation is very poor. It does not say how to find the validation class, the folder it should be, not even an example of how it should be constructed, the method and if you have more then one validation to construct.

Is there a better documentation about this?

thanks in advance.

2015-06-13 12:27 GMT-03:00 Paulo Terra <pterra@gmail.com>:

This is exactly what I was reading at the moment. Thanks José.

Em 13/06/2015 12:10, "Anthony GRASSIOT" <antograssiot@gmail.com> escreveu:

he's refering to this:
http://book.cakephp.org/3.0/en/core-libraries/validation.html#adding-validation-providers

Le 13 juin 2015 16:49, "Paulo Terra" <pterra@gmail.com> a écrit :
Thank you José for your reply.

I need to validate brazilian ID´s CPF and CNPJ, brazilian ZIP Code and phones.

When you say custom validation provider do you mean the model in cake?


Em sábado, 13 de junho de 2015 04:13:25 UTC-3, José Lorenzo escreveu:
There isn't yet. What do you need from the plugin?

If it is the validation rules, you can just copy the rules from the old Localized plugin into your custom validation provider.

On Friday, June 12, 2015 at 1:06:04 PM UTC+2, Paulo Terra wrote:
Hi, I have been looking for a plugin to validate Person ID, Phone, ZIP Code, etc, but all I can find is for old versions of CakePHP. Does anybody know where I can find a working version for CakePHP 3.0?

Thanks.

Paulo Terra

--
Like Us on FaceBook https://www.facebook.com/CakePHP
Find us on Twitter http://twitter.com/CakePHP

---
You received this message because you are subscribed to the Google Groups "CakePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email to cake-php+unsubscribe@googlegroups.com.
To post to this group, send email to cake-php@googlegroups.com.
Visit this group at http://groups.google.com/group/cake-php.
For more options, visit https://groups.google.com/d/optout.

--
Like Us on FaceBook https://www.facebook.com/CakePHP
Find us on Twitter http://twitter.com/CakePHP

---
You received this message because you are subscribed to a topic in the Google Groups "CakePHP" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/cake-php/Zn05icCM6rQ/unsubscribe.
To unsubscribe from this group and all its topics, send an email to cake-php+unsubscribe@googlegroups.com.
To post to this group, send email to cake-php@googlegroups.com.
Visit this group at http://groups.google.com/group/cake-php.
For more options, visit https://groups.google.com/d/optout.

--
Like Us on FaceBook https://www.facebook.com/CakePHP
Find us on Twitter http://twitter.com/CakePHP

---
You received this message because you are subscribed to the Google Groups "CakePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email to cake-php+unsubscribe@googlegroups.com.
To post to this group, send email to cake-php@googlegroups.com.
Visit this group at http://groups.google.com/group/cake-php.
For more options, visit https://groups.google.com/d/optout.

--
Like Us on FaceBook https://www.facebook.com/CakePHP
Find us on Twitter http://twitter.com/CakePHP

---
You received this message because you are subscribed to a topic in the Google Groups "CakePHP" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/cake-php/Zn05icCM6rQ/unsubscribe.
To unsubscribe from this group and all its topics, send an email to cake-php+unsubscribe@googlegroups.com.
To post to this group, send email to cake-php@googlegroups.com.
Visit this group at http://groups.google.com/group/cake-php.
For more options, visit https://groups.google.com/d/optout.

--
Like Us on FaceBook https://www.facebook.com/CakePHP
Find us on Twitter http://twitter.com/CakePHP

---
You received this message because you are subscribed to the Google Groups "CakePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email to cake-php+unsubscribe@googlegroups.com.
To post to this group, send email to cake-php@googlegroups.com.
Visit this group at http://groups.google.com/group/cake-php.
For more options, visit https://groups.google.com/d/optout.

No comments: