2021-06-03 09:49:07 +02:00
< ? php
/* Copyright ( C ) 2021 John BOTELLA < john . botella @ atm - consulting . fr >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 3 of the License , or
* any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < https :// www . gnu . org / licenses />.
*/
/**
* \file htdocs / core / class / validate . class . php
* \ingroup core
* \brief File for Utils class
*/
/**
* Class toolbox to validate values
*/
class Validate
{
/**
* @ var DoliDb Database handler ( result of a new DoliDB )
*/
public $db ;
/**
* @ var Translate $outputLang
*/
public $outputLang ;
/**
* @ var string Error string
* @ see $errors
*/
public $error ;
/**
2021-08-31 20:31:05 +02:00
* Constructor
2021-06-03 09:49:07 +02:00
*
2021-08-31 20:31:05 +02:00
* @ param DoliDB $db Database handler
* @ param Translate $outputLang Output lang for error
2021-06-03 09:49:07 +02:00
*/
2021-08-31 20:31:05 +02:00
public function __construct ( $db , $outputLang = null )
2021-06-03 09:49:07 +02:00
{
global $langs ;
2022-01-14 11:46:31 +01:00
if ( empty ( $outputLang )) {
2021-06-03 09:49:07 +02:00
$this -> outputLang = $langs ;
} else {
$this -> outputLang = $outputLang ;
}
2022-01-14 11:46:31 +01:00
if ( ! is_object ( $this -> outputLang ) || ! method_exists ( $this -> outputLang , 'load' )) {
2023-02-22 16:27:10 +01:00
return ;
2021-12-28 19:08:47 +01:00
}
2022-01-14 11:46:31 +01:00
$this -> outputLang -> loadLangs ( array ( 'validate' , 'errors' ));
2021-06-03 09:49:07 +02:00
$this -> db = $db ;
}
/**
* Use to clear errors msg or other ghost vars
2023-02-22 16:27:10 +01:00
*
* @ return void
2021-06-03 09:49:07 +02:00
*/
protected function clear ()
{
$this -> error = '' ;
}
/**
* Use to clear errors msg or other ghost vars
2021-07-11 14:13:24 +02:00
*
2023-02-22 16:27:10 +01:00
* @ param string $errMsg your error message
* @ return void
2021-06-03 09:49:07 +02:00
*/
protected function setError ( $errMsg )
{
2021-07-11 15:58:34 +02:00
$this -> error = $errMsg ;
2021-06-03 09:49:07 +02:00
}
/**
* Check for e - mail validity
*
2023-02-22 16:27:10 +01:00
* @ param string $email e - mail address to validate
* @ param int $maxLength string max length
* @ return boolean Validity is ok or not
2021-06-03 09:49:07 +02:00
*/
public function isEmail ( $email , $maxLength = false )
{
if ( ! filter_var ( $email , FILTER_VALIDATE_EMAIL )) {
$this -> error = $this -> outputLang -> trans ( 'RequireValidEmail' );
return false ;
}
return true ;
}
/**
* Check for price validity
*
* @ param string $price Price to validate
* @ return boolean Validity is ok or not
*/
public function isPrice ( $price )
{
if ( ! preg_match ( '/^[0-9]{1,10}(\.[0-9]{1,9})?$/ui' , $price )) {
$this -> error = $this -> outputLang -> trans ( 'RequireValidValue' );
return false ;
}
return true ;
}
/**
* Check for timestamp validity
*
* @ param string | int $stamp timestamp to validate
* @ return boolean Validity is ok or not
*/
public function isTimestamp ( $stamp )
{
2021-06-14 21:15:53 +02:00
if ( ! is_numeric ( $stamp ) && ( int ) $stamp == $stamp ) {
2021-06-06 21:12:03 +02:00
$this -> error = $this -> outputLang -> trans ( 'RequireValidDate' );
return false ;
}
return true ;
}
/**
* Check for phone validity
*
* @ param string $phone Phone string to validate
* @ return boolean Validity is ok or not
*/
public function isPhone ( $phone )
{
if ( ! preg_match ( '/^[+0-9. ()-]*$/ui' , $phone )) {
$this -> error = $this -> outputLang -> trans ( 'RequireValidPhone' );
2021-06-03 09:49:07 +02:00
return false ;
}
return true ;
}
/**
* Check for string max length validity
*
* @ param string $string to validate
* @ param int $length max length
* @ return boolean Validity is ok or not
*/
public function isMaxLength ( $string , $length )
{
if ( strlen ( $string ) > $length ) {
$this -> error = $this -> outputLang -> trans ( 'RequireMaxLength' , $length );
return false ;
}
return true ;
}
/**
* Check for string not empty
*
* @ param string $string to validate
* @ return boolean Validity is ok or not
*/
public function isNotEmptyString ( $string )
{
if ( ! strlen ( $string )) {
$this -> error = $this -> outputLang -> trans ( 'RequireANotEmptyValue' );
return false ;
}
return true ;
}
/**
* Check for string min length validity
*
* @ param string $string to validate
* @ param int $length max length
* @ return boolean Validity is ok or not
*/
public function isMinLength ( $string , $length )
{
2022-12-20 15:17:55 +01:00
if ( strlen ( $string ) < $length ) {
2021-06-03 09:49:07 +02:00
$this -> error = $this -> outputLang -> trans ( 'RequireMinLength' , $length );
return false ;
}
return true ;
}
/**
* Check url validity
*
* @ param string $url to validate
* @ return boolean Validity is ok or not
*/
public function isUrl ( $url )
{
if ( ! filter_var ( $url , FILTER_VALIDATE_URL )) {
$this -> error = $this -> outputLang -> trans ( 'RequireValidUrl' );
return false ;
}
return true ;
}
2021-06-06 21:12:03 +02:00
/**
* Check Duration validity
*
2021-12-28 19:08:47 +01:00
* @ param mixed $duration to validate
2021-06-06 21:12:03 +02:00
* @ return boolean Validity is ok or not
*/
public function isDuration ( $duration )
{
if ( ! is_int ( $duration ) && $duration >= 0 ) {
$this -> error = $this -> outputLang -> trans ( 'RequireValidDuration' );
return false ;
}
return true ;
}
2022-01-14 11:46:31 +01:00
/**
2022-01-14 11:51:07 +01:00
* Check numeric validity
2022-01-14 11:46:31 +01:00
*
* @ param mixed $string to validate
* @ return boolean Validity is ok or not
*/
public function isNumeric ( $string )
{
if ( ! is_numeric ( $string )) {
$this -> error = $this -> outputLang -> trans ( 'RequireValidNumeric' );
return false ;
}
return true ;
}
2021-06-06 21:12:03 +02:00
/**
* Check for boolean validity
*
* @ param boolean $bool Boolean to validate
* @ return boolean Validity is ok or not
*/
public function isBool ( $bool )
{
2021-06-14 21:15:53 +02:00
if ( ! ( is_null ( $bool ) || is_bool ( $bool ) || preg_match ( '/^[0|1]{1}$/ui' , $bool ))) {
2021-06-06 21:12:03 +02:00
$this -> error = $this -> outputLang -> trans ( 'RequireValidBool' );
return false ;
}
return true ;
}
/**
* Check for all values in db
*
* @ param array $values Boolean to validate
2022-01-27 10:19:35 +01:00
* @ param string $table the db table name without $this -> db -> prefix ()
2021-06-06 21:12:03 +02:00
* @ param string $col the target col
* @ return boolean Validity is ok or not
* @ throws Exception
*/
public function isInDb ( $values , $table , $col )
{
if ( ! is_array ( $values )) {
$value_arr = array ( $values );
} else {
$value_arr = $values ;
}
if ( ! count ( $value_arr )) {
$this -> error = $this -> outputLang -> trans ( 'RequireValue' );
return false ;
}
2021-06-14 21:15:53 +02:00
foreach ( $value_arr as $val ) {
2022-05-10 14:38:40 +02:00
$sql = " SELECT " . $col . " FROM " . $this -> db -> prefix () . $table . " WHERE " . $col . " = ' " . $this -> db -> escape ( $val ) . " ' LIMIT 1 " ; // more quick than count(*) to check existing of a row
$resql = $this -> db -> query ( $sql );
2021-06-06 21:12:03 +02:00
if ( $resql ) {
2022-05-10 14:38:40 +02:00
$obj = $this -> db -> fetch_object ( $resql );
if ( $obj ) {
continue ;
}
2021-06-06 21:12:03 +02:00
}
2022-05-10 14:38:40 +02:00
// If something was wrong
$this -> error = $this -> outputLang -> trans ( 'RequireValidExistingElement' );
return false ;
2021-06-06 21:12:03 +02:00
}
return true ;
}
/**
* Check for all values in db
*
2022-06-17 10:35:01 +02:00
* @ param integer $id of element
2021-06-06 21:12:03 +02:00
* @ param string $classname the class name
* @ param string $classpath the class path
* @ return boolean Validity is ok or not
* @ throws Exception
*/
2022-06-17 10:35:01 +02:00
public function isFetchable ( $id , $classname , $classpath )
2021-06-06 21:12:03 +02:00
{
if ( ! empty ( $classpath )) {
if ( dol_include_once ( $classpath )) {
if ( $classname && class_exists ( $classname )) {
/** @var CommonObject $object */
$object = new $classname ( $this -> db );
if ( ! is_callable ( array ( $object , 'fetch' )) || ! is_callable ( array ( $object , 'isExistingObject' ))) {
$this -> error = $this -> outputLang -> trans ( 'BadSetupOfFieldFetchNotCallable' );
return false ;
}
2022-06-17 10:35:01 +02:00
if ( ! empty ( $object -> table_element ) && $object -> isExistingObject ( $object -> table_element , $id )) {
2021-06-06 21:12:03 +02:00
return true ;
2023-12-04 12:04:36 +01:00
} else {
$this -> error = $this -> outputLang -> trans ( 'RequireValidExistingElement' );
}
} else {
$this -> error = $this -> outputLang -> trans ( 'BadSetupOfFieldClassNotFoundForValidation' );
}
} else {
$this -> error = $this -> outputLang -> trans ( 'BadSetupOfFieldFileNotFound' );
}
} else {
$this -> error = $this -> outputLang -> trans ( 'BadSetupOfField' );
}
2021-06-06 21:12:03 +02:00
return false ;
}
2021-06-03 09:49:07 +02:00
}