2012-10-09 09:47:33 +00:00
< ? php
/**
* Implementation of the attribute object in the document management system
*
* @ category DMS
2013-02-14 11:10:53 +00:00
* @ package SeedDMS_Core
2012-10-09 09:47:33 +00:00
* @ license GPL 2
* @ version @ version @
* @ author Uwe Steinmann < uwe @ steinmann . cx >
* @ copyright Copyright ( C ) 2012 Uwe Steinmann
* @ version Release : @ package_version @
*/
/**
* Class to represent an attribute in the document management system
*
2013-02-05 09:05:13 +00:00
* Attributes are key / value pairs which can be attachted to documents ,
* folders and document content . The number of attributes is unlimited .
* Each attribute has a value and is related to an attribute definition ,
2013-02-13 17:07:16 +00:00
* which holds the name and other information about the attribute .
2013-02-05 09:05:13 +00:00
*
2013-02-14 11:10:53 +00:00
* @ see SeedDMS_Core_AttributeDefinition
2013-02-05 09:05:13 +00:00
*
2012-10-09 09:47:33 +00:00
* @ category DMS
2013-02-14 11:10:53 +00:00
* @ package SeedDMS_Core
2013-02-13 17:07:16 +00:00
* @ author Uwe Steinmann < uwe @ steinmann . cx >
* @ copyright Copyright ( C ) 2012 - 2013 Uwe Steinmann
2012-10-09 09:47:33 +00:00
* @ version Release : @ package_version @
*/
2013-02-14 11:10:53 +00:00
class SeedDMS_Core_Attribute { /* {{{ */
2012-10-09 09:47:33 +00:00
/**
* @ var integer id of attribute
*
* @ access protected
*/
2013-01-24 08:22:36 +00:00
protected $_id ;
2012-10-09 09:47:33 +00:00
/**
2017-10-24 10:44:22 +00:00
* @ var SeedDMS_Core_Folder | SeedDMS_Core_Document | SeedDMS_Core_DocumentContent SeedDMS_Core_Object folder , document or document content
2013-02-13 17:07:16 +00:00
* this attribute belongs to
2012-10-09 09:47:33 +00:00
*
* @ access protected
*/
2013-01-24 08:22:36 +00:00
protected $_obj ;
2012-10-09 09:47:33 +00:00
/**
2017-10-24 10:44:22 +00:00
* @ var SeedDMS_Core_AttributeDefinition definition of this attribute
2012-10-09 09:47:33 +00:00
*
* @ access protected
*/
2013-01-24 08:22:36 +00:00
protected $_attrdef ;
2012-10-09 09:47:33 +00:00
/**
* @ var mixed value of this attribute
*
* @ access protected
*/
2013-01-24 08:22:36 +00:00
protected $_value ;
2012-10-09 09:47:33 +00:00
2015-04-14 17:36:10 +00:00
/**
* @ var integer validation error
*
* @ access protected
*/
protected $_validation_error ;
2012-10-09 09:47:33 +00:00
/**
2017-10-24 10:44:22 +00:00
* @ var SeedDMS_Core_DMS reference to the dms instance this attribute belongs to
2012-10-09 09:47:33 +00:00
*
* @ access protected
*/
2013-01-24 08:22:36 +00:00
protected $_dms ;
2012-10-09 09:47:33 +00:00
2018-02-22 18:10:39 +00:00
/**
* SeedDMS_Core_Attribute constructor .
* @ param $id
* @ param $obj
* @ param $attrdef
* @ param $value
*/
2016-03-22 14:08:36 +00:00
function __construct ( $id , $obj , $attrdef , $value ) { /* {{{ */
2012-10-09 09:47:33 +00:00
$this -> _id = $id ;
$this -> _obj = $obj ;
$this -> _attrdef = $attrdef ;
$this -> _value = $value ;
2015-04-14 17:36:10 +00:00
$this -> _validation_error = 0 ;
2012-10-09 09:47:33 +00:00
$this -> _dms = null ;
2013-01-24 08:22:36 +00:00
} /* }}} */
2012-10-09 09:47:33 +00:00
2013-02-13 17:07:16 +00:00
/**
* Set reference to dms
*
2013-02-14 11:10:53 +00:00
* @ param SeedDMS_Core_DMS $dms
2013-02-13 17:07:16 +00:00
*/
2013-01-24 08:22:36 +00:00
function setDMS ( $dms ) { /* {{{ */
2012-10-09 09:47:33 +00:00
$this -> _dms = $dms ;
2013-01-24 08:22:36 +00:00
} /* }}} */
2012-10-09 09:47:33 +00:00
2020-12-14 16:20:06 +00:00
/**
* Get dms of attribute
*
* @ return object $dms
*/
function getDMS () { return $this -> _dms ; }
2014-11-17 09:40:35 +00:00
/**
* Get internal id of attribute
*
* @ return integer id
*/
2012-10-09 09:47:33 +00:00
function getID () { return $this -> _id ; }
2014-11-13 07:20:45 +00:00
/**
* Return attribute value as stored in database
*
* This function will return the value of multi value attributes
* including the separator char .
*
* @ return string the attribute value as it is stored in the database .
*/
2012-10-09 09:47:33 +00:00
function getValue () { return $this -> _value ; }
2014-11-13 07:20:45 +00:00
/**
* Return attribute values as an array
*
2016-02-03 13:45:00 +00:00
* This function returns the attribute value as an array . The array
2014-11-13 07:20:45 +00:00
* has one element for non multi value attributes and n elements for
* multi value attributes .
*
* @ return array the attribute values
*/
function getValueAsArray () { /* {{{ */
if ( $this -> _attrdef -> getMultipleValues ()) {
2016-11-14 10:04:57 +00:00
/* If the value doesn ' t start with the separator used in the value set ,
* then assume that the value was not saved with a leading separator .
* This can happen , if the value was previously a single value from
* the value set and later turned into a multi value attribute .
*/
$sep = substr ( $this -> _value , 0 , 1 );
2020-08-28 09:45:37 +00:00
if ( ! ( $vsep = $this -> _attrdef -> getValueSetSeparator ()))
$vsep = $sep ;
2016-11-14 10:04:57 +00:00
if ( $sep == $vsep )
return ( explode ( $sep , substr ( $this -> _value , 1 )));
else
return ( array ( $this -> _value ));
2014-11-13 07:20:45 +00:00
} else {
return array ( $this -> _value );
}
} /* }}} */
2012-10-09 09:47:33 +00:00
/**
* Set a value of an attribute
*
2016-02-03 13:45:00 +00:00
* The attribute is completely deleted if the value is an empty string
* or empty array . An array of values is only allowed if the attribute may
* have multiple values . If an array is passed and the attribute may
* have only a single value , then the first element of the array will
* be taken .
*
* @ param string $values value as string or array to be set
2012-10-09 09:47:33 +00:00
* @ return boolean true if operation was successfull , otherwise false
*/
2016-02-03 13:45:00 +00:00
function setValue ( $values ) { /* {{{*/
2012-10-09 09:47:33 +00:00
$db = $this -> _dms -> getDB ();
2016-02-03 13:45:00 +00:00
if ( $this -> _attrdef -> getMultipleValues ()) {
2020-08-28 09:45:37 +00:00
$valuesetstr = $this -> _attrdef -> getValueSet ();
2016-02-03 13:45:00 +00:00
/* Multiple values without a value set is not allowed */
2020-08-28 09:45:37 +00:00
/* No need to have valueset anymore . If none is given , the values are
* expected to be separated by ','
if ( ! $valuesetstr )
2016-02-03 13:45:00 +00:00
return false ;
2020-08-28 09:45:37 +00:00
*/
2016-02-03 13:45:00 +00:00
$valueset = $this -> _attrdef -> getValueSetAsArray ();
if ( is_array ( $values )) {
if ( $values ) {
2020-09-01 12:59:16 +00:00
$vsep = $this -> getValueSetSeparator ();
2020-08-28 09:45:37 +00:00
if ( $valueset ) {
2021-03-06 14:26:18 +00:00
/* Validation should have been done before
2020-08-28 09:45:37 +00:00
$error = false ;
foreach ( $values as $v ) {
if ( ! in_array ( $v , $valueset )) { $error = true ; break ; }
}
if ( $error )
return false ;
2021-03-06 14:26:18 +00:00
*/
2020-08-28 09:45:37 +00:00
$valuesetstr = $this -> _attrdef -> getValueSet ();
2020-09-01 12:59:16 +00:00
$value = $vsep . implode ( $vsep , $values );
2020-08-28 09:45:37 +00:00
} else {
2020-09-01 12:59:16 +00:00
$value = $vsep . implode ( $vsep , $values );
2016-02-03 13:45:00 +00:00
}
} else {
$value = '' ;
}
} else {
if ( $values ) {
2020-08-28 09:45:37 +00:00
if ( $valuesetstr ) {
if ( $valuesetstr [ 0 ] != $values [ 0 ])
$values = explode ( $valuesetstr [ 0 ], $values );
else
$values = explode ( $valuesetstr [ 0 ], substr ( $values , 1 ));
} else {
$values = explode ( ',' , substr ( $values , 1 ));
}
if ( $valueset ) {
2021-03-06 14:26:18 +00:00
/* Validation should have been done before
2020-08-28 09:45:37 +00:00
$error = false ;
foreach ( $values as $v ) {
if ( ! in_array ( $v , $valueset )) { $error = true ; break ; }
}
if ( $error )
return false ;
2021-03-06 14:26:18 +00:00
*/
2020-08-28 09:45:37 +00:00
$value = $valuesetstr [ 0 ] . implode ( $valuesetstr [ 0 ], $values );
} else {
$value = ',' . implode ( ',' , $values );
2016-02-03 13:45:00 +00:00
}
} else {
$value = $values ;
}
}
} else {
if ( is_array ( $values )) {
if ( $values )
$value = $values [ 0 ];
else
$value = '' ;
} else {
$value = $values ;
}
}
2012-10-09 09:47:33 +00:00
switch ( get_class ( $this -> _obj )) {
2015-04-15 14:11:07 +00:00
case $this -> _dms -> getClassname ( 'document' ) :
2012-10-09 09:47:33 +00:00
if ( trim ( $value ) === '' )
2017-02-10 07:04:19 +00:00
$queryStr = " DELETE FROM `tblDocumentAttributes` WHERE `document` = " . $this -> _obj -> getID () . " AND `attrdef` = " . $this -> _attrdef -> getId ();
2012-10-09 09:47:33 +00:00
else
2017-02-10 07:04:19 +00:00
$queryStr = " UPDATE `tblDocumentAttributes` SET `value` = " . $db -> qstr ( $value ) . " WHERE `document` = " . $this -> _obj -> getID () . " AND `attrdef` = " . $this -> _attrdef -> getId ();
2012-10-09 09:47:33 +00:00
break ;
2015-04-15 14:11:07 +00:00
case $this -> _dms -> getClassname ( 'documentcontent' ) :
2012-10-09 09:47:33 +00:00
if ( trim ( $value ) === '' )
2017-02-10 07:04:19 +00:00
$queryStr = " DELETE FROM `tblDocumentContentAttributes` WHERE `content` = " . $this -> _obj -> getID () . " AND `attrdef` = " . $this -> _attrdef -> getId ();
2012-10-09 09:47:33 +00:00
else
2017-02-10 07:04:19 +00:00
$queryStr = " UPDATE `tblDocumentContentAttributes` SET `value` = " . $db -> qstr ( $value ) . " WHERE `content` = " . $this -> _obj -> getID () . " AND `attrdef` = " . $this -> _attrdef -> getId ();
2012-10-09 09:47:33 +00:00
break ;
2015-04-15 14:11:07 +00:00
case $this -> _dms -> getClassname ( 'folder' ) :
2012-10-09 09:47:33 +00:00
if ( trim ( $value ) === '' )
2017-02-10 07:04:19 +00:00
$queryStr = " DELETE FROM `tblFolderAttributes WHERE` `folder` = " . $this -> _obj -> getID () . " AND `attrdef` = " . $this -> _attrdef -> getId ();
2012-10-09 09:47:33 +00:00
else
2017-02-10 07:04:19 +00:00
$queryStr = " UPDATE `tblFolderAttributes` SET `value` = " . $db -> qstr ( $value ) . " WHERE `folder` = " . $this -> _obj -> getID () . " AND `attrdef` = " . $this -> _attrdef -> getId ();
2012-10-09 09:47:33 +00:00
break ;
default :
return false ;
}
if ( ! $db -> getResult ( $queryStr ))
return false ;
$this -> _value = $value ;
return true ;
} /* }}} */
2015-04-14 17:36:10 +00:00
/**
* Validate attribute value
*
* This function checks if the attribute values fits the attribute
* definition .
* If the validation fails the validation error will be set which
* can be requested by SeedDMS_Core_Attribute :: getValidationError ()
*
2017-10-24 10:44:22 +00:00
* @ return boolean true if validation succeeds , otherwise false
2015-04-14 17:36:10 +00:00
*/
function validate () { /* {{{ */
2017-10-24 10:44:22 +00:00
/** @var SeedDMS_Core_AttributeDefinition $attrdef */
2020-06-05 16:06:27 +00:00
$attrdef = $this -> _attrdef ;
2015-04-15 14:11:07 +00:00
$result = $attrdef -> validate ( $this -> _value );
$this -> _validation_error = $attrdef -> getValidationError ();
return $result ;
2015-04-14 17:36:10 +00:00
} /* }}} */
/**
* Get validation error from last validation
*
* @ return integer error code
*/
function getValidationError () { return $this -> _validation_error ; }
2017-06-27 15:06:32 +00:00
/**
* Set validation error
*
* @ param integer error code
*/
function setValidationError ( $error ) { $this -> _validation_error = $error ; }
2014-11-17 09:40:35 +00:00
/**
* Get definition of attribute
*
* @ return object attribute definition
*/
2012-10-09 09:47:33 +00:00
function getAttributeDefinition () { return $this -> _attrdef ; }
2013-02-13 17:07:16 +00:00
} /* }}} */
2012-10-09 09:47:33 +00:00
/**
* Class to represent an attribute definition in the document management system
*
2013-02-05 09:05:13 +00:00
* Attribute definitions specify the name , type , object type , minimum and
* maximum values and a value set . The object type determines the object
* an attribute may be attached to . If the object type is set to object_all
* the attribute can be used for documents , document content and folders .
*
* The type of an attribute specifies the skalar data type .
*
* Attributes for which multiple values are allowed must have the
* multiple flag set to true and specify a value set . A value set
* is a string consisting of n separated values . The separator is the
* first char of the value set . A possible value could be '|REV-A|REV-B'
* If multiple values are allowed , then minvalues and maxvalues may
* restrict the allowed number of values .
*
2013-02-14 11:10:53 +00:00
* @ see SeedDMS_Core_Attribute
2013-02-05 09:05:13 +00:00
*
2012-10-09 09:47:33 +00:00
* @ category DMS
2013-02-14 11:10:53 +00:00
* @ package SeedDMS_Core
2012-10-09 09:47:33 +00:00
* @ author Markus Westphal , Malcolm Cowe , Uwe Steinmann < uwe @ steinmann . cx >
* @ copyright Copyright ( C ) 2012 Uwe Steinmann
* @ version Release : @ package_version @
*/
2013-02-14 11:10:53 +00:00
class SeedDMS_Core_AttributeDefinition { /* {{{ */
2012-10-09 09:47:33 +00:00
/**
* @ var integer id of attribute definition
*
* @ access protected
*/
2013-01-24 08:22:36 +00:00
protected $_id ;
2012-10-09 09:47:33 +00:00
/**
* @ var string name of attribute definition
*
* @ access protected
*/
2013-01-24 08:22:36 +00:00
protected $_name ;
2012-10-09 09:47:33 +00:00
2013-02-05 09:05:13 +00:00
/**
2013-02-13 17:07:16 +00:00
* @ var string object type of attribute definition . This can be one of
2015-04-14 17:36:10 +00:00
* type_int , type_float , type_string , type_boolean , type_url , or type_email .
2013-02-05 09:05:13 +00:00
*
* @ access protected
*/
protected $_type ;
/**
2013-02-13 17:07:16 +00:00
* @ var string type of attribute definition . This can be one of objtype_all ,
* objtype_folder , objtype_document , or objtype_documentcontent .
2013-02-05 09:05:13 +00:00
*
* @ access protected
*/
protected $_objtype ;
/**
* @ var boolean whether an attribute can have multiple values
*
* @ access protected
*/
protected $_multiple ;
/**
* @ var integer minimum values of an attribute
*
* @ access protected
*/
protected $_minvalues ;
/**
* @ var integer maximum values of an attribute
*
* @ access protected
*/
protected $_maxvalues ;
/**
* @ var string list of possible values of an attribute
*
* @ access protected
*/
protected $_valueset ;
2013-05-28 07:01:04 +00:00
/**
* @ var string regular expression the value must match
*
* @ access protected
*/
protected $_regex ;
2015-04-15 14:11:07 +00:00
/**
* @ var integer validation error
*
* @ access protected
*/
protected $_validation_error ;
2012-10-09 09:47:33 +00:00
/**
2017-10-24 10:44:22 +00:00
* @ var SeedDMS_Core_DMS reference to the dms instance this attribute definition belongs to
2012-10-09 09:47:33 +00:00
*
* @ access protected
*/
2013-01-24 08:22:36 +00:00
protected $_dms ;
2012-10-09 09:47:33 +00:00
2018-02-22 18:10:39 +00:00
/**
* @ var string
*/
protected $_separator ;
2017-10-24 10:44:22 +00:00
2013-02-05 09:05:13 +00:00
/*
* Possible skalar data types of an attribute
*/
2012-10-09 09:47:33 +00:00
const type_int = '1' ;
const type_float = '2' ;
const type_string = '3' ;
const type_boolean = '4' ;
2015-04-14 17:36:10 +00:00
const type_url = '5' ;
const type_email = '6' ;
2015-10-30 07:06:32 +00:00
const type_date = '7' ;
2012-10-09 09:47:33 +00:00
2020-08-28 09:45:37 +00:00
/*
* Addtional data types of an attribute representing objects in seeddms
*/
const type_folder = '101' ;
const type_document = '102' ;
//const type_documentcontent = '103';
const type_user = '104' ;
const type_group = '105' ;
2013-02-05 09:05:13 +00:00
/*
* The object type for which a attribute may be used
*/
2012-10-09 09:47:33 +00:00
const objtype_all = '0' ;
const objtype_folder = '1' ;
const objtype_document = '2' ;
const objtype_documentcontent = '3' ;
2018-02-22 18:10:39 +00:00
/**
* Constructor
*
* @ param integer $id internal id of attribute definition
* @ param string $name name of attribute
* @ param integer $objtype type of object for which this attribute definition
* may be used .
* @ param integer $type skalar type of attribute
* @ param boolean $multiple set to true if multiple values are allowed
* @ param integer $minvalues minimum number of values
* @ param integer $maxvalues maximum number of values
* @ param string $valueset separated list of allowed values , the first char
* is taken as the separator
* @ param $regex
*/
2016-03-22 14:08:36 +00:00
function __construct ( $id , $name , $objtype , $type , $multiple , $minvalues , $maxvalues , $valueset , $regex ) { /* {{{ */
2012-10-09 09:47:33 +00:00
$this -> _id = $id ;
$this -> _name = $name ;
$this -> _type = $type ;
$this -> _objtype = $objtype ;
$this -> _multiple = $multiple ;
$this -> _minvalues = $minvalues ;
$this -> _maxvalues = $maxvalues ;
$this -> _valueset = $valueset ;
$this -> _separator = '' ;
2013-05-28 07:01:04 +00:00
$this -> _regex = $regex ;
2012-10-09 09:47:33 +00:00
$this -> _dms = null ;
2015-04-15 14:11:07 +00:00
$this -> _validation_error = 0 ;
2013-01-24 08:22:36 +00:00
} /* }}} */
2012-10-09 09:47:33 +00:00
2013-02-13 17:07:16 +00:00
/**
* Set reference to dms
*
2013-02-14 11:10:53 +00:00
* @ param SeedDMS_Core_DMS $dms
2013-02-13 17:07:16 +00:00
*/
2013-01-24 08:22:36 +00:00
function setDMS ( $dms ) { /* {{{ */
2012-10-09 09:47:33 +00:00
$this -> _dms = $dms ;
2013-01-24 08:22:36 +00:00
} /* }}} */
2012-10-09 09:47:33 +00:00
2020-12-14 16:20:06 +00:00
/**
* Get dms of attribute definition
*
* @ return object $dms
*/
function getDMS () { return $this -> _dms ; }
2014-11-17 09:40:35 +00:00
/**
* Get internal id of attribute definition
*
* @ return integer id
*/
2012-10-09 09:47:33 +00:00
function getID () { return $this -> _id ; }
2014-11-17 09:40:35 +00:00
/**
* Get name of attribute definition
*
* @ return string name
*/
2012-10-09 09:47:33 +00:00
function getName () { return $this -> _name ; }
2013-01-24 08:22:36 +00:00
function setName ( $name ) { /* {{{ */
2012-10-09 09:47:33 +00:00
$db = $this -> _dms -> getDB ();
2017-02-10 07:04:19 +00:00
$queryStr = " UPDATE `tblAttributeDefinitions` SET `name` = " . $db -> qstr ( $name ) . " WHERE `id` = " . $this -> _id ;
2012-10-09 09:47:33 +00:00
$res = $db -> getResult ( $queryStr );
if ( ! $res )
return false ;
$this -> _name = $name ;
return true ;
2013-01-24 08:22:36 +00:00
} /* }}} */
2012-10-09 09:47:33 +00:00
2014-11-17 09:40:35 +00:00
/**
* Get object type of attribute definition
*
* This can be one of objtype_all ,
* objtype_folder , objtype_document , or objtype_documentcontent .
*
* @ return integer type
*/
2012-10-09 09:47:33 +00:00
function getObjType () { return $this -> _objtype ; }
2018-02-22 18:10:39 +00:00
/**
* Set object type of attribute definition
*
* This can be one of objtype_all ,
* objtype_folder , objtype_document , or objtype_documentcontent .
*
* @ param integer $objtype type
* @ return bool
*/
2013-01-24 08:22:36 +00:00
function setObjType ( $objtype ) { /* {{{ */
2012-10-09 09:47:33 +00:00
$db = $this -> _dms -> getDB ();
2017-02-10 07:04:19 +00:00
$queryStr = " UPDATE `tblAttributeDefinitions` SET `objtype` = " . intval ( $objtype ) . " WHERE `id` = " . $this -> _id ;
2012-10-09 09:47:33 +00:00
$res = $db -> getResult ( $queryStr );
if ( ! $res )
return false ;
$this -> _objtype = $objtype ;
return true ;
2013-01-24 08:22:36 +00:00
} /* }}} */
2012-10-09 09:47:33 +00:00
2014-11-17 09:40:35 +00:00
/**
* Get type of attribute definition
*
2015-04-14 17:36:10 +00:00
* This can be one of type_int , type_float , type_string , type_boolean ,
* type_url , type_email .
2014-11-17 09:40:35 +00:00
*
* @ return integer type
*/
2012-10-09 09:47:33 +00:00
function getType () { return $this -> _type ; }
2018-02-22 18:10:39 +00:00
/**
* Set type of attribute definition
*
* This can be one of type_int , type_float , type_string , type_boolean ,
* type_url , type_email .
*
* @ param integer $type type
* @ return bool
*/
2013-01-24 08:22:36 +00:00
function setType ( $type ) { /* {{{ */
2012-10-09 09:47:33 +00:00
$db = $this -> _dms -> getDB ();
2017-02-10 07:04:19 +00:00
$queryStr = " UPDATE `tblAttributeDefinitions` SET `type` = " . intval ( $type ) . " WHERE `id` = " . $this -> _id ;
2012-10-09 09:47:33 +00:00
$res = $db -> getResult ( $queryStr );
if ( ! $res )
return false ;
$this -> _type = $type ;
return true ;
2013-01-24 08:22:36 +00:00
} /* }}} */
2012-10-09 09:47:33 +00:00
2014-11-17 09:40:35 +00:00
/**
* Check if attribute definition allows multi values for attribute
*
* @ return boolean true if attribute may have multiple values
*/
2013-01-24 08:22:36 +00:00
function getMultipleValues () { return $this -> _multiple ; }
2012-10-09 09:47:33 +00:00
2018-02-22 18:10:39 +00:00
/**
* Set if attribute definition allows multi values for attribute
*
* @ param boolean $mv true if attribute may have multiple values , otherwise
* false
* @ return bool
*/
2013-01-24 08:22:36 +00:00
function setMultipleValues ( $mv ) { /* {{{ */
2012-10-09 09:47:33 +00:00
$db = $this -> _dms -> getDB ();
2017-02-10 07:04:19 +00:00
$queryStr = " UPDATE `tblAttributeDefinitions` SET `multiple` = " . intval ( $mv ) . " WHERE `id` = " . $this -> _id ;
2012-10-09 09:47:33 +00:00
$res = $db -> getResult ( $queryStr );
if ( ! $res )
return false ;
$this -> _multiple = $mv ;
return true ;
2013-01-24 08:22:36 +00:00
} /* }}} */
2012-10-09 09:47:33 +00:00
2014-11-17 09:40:35 +00:00
/**
* Return minimum number of values for attributes
*
* Attributes with multiple values may be limited to a range
* of values . This functions returns the minimum number of values .
*
* @ return integer minimum number of values
*/
2012-10-09 09:47:33 +00:00
function getMinValues () { return $this -> _minvalues ; }
2013-01-24 08:22:36 +00:00
function setMinValues ( $minvalues ) { /* {{{ */
2012-10-09 09:47:33 +00:00
$db = $this -> _dms -> getDB ();
2017-02-10 07:04:19 +00:00
$queryStr = " UPDATE `tblAttributeDefinitions` SET `minvalues` = " . intval ( $minvalues ) . " WHERE `id` = " . $this -> _id ;
2012-10-09 09:47:33 +00:00
$res = $db -> getResult ( $queryStr );
if ( ! $res )
return false ;
$this -> _minvalues = $minvalues ;
return true ;
2013-01-24 08:22:36 +00:00
} /* }}} */
2012-10-09 09:47:33 +00:00
2014-11-17 09:40:35 +00:00
/**
* Return maximum number of values for attributes
*
* Attributes with multiple values may be limited to a range
* of values . This functions returns the maximum number of values .
*
* @ return integer maximum number of values
*/
2012-10-09 09:47:33 +00:00
function getMaxValues () { return $this -> _maxvalues ; }
function setMaxValues ( $maxvalues ) { /* {{{ */
$db = $this -> _dms -> getDB ();
2017-02-10 07:04:19 +00:00
$queryStr = " UPDATE `tblAttributeDefinitions` SET `maxvalues` = " . intval ( $maxvalues ) . " WHERE `id` = " . $this -> _id ;
2012-10-09 09:47:33 +00:00
$res = $db -> getResult ( $queryStr );
if ( ! $res )
return false ;
$this -> _maxvalues = $maxvalues ;
return true ;
} /* }}} */
/**
* Get the value set as saved in the database
*
2016-02-03 13:45:00 +00:00
* This is a string containing the list of valueѕ separated by a
* delimiter which also precedes the whole string , e . g . '|Yes|No'
*
* Use { @ link SeedDMS_Core_AttributeDefinition :: getValueSetAsArray ()}
* for a list of values returned as an array .
*
2012-10-09 09:47:33 +00:00
* @ return string value set
*/
function getValueSet () { /* {{{ */
return $this -> _valueset ;
} /* }}} */
2016-10-07 09:37:35 +00:00
/**
* Get the separator used for the value set
*
* This is the first char of the value set string .
*
* @ return string separator or an empty string if a value set is not set
*/
function getValueSetSeparator () { /* {{{ */
2020-09-01 12:59:16 +00:00
if ( strlen ( $this -> _valueset ) > 1 ) {
2016-10-07 09:37:35 +00:00
return $this -> _valueset [ 0 ];
2020-09-01 12:59:16 +00:00
} elseif ( $this -> _multiple ) {
if ( $this -> _type == SeedDMS_Core_AttributeDefinition :: type_user || $this -> _type == SeedDMS_Core_AttributeDefinition :: type_group )
return ',' ;
else
return '' ;
} else {
2016-10-07 09:37:35 +00:00
return '' ;
2020-09-01 12:59:16 +00:00
}
2016-10-07 09:37:35 +00:00
} /* }}} */
2012-10-09 09:47:33 +00:00
/**
* Get the whole value set as an array
*
* @ return array values of value set or false if the value set has
* less than 2 chars
*/
function getValueSetAsArray () { /* {{{ */
if ( strlen ( $this -> _valueset ) > 1 )
2016-10-06 06:01:57 +00:00
return array_map ( 'trim' , explode ( $this -> _valueset [ 0 ], substr ( $this -> _valueset , 1 )));
2012-10-09 09:47:33 +00:00
else
2016-02-03 13:45:00 +00:00
return array ();
2012-10-09 09:47:33 +00:00
} /* }}} */
2018-02-22 18:10:39 +00:00
/**
* Get the n ' th value of a value set
*
* @ param $ind
* @ return string n ' th value of value set or false if the index is
* out of range or the value set has less than 2 chars
* @ internal param int $index
*/
2012-10-09 09:47:33 +00:00
function getValueSetValue ( $ind ) { /* {{{ */
if ( strlen ( $this -> _valueset ) > 1 ) {
$tmp = explode ( $this -> _valueset [ 0 ], substr ( $this -> _valueset , 1 ));
if ( isset ( $tmp [ $ind ]))
2016-10-06 06:01:57 +00:00
return trim ( $tmp [ $ind ]);
2012-10-09 09:47:33 +00:00
else
return false ;
} else
return false ;
} /* }}} */
/**
* Set the value set
*
* A value set is a list of values allowed for an attribute . The values
* are separated by a char which must also be the first char of the
* value set string .
*
* @ param string $valueset
* @ return boolean true if value set could be set , otherwise false
*/
function setValueSet ( $valueset ) { /* {{{ */
/*
$tmp = array ();
foreach ( $valueset as $value ) {
$tmp [] = str_replace ( '"' , '""' , $value );
}
$valuesetstr = implode ( " , " , $tmp );
*/
2016-10-07 09:37:35 +00:00
if ( trim ( $valueset )) {
$valuesetarr = array_map ( 'trim' , explode ( $valueset [ 0 ], substr ( $valueset , 1 )));
$valuesetstr = $valueset [ 0 ] . implode ( $valueset [ 0 ], $valuesetarr );
} else {
$valuesetstr = '' ;
}
2012-10-09 09:47:33 +00:00
$db = $this -> _dms -> getDB ();
2017-02-10 07:04:19 +00:00
$queryStr = " UPDATE `tblAttributeDefinitions` SET `valueset` = " . $db -> qstr ( $valuesetstr ) . " WHERE `id` = " . $this -> _id ;
2012-10-09 09:47:33 +00:00
$res = $db -> getResult ( $queryStr );
if ( ! $res )
return false ;
$this -> _valueset = $valueset ;
$this -> _separator = substr ( $valueset , 0 , 1 );
return true ;
} /* }}} */
2013-05-28 07:01:04 +00:00
/**
* Get the regular expression as saved in the database
*
* @ return string regular expression
*/
function getRegex () { /* {{{ */
return $this -> _regex ;
} /* }}} */
/**
* Set the regular expression
*
* A value of the attribute must match this regular expression .
*
* @ param string $regex
* @ return boolean true if regex could be set , otherwise false
*/
function setRegex ( $regex ) { /* {{{ */
$db = $this -> _dms -> getDB ();
2017-02-10 07:04:19 +00:00
$queryStr = " UPDATE `tblAttributeDefinitions` SET `regex` = " . $db -> qstr ( $regex ) . " WHERE `id` = " . $this -> _id ;
2013-05-28 07:01:04 +00:00
$res = $db -> getResult ( $queryStr );
if ( ! $res )
return false ;
$this -> _regex = $regex ;
return true ;
} /* }}} */
2012-10-09 09:47:33 +00:00
/**
* Check if the attribute definition is used
*
2013-05-29 18:04:45 +00:00
* Checks all documents , folders and document content whether at least
* one of them referenceѕ this attribute definition
2012-10-09 09:47:33 +00:00
*
* @ return boolean true if attribute definition is used , otherwise false
*/
function isUsed () { /* {{{ */
$db = $this -> _dms -> getDB ();
2017-02-10 07:04:19 +00:00
$queryStr = " SELECT * FROM `tblDocumentAttributes` WHERE `attrdef`= " . $this -> _id ;
2012-10-09 09:47:33 +00:00
$resArr = $db -> getResultArray ( $queryStr );
if ( is_array ( $resArr ) && count ( $resArr ) == 0 ) {
2017-02-10 07:04:19 +00:00
$queryStr = " SELECT * FROM `tblFolderAttributes` WHERE `attrdef`= " . $this -> _id ;
2012-10-09 09:47:33 +00:00
$resArr = $db -> getResultArray ( $queryStr );
if ( is_array ( $resArr ) && count ( $resArr ) == 0 ) {
2017-02-10 07:04:19 +00:00
$queryStr = " SELECT * FROM `tblDocumentContentAttributes` WHERE `attrdef`= " . $this -> _id ;
2012-10-09 09:47:33 +00:00
$resArr = $db -> getResultArray ( $queryStr );
if ( is_array ( $resArr ) && count ( $resArr ) == 0 ) {
return false ;
}
}
}
return true ;
} /* }}} */
2018-02-22 18:10:39 +00:00
/**
* Parse a given value according to attribute definition
*
* The return value is always an array , even if the attribute is single
* value attribute .
*
* @ param $value
* @ return array | bool
*/
2016-11-14 10:04:57 +00:00
function parseValue ( $value ) { /* {{{ */
if ( $this -> getMultipleValues ()) {
/* If the value doesn ' t start with the separator used in the value set ,
* then assume that the value was not saved with a leading separator .
* This can happen , if the value was previously a single value from
* the value set and later turned into a multi value attribute .
*/
$sep = substr ( $value , 0 , 1 );
$vsep = $this -> getValueSetSeparator ();
if ( $sep == $vsep )
2020-09-01 07:22:48 +00:00
$values = explode ( $sep , substr ( $value , 1 ));
2016-11-14 10:04:57 +00:00
else
2020-09-01 07:22:48 +00:00
$values = array ( $value );
2016-11-14 10:04:57 +00:00
} else {
2020-09-01 07:22:48 +00:00
$values = array ( $value );
2016-11-14 10:04:57 +00:00
}
2020-09-01 07:22:48 +00:00
switch (( string ) $this -> getType ()) {
case self :: type_document :
foreach ( $values as $value ) {
if ( $u = $this -> _dms -> getDocument (( int ) $value ))
$tmp [] = $u -> getName ();
else
$tmp [] = '???' ;
}
$values = $tmp ;
break ;
case self :: type_folder :
foreach ( $values as $value ) {
if ( $u = $this -> _dms -> getFolder (( int ) $value ))
$tmp [] = $u -> getName ();
else
$tmp [] = '???' ;
}
$values = $tmp ;
break ;
case self :: type_user :
foreach ( $values as $value ) {
if ( $u = $this -> _dms -> getUser (( int ) $value ))
$tmp [] = $u -> getLogin ();
else
$tmp [] = '???' ;
}
$values = $tmp ;
break ;
case self :: type_group :
foreach ( $values as $value ) {
if ( $u = $this -> _dms -> getGroup (( int ) $value ))
$tmp [] = $u -> getName ();
else
$tmp [] = '???' ;
}
$values = $tmp ;
break ;
}
return $values ;
2016-11-14 10:04:57 +00:00
} /* }}} */
2013-05-29 18:04:45 +00:00
/**
* Return a list of documents , folders , document contents where this
* attribute definition is used
*
* @ param integer $limit return not more the n objects of each type
2017-10-24 10:44:22 +00:00
* @ return array | bool
2018-02-22 18:10:39 +00:00
*/
2013-05-29 18:04:45 +00:00
function getStatistics ( $limit = 0 ) { /* {{{ */
$db = $this -> _dms -> getDB ();
$result = array ( 'docs' => array (), 'folders' => array (), 'contents' => array ());
if ( $this -> _objtype == SeedDMS_Core_AttributeDefinition :: objtype_all ||
$this -> _objtype == SeedDMS_Core_AttributeDefinition :: objtype_document ) {
2017-02-10 07:04:19 +00:00
$queryStr = " SELECT * FROM `tblDocumentAttributes` WHERE `attrdef`= " . $this -> _id ;
2013-05-29 18:04:45 +00:00
if ( $limit )
$queryStr .= " limit " . ( int ) $limit ;
$resArr = $db -> getResultArray ( $queryStr );
if ( $resArr ) {
foreach ( $resArr as $rec ) {
if ( $doc = $this -> _dms -> getDocument ( $rec [ 'document' ])) {
$result [ 'docs' ][] = $doc ;
}
}
}
2017-02-10 07:04:19 +00:00
$queryStr = " SELECT count(*) c, `value` FROM `tblDocumentAttributes` WHERE `attrdef`= " . $this -> _id . " GROUP BY `value` ORDER BY c DESC " ;
2013-05-29 18:04:45 +00:00
$resArr = $db -> getResultArray ( $queryStr );
if ( $resArr ) {
2018-02-22 18:10:39 +00:00
foreach ( $resArr as $row ) {
$tmpattr = new SeedDMS_Core_Attribute ( 0 , null , $this , $row [ 'value' ]);
foreach ( $tmpattr -> getValueAsArray () as $value ) {
if ( isset ( $possiblevalues [ md5 ( $value )])) {
$possiblevalues [ md5 ( $value )][ 'c' ] += $row [ 'c' ];
} else {
$possiblevalues [ md5 ( $value )] = array ( 'value' => $value , 'c' => $row [ 'c' ]);
}
}
}
$result [ 'frequencies' ][ 'document' ] = $possiblevalues ;
2013-05-29 18:04:45 +00:00
}
}
if ( $this -> _objtype == SeedDMS_Core_AttributeDefinition :: objtype_all ||
$this -> _objtype == SeedDMS_Core_AttributeDefinition :: objtype_folder ) {
2017-02-10 07:04:19 +00:00
$queryStr = " SELECT * FROM `tblFolderAttributes` WHERE `attrdef`= " . $this -> _id ;
2013-05-29 18:04:45 +00:00
if ( $limit )
$queryStr .= " limit " . ( int ) $limit ;
$resArr = $db -> getResultArray ( $queryStr );
if ( $resArr ) {
foreach ( $resArr as $rec ) {
if ( $folder = $this -> _dms -> getFolder ( $rec [ 'folder' ])) {
$result [ 'folders' ][] = $folder ;
}
}
}
2018-02-22 18:10:39 +00:00
$valueset = $this -> getValueSetAsArray ();
$possiblevalues = array ();
foreach ( $valueset as $value ) {
$possiblevalues [ md5 ( $value )] = array ( 'value' => $value , 'c' => 0 );
}
2017-02-10 07:04:19 +00:00
$queryStr = " SELECT count(*) c, `value` FROM `tblFolderAttributes` WHERE `attrdef`= " . $this -> _id . " GROUP BY `value` ORDER BY c DESC " ;
2016-02-04 17:25:04 +00:00
$resArr = $db -> getResultArray ( $queryStr );
if ( $resArr ) {
2018-02-22 18:10:39 +00:00
foreach ( $resArr as $row ) {
$tmpattr = new SeedDMS_Core_Attribute ( 0 , null , $this , $row [ 'value' ]);
foreach ( $tmpattr -> getValueAsArray () as $value ) {
if ( isset ( $possiblevalues [ md5 ( $value )])) {
$possiblevalues [ md5 ( $value )][ 'c' ] += $row [ 'c' ];
} else {
$possiblevalues [ md5 ( $value )] = array ( 'value' => $value , 'c' => $row [ 'c' ]);
}
}
}
$result [ 'frequencies' ][ 'folder' ] = $possiblevalues ;
2016-02-04 17:25:04 +00:00
}
2013-05-29 18:04:45 +00:00
}
if ( $this -> _objtype == SeedDMS_Core_AttributeDefinition :: objtype_all ||
$this -> _objtype == SeedDMS_Core_AttributeDefinition :: objtype_documentcontent ) {
2017-02-10 07:04:19 +00:00
$queryStr = " SELECT * FROM `tblDocumentContentAttributes` WHERE `attrdef`= " . $this -> _id ;
2013-05-29 18:04:45 +00:00
if ( $limit )
$queryStr .= " limit " . ( int ) $limit ;
$resArr = $db -> getResultArray ( $queryStr );
if ( $resArr ) {
foreach ( $resArr as $rec ) {
if ( $content = $this -> _dms -> getDocumentContent ( $rec [ 'content' ])) {
$result [ 'contents' ][] = $content ;
}
}
}
2018-02-22 18:10:39 +00:00
$valueset = $this -> getValueSetAsArray ();
$possiblevalues = array ();
foreach ( $valueset as $value ) {
$possiblevalues [ md5 ( $value )] = array ( 'value' => $value , 'c' => 0 );
}
2017-02-10 07:04:19 +00:00
$queryStr = " SELECT count(*) c, `value` FROM `tblDocumentContentAttributes` WHERE `attrdef`= " . $this -> _id . " GROUP BY `value` ORDER BY c DESC " ;
2016-02-04 17:25:04 +00:00
$resArr = $db -> getResultArray ( $queryStr );
if ( $resArr ) {
2018-02-22 18:10:39 +00:00
foreach ( $resArr as $row ) {
$tmpattr = new SeedDMS_Core_Attribute ( 0 , null , $this , $row [ 'value' ]);
foreach ( $tmpattr -> getValueAsArray () as $value ) {
if ( isset ( $possiblevalues [ md5 ( $value )])) {
$possiblevalues [ md5 ( $value )][ 'c' ] += $row [ 'c' ];
} else {
$possiblevalues [ md5 ( $value )] = array ( 'value' => $value , 'c' => $row [ 'c' ]);
}
}
}
$result [ 'frequencies' ][ 'content' ] = $possiblevalues ;
2016-02-04 17:25:04 +00:00
}
2013-05-29 18:04:45 +00:00
}
return $result ;
} /* }}} */
2012-10-09 09:47:33 +00:00
/**
* Remove the attribute definition
* Removal is only executed when the definition is not used anymore .
*
* @ return boolean true on success or false in case of an error
*/
function remove () { /* {{{ */
$db = $this -> _dms -> getDB ();
if ( $this -> isUsed ())
return false ;
// Delete user itself
2017-02-10 07:04:19 +00:00
$queryStr = " DELETE FROM `tblAttributeDefinitions` WHERE `id` = " . $this -> _id ;
2012-10-09 09:47:33 +00:00
if ( ! $db -> getResult ( $queryStr )) return false ;
return true ;
} /* }}} */
2014-06-30 05:40:18 +00:00
/**
2018-02-22 18:10:39 +00:00
* Get all documents and folders by a given attribute value
2014-06-30 05:40:18 +00:00
*
* @ param string $attrvalue value of attribute
* @ param integer $limit limit number of documents / folders
* @ return array array containing list of documents and folders
*/
2018-02-22 18:10:39 +00:00
public function getObjects ( $attrvalue , $limit = '' ) { /* {{{ */
2014-06-30 05:40:18 +00:00
$db = $this -> _dms -> getDB ();
$result = array ( 'docs' => array (), 'folders' => array (), 'contents' => array ());
if ( $this -> _objtype == SeedDMS_Core_AttributeDefinition :: objtype_all ||
$this -> _objtype == SeedDMS_Core_AttributeDefinition :: objtype_document ) {
2018-02-22 18:10:39 +00:00
$queryStr = " SELECT * FROM `tblDocumentAttributes` WHERE `attrdef`= " . $this -> _id . " AND " ;
if ( $this -> getMultipleValues ()) {
$sep = $this -> getValueSetSeparator ();
$queryStr .= " (`value` like " . $db -> qstr ( $sep . $attrvalue . '%' ) . " OR `value` like " . $db -> qstr ( '%' . $sep . $attrvalue . $sep . '%' ) . " OR `value` like " . $db -> qstr ( '%' . $sep . $attrvalue ) . " ) " ;
} else {
$queryStr .= " `value`= " . $db -> qstr ( $attrvalue );
}
2014-06-30 05:40:18 +00:00
if ( $limit )
$queryStr .= " limit " . ( int ) $limit ;
$resArr = $db -> getResultArray ( $queryStr );
if ( $resArr ) {
foreach ( $resArr as $rec ) {
if ( $doc = $this -> _dms -> getDocument ( $rec [ 'document' ])) {
$result [ 'docs' ][] = $doc ;
}
}
}
}
if ( $this -> _objtype == SeedDMS_Core_AttributeDefinition :: objtype_all ||
$this -> _objtype == SeedDMS_Core_AttributeDefinition :: objtype_folder ) {
2018-02-22 18:10:39 +00:00
$queryStr = " SELECT * FROM `tblFolderAttributes` WHERE `attrdef`= " . $this -> _id . " AND " ;
if ( $this -> getMultipleValues ()) {
$sep = $this -> getValueSetSeparator ();
$queryStr .= " (`value` like " . $db -> qstr ( $sep . $attrvalue . '%' ) . " OR `value` like " . $db -> qstr ( '%' . $sep . $attrvalue . $sep . '%' ) . " OR `value` like " . $db -> qstr ( '%' . $sep . $attrvalue ) . " ) " ;
} else {
$queryStr .= " `value`= " . $db -> qstr ( $attrvalue );
}
2014-06-30 05:40:18 +00:00
if ( $limit )
$queryStr .= " limit " . ( int ) $limit ;
$resArr = $db -> getResultArray ( $queryStr );
if ( $resArr ) {
foreach ( $resArr as $rec ) {
if ( $folder = $this -> _dms -> getFolder ( $rec [ 'folder' ])) {
$result [ 'folders' ][] = $folder ;
}
}
}
}
return $result ;
} /* }}} */
2018-02-22 18:10:39 +00:00
/**
* Remove a given attribute value from all documents , versions and folders
*
* @ param string $attrvalue value of attribute
* @ return array array containing list of documents and folders
*/
public function removeValue ( $attrvalue ) { /* {{{ */
$db = $this -> _dms -> getDB ();
foreach ( array ( 'document' , 'documentcontent' , 'folder' ) as $type ) {
if ( $type == 'document' ) {
$tablename = " tblDocumentAttributes " ;
$objtype = SeedDMS_Core_AttributeDefinition :: objtype_document ;
} elseif ( $type == 'documentcontent' ) {
$tablename = " tblDocumentContentAttributes " ;
$objtype = SeedDMS_Core_AttributeDefinition :: objtype_documentcontent ;
} elseif ( $type == 'folder' ) {
$tablename = " tblFolderAttributes " ;
$objtype = SeedDMS_Core_AttributeDefinition :: objtype_folder ;
}
if ( $this -> _objtype == SeedDMS_Core_AttributeDefinition :: objtype_all || $objtype ) {
$queryStr = " SELECT * FROM ` " . $tablename . " ` WHERE `attrdef`= " . $this -> _id . " AND " ;
if ( $this -> getMultipleValues ()) {
$sep = $this -> getValueSetSeparator ();
$queryStr .= " (`value` like " . $db -> qstr ( $sep . $attrvalue . '%' ) . " OR `value` like " . $db -> qstr ( '%' . $sep . $attrvalue . $sep . '%' ) . " OR `value` like " . $db -> qstr ( '%' . $sep . $attrvalue ) . " ) " ;
} else {
$queryStr .= " `value`= " . $db -> qstr ( $attrvalue );
}
$resArr = $db -> getResultArray ( $queryStr );
if ( $resArr ) {
$db -> startTransaction ();
foreach ( $resArr as $rec ) {
if ( $rec [ 'value' ] == $attrvalue ) {
$queryStr = " DELETE FROM ` " . $tablename . " ` WHERE `id`= " . $rec [ 'id' ];
} else {
if ( $this -> getMultipleValues ()) {
$sep = substr ( $rec [ 'value' ], 0 , 1 );
$vsep = $this -> getValueSetSeparator ();
if ( $sep == $vsep )
$values = explode ( $sep , substr ( $rec [ 'value' ], 1 ));
else
$values = array ( $rec [ 'value' ]);
if (( $key = array_search ( $attrvalue , $values )) !== false ) {
unset ( $values [ $key ]);
}
if ( $values ) {
$queryStr = " UPDATE ` " . $tablename . " ` SET `value`= " . $db -> qstr ( $sep . implode ( $sep , $values )) . " WHERE `id`= " . $rec [ 'id' ];
} else {
$queryStr = " DELETE FROM ` " . $tablename . " ` WHERE `id`= " . $rec [ 'id' ];
}
} else {
}
}
if ( ! $db -> getResult ( $queryStr )) {
$db -> rollbackTransaction ();
return false ;
}
}
$db -> commitTransaction ();
}
}
}
return true ;
} /* }}} */
2015-04-15 14:11:07 +00:00
/**
* Validate value against attribute definition
*
* This function checks if the given value fits the attribute
* definition .
* If the validation fails the validation error will be set which
* can be requested by SeedDMS_Core_Attribute :: getValidationError ()
2020-12-14 17:16:35 +00:00
* Set $new to true if the value to be checked isn ' t saved to the database
* already . It will just be passed to the callback onAttributeValidate where
* it could be used to , e . g . check if a value is unique once it is saved to
2020-12-14 17:46:38 +00:00
* the database . $object is set to a folder , document or documentcontent
* if the attribute belongs to such an object . This will be null , if a
* new object is created .
2015-04-15 14:11:07 +00:00
*
* @ param string | array $attrvalue attribute value
2020-12-14 17:46:38 +00:00
* @ param object $object set if the current attribute is saved for this object
2020-12-14 17:16:35 +00:00
* @ param boolean $new set to true if the value is new value and not taken from
* an existing attribute
2015-04-15 14:11:07 +00:00
* @ return boolean true if validation succeds , otherwise false
*/
2020-12-14 17:46:38 +00:00
function validate ( $attrvalue , $object = null , $new = false ) { /* {{{ */
2017-06-27 15:06:32 +00:00
/* Check if 'onAttributeValidate' callback is set */
if ( isset ( $this -> _dms -> callbacks [ 'onAttributeValidate' ])) {
foreach ( $this -> _dms -> callbacks [ 'onAttributeValidate' ] as $callback ) {
2020-12-14 17:46:38 +00:00
$ret = call_user_func ( $callback [ 0 ], $callback [ 1 ], $this , $attrvalue , $object , $new );
2017-06-27 15:06:32 +00:00
if ( is_bool ( $ret ))
return $ret ;
}
}
2020-09-01 07:22:48 +00:00
/* Turn $attrvalue into an array of values . Checks if $attrvalue starts
* with a separator char as set in the value set and uses it to explode
* the $attrvalue . If the separator doesn ' t match or this attribute
* definition doesn ' t have a value set , then just create a one element
* array . if $attrvalue is empty , then create an empty array .
*/
2015-04-15 14:11:07 +00:00
if ( $this -> getMultipleValues ()) {
2016-11-14 10:26:26 +00:00
if ( is_string ( $attrvalue )) {
$sep = $attrvalue [ 0 ];
$vsep = $this -> getValueSetSeparator ();
if ( $sep == $vsep )
$values = explode ( $attrvalue [ 0 ], substr ( $attrvalue , 1 ));
else
$values = array ( $attrvalue );
} else
2015-04-15 14:11:07 +00:00
$values = $attrvalue ;
2017-11-21 10:27:17 +00:00
} elseif ( $attrvalue ) {
2015-04-15 14:11:07 +00:00
$values = array ( $attrvalue );
2017-11-21 10:27:17 +00:00
} else {
$values = array ();
2015-04-15 14:11:07 +00:00
}
2020-09-01 07:22:48 +00:00
/* Check if attribute value has at least the minimum number of values */
2015-04-15 14:11:07 +00:00
$this -> _validation_error = 0 ;
if ( $this -> getMinValues () > count ( $values )) {
$this -> _validation_error = 1 ;
return false ;
}
2020-09-01 07:22:48 +00:00
/* Check if attribute value has not more than maximum number of values */
2015-04-15 14:11:07 +00:00
if ( $this -> getMaxValues () && $this -> getMaxValues () < count ( $values )) {
$this -> _validation_error = 2 ;
return false ;
}
2016-10-05 14:03:47 +00:00
$success = true ;
2015-04-15 14:11:07 +00:00
switch (( string ) $this -> getType ()) {
2016-10-27 07:17:14 +00:00
case self :: type_boolean :
foreach ( $values as $value ) {
$success &= preg_match ( '/^[01]$/' , $value ) ? true : false ;
}
if ( ! $success )
$this -> _validation_error = 8 ;
break ;
2015-04-15 14:11:07 +00:00
case self :: type_int :
foreach ( $values as $value ) {
$success &= preg_match ( '/^[0-9]*$/' , $value ) ? true : false ;
}
2016-10-27 07:17:14 +00:00
if ( ! $success )
$this -> _validation_error = 6 ;
break ;
case self :: type_date :
foreach ( $values as $value ) {
$success &= preg_match ( '/^[12][0-9]{3}-[01][0-9]-[0-9]{2}$/' , $value ) ? true : false ;
}
if ( ! $success )
$this -> _validation_error = 9 ;
2015-04-15 14:11:07 +00:00
break ;
case self :: type_float :
foreach ( $values as $value ) {
$success &= is_numeric ( $value );
}
2016-10-27 07:17:14 +00:00
if ( ! $success )
$this -> _validation_error = 7 ;
2015-04-15 14:11:07 +00:00
break ;
case self :: type_string :
if ( trim ( $this -> getRegex ()) != '' ) {
foreach ( $values as $value ) {
$success &= preg_match ( $this -> getRegex (), $value ) ? true : false ;
}
}
if ( ! $success )
$this -> _validation_error = 3 ;
break ;
case self :: type_email :
foreach ( $values as $value ) {
2016-10-25 05:55:27 +00:00
$success &= preg_match ( '/^[a-z0-9._-]+@+[a-z0-9._-]+\.+[a-z]{2,4}$/i' , $value );
2015-04-15 14:11:07 +00:00
}
if ( ! $success )
$this -> _validation_error = 5 ;
break ;
case self :: type_url :
foreach ( $values as $value ) {
$success &= preg_match ( '/^http(s)?:\/\/[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(\/.*)?$/i' , $value );
}
if ( ! $success )
$this -> _validation_error = 4 ;
break ;
2020-09-01 07:22:48 +00:00
case self :: type_document :
foreach ( $values as $value ) {
$success = true ;
if ( ! $this -> _dms -> getDocument (( int ) $value ))
$success = false ;
}
if ( ! $success )
$this -> _validation_error = 10 ;
break ;
case self :: type_folder :
foreach ( $values as $value ) {
$success = true ;
if ( ! $this -> _dms -> getFolder (( int ) $value ))
$success = false ;
}
if ( ! $success )
$this -> _validation_error = 11 ;
break ;
case self :: type_user :
foreach ( $values as $value ) {
$success = true ;
if ( ! $this -> _dms -> getUser (( int ) $value ))
$success = false ;
}
if ( ! $success )
$this -> _validation_error = 12 ;
break ;
case self :: type_group :
foreach ( $values as $value ) {
$success = true ;
if ( ! $this -> _dms -> getGroup (( int ) $value ))
$success = false ;
}
if ( ! $success )
$this -> _validation_error = 13 ;
break ;
2015-04-15 14:11:07 +00:00
}
2016-10-27 15:47:47 +00:00
if ( ! $success )
return $success ;
2015-04-15 14:11:07 +00:00
/* Check if value is in value set */
if ( $valueset = $this -> getValueSetAsArray ()) {
foreach ( $values as $value ) {
if ( ! in_array ( $value , $valueset )) {
$success = false ;
$this -> _validation_error = 10 ;
}
}
}
return $success ;
} /* }}} */
/**
* Get validation error from last validation
*
* @ return integer error code
*/
function getValidationError () { return $this -> _validation_error ; }
2013-02-13 17:07:16 +00:00
} /* }}} */