2010-03-22 15:45:47 +00:00
< ? php
/*
* e107 website system
*
2011-09-14 11:30:58 +00:00
* Copyright ( C ) 2008 - 2011 e107 Inc ( e107 . org )
2010-03-22 15:45:47 +00:00
* Released under the terms and conditions of the
* GNU General Public License ( http :// www . gnu . org / licenses / gpl . txt )
*
* User Model
*
* $URL $
* $Id $
*/
2010-05-02 18:41:20 +00:00
/**
2010-05-05 15:05:32 +00:00
* @ package e107
2010-05-28 22:10:20 +00:00
* @ subpackage e107_handlers
2010-05-05 15:05:32 +00:00
* @ version $Id $
* @ author SecretR
*
* Front - end User Models
2010-05-02 18:41:20 +00:00
*/
2010-05-05 15:05:32 +00:00
if ( ! defined ( 'e107_INIT' ))
{
exit ;
}
class e_user_model extends e_front_model
2010-05-02 18:41:20 +00:00
{
/**
2010-05-05 15:05:32 +00:00
* Describes all model data , used as _FIELD_TYPE array as well
2010-05-02 18:41:20 +00:00
* @ var array
*/
2010-05-05 15:05:32 +00:00
protected $_data_fields = array (
'user_id' => 'integer' ,
'user_name' => 'string' ,
'user_loginname' => 'string' ,
'user_customtitle' => 'string' ,
'user_password' => 'string' ,
'user_sess' => 'string' ,
'user_email' => 'string' ,
'user_signature' => 'string' ,
'user_image' => 'string' ,
'user_hideemail' => 'integer' ,
'user_join' => 'integer' ,
'user_lastvisit' => 'integer' ,
'user_currentvisit' => 'integer' ,
'user_lastpost' => 'integer' ,
'user_chats' => 'integer' ,
'user_comments' => 'integer' ,
'user_ip' => 'string' ,
'user_ban' => 'integer' ,
'user_prefs' => 'string' ,
'user_visits' => 'integer' ,
'user_admin' => 'integer' ,
'user_login' => 'string' ,
'user_class' => 'string' ,
'user_perms' => 'string' ,
'user_realm' => 'string' ,
'user_pwchange' => 'integer' ,
'user_xup' => 'string' ,
);
2010-05-02 18:41:20 +00:00
/**
2010-05-05 15:05:32 +00:00
* Validate required fields
* @ var array
2010-05-02 18:41:20 +00:00
*/
2010-05-05 15:05:32 +00:00
protected $_validation_rules = array (
'user_name' => array ( 'string' , '1' , 'LAN_USER_01' , 'LAN_USER_HELP_01' ), // TODO - regex
'user_loginname' => array ( 'string' , '1' , 'LAN_USER_02' , 'LAN_USER_HELP_02' ), // TODO - regex
2010-05-13 15:47:31 +00:00
'user_password' => array ( 'compare' , '5' , 'LAN_USER_05' , 'LAN_USER_HELP_05' ), // TODO - pref - modify it somewhere below - prepare_rules()?
2010-05-05 15:05:32 +00:00
'user_email' => array ( 'email' , '' , 'LAN_USER_08' , 'LAN_USER_HELP_08' ),
);
2010-05-02 18:41:20 +00:00
/**
2010-05-05 15:05:32 +00:00
* Validate optional fields - work in progress , not working yet
* @ var array
2010-05-02 18:41:20 +00:00
*/
2010-05-05 15:05:32 +00:00
protected $_optional_rules = array (
'user_customtitle' => array ( 'string' , '1' , 'LAN_USER_01' ), // TODO - regex
);
2010-05-02 18:41:20 +00:00
2010-03-22 15:45:47 +00:00
/**
* @ see e_model
* @ var string
*/
protected $_db_table = 'user' ;
/**
* @ see e_model
* @ var string
*/
protected $_field_id = 'user_id' ;
/**
* @ see e_model
* @ var string
*/
protected $_message_stack = 'user' ;
2010-05-05 15:05:32 +00:00
2010-05-15 17:33:11 +00:00
/**
* User class as set in user Adminsitration
*
* @ var integer
*/
protected $_memberlist_access = null ;
2010-04-28 15:44:46 +00:00
/**
* Extended data
2010-05-05 15:05:32 +00:00
*
2010-04-28 15:44:46 +00:00
* @ var e_user_extended_model
*/
protected $_extended_model = null ;
2010-05-05 15:05:32 +00:00
2010-04-28 15:44:46 +00:00
/**
* Extended structure
2010-05-05 15:05:32 +00:00
*
2010-05-02 18:41:20 +00:00
* @ var e_user_extended_structure
*/
protected $_extended_structure = null ;
2010-05-05 15:05:32 +00:00
2010-05-13 15:47:31 +00:00
/**
* User preferences model
* @ var e_user_pref
*/
protected $_user_config = null ;
2010-05-02 18:41:20 +00:00
/**
* User model of current editor
* @ var e_user_model
*/
protected $_editor = null ;
2010-12-11 15:37:39 +00:00
protected $_class_list ;
2010-05-05 15:05:32 +00:00
2010-05-15 17:33:11 +00:00
/**
* Constructor
* @ param array $data
* @ return void
*/
public function __construct ( $data = array ())
{
$this -> _memberlist_access = e107 :: getPref ( 'memberlist_access' );
parent :: __construct ( $data );
}
2010-05-02 18:41:20 +00:00
/**
* Always return integer
2010-05-05 15:05:32 +00:00
*
2010-05-02 18:41:20 +00:00
* @ see e107_handlers / e_model #getId()
2010-04-28 15:44:46 +00:00
*/
2010-05-02 18:41:20 +00:00
public function getId ()
{
return ( integer ) parent :: getId ();
}
2010-05-05 15:05:32 +00:00
2010-05-15 17:33:11 +00:00
final public function getName ( $anon = false )
{
return ( $this -> isUser () ? $this -> get ( 'user_name' ) : $anon );
}
2010-05-02 18:41:20 +00:00
final public function getAdminId ()
{
return ( $this -> isAdmin () ? $this -> getId () : false );
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
final public function getAdminName ()
{
2010-05-14 18:45:51 +00:00
return ( $this -> isAdmin () ? $this -> get ( 'user_name' ) : false );
2010-05-02 18:41:20 +00:00
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
final public function getAdminEmail ()
{
2010-05-14 18:45:51 +00:00
return ( $this -> isAdmin () ? $this -> get ( 'user_email' ) : false );
2010-05-02 18:41:20 +00:00
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
final public function getAdminPwchange ()
{
2010-05-14 18:45:51 +00:00
return ( $this -> isAdmin () ? $this -> get ( 'user_pwchange' ) : false );
2010-05-02 18:41:20 +00:00
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
final public function getAdminPerms ()
{
2010-05-14 18:45:51 +00:00
return ( $this -> isAdmin () ? $this -> get ( 'user_perms' ) : false );
2010-05-02 18:41:20 +00:00
}
2010-05-05 15:05:32 +00:00
2010-10-26 07:41:20 +00:00
/**
* DEPRECATED - will be removed or changed soon ( see e_session )
* @ return string
*/
2010-05-19 15:28:52 +00:00
public function getToken ()
{
if ( null === $this -> get ( 'user_token' ))
{
2010-10-26 07:41:20 +00:00
//$this->set('user_token', md5($this->get('user_password').$this->get('user_lastvisit').$this->get('user_pwchange').$this->get('user_class')));
$this -> set ( 'user_token' , e107 :: getSession () -> getFormToken ( false ));
2010-05-19 15:28:52 +00:00
}
return $this -> get ( 'user_token' );
}
2010-05-02 18:41:20 +00:00
public function isCurrent ()
{
return false ;
}
final public function isAdmin ()
{
2010-05-14 18:45:51 +00:00
return ( $this -> get ( 'user_admin' ) ? true : false );
2010-05-02 18:41:20 +00:00
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
final public function isMainAdmin ()
{
return $this -> checkAdminPerms ( '0' );
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
final public function isUser ()
{
return ( $this -> getId () ? true : false );
}
2010-05-05 15:05:32 +00:00
2010-05-14 18:45:51 +00:00
final public function isGuest ()
{
return ( $this -> getId () ? false : true );
}
final public function hasBan ()
{
return (( integer ) $this -> get ( 'user_ban' ) === 1 ? true : false );
}
final public function hasRestriction ()
{
return (( integer ) $this -> get ( 'user_ban' ) === 0 ? false : true );
}
2010-05-02 18:41:20 +00:00
public function hasEditor ()
{
2010-05-13 15:47:31 +00:00
return ( null !== $this -> _editor );
2010-05-02 18:41:20 +00:00
}
2010-05-05 15:05:32 +00:00
2010-05-17 14:13:50 +00:00
final protected function _setClassList ()
2010-05-02 18:41:20 +00:00
{
$this -> _class_list = array ();
2010-05-05 15:05:32 +00:00
if ( $this -> isUser ())
2010-05-02 18:41:20 +00:00
{
2010-05-15 17:33:11 +00:00
if ( $this -> get ( 'user_class' ))
2010-05-02 18:41:20 +00:00
{
2010-05-17 14:13:50 +00:00
// list of all 'inherited' user classes, convert elements to integer
$this -> _class_list = array_map ( 'intval' , e107 :: getUserClass () -> get_all_user_classes ( $this -> get ( 'user_class' ), true ));
2010-05-02 18:41:20 +00:00
}
$this -> _class_list [] = e_UC_MEMBER ;
2010-05-05 15:05:32 +00:00
if ( $this -> isAdmin ())
2010-05-02 18:41:20 +00:00
{
$this -> _class_list [] = e_UC_ADMIN ;
}
2010-05-05 15:05:32 +00:00
if ( $this -> isMainAdmin ())
2010-05-02 18:41:20 +00:00
{
$this -> _class_list [] = e_UC_MAINADMIN ;
}
}
else
{
$this -> _class_list [] = e_UC_GUEST ;
}
$this -> _class_list [] = e_UC_READONLY ;
$this -> _class_list [] = e_UC_PUBLIC ;
2010-05-05 15:05:32 +00:00
2010-05-17 14:13:50 +00:00
// unique, rebuild indexes
$this -> _class_list = array_merge ( array_unique ( $this -> _class_list ));
2010-05-02 18:41:20 +00:00
return $this ;
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
final public function getClassList ( $toString = false )
{
2010-05-05 15:05:32 +00:00
if ( null === $this -> _class_list )
2010-05-02 18:41:20 +00:00
{
$this -> _setClassList ();
}
return ( $toString ? implode ( ',' , $this -> _class_list ) : $this -> _class_list );
}
2010-05-05 15:05:32 +00:00
2010-05-15 17:33:11 +00:00
final public function getClassRegex ()
{
return '(^|,)(' . str_replace ( ',' , '|' , $this -> getClassList ( true )) . ')(,|$)' ;
}
2010-05-02 18:41:20 +00:00
final public function checkClass ( $class , $allowMain = true )
{
// FIXME - replace check_class() here
return (( $allowMain && $this -> isMainAdmin ()) || check_class ( $class , $this -> getClassList (), 0 ));
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
final public function checkAdminPerms ( $perm_str )
{
// FIXME - method to replace getperms()
return ( $this -> isAdmin () && getperms ( $perm_str , $this -> getAdminPerms ()));
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
final public function checkEditorPerms ( $class = '' )
{
2010-05-05 15:05:32 +00:00
if ( ! $this -> hasEditor ())
return false ;
2010-05-02 18:41:20 +00:00
$editor = $this -> getEditor ();
2010-05-05 15:05:32 +00:00
if ( '' !== $class )
return ( $editor -> isAdmin () && $editor -> checkClass ( $class ));
2010-05-02 18:41:20 +00:00
return $editor -> isAdmin ();
}
2010-03-22 15:45:47 +00:00
2010-05-19 15:28:52 +00:00
/**
* Check passed value against current user token
2010-10-26 07:41:20 +00:00
* DEPRECATED - will be removed or changed soon ( see e_core_session )
2010-05-19 15:28:52 +00:00
* @ param string $token md5 sum of e . g . posted token
* @ return boolean
*/
final public function checkToken ( $token )
{
$utoken = $this -> getToken ();
return ( null !== $utoken && $token === md5 ( $utoken ));
}
2010-05-17 15:51:42 +00:00
/**
* Bad but required ( BC ) method of retrieving all user data
* It ' s here to be used from get_user_data () core function .
2010-05-19 15:28:52 +00:00
* DON ' T USE THEM BOTH unless you have VERY good reason to do it .
2010-05-17 15:51:42 +00:00
*
* @ return array
*/
public function getUserData ()
{
2010-05-28 13:24:25 +00:00
// revised - don't call extended object, no permission checks, just return joined user data
$ret = $this -> getData ();
// $ret = array_merge($this->getExtendedModel()->getExtendedData(), $this->getData());
2010-05-17 15:51:42 +00:00
if ( $ret [ 'user_perms' ] == '0.' ) $ret [ 'user_perms' ] = '0' ;
$ret [ 'user_baseclasslist' ] = $ret [ 'user_class' ];
$ret [ 'user_class' ] = $this -> getClassList ( true );
return $ret ;
}
2010-03-22 15:45:47 +00:00
/**
2010-05-28 13:24:25 +00:00
* Check if given field name is present in core user table structure
2010-03-22 15:45:47 +00:00
*
2010-05-28 13:24:25 +00:00
* @ param string $field
* @ param boolean $short
* @ return boolean
*/
public function isCoreField ( $field , $short = true )
{
if ( $short ) $field = 'user_' . $field ;
return isset ( $this -> _data_fields [ $field ]);
}
/**
* Check if given field name is present in extended user table structure
*
* @ param string $field
* @ param boolean $short
* @ return boolean
*/
public function isExtendedField ( $field , $short = true )
{
if ( $short ) $field = 'user_' . $field ;
if ( $this -> isCoreField ( $field , false ))
{
return false ;
}
return $this -> getExtendedModel () -> isField ( $field , false );
}
/**
* Get User value from core user table .
* This method doesn ' t perform any read permission cheks .
*
* @ param string $field
* @ param mixed $default
2010-05-13 15:47:31 +00:00
* @ param boolean $short if true , 'user_' prefix will be added to field name
2010-05-28 13:24:25 +00:00
* @ return mixed if field is not part of core user table returns null by default
2010-03-22 15:45:47 +00:00
*/
2010-05-28 13:24:25 +00:00
public function getCore ( $field , $default = null , $short = true )
2010-03-22 15:45:47 +00:00
{
2010-05-13 15:47:31 +00:00
if ( $short ) $field = 'user_' . $field ;
2010-05-28 13:24:25 +00:00
if ( $this -> isCoreField ( $field , false )) return $this -> get ( $field , $default );
return $default ;
2010-03-22 15:45:47 +00:00
}
/**
2010-05-28 13:24:25 +00:00
* Set User value ( core user field ) .
* This method doesn ' t perform any write permission cheks .
*
2010-03-22 15:45:47 +00:00
* @ param string $field
* @ param mixed $value
2010-05-13 15:47:31 +00:00
* @ param boolean $short if true , 'user_' prefix will be added to field name
2010-05-28 13:24:25 +00:00
* @ param boolean $strict if false no Applicable check will be made
2010-03-22 15:45:47 +00:00
* @ return e_user_model
*/
2010-05-28 13:24:25 +00:00
public function setCore ( $field , $value , $short = true , $strict = false )
2010-03-22 15:45:47 +00:00
{
2010-05-13 15:47:31 +00:00
if ( $short ) $field = 'user_' . $field ;
2010-05-28 13:24:25 +00:00
if ( $this -> isCoreField ( $field , false )) $this -> set ( $field , $value , $strict );
return $this ;
}
/**
* Get User extended value .
* This method doesn ' t perform any read permission cheks .
*
* @ param string $field
* @ param boolean $short if true , 'user_' prefix will be added to field name
* @ param boolean $raw get raw DB values ( no SQL query )
* @ return mixed
*/
public function getExtended ( $field , $short = true , $raw = true )
{
return $this -> getExtendedModel () -> getSystem ( $field , $short , $raw );
}
/**
* Set User extended value .
* This method doesn ' t perform any write permission cheks .
*
* @ param string $field
* @ param mixed $value
* @ param boolean $short if true , 'user_' prefix will be added to field name
* @ param boolean $strict if false no Applicable check will be made
* @ return e_user_model
*/
public function setExtended ( $field , $value , $short = true , $strict = false )
{
$this -> getExtendedModel () -> setSystem ( $field , $value , $short , $strict );
return $this ;
}
/**
* Get User extended value after checking read permissions against current Editor
*
* @ param string $field
* @ param boolean $short if true , 'user_' prefix will be added to field name
* @ param boolean $raw get raw DB values ( no SQL query )
* @ return mixed
*/
public function getExtendedFront ( $field , $short = true , $raw = false )
{
return $this -> getExtendedModel () -> getValue ( $field , $short , $raw );
}
/**
* Set User extended value after checking write permissions against current Editor .
*
* @ param string $field
* @ param mixed $value
* @ param boolean $short if true , 'user_' prefix will be added to field name
* @ return e_user_model
*/
public function setExtendedFront ( $field , $value , $short = true )
{
$this -> getExtendedModel () -> setValue ( $field , $value , $short );
return $this ;
}
/**
* Transparent front - end getter . It performs all required read / applicable permission checks
* against current editor / user . It doesn ' t distinguish core and extended fields .
* It grants BC .
* It 's what you' d need in all front - end parsing code ( e . g . shortcodes )
*
* @ param string $field
* @ param mixed $default
* @ param boolean $short if true , 'user_' prefix will be added to field name
* @ param boolean $rawExtended get raw DB values ( no SQL query ) - used only for extended fields
* @ return mixed if field is not readable returns null by default
*/
public function getValue ( $field , $default = null , $short = true , $rawExtended = false )
{
if ( $short )
{
$mfield = $field ;
$field = 'user_' . $field ;
}
else
{
$mfield = substr ( $field , 5 );
}
// check for BC/override method first e.g. getSingatureValue($default, $system = false, $rawExtended);
$method = 'get' . ucfirst ( $mfield ) . 'Value' ;
if ( method_exists ( $this , $method )) return $this -> $method ( $default , false , $rawExtended );
if ( $this -> isCoreField ( $field , false ))
{
if ( ! $this -> isReadable ( $field )) return $default ;
return $this -> getCore ( $field , $default , false );
}
return $this -> getExtendedFront ( $field , false , $rawExtended );
}
/**
* Transparent front - end setter . It performs all required write / applicable permission checks
* against current editor / user . It doesn ' t distinguish core and extended fields .
* It grants BC .
* It 's what you' d need on all user front - end manipulation events ( e . g . user settings page related code )
* NOTE : untrusted data should be provided via setPosted () method !
*
* @ param string $field
* @ param mixed $value
* @ param boolean $short if true , 'user_' prefix will be added to field name
* @ return e_user_model
*/
public function setValue ( $field , $value , $short = true )
{
if ( $short )
{
$mfield = $field ;
$field = 'user_' . $field ;
}
else
{
$mfield = substr ( $field , 5 );
}
// check for BC/override method first e.g. setSingatureValue($value, $system = false);
$method = 'set' . ucfirst ( $mfield ) . 'Value' ;
if ( method_exists ( $this , $method ))
{
$this -> $method ( $value , false );
return $this ;
}
if ( $this -> isCoreField ( $field , false ))
{
if ( $this -> isWritable ( $field )) $this -> setCore ( $field , $value , false , true );
}
else
{
$this -> setExtendedFront ( $field , $value , false );
}
return $this ;
}
/**
* Transparent system getter . It doesn ' t perform any read / applicable permission checks
* against current editor / user . It doesn ' t distinguish core and extended fields .
* It grants BC .
* It ' s here to serve in your application logic .
*
* @ param string $field
* @ param mixed $default
* @ param boolean $short if true , 'user_' prefix will be added to field name
* @ param boolean $rawExtended get raw DB values ( no SQL query ) - used only for extended fields
* @ return mixed
*/
public function getSystem ( $field , $default = null , $short = true , $rawExtended = true )
{
if ( $short )
{
$mfield = $field ;
$field = 'user_' . $field ;
}
else
{
$mfield = substr ( $field , 5 );
}
// check for BC/override method first e.g. getSingatureValue($default, $system = true, $rawExtended);
$method = 'get' . ucfirst ( $mfield ) . 'Value' ;
if ( method_exists ( $this , $method )) return $this -> $method ( $default , true , $rawExtended );
if ( $this -> isCoreField ( $field , false ))
{
return $this -> getCore ( $field , $default , false );
}
return $this -> getExtended ( $field , false , $rawExtended );
}
/**
* Transparent front - end setter . It doesn ' t perform any write / applicable permission checks
* against current editor / user . It doesn ' t distinguish core and extended fields .
* It ' s here to serve in your application logic .
* NOTE : untrusted data should be provided via setPosted () method !
*
* @ param string $field
* @ param mixed $value
* @ param boolean $short if true , 'user_' prefix will be added to field name
* @ param boolean $strict if false no Applicable check will be made
* @ return e_user_model
*/
public function setSystem ( $field , $value , $short = true , $strict = false )
{
if ( $short )
{
$mfield = $field ;
$field = 'user_' . $field ;
}
else
{
$mfield = substr ( $field , 5 );
}
// check for BC/override method first e.g. setSingatureValue($value, $system = true);
$method = 'set' . ucfirst ( $mfield ) . 'Value' ;
if ( method_exists ( $this , $method ))
{
$this -> $method ( $value , true );
return $this ;
}
if ( $this -> isCoreField ( $field , false ))
{
$this -> setCore ( $field , $value , false , $strict );
}
else
{
$this -> setExtended ( $field , $value , false , $strict );
}
return $this ;
}
/**
* Just an example override method . This method is auto - magically called by getValue / System
* getters .
* $rawExtended is not used ( here for example purposes only )
* If user_signature become extended field one day , we ' d need this method
* for real - it ' ll call extended getters to retrieve the required value .
*
* @ param mixed $default optional
* @ param boolean $system optional
* @ param boolean $rawExtended optional
* @ return mixed value
*/
public function getSignatureValue ( $default = null , $system = false , $rawExtended = true )
{
if ( $system || $this -> isReadable ( 'user_signature' )) return $this -> getCore ( 'signature' , $default );
return $default ;
}
/**
* Just an example override method . This method is auto - magically called by setValue / System
* setters .
* If user_signature become extended field one day , we ' d need this method
* for real - it ' ll call extended setters to set the new signature value
*
* @ param string $value
* @ param boolean $system
* @ return e_user_model
*/
public function setSignatureValue ( $value , $system = false )
{
if ( $system || $this -> isWritable ( 'user_signature' )) $this -> setCore ( 'signature' , $value );
2010-05-13 15:47:31 +00:00
return $this ;
}
/**
* Get user preference
* @ param string $pref_name
* @ param mixed $default
* @ return mixed
*/
public function getPref ( $pref_name = null , $default = null )
{
if ( null === $pref_name ) return $this -> getConfig () -> getData ();
return $this -> getConfig () -> get ( $pref_name , $default );
}
/**
* Set user preference
* @ param string $pref_name
* @ param mixed $value
* @ return e_user_model
*/
public function setPref ( $pref_name , $value = null )
{
$this -> getConfig () -> set ( $pref_name , $value );
return $this ;
}
/**
* Get user preference ( advanced - slower )
* @ param string $pref_path
* @ param mixed $default
* @ param integer $index if number , value will be exploded by " \n " and corresponding index will be returned
* @ return mixed
*/
public function findPref ( $pref_path = null , $default = null , $index = null )
{
return $this -> getConfig () -> getData ( $pref_path , $default , $index );
}
/**
* Set user preference ( advanced - slower )
* @ param string $pref_path
* @ param mixed $value
* @ return e_user_model
*/
public function setPrefData ( $pref_path , $value = null )
{
$this -> getConfig () -> setData ( $pref_path , $value = null );
2010-03-22 15:45:47 +00:00
return $this ;
}
2010-05-05 15:05:32 +00:00
2010-04-28 15:44:46 +00:00
/**
* Get user extended model
2010-05-05 15:05:32 +00:00
*
2010-04-28 15:44:46 +00:00
* @ return e_user_extended_model
*/
2010-05-02 18:41:20 +00:00
public function getExtendedModel ()
2010-04-28 15:44:46 +00:00
{
2010-05-05 15:05:32 +00:00
if ( null === $this -> _extended_model )
2010-04-28 15:44:46 +00:00
{
2010-05-02 18:41:20 +00:00
$this -> _extended_model = new e_user_extended_model ( $this );
2010-04-28 15:44:46 +00:00
}
return $this -> _extended_model ;
}
2010-05-05 15:05:32 +00:00
2010-04-28 15:44:46 +00:00
/**
* Set user extended model
2010-05-05 15:05:32 +00:00
*
2010-04-28 15:44:46 +00:00
* @ param e_user_extended_model $extended_model
* @ return e_user_model
*/
2010-05-02 18:41:20 +00:00
public function setExtendedModel ( $extended_model )
2010-04-28 15:44:46 +00:00
{
$this -> _extended_model = $extended_model ;
return $this ;
}
2010-05-05 15:05:32 +00:00
2010-05-13 15:47:31 +00:00
/**
* Get user config model
*
* @ return e_user_pref
*/
public function getConfig ()
{
if ( null === $this -> _user_config )
{
$this -> _user_config = new e_user_pref ( $this );
}
return $this -> _user_config ;
}
/**
* Set user config model
*
* @ param e_user_pref $user_config
* @ return e_user_model
*/
public function setConfig ( e_user_pref $user_config )
{
$this -> _user_config = $user_config ;
return $this ;
}
2010-04-28 15:44:46 +00:00
/**
2010-05-02 18:41:20 +00:00
* Get current user editor model
* @ return e_user_model
2010-04-28 15:44:46 +00:00
*/
2010-05-02 18:41:20 +00:00
public function getEditor ()
2010-04-28 15:44:46 +00:00
{
2010-05-02 18:41:20 +00:00
return $this -> _editor ;
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
/**
2010-05-15 17:33:11 +00:00
* Set current user editor model
2010-05-02 18:41:20 +00:00
* @ return e_user_model
*/
2010-05-15 17:33:11 +00:00
public function setEditor ( e_user_model $user_model )
2010-05-02 18:41:20 +00:00
{
$this -> _editor = $user_model ;
return $this ;
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
/**
* Check if passed field is writable
* @ param string $field
* @ return boolean
*/
public function isWritable ( $field )
{
2010-05-13 15:47:31 +00:00
$perm = false ;
$editor = $this -> getEditor ();
if ( $this -> getId () === $editor -> getId () || $editor -> isMainAdmin () || $editor -> checkAdminPerms ( '4' ))
$perm = true ;
return ( $perm && ! in_array ( $field , array ( $this -> getFieldIdName (), 'user_admin' , 'user_perms' , 'user_prefs' )));
2010-04-28 15:44:46 +00:00
}
2010-03-22 15:45:47 +00:00
2010-05-15 17:33:11 +00:00
/**
* Check if passed field is readable by the Editor
* @ param string $field
* @ return boolean
*/
public function isReadable ( $field )
{
$perm = false ;
$editor = $this -> getEditor ();
if ( $this -> getId () === $editor -> getId () || $editor -> isMainAdmin () || $editor -> checkAdminPerms ( '4' ))
$perm = true ;
return ( $perm || ( ! in_array ( $field , array ( 'user_admin' , 'user_perms' , 'user_prefs' , 'user_password' ) && $editor -> checkClass ( $this -> _memberlist_access ))));
}
2010-03-22 15:45:47 +00:00
/**
* Set current object as a target
2010-05-05 15:05:32 +00:00
*
2010-03-22 15:45:47 +00:00
* @ return e_user_model
*/
2010-05-02 18:41:20 +00:00
protected function setAsTarget ()
2010-03-22 15:45:47 +00:00
{
2010-05-13 15:47:31 +00:00
e107 :: setRegistry ( 'core/e107/user/' . $this -> getId (), $this );
2010-03-22 15:45:47 +00:00
return $this ;
}
/**
* Clear registered target
2010-05-05 15:05:32 +00:00
*
2010-03-22 15:45:47 +00:00
* @ return e_user_model
*/
2010-05-02 18:41:20 +00:00
protected function clearTarget ()
2010-03-22 15:45:47 +00:00
{
2010-05-13 15:47:31 +00:00
e107 :: setRegistry ( 'core/e107/user' . $this -> getId (), null );
2010-03-22 15:45:47 +00:00
return $this ;
}
/**
* @ see e_model #load($id, $force)
*/
public function load ( $user_id = 0 , $force = false )
{
2010-05-28 13:24:25 +00:00
$qry = " SELECT u.*, ue.* FROM #user AS u LEFT JOIN #user_extended as ue ON u.user_id=ue.user_extended_id WHERE user_id= { ID} " ;
$this -> setParam ( 'db_query' , $qry );
2010-03-22 15:45:47 +00:00
parent :: load ( $user_id , $force );
2010-05-05 15:05:32 +00:00
if ( $this -> getId ())
2010-04-28 15:44:46 +00:00
{
// no errors - register
2010-05-02 18:41:20 +00:00
$this -> setAsTarget ()
-> setEditor ( e107 :: getUser ()); //set current user as default editor
}
}
2010-05-05 15:05:32 +00:00
2010-05-13 15:47:31 +00:00
/**
* Additional security while applying posted
* data to user model
* @ return e_user_model
*/
public function mergePostedData ()
{
$posted = $this -> getPostedData ();
foreach ( $posted as $key => $value )
{
if ( ! $this -> isWritable ( $key ))
{
$this -> removePosted ( $key );
continue ;
}
$this -> _modifyPostedData ( $key , $value );
}
parent :: mergePostedData ( true , true , true );
return $this ;
}
protected function _modifyPostedData ( $key , $value )
{
// TODO - add more here
switch ( $key )
{
case 'password1' :
// compare validation rule
$this -> setPosted ( 'user_password' , array ( $value , $this -> getPosted ( 'password2' )));
break ;
}
}
2010-05-02 18:41:20 +00:00
/**
* Send model data to DB
*/
2010-05-05 15:05:32 +00:00
public function save ( $force = false , $session = false )
2010-05-02 18:41:20 +00:00
{
2010-05-05 15:05:32 +00:00
if ( ! $this -> checkEditorPerms ())
2010-05-02 18:41:20 +00:00
{
return false ; // TODO - message, admin log
2010-05-05 15:05:32 +00:00
}
2010-05-13 15:47:31 +00:00
// sync user prefs
$this -> getConfig () -> apply ();
// TODO - do the save manually in this order: validate() on user model, save() on extended fields, save() on user model
2010-05-05 15:05:32 +00:00
$ret = parent :: save ( true , $force , $session );
if ( false !== $ret && null !== $this -> _extended_model ) // don't load extended fields if not already used
{
$ret_e = $this -> _extended_model -> save ( $force , $session );
if ( false !== $ret_e )
{
return ( $ret_e + $ret );
}
return false ;
}
return $ret ;
}
public function saveDebug ( $extended = true , $return = false , $undo = true )
{
$ret = array ();
$ret [ 'CORE_FIELDS' ] = parent :: saveDebug ( true , $undo );
if ( $extended && null !== $this -> _extended_model )
2010-05-02 18:41:20 +00:00
{
2010-05-05 15:05:32 +00:00
$ret [ 'EXTENDED_FIELDS' ] = $this -> _extended_model -> saveDebug ( true , $undo );
2010-04-28 15:44:46 +00:00
}
2010-05-05 15:05:32 +00:00
if ( $return ) return $ret ;
print_a ( $ret );
2010-04-28 15:44:46 +00:00
}
2010-05-05 15:05:32 +00:00
2010-04-28 15:44:46 +00:00
public function destroy ()
{
$this -> clearTarget ()
-> removeData ();
2010-05-14 18:45:51 +00:00
$this -> _class_list = array ();
$this -> _editor = null ;
$this -> _extended_structure = null ;
$this -> _user_config = null ;
2010-05-05 15:05:32 +00:00
if ( null !== $this -> _extended_model )
2010-04-28 15:44:46 +00:00
{
$this -> _extended_model -> destroy ();
2010-05-14 18:45:51 +00:00
$this -> _extended_model = null ;
2010-04-28 15:44:46 +00:00
}
2010-03-22 15:45:47 +00:00
}
}
2010-05-02 18:41:20 +00:00
// TODO - add some more useful methods, sc_* methods support
class e_system_user extends e_user_model
2010-03-22 15:45:47 +00:00
{
2010-05-02 18:41:20 +00:00
/**
* Constructor
2010-05-05 15:05:32 +00:00
*
2010-05-02 18:41:20 +00:00
* @ param array $user_data trusted data , loaded from DB
* @ return void
*/
public function __construct ( $user_data = array ())
{
2010-07-24 16:13:42 +00:00
parent :: __construct ( $user_data );
2010-05-28 13:24:25 +00:00
$this -> setEditor ( e107 :: getUser ());
2010-05-02 18:41:20 +00:00
}
2010-05-05 15:05:32 +00:00
/**
* Returns always false
* Even if user data belongs to the current user , Current User interface
* is not available
*
* @ return boolean
*/
2010-04-28 15:44:46 +00:00
final public function isCurrent ()
{
2010-05-02 18:41:20 +00:00
// check against current system user
2010-05-05 15:05:32 +00:00
//return ($this->getId() && $this->getId() == e107::getUser()->getId());
return false ;
2010-04-28 15:44:46 +00:00
}
2010-03-22 15:45:47 +00:00
}
2010-05-02 18:41:20 +00:00
/**
2010-05-13 15:47:31 +00:00
* Current system user
2010-05-02 18:41:20 +00:00
* @ author SecretR
*/
2010-03-22 15:45:47 +00:00
class e_user extends e_user_model
2010-05-05 15:05:32 +00:00
{
2010-05-13 15:47:31 +00:00
private $_session_data = null ;
private $_session_key = null ;
private $_session_type = null ;
private $_session_error = false ;
private $_parent_id = false ;
private $_parent_data = array ();
private $_parent_extmodel = null ;
private $_parent_extstruct = null ;
private $_parent_config = null ;
2010-05-02 18:41:20 +00:00
public function __construct ()
{
2010-05-13 15:47:31 +00:00
$this -> setSessionData () // retrieve data from current session
-> load () // load current user from DB
-> setEditor ( $this ); // reference to self
2010-05-02 18:41:20 +00:00
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
/**
* Yes , it ' s current user - return always true
* NOTE : it ' s not user check , use isUser () instead !
* @ return boolean
*/
2010-04-28 15:44:46 +00:00
final public function isCurrent ()
{
2010-05-02 18:41:20 +00:00
return true ;
}
2010-05-05 15:05:32 +00:00
2010-05-13 15:47:31 +00:00
/**
* Get parent user ID - present if main admin is browsing
* front - end logged in as another user account
*
* @ return integer or false if not present
*/
final public function getParentId ()
{
return $this -> _parent_id ;
}
/**
* User login
* @ param string $uname
* @ param string $upass_plain
* @ param boolean $uauto
* @ param string $uchallange
2010-05-14 18:45:51 +00:00
* @ param boolean $noredirect
2010-05-13 15:47:31 +00:00
* @ return boolean success
*/
2010-05-14 18:45:51 +00:00
final public function login ( $uname , $upass_plain , $uauto = false , $uchallange = false , $noredirect = true )
2010-05-02 18:41:20 +00:00
{
2010-05-13 15:47:31 +00:00
if ( $this -> isUser ()) return false ;
2011-09-14 11:30:58 +00:00
$userlogin = new userlogin ();
$userlogin -> login ( $uname , $upass_plain , $uauto , $uchallange , $noredirect );
2010-05-13 15:47:31 +00:00
$this -> setSessionData ( true )
-> setData ( $userlogin -> getUserData ());
2010-05-02 18:41:20 +00:00
return $this -> isUser ();
}
2010-05-05 15:05:32 +00:00
2010-05-14 18:45:51 +00:00
/**
* Login as another user account
* @ param integer $user_id
* @ return boolean success
*/
2010-05-13 15:47:31 +00:00
final public function loginAs ( $user_id )
{
// TODO - set session data required for loadAs()
2010-05-14 18:45:51 +00:00
if ( $this -> getParentId ()
|| ! $this -> isMainAdmin ()
|| empty ( $user_id )
|| $this -> getSessionDataAs ()
|| $user_id == $this -> getId ()
) return false ;
$key = $this -> _session_key . '_as' ;
if ( 'session' == $this -> _session_type )
{
$_SESSION [ $key ] = $user_id ;
}
elseif ( 'cookie' == $this -> _session_type )
{
$_COOKIE [ $key ] = $user_id ;
cookie ( $key , $user_id );
}
2010-05-17 14:13:50 +00:00
// TODO - lan
e107 :: getAdminLog () -> log_event ( 'Head Admin used Login As feature' , 'Head Admin [#' . $this -> getId () . '] ' . $this -> getName () . ' logged in user account #' . $user_id );
2010-05-14 18:45:51 +00:00
//$this->loadAs(); - shouldn't be called here - loginAs should be called in Admin area only, loadAs - front-end
return true ;
2010-05-13 15:47:31 +00:00
}
2010-05-02 18:41:20 +00:00
/**
2010-05-05 15:05:32 +00:00
*
2010-05-13 15:47:31 +00:00
* @ return e_user
2010-05-02 18:41:20 +00:00
*/
2010-05-13 15:47:31 +00:00
protected function _initConstants ()
2010-05-02 18:41:20 +00:00
{
//FIXME - BC - constants from init_session() should be defined here
2010-05-13 15:47:31 +00:00
// [SecretR] Not sure we should do this here, it's too restricting - constants can be
// defined once, we need the freedom to do it multiple times - e.g. load() executed in constructor than login(), loginAs() etc.
// called by a controller
// We should switch to e.g. isAdmin() instead of ADMIN constant check
return $this ;
2010-05-02 18:41:20 +00:00
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
/**
2010-05-13 15:47:31 +00:00
* Destroy cookie / session data , self destroy
* @ return e_user
2010-05-02 18:41:20 +00:00
*/
final public function logout ()
{
2010-05-13 15:47:31 +00:00
$this -> logoutAs ()
-> _destroySession ();
parent :: destroy ();
2010-10-27 11:31:18 +00:00
//if(session_id()) session_destroy();
e107 :: getSession () -> destroy ();
2010-05-13 15:47:31 +00:00
e107 :: setRegistry ( 'core/e107/current_user' , null );
return $this ;
}
/**
* Destroy cookie / session / model data for current user , resurrect parent user
* @ return e_user
*/
final public function logoutAs ()
{
if ( $this -> getParentId ())
2010-05-02 18:41:20 +00:00
{
2010-05-13 15:47:31 +00:00
// load parent user data
$this -> _extended_model = $this -> _parent_extmodel ;
$this -> _extended_structure = $this -> _parent_extstruct ;
$this -> _user_config = $this -> _parent_config ;
$this -> setData ( $this -> _parent_model -> getData ());
// cleanup
$this -> _parent_id = false ;
$this -> _parent_model = $this -> _parent_extstruct = $this -> _parent_extmodel = $this -> _parent_config = null ;
2010-05-02 18:41:20 +00:00
}
2010-05-14 18:45:51 +00:00
$this -> _destroyAsSession ();
2010-05-13 15:47:31 +00:00
return $this ;
2010-05-02 18:41:20 +00:00
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
/**
* TODO load user data by cookie / session data
* @ return e_user
*/
2010-05-13 15:47:31 +00:00
final public function load ( $force = false , $denyAs = false )
2010-05-02 18:41:20 +00:00
{
2010-05-13 15:47:31 +00:00
if ( ! $force && $this -> getId ()) return $this ;
2010-05-14 18:45:51 +00:00
if ( deftrue ( 'e_ADMIN_AREA' )) $denyAs = true ;
2010-05-13 15:47:31 +00:00
// always run cli as main admin
if ( e107 :: isCli ())
{
$this -> _load ( 1 , $force );
$this -> _initConstants ();
return $this ;
}
// We have active session
if ( null !== $this -> _session_data )
{
list ( $uid , $upw ) = explode ( '.' , $this -> _session_data );
// Bad cookie - destroy session
if ( empty ( $uid ) || ! is_numeric ( $uid ) || empty ( $upw ))
{
$this -> _destroyBadSession ();
$this -> _initConstants ();
return $this ;
}
$udata = $this -> _load ( $uid , $force );
// Bad cookie - destroy session
if ( empty ( $udata ))
{
$this -> _destroyBadSession ();
$this -> _initConstants ();
return $this ;
}
// we have a match
if ( md5 ( $udata [ 'user_password' ]) == $upw )
{
// set current user data
$this -> setData ( $udata );
// NEW - try 'logged in as' feature
if ( ! $denyAs ) $this -> loadAs ();
2010-05-15 17:33:11 +00:00
// update lastvisit field
$this -> updateVisit ();
// currently does nothing
2010-05-13 15:47:31 +00:00
$this -> _initConstants ();
return $this ;
}
$this -> _destroyBadSession ();
$this -> _initConstants ();
return $this ;
}
return $this ;
}
final public function loadAs ()
{
// FIXME - option to avoid it when browsing Admin area
2010-05-14 18:45:51 +00:00
$loginAs = $this -> getSessionDataAs ();
2010-05-13 15:47:31 +00:00
if ( ! $this -> getParentId () && false !== $loginAs && $loginAs !== $this -> getId () && $loginAs !== 1 && $this -> isMainAdmin ())
{
$uasdata = $this -> _load ( $loginAs );
if ( ! empty ( $uasdata ))
{
// backup parent user data to prevent further db queries
$this -> _parent_id = $this -> getId ();
2010-05-14 18:45:51 +00:00
$this -> _parent_model = new e_user_model ( $this -> getData ());
2010-05-13 15:47:31 +00:00
$this -> setData ( $uasdata );
// not allowed - revert back
if ( $this -> isMainAdmin ())
{
$this -> _parent_id = false ;
$this -> setData ( $this -> _parent_model -> getData ());
$this -> _parent_model = null ;
$this -> _destroyAsSession ();
}
else
{
$this -> _parent_extmodel = $this -> _extended_model ;
$this -> _parent_extstruct = $this -> _extended_structure ;
$this -> _user_config = $this -> _parent_config ;
$this -> _extended_model = $this -> _extended_structure = $this -> _user_config = null ;
}
}
}
else
{
$this -> _parent_id = false ;
$this -> _parent_model = null ;
$this -> _parent_extstruct = $this -> _parent_extmodel = null ;
}
2010-05-14 18:45:51 +00:00
return $this ;
2010-05-13 15:47:31 +00:00
}
2010-05-15 17:33:11 +00:00
/**
* Update user visit timestamp
* @ return void
*/
protected function updateVisit ()
{
// Don't update if main admin is logged in as current (non main admin) user
if ( ! $this -> getParentId ())
{
$sql = e107 :: getDb ();
$this -> set ( 'last_ip' , $this -> get ( 'user_ip' ));
2012-01-02 22:06:22 +00:00
$current_ip = e107 :: getIPHandler () -> getIP ( FALSE );
2010-05-15 17:33:11 +00:00
$update_ip = $this -> get ( 'user_ip' != $current_ip ? " , user_ip = ' " . $current_ip . " ' " : " " );
$this -> set ( 'user_ip' , $current_ip );
if ( $this -> get ( 'user_currentvisit' ) + 3600 < time () || ! $this -> get ( 'user_lastvisit' ))
{
$this -> set ( 'user_lastvisit' , ( integer ) $this -> get ( 'user_currentvisit' ));
$this -> set ( 'user_currentvisit' , time ());
$sql -> db_Update ( 'user' , " user_visits = user_visits + 1, user_lastvisit = " . $this -> get ( 'user_lastvisit' ) . " , user_currentvisit = " . $this -> get ( 'user_currentvisit' ) . " { $update_ip } WHERE user_id=' " . $this -> getId () . " ' " );
}
else
{
$this -> set ( 'user_currentvisit' , time ());
$sql -> db_Update ( 'user' , " user_currentvisit = " . $this -> get ( 'user_currentvisit' ) . " { $update_ip } WHERE user_id=' " . $this -> getId () . " ' " );
}
}
}
2010-05-13 15:47:31 +00:00
final protected function _destroySession ()
{
cookie ( $this -> _session_key , '' , ( time () - 2592000 ));
2010-10-27 11:31:18 +00:00
unset ( $_SESSION [ $this -> _session_key ]);
2010-05-13 15:47:31 +00:00
return $this ;
}
final protected function _destroyAsSession ()
{
$key = $this -> _session_key . '_as' ;
cookie ( $key , '' , ( time () - 2592000 ));
$_SESSION [ $key ] = '' ;
unset ( $_SESSION [ $key ]);
return $this ;
}
final protected function _destroyBadSession ()
{
$this -> _session_error = true ;
return $this -> _destroySession ();
}
2010-05-14 18:45:51 +00:00
final public function getSessionDataAs ()
2010-05-13 15:47:31 +00:00
{
$id = false ;
$key = $this -> _session_key . '_as' ;
if ( 'session' == $this -> _session_type && isset ( $_SESSION [ $key ]) && ! empty ( $_SESSION [ $key ]))
{
$id = $_SESSION [ $key ];
}
elseif ( 'cookie' == $this -> _session_type && isset ( $_COOKIE [ $key ]) && ! empty ( $_COOKIE [ $key ]))
{
$id = $_COOKIE [ $key ];
}
if ( ! empty ( $id ) && is_numeric ( $id )) return intval ( $id );
return false ;
}
final public function setSessionData ( $force = false )
{
if ( $force || null === $this -> _session_data )
{
2011-12-06 08:00:42 +00:00
$this -> _session_data = null ;
2010-05-13 15:47:31 +00:00
$this -> _session_key = e107 :: getPref ( 'cookie_name' , 'e107cookie' );
$this -> _session_type = e107 :: getPref ( 'user_tracking' , 'cookie' );
2010-10-26 07:41:20 +00:00
2010-05-13 15:47:31 +00:00
if ( 'session' == $this -> _session_type && isset ( $_SESSION [ $this -> _session_key ]) && ! empty ( $_SESSION [ $this -> _session_key ]))
{
$this -> _session_data = & $_SESSION [ $this -> _session_key ];
}
elseif ( 'cookie' == $this -> _session_type && isset ( $_COOKIE [ $this -> _session_key ]) && ! empty ( $_COOKIE [ $this -> _session_key ]))
{
$this -> _session_data = & $_COOKIE [ $this -> _session_key ];
}
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
return $this ;
}
2010-05-05 15:05:32 +00:00
2010-05-13 15:47:31 +00:00
public function hasSessionError ()
{
return $this -> _session_error ;
}
final protected function _load ( $user_id )
{
2010-05-28 13:24:25 +00:00
$qry = 'SELECT u.*, ue.* FROM #user AS u LEFT JOIN #user_extended as ue ON u.user_id=ue.user_extended_id WHERE user_id=' . intval ( $user_id );
if ( e107 :: getDb () -> db_Select_gen ( $qry ))
2010-05-13 15:47:31 +00:00
{
return e107 :: getDb () -> db_Fetch ();
}
return array ();
}
2010-05-02 18:41:20 +00:00
/**
* Not allowed
2010-05-05 15:05:32 +00:00
*
2010-05-02 18:41:20 +00:00
* @ return e_user_model
*/
final protected function setAsTarget ()
{
return $this ;
}
/**
* Not allowed
2010-05-05 15:05:32 +00:00
*
2010-05-02 18:41:20 +00:00
* @ return e_user_model
*/
final protected function clearTarget ()
{
return $this ;
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
public function destroy ()
{
// not allowed - see logout()
2010-04-28 15:44:46 +00:00
}
}
2010-05-05 15:05:32 +00:00
class e_user_extended_model extends e_front_model
2010-04-28 15:44:46 +00:00
{
2010-05-05 15:05:32 +00:00
/**
* Describes known model fields
* @ var array
*/
protected $_data_fields = array (
'user_extended_id' => 'integer' ,
'user_hidden_fields' => 'string' ,
);
2010-04-28 15:44:46 +00:00
/**
* @ see e_model
* @ var string
*/
protected $_db_table = 'user_extended' ;
/**
* @ see e_model
* @ var string
*/
protected $_field_id = 'user_extended_id' ;
/**
* @ see e_model
* @ var string
*/
protected $_message_stack = 'user' ;
2010-05-05 15:05:32 +00:00
2010-05-15 17:33:11 +00:00
/**
* User class as set in user Adminsitration
*
* @ var integer
*/
protected $_memberlist_access = null ;
2010-05-02 18:41:20 +00:00
/**
* @ var e_user_extended_structure_tree
*/
protected $_structure = null ;
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
/**
* User model , the owner of extended fields model
* @ var e_user_model
*/
protected $_user = null ;
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
/**
* Stores access classes and default value per custom field
* @ var array
*/
protected $_struct_index = array ();
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
/**
* Constructor
* @ param e_user_model $user_model
* @ return void
*/
public function __construct ( e_user_model $user_model )
{
2010-05-15 17:33:11 +00:00
$this -> _memberlist_access = e107 :: getPref ( 'memberlist_access' );
2010-05-02 18:41:20 +00:00
$this -> setUser ( $user_model )
2010-05-15 17:33:11 +00:00
-> load ();
2010-05-02 18:41:20 +00:00
}
2010-05-05 15:05:32 +00:00
2010-05-13 15:47:31 +00:00
/**
* Always return integer
*/
public function getId ()
{
return ( integer ) parent :: getId ();
}
2010-05-02 18:41:20 +00:00
/**
* Get user model
* @ return e_user_model
*/
public function getUser ()
{
return $this -> _user ;
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
/**
* Set User model
* @ param $user_model
* @ return e_user_extended_model
*/
public function setUser ( $user_model )
{
$this -> _user = $user_model ;
return $this ;
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
/**
* Get current user editor model
* @ return e_user_model
*/
public function getEditor ()
{
2010-05-15 17:33:11 +00:00
return $this -> getUser () -> getEditor ();
2010-05-02 18:41:20 +00:00
}
2010-05-05 15:05:32 +00:00
2010-05-17 15:51:42 +00:00
/**
* Bad but required ( BC ) method of retrieving all user data
* It ' s here to be used from get_user_data () core function .
* DON ' T USE IT unless you have VERY good reason to do it .
2010-05-28 13:24:25 +00:00
* TODO - revise this ! Merge it to getSystemData , getApplicableData
2010-05-17 15:51:42 +00:00
*
* @ return array
*/
public function getExtendedData ()
{
$ret = array ();
$fields = $this -> getExtendedStructure () -> getFieldTree ();
foreach ( $fields as $id => $field )
{
$value = $this -> getValue ( $field -> getValue ( 'name' ));
if ( null !== $value ) $ret [ $field -> getValue ( 'name' )] = $value ;
}
$ret [ 'user_extended_id' ] = $this -> getId ();
$ret [ 'user_hidden_fields' ] = $this -> get ( 'user_hidden_fields' );
return $ret ;
}
2010-04-28 15:44:46 +00:00
/**
2010-05-28 13:24:25 +00:00
* Get User extended field value . It performs all required read / applicable permission checks
* against current editor / user .
2010-05-02 18:41:20 +00:00
* Returns NULL when field / default value not found or not enough permissions
2010-05-13 15:47:31 +00:00
* @ param string $field
* @ param boolean $short if true , 'user_' prefix will be added to field name
2010-05-28 13:24:25 +00:00
* @ param boolean $raw doesn ' t retrieve db value when true ( no sql query )
2010-04-28 15:44:46 +00:00
* @ return mixed
*/
2010-05-14 18:45:51 +00:00
public function getValue ( $field , $short = true , $raw = false )
2010-04-28 15:44:46 +00:00
{
2010-05-13 15:47:31 +00:00
if ( $short ) $field = 'user_' . $field ;
2010-05-05 15:05:32 +00:00
if ( ! $this -> checkRead ( $field ))
return null ;
2010-05-14 18:45:51 +00:00
if ( ! $raw && vartrue ( $this -> _struct_index [ $field ][ 'db' ]))
{
return $this -> getDbValue ( $field );
}
2010-05-02 18:41:20 +00:00
return $this -> get ( $field , $this -> getDefault ( $field ));
2010-04-28 15:44:46 +00:00
}
/**
2010-05-28 13:24:25 +00:00
* Set User extended field value , only if current editor has write permissions and field
* is applicable for the current user .
2010-05-02 18:41:20 +00:00
* Note : Data is not sanitized !
2010-04-28 15:44:46 +00:00
* @ param string $field
* @ param mixed $value
2010-05-13 15:47:31 +00:00
* @ param boolean $short if true , 'user_' prefix will be added to field name
2010-05-02 18:41:20 +00:00
* @ return e_user_extended_model
2010-04-28 15:44:46 +00:00
*/
2010-05-13 15:47:31 +00:00
public function setValue ( $field , $value , $short = true )
2010-04-28 15:44:46 +00:00
{
2010-05-13 15:47:31 +00:00
if ( $short ) $field = 'user_' . $field ;
2010-05-05 15:05:32 +00:00
if ( ! $this -> checkWrite ( $field ))
return $this ;
2010-05-28 13:24:25 +00:00
2010-05-02 18:41:20 +00:00
$this -> set ( $field , $value , true );
return $this ;
}
2010-05-05 15:05:32 +00:00
2010-05-28 13:24:25 +00:00
/**
* Retrieve value of a field of type 'db' . It does sql request only once .
*
* @ param string $field field name
* @ return mixed db value
*/
2010-05-14 18:45:51 +00:00
protected function getDbValue ( $field )
{
if ( null !== $this -> _struct_index [ $field ][ 'db_value' ])
{
return $this -> _struct_index [ $field ][ 'db_value' ];
}
// retrieve db data
$value = $this -> get ( $field );
list ( $table , $field_id , $field_name , $field_order ) = explode ( ',' , $this -> _struct_index [ $field ][ 'db' ], 4 );
$this -> _struct_index [ $field ][ 'db_value' ] = $value ;
if ( $value && $table && $field_id && $field_name && e107 :: getDb () -> db_Select ( $table , $field_name , " { $field_id } =' { $value } ' " ))
{
$res = e107 :: getDb () -> db_Fetch ();
$this -> _struct_index [ $field ][ 'db_value' ] = $res [ $field_name ];
}
return $this -> _struct_index [ $field ][ 'db_value' ];
}
2010-05-28 13:24:25 +00:00
/**
* System getter . It doesn ' t perform any read / applicable permission checks
* against current editor / user .
* It ' s here to serve in your application logic .
*
* @ param string $field
* @ param boolean $short if true , 'user_' prefix will be added to field name
* @ param boolean $raw don ' t retrieve db value
* @ return mixed
*/
public function getSystem ( $field , $short = true , $raw = true )
{
if ( $short ) $field = 'user_' . $field ;
if ( ! $raw && vartrue ( $this -> _struct_index [ $field ][ 'db' ]))
{
return $this -> getDbValue ( $field );
}
return $this -> get ( $field , $this -> getDefault ( $field ));
}
/**
* System setter . It doesn ' t perform any write / applicable permission checks
* against current editor / user .
* It ' s here to serve in your application logic .
* NOTE : untrusted data should be provided via setPosted () method !
*
* @ param string $field
* @ param mixed $value
* @ param boolean $short if true , 'user_' prefix will be added to field name
* @ param boolean $strict if false no Applicable check will be made
* @ return e_user_model
*/
public function setSystem ( $field , $value , $short = true , $strict = true )
{
if ( $short ) $field = 'user_' . $field ;
$this -> set ( $field , $value , $strict );
return $this ;
}
2010-05-13 15:47:31 +00:00
public function getReadData ()
{
2010-05-28 13:24:25 +00:00
// TODO array allowed user profile page data (read mode)
2010-05-13 15:47:31 +00:00
}
public function getWriteData ()
{
2010-05-28 13:24:25 +00:00
// TODO array allowed user settings page data (edit mode)
2010-05-13 15:47:31 +00:00
}
2010-05-02 18:41:20 +00:00
/**
* Get default field value , defined by extended field structure
* Returns NULL if field / default value not found
* @ param string $field
* @ return mixed
*/
public function getDefault ( $field )
{
return varset ( $this -> _struct_index [ $field ][ 'default' ], null );
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
/**
* Check field read permissions against current editor
* @ param string $field
* @ return boolean
*/
public function checkRead ( $field )
{
2010-05-13 15:47:31 +00:00
$hidden = $this -> get ( 'user_hidden_fields' );
2010-05-28 13:24:25 +00:00
$editor = $this -> getEditor ();
2010-05-17 15:51:42 +00:00
if ( ! empty ( $hidden ) && $this -> getId () !== $editor -> getId () && strpos ( $hidden , '^' . $field . '^' ) !== false ) return false ;
2010-05-13 15:47:31 +00:00
2010-05-15 17:33:11 +00:00
return ( $this -> checkApplicable ( $field ) && $editor -> checkClass ( $this -> _memberlist_access ) && $editor -> checkClass ( varset ( $this -> _struct_index [ $field ][ 'read' ])));
2010-05-02 18:41:20 +00:00
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
/**
2010-05-13 15:47:31 +00:00
* Check field write permissions against current editor
2010-05-02 18:41:20 +00:00
* @ param string $field
* @ return boolean
*/
public function checkWrite ( $field )
{
2010-05-13 15:47:31 +00:00
if ( ! $this -> checkApplicable ( $field )) return false ;
$editor = $this -> getEditor ();
// Main admin checked later in checkClass() method
if ( $editor -> checkAdminPerms ( '4' ) && varset ( $this -> _struct_index [ $field ][ 'write' ]) != e_UC_NOBODY )
return true ;
return $editor -> checkClass ( varset ( $this -> _struct_index [ $field ][ 'write' ]));
2010-05-02 18:41:20 +00:00
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
/**
* Check field signup permissions
* @ param string $field
* @ return boolean
*/
public function checkSignup ( $field )
{
2010-05-13 15:47:31 +00:00
return $this -> getUser () -> checkClass ( varset ( $this -> _struct_index [ $field ][ 'signup' ]));
2010-05-02 18:41:20 +00:00
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
/**
2010-05-13 15:47:31 +00:00
* Check field applicable permissions against current user
2010-05-02 18:41:20 +00:00
* @ param string $field
* @ return boolean
*/
public function checkApplicable ( $field )
{
2010-05-17 15:51:42 +00:00
return $this -> getUser () -> checkClass ( varset ( $this -> _struct_index [ $field ][ 'apply' ]));
2010-05-02 18:41:20 +00:00
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
/**
* @ see e_model #load($id, $force)
* @ return e_user_extended_model
*/
public function load ( $force = false )
{
2010-05-05 15:05:32 +00:00
if ( $this -> getId () && ! $force )
return $this ;
2010-05-28 13:24:25 +00:00
$this -> _loadDataAndAccess ();
2010-05-02 18:41:20 +00:00
return $this ;
}
2010-05-05 15:05:32 +00:00
2010-05-28 13:24:25 +00:00
/**
* Check if given field name is present in extended user table structure
*
* @ param string $field
* @ param boolean $short
* @ return boolean
*/
public function isField ( $field , $short = true )
{
if ( $short ) $field = 'user_' . $field ;
return ( isset ( $this -> _struct_index [ $field ]) || in_array ( $field , array ( $this -> getFieldIdName (), 'user_hidden_fields' )));
}
2010-05-02 18:41:20 +00:00
/**
* Load extended fields permissions once ( performance )
* @ return e_user_extended_model
*/
2010-05-28 13:24:25 +00:00
protected function _loadDataAndAccess ()
2010-05-02 18:41:20 +00:00
{
$struct_tree = $this -> getExtendedStructure ();
2010-05-28 13:24:25 +00:00
$user = $this -> getUser ();
if ( $user && $struct_tree -> hasTree ())
2010-05-05 15:05:32 +00:00
{
2010-05-02 18:41:20 +00:00
// load structure dependencies
2010-05-28 13:24:25 +00:00
$ignore = array ( $this -> getFieldIdName (), 'user_hidden_fields' );
// set ignored values
foreach ( $ignore as $field_name )
{
$this -> set ( $field_name , $user -> get ( $field_name ));
}
2010-05-13 15:47:31 +00:00
2010-05-02 18:41:20 +00:00
$fields = $struct_tree -> getTree ();
2010-05-05 15:05:32 +00:00
foreach ( $fields as $id => $field )
2010-05-02 18:41:20 +00:00
{
2010-05-28 13:24:25 +00:00
$field_name = 'user_' . $field -> getValue ( 'name' );
$this -> set ( $field_name , $user -> get ( $field_name ));
2010-05-05 15:05:32 +00:00
if ( ! in_array ( $field -> getValue ( 'name' ), $ignore ))
2010-05-02 18:41:20 +00:00
{
2010-05-28 13:24:25 +00:00
$this -> _struct_index [ $field_name ] = array (
2010-05-14 18:45:51 +00:00
'db' => $field -> getValue ( 'type' ) == 4 ? $field -> getValue ( 'values' ) : '' ,
'db_value' => null , // used later for caching DB results
2010-05-05 15:05:32 +00:00
'read' => $field -> getValue ( 'read' ),
'write' => $field -> getValue ( 'write' ),
'signup' => $field -> getValue ( 'signup' ),
'apply' => $field -> getValue ( 'applicable' ),
'default' => $field -> getValue ( 'default' ),
2010-05-02 18:41:20 +00:00
);
}
}
}
2010-04-28 15:44:46 +00:00
return $this ;
}
2010-05-05 15:05:32 +00:00
/**
* Build manage rules for single field
* @ param $structure_model
* @ return e_user_extended_model
*/
protected function _buildManageField ( e_user_extended_structure_model $structure_model )
{
$ftype = $structure_model -> getValue ( 'type' ) == 6 ? 'integer' : 'string' ;
// 0- field control (html) attributes;1 - regex; 2 - validation error msg;
$parms = explode ( '^,^' , $structure_model -> getValue ( 'parms' ));
// validaton rules
$vtype = $parms [ 1 ] ? 'regex' : $ftype ;
$this -> setValidationRule ( $structure_model -> getValue ( 'name' ), array ( $vtype , $parms [ 1 ], $structure_model -> getValue ( 'text' ), $parms [ 2 ]), $structure_model -> getValue ( 'required' ));
// data type, required for sql query
$this -> _data_fields [ $structure_model -> getValue ( 'name' )] = $ftype ;
return $this ;
}
/**
* Build manage rules for single field
* @ param $structure_model
* @ return e_user_extended_model
*/
protected function _buildManageRules ()
{
$struct_tree = $this -> getExtendedStructure ();
if ( $this -> getId () && $struct_tree -> hasTree ())
{
// load structure dependencies TODO protected fields check as method
$ignore = array ( $this -> getFieldIdName (), 'user_hidden_fields' ); // TODO - user_hidden_fields? Old?
$fields = $struct_tree -> getTree ();
foreach ( $fields as $id => $field )
{
if ( ! in_array ( $field -> getValue ( 'name' ), $ignore ))
{
// build _data_type and rules
$this -> _buildManageField ( $field );
}
}
}
return $this ;
}
2010-04-28 15:44:46 +00:00
/**
* Get extended structure tree
2010-05-02 18:41:20 +00:00
* @ return e_user_extended_structure_tree
2010-04-28 15:44:46 +00:00
*/
public function getExtendedStructure ()
{
2010-05-05 15:05:32 +00:00
if ( null === $this -> _structure )
$this -> _structure = e107 :: getUserStructure ();
2010-05-02 18:41:20 +00:00
return $this -> _structure ;
2010-04-28 15:44:46 +00:00
}
2010-05-05 15:05:32 +00:00
2010-05-13 15:47:31 +00:00
/**
* Additional security while applying posted
* data to user extended model
* @ return e_user_extended_model
*/
public function mergePostedData ()
{
$posted = $this -> getPostedData ();
foreach ( $posted as $key => $value )
{
if ( ! $this -> checkWrite ( $key ))
{
$this -> removePosted ( $key );
}
}
parent :: mergePostedData ( true , true , true );
return $this ;
}
2010-05-05 15:05:32 +00:00
/**
* Build data types and rules on the fly and save
2010-05-13 15:47:31 +00:00
* @ see e_front_model :: save ()
2010-05-05 15:05:32 +00:00
*/
public function save ( $force = false , $session = false )
{
$this -> _buildManageRules ();
return parent :: save ( true , $force , $session );
}
2010-05-13 15:47:31 +00:00
/**
* Doesn ' t save anything actually ...
*/
2010-05-05 15:05:32 +00:00
public function saveDebug ( $retrun = false , $undo = true )
{
$this -> _buildManageRules ();
2010-05-13 15:47:31 +00:00
return parent :: saveDebug ( $return , $undo );
2010-05-05 15:05:32 +00:00
}
2010-04-28 15:44:46 +00:00
}
class e_user_extended_structure_model extends e_model
{
/**
* @ see e_model
* @ var string
*/
protected $_db_table = 'user_extended_struct' ;
2010-05-05 15:05:32 +00:00
2010-04-28 15:44:46 +00:00
/**
* @ see e_model
* @ var string
*/
protected $_field_id = 'user_extended_struct_id' ;
2010-05-05 15:05:32 +00:00
2010-04-28 15:44:46 +00:00
/**
* @ see e_model
* @ var string
*/
2010-05-02 18:41:20 +00:00
protected $_message_stack = 'user_struct' ;
2010-05-05 15:05:32 +00:00
2010-04-28 15:44:46 +00:00
/**
* Get User extended structure field value
*
* @ param string $field
* @ param string $default
* @ return mixed
*/
public function getValue ( $field , $default = '' )
{
2010-05-02 18:41:20 +00:00
$field = 'user_extended_struct_' . $field ;
2010-04-28 15:44:46 +00:00
return $this -> get ( $field , $default );
}
/**
* Set User extended structure field value
2010-05-05 15:05:32 +00:00
*
2010-04-28 15:44:46 +00:00
* @ param string $field
* @ param mixed $value
* @ return e_user_model
*/
public function setValue ( $field , $value )
{
2010-05-02 18:41:20 +00:00
$field = 'user_extended_struct_' . $field ;
2010-04-28 15:44:46 +00:00
$this -> set ( $field , $value , false );
return $this ;
}
2010-05-05 15:05:32 +00:00
2010-05-14 18:45:51 +00:00
public function isCategory ()
{
return ( $this -> getValue ( 'type' ) ? false : true );
}
public function getCategoryId ()
{
return $this -> getValue ( 'parent' );
}
public function getLabel ()
{
$label = $this -> isCategory () ? $this -> getValue ( 'name' ) : $this -> getValue ( 'text' );
return defset ( $label , $label );
}
2010-04-28 15:44:46 +00:00
/**
* Loading of single structure row not allowed for front model
*/
public function load ()
{
return $this ;
}
}
2010-03-22 15:45:47 +00:00
2010-05-02 18:41:20 +00:00
class e_user_extended_structure_tree extends e_tree_model
2010-04-28 15:44:46 +00:00
{
/**
* @ see e_model
* @ var string
*/
protected $_db_table = 'user_extended_struct' ;
2010-05-05 15:05:32 +00:00
2010-04-28 15:44:46 +00:00
/**
* @ see e_model
* @ var string
*/
protected $_field_id = 'user_extended_struct_id' ;
2010-05-05 15:05:32 +00:00
2010-04-28 15:44:46 +00:00
/**
* @ see e_model
* @ var string
*/
protected $_message_stack = 'user' ;
2010-05-05 15:05:32 +00:00
2010-04-28 15:44:46 +00:00
/**
* @ var string
*/
2010-05-02 18:41:20 +00:00
protected $_cache_string = 'nomd5_user_extended_struct' ;
2010-05-05 15:05:32 +00:00
2010-04-28 15:44:46 +00:00
/**
2010-05-02 18:41:20 +00:00
* Force system cache ( cache used even if disabled by site admin )
2010-04-28 15:44:46 +00:00
* @ var boolen
*/
protected $_cache_force = true ;
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
/**
2010-05-14 18:45:51 +00:00
* Index for speed up retrieving by name routine
* @ var array
*/
protected $_name_index = array ();
/**
* Category Index - numerical array of id ' s
* @ var array
*/
protected $_category_index = array ();
/**
* Items by category list
* @ var array
2010-05-02 18:41:20 +00:00
*/
2010-05-14 18:45:51 +00:00
protected $_parent_index = array ();
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
/**
* Constructor - auto - load
* @ return void
*/
public function __construct ()
{
$this -> load ();
}
2010-05-05 15:05:32 +00:00
2010-05-14 18:45:51 +00:00
/**
* @ param string $name name field value
* @ return e_user_extended_structure_model
*/
2010-05-02 18:41:20 +00:00
public function getNodeByName ( $name )
{
2010-05-05 15:05:32 +00:00
if ( $this -> isNodeName ( $name ))
2010-05-02 18:41:20 +00:00
{
return $this -> getNode ( $this -> getNodeId ( $name ));
}
return null ;
}
2010-05-05 15:05:32 +00:00
2010-05-14 18:45:51 +00:00
/**
* Check if node exists by its name field value
* @ param string $name
* @ return boolean
*/
2010-05-02 18:41:20 +00:00
public function isNodeName ( $name )
{
return ( isset ( $this -> _name_index [ $name ]) && $this -> isNode ( $this -> _name_index [ $name ]));
}
2010-05-05 15:05:32 +00:00
2010-05-14 18:45:51 +00:00
/**
* Get node ID by node name field
* @ param string $name
* @ return integer
*/
2010-05-02 18:41:20 +00:00
public function getNodeId ( $name )
{
2010-05-14 18:45:51 +00:00
return ( isset ( $this -> _name_index [ $name ]) ? $this -> _name_index [ $name ] : null );
}
/**
* Get collection of nodes of type category
* @ return array
*/
public function getCategoryTree ()
{
return $this -> _array_intersect_key ( $this -> getTree (), array_combine ( $this -> _category_index , $this -> _category_index ));
}
2010-05-17 15:51:42 +00:00
/**
* Get collection of nodes of type field
* @ return array
*/
public function getFieldTree ()
{
return array_diff_key ( $this -> getTree (), array_combine ( $this -> _category_index , $this -> _category_index ));
}
2010-05-14 18:45:51 +00:00
/**
* Get collection of nodes assigned to a specific category
* @ param integer $category_id
* @ return array
*/
public function getTreeByCategory ( $category_id )
{
if ( ! isset ( $this -> _parent_index [ $category_id ]) || empty ( $this -> _parent_index [ $category_id ])) return array ();
return $this -> _array_intersect_key ( $this -> getTree (), array_combine ( $this -> _parent_index [ $category_id ], $this -> _parent_index [ $category_id ]));
2010-05-02 18:41:20 +00:00
}
2010-05-05 15:05:32 +00:00
2010-04-28 15:44:46 +00:00
/**
* Load tree data
2010-05-05 15:05:32 +00:00
*
2010-05-02 18:41:20 +00:00
* @ param boolean $force
2010-04-28 15:44:46 +00:00
*/
public function load ( $force = false )
{
$this -> setParam ( 'nocount' , true )
2010-05-14 18:45:51 +00:00
-> setParam ( 'model_class' , 'e_user_extended_structure_model' )
-> setParam ( 'db_order' , 'user_extended_struct_order ASC' );
2010-04-28 15:44:46 +00:00
parent :: load ( $force );
2010-05-17 15:51:42 +00:00
2010-04-28 15:44:46 +00:00
return $this ;
}
2010-05-05 15:05:32 +00:00
2010-05-02 18:41:20 +00:00
/**
2010-05-14 18:45:51 +00:00
* Build all indexes on load
* ( New ) This method is auto - triggered by core load () method
2010-05-02 18:41:20 +00:00
* @ param e_user_extended_structure_model $model
*/
protected function _onLoad ( $model )
{
2010-05-14 18:45:51 +00:00
if ( $model -> isCategory ())
{
$this -> _category_index [] = $model -> getId ();
}
else
{
$this -> _name_index [ 'user_' . $model -> getValue ( 'name' )] = $model -> getId ();
$this -> _parent_index [ $model -> getCategoryId ()][] = $model -> getId ();
}
2010-05-02 18:41:20 +00:00
return $this ;
}
2010-05-14 18:45:51 +00:00
/**
* Compatibility - array_intersect_key () available since PHP 5.1
*
* @ see http :// php . net / manual / en / function . array - intersect - key . php
* @ param array $array1
* @ param array $array2
* @ return array
*/
protected function _array_intersect_key ( $array1 , $array2 )
{
if ( function_exists ( 'array_intersect_key' )) return array_intersect_key ( $array1 , $array2 );
$ret = array ();
foreach ( $array1 as $k => $v )
{
if ( isset ( $array2 [ $k ])) $ret [ $k ] = $v ;
}
return $ret ;
}
2010-05-05 15:05:32 +00:00
}
2010-05-13 15:47:31 +00:00
2010-05-14 18:45:51 +00:00
class e_user_pref extends e_front_model
2010-05-13 15:47:31 +00:00
{
/**
* @ var e_user_model
*/
protected $_user ;
/**
* Constructor
* @ param e_user_model $user_model
* @ return void
*/
public function __construct ( e_user_model $user_model )
{
$this -> _user = $user_model ;
$this -> load ();
}
/**
* Load data from user preferences string
* @ param boolean $force
* @ return e_user_pref
*/
public function load ( $force = false )
{
if ( $force || ! $this -> hasData ())
{
$data = $this -> _user -> get ( 'user_prefs' , '' );
if ( ! empty ( $data ))
{
2010-05-14 18:45:51 +00:00
// BC
$data = substr ( $data , 0 , 5 ) == " array " ? e107 :: getArrayStorage () -> ReadArray ( $data ) : unserialize ( $data );
2010-05-13 15:47:31 +00:00
if ( ! $data ) $data = array ();
}
else $data = array ();
$this -> setData ( $data );
}
return $this ;
}
/**
* Apply current data to user data
* @ return e_user_pref
*/
public function apply ()
{
$this -> _user -> set ( 'user_prefs' , $this -> toString ( true ));
return $this ;
}
/**
* Save and apply user preferences
2010-05-15 17:33:11 +00:00
* @ param boolean $from_post
* @ param boolean $force
2010-05-13 15:47:31 +00:00
* @ return boolean success
*/
2010-05-15 17:33:11 +00:00
public function save ( $from_post = false , $force = false )
2010-05-13 15:47:31 +00:00
{
if ( $this -> _user -> getId ())
{
2010-05-14 18:45:51 +00:00
if ( $from_post )
{
$this -> mergePostedData ( false , true , false );
}
2010-05-15 17:33:11 +00:00
if ( $force || $this -> dataHasChanged ())
{
$data = $this -> toString ( true );
$this -> apply ();
return ( e107 :: getDb ( 'user_prefs' ) -> db_Update ( 'user' , " user_prefs=' { $data } ' WHERE user_id= " . $this -> _user -> getId ()) ? true : false );
}
return 0 ;
2010-05-13 15:47:31 +00:00
}
return false ;
}
/**
* Remove & apply user prefeferences , optionally - save to DB
* @ return boolean success
*/
public function delete ( $save = false )
{
$this -> removeData () -> apply ();
if ( $save ) return $this -> save ();
return true ;
}
}