2010-03-22 15:45:47 +00:00
|
|
|
<?php
|
|
|
|
/*
|
|
|
|
* e107 website system
|
|
|
|
*
|
|
|
|
* Copyright (C) 2008-2010 e107 Inc (e107.org)
|
|
|
|
* 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
|
|
|
|
* @category user
|
|
|
|
* @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-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-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-02 18:41:20 +00:00
|
|
|
final protected function _setClassList($uid = '')
|
|
|
|
{
|
|
|
|
$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-15 17:33:11 +00:00
|
|
|
$this->_class_list = explode(',', $this->get('user_class'));
|
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-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
|
|
|
|
|
|
|
/**
|
|
|
|
* Get User value
|
|
|
|
*
|
|
|
|
* @param string$field
|
|
|
|
* @param string $default
|
2010-05-13 15:47:31 +00:00
|
|
|
* @param boolean $short if true, 'user_' prefix will be added to field name
|
2010-03-22 15:45:47 +00:00
|
|
|
* @return mixed
|
|
|
|
*/
|
2010-05-13 15:47:31 +00:00
|
|
|
public function getValue($field, $default = '', $short = true)
|
2010-03-22 15:45:47 +00:00
|
|
|
{
|
2010-05-13 15:47:31 +00:00
|
|
|
if($short) $field = 'user_'.$field;
|
2010-03-22 15:45:47 +00:00
|
|
|
return $this->get($field, $default);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2010-05-13 15:47:31 +00:00
|
|
|
* Set User value - only when writable
|
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-03-22 15:45:47 +00:00
|
|
|
* @return e_user_model
|
|
|
|
*/
|
2010-05-13 15:47:31 +00:00
|
|
|
public function setValue($field, $value, $short = true)
|
2010-03-22 15:45:47 +00:00
|
|
|
{
|
2010-05-13 15:47:31 +00:00
|
|
|
if($short) $field = 'user_'.$field;
|
|
|
|
if($this->isWritable($field)) $this->set($field, $value, true);
|
|
|
|
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 value
|
|
|
|
*
|
|
|
|
* @param string$field
|
2010-05-14 18:45:51 +00:00
|
|
|
* @param boolean $short if true, 'user_' prefix will be added to field name
|
2010-04-28 15:44:46 +00:00
|
|
|
* @return mixed
|
|
|
|
*/
|
2010-05-14 18:45:51 +00:00
|
|
|
public function getExtended($field, $short = true)
|
2010-04-28 15:44:46 +00:00
|
|
|
{
|
2010-05-14 18:45:51 +00:00
|
|
|
return $this->getExtendedModel()->getValue($field, $short);
|
2010-04-28 15:44:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set User extended value
|
2010-05-05 15:05:32 +00:00
|
|
|
*
|
2010-04-28 15:44:46 +00:00
|
|
|
* @param string $field
|
|
|
|
* @param mixed $value
|
2010-05-14 18:45:51 +00:00
|
|
|
* @param boolean $short if true, 'user_' prefix will be added to field name
|
2010-04-28 15:44:46 +00:00
|
|
|
* @return e_user_model
|
|
|
|
*/
|
2010-05-14 18:45:51 +00:00
|
|
|
public function setExtended($field, $value, $short = true)
|
2010-04-28 15:44:46 +00:00
|
|
|
{
|
2010-05-14 18:45:51 +00:00
|
|
|
$this->getExtendedModel()->setValue($field, $value, $short);
|
2010-04-28 15:44:46 +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)
|
|
|
|
{
|
|
|
|
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-05-05 15:05:32 +00:00
|
|
|
if ($user_data)
|
2010-05-02 18:41:20 +00:00
|
|
|
{
|
|
|
|
$this->_data = $user_data;
|
|
|
|
$this->setEditor(e107::getUser());
|
|
|
|
}
|
|
|
|
}
|
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;
|
|
|
|
|
2010-05-14 18:45:51 +00:00
|
|
|
$userlogin = new userlogin($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);
|
|
|
|
}
|
|
|
|
//$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();
|
|
|
|
if(session_id()) session_destroy();
|
|
|
|
|
|
|
|
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'));
|
|
|
|
$current_ip = e107::getInstance()->getip();
|
|
|
|
$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));
|
|
|
|
$_SESSION[$this->_session_key] = '';
|
|
|
|
|
|
|
|
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)
|
|
|
|
{
|
|
|
|
$this->_session_key = e107::getPref('cookie_name', 'e107cookie');
|
|
|
|
$this->_session_type = e107::getPref('user_tracking', 'cookie');
|
|
|
|
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)
|
|
|
|
{
|
|
|
|
if(e107::getDb()->db_Select('user', '*', 'user_id='.intval($user_id)))
|
|
|
|
{
|
|
|
|
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-04-28 15:44:46 +00:00
|
|
|
/**
|
|
|
|
* Get User extended field value
|
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-14 18:45:51 +00:00
|
|
|
* @param boolean $raw don't retrieve db value
|
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-02 18:41:20 +00:00
|
|
|
* Set User extended field value, only if current editor has write permissions
|
|
|
|
* 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-02 18:41:20 +00:00
|
|
|
$this->set($field, $value, true);
|
|
|
|
return $this;
|
|
|
|
}
|
2010-05-05 15:05:32 +00:00
|
|
|
|
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-13 15:47:31 +00:00
|
|
|
public function getReadData()
|
|
|
|
{
|
|
|
|
// TODO array allowed profile page data (read mode)
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getWriteData()
|
|
|
|
{
|
|
|
|
// TODO array allowed settings page data (edit mode)
|
|
|
|
}
|
|
|
|
|
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-15 17:33:11 +00:00
|
|
|
$editor = $this->getEditor();
|
|
|
|
if($this->getId() !== $editor->getId() && !empty($hidden) && 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-13 15:47:31 +00:00
|
|
|
return $this->getUser()->checkClass(varset($this->_struct_index[$field]['applicable']));
|
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-02 18:41:20 +00:00
|
|
|
parent::load($this->getUser()->getId(), $force);
|
|
|
|
$this->_loadAccess();
|
|
|
|
return $this;
|
|
|
|
}
|
2010-05-05 15:05:32 +00:00
|
|
|
|
2010-05-02 18:41:20 +00:00
|
|
|
/**
|
|
|
|
* Load extended fields permissions once (performance)
|
|
|
|
* @return e_user_extended_model
|
|
|
|
*/
|
|
|
|
protected function _loadAccess()
|
|
|
|
{
|
|
|
|
$struct_tree = $this->getExtendedStructure();
|
2010-05-05 15:05:32 +00:00
|
|
|
if (/*$this->getId() && */$struct_tree->hasTree())
|
|
|
|
{
|
2010-05-02 18:41:20 +00:00
|
|
|
// load structure dependencies
|
|
|
|
$ignore = array($this->getFieldIdName(), 'user_hidden_fields'); // TODO - user_hidden_fields? Old?
|
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-05 15:05:32 +00:00
|
|
|
if (!in_array($field->getValue('name'), $ignore))
|
2010-05-02 18:41:20 +00:00
|
|
|
{
|
|
|
|
$this->_struct_index['user_'.$field->getValue('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));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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-14 18:45:51 +00:00
|
|
|
print_a($this->_category_index);
|
|
|
|
print_a($this->_parent_index);
|
|
|
|
print_a($this->_name_index);
|
|
|
|
print_a($this->getTreeByCategory(4));
|
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;
|
|
|
|
}
|
|
|
|
}
|