<?php
/**
* СодеÑÐ¶Ð¸Ñ ÐºÐ»Ð°ÑÑ User
*
* @package energine
* @subpackage core
* @author dr.Pavka
* @copyright ColoCall 2006
* @version $Id: User.class.php,v 1.5 2007/12/17 14:16:03 pavka Exp $
*/
//require_once('core/framework/DBWorker.class.php');
//require_once('core/framework/UserGroup.class.php');
/**
* ÐлаÑÑ Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¿Ð¾Ð»ÑзоваÑелем
* ÐозвÑаÑÐ°ÐµÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ полÑзоваÑеле, ÑоÑ
ÑанÑÐµÑ Ð´Ð°Ð½Ð½Ñе
*
* @package energine
* @subpackage core
*/
class User extends DBWorker {
/**
* ÐÐ¼Ñ ÑаблиÑÑ Ð¿Ð¾Ð»ÑзоваÑелей
*
*/
const USER_TABLE_NAME = 'user_users';
/**
* ÐÐ¼Ñ ÑаблиÑÑ Ð³ÑÑпп
*
*/
const GROUP_TABLE_NAME = 'user_user_groups';
/**
* ÐденÑиÑикаÑÐ¾Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ
*
* @var int
* @access private
*/
private $id = false;
/**
* ÐбÑÐµÐºÑ Ð¿Ð¾ ÑабоÑе Ñ Ð¿Ð¾Ð»ÑзоваÑелÑми
*
* @var UserGroup
* @access protected
*/
protected $userGroup;
/**
* ÐнÑоÑмаÑÐ¸Ñ Ð¾ полÑзоваÑеле
*
* @var array
* @access private
*/
private $info = array();
/**
* ÐонÑÑÑÑкÑÐ¾Ñ ÐºÐ»Ð°ÑÑа
*
* @param int иденÑиÑикаÑÐ¾Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ
* @return void
*/
public function __construct($id = false) {
parent::__construct();
$this->id = $id;
$this->userGroup = UserGroup::getInstance();
//ÐÑли полÑзоваÑÐµÐ»Ñ ÑÑÑеÑÑвÑÐµÑ - загÑÑжаем его инÑоÑмаÑиÑ
if ($this->id) {
$this->loadInfo($this->id);
}
}
/**
* ÐагÑÑзка инÑоÑмаÑии из ÐÐ
*
* @param int иденÑиÑикаÑÐ¾Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ
* @return void
* @access protected
*/
protected function loadInfo($UID) {
$result = $this->dbh->select(self::USER_TABLE_NAME, true, array('u_id' => $UID));
if (is_array($result) && !empty($result)) {
$this->id = $UID;
$result[0]['u_password'] = true;
$this->info = $result[0];
}
}
/**
* ÐозвÑаÑÐ°ÐµÑ Ð¿ÐµÑеÑÐµÐ½Ñ Ð³ÑÑпп в коÑоÑÑе вÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ
*
* @return mixed
* @access public
*/
public function getGroups() {
$result = array();
$result = $this->userGroup->getUserGroups($this->id);
return $result;
}
/**
* ÐозвÑаÑÐ°ÐµÑ Ð¸Ð´ÐµÐ½ÑÑикаÑÐ¾Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ
*
* @return mixed
* @access public
*/
public function getID() {
return $this->id;
}
/**
* ÐозвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение полÑ
*
* @return mixed
* @access public
*/
public function getValue($fieldName) {
$result = false;
if (isset($this->info[$fieldName])) {
$result = $this->info[$fieldName];
}
return $result;
}
/**
* ÐозвÑаÑÐ°ÐµÑ Ð¿ÐµÑеÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ¹
*
* @return array
* @access public
*/
public function getFields() {
$result = $this->dbh->getColumnsInfo(self::USER_TABLE_NAME);
return $result;
}
/**
* Создание нового полÑзоваÑелÑ
*
* @param array
* @return void
* @access public
*/
public function create($data) {
//пÑовеÑÑем имеÑÑÑÑ Ð»Ð¸ вÑе необÑ
одимÑе знаÑениÑ
$tableInfo = $this->dbh->getColumnsInfo(self::USER_TABLE_NAME);
$necessaryFields = $uniqueFields = array();
foreach ($tableInfo as $columnName => $columnInfo) {
//оÑбиÑаем вÑе Ð¿Ð¾Ð»Ñ !nullable, не PRI, и без деÑолÑного знаÑениÑ
if (!$columnInfo['nullable'] && $columnInfo['index'] != DBA::PRIMARY_INDEX && !$columnInfo['default']) {
array_push($necessaryFields, $columnName);
}
//ÐÑбиÑаем вÑе ÑникалÑнÑе полÑ
if ($columnInfo['index'] == DBA::UNIQUE_INDEX) {
array_push($uniqueFields, $columnName);
}
}
//еÑли пеÑеÑеÑение ÑпиÑка необÑ
одимÑÑ
полей и ÑпиÑка полей даннÑÑ
не пÑÑÑое - знаÑÐ¸Ñ Ð½ÐµÐ´Ð¾ÑÑаÑоÑно даннÑÑ
Ð´Ð»Ñ ÑоÑ
ÑанениÑ
if ($undefinedFields = array_diff($necessaryFields, array_keys($data))) {
throw new SystemException('ERR_INSUFFICIENT_DATA', SystemException::ERR_WARNING, $undefinedFields);
}
//пÑовеÑÑем ÑвлÑÑÑÑÑ Ð»Ð¸ введеннÑе Ð¿Ð¾Ð»Ñ ÑникалÑнÑми
if (!empty($uniqueFields)) {
$condition = array();
foreach ($uniqueFields as $fieldname) {
$condition[] = $fieldname.' = "'.$data[$fieldname].'"';
}
$condition = implode(' OR ', $condition);
if (simplifyDBResult($this->dbh->select(self::USER_TABLE_NAME, 'COUNT(u_id) as num', $condition), 'num', true)>0) {
throw new SystemException('ERR_NOT_UNIQUE_DATA', SystemException::ERR_WARNING);
}
}
$this->info = $data;
//$this->info['u_password'] = $data['u_password'];
$data['u_password'] = sha1($data['u_password']);
$this->id = $this->dbh->modify(QAL::INSERT, self::USER_TABLE_NAME , $data);
$this->setGroups(array($this->userGroup->getDefaultUserGroup()));
}
/**
* Ðбновление даннÑÑ
о полÑзоваÑеле
*
* @param array
* @return boolean
* @access public
*/
public function update($data){
$result = false;
if ($this->getID()) {
$result = $this->dbh->modify(QAL::UPDATE, self::USER_TABLE_NAME , $data, array('u_id'=>$this->getID()));
}
return $result;
}
/**
* УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¿ÐµÑеÑÐµÐ½Ñ Ð³ÑÑпп в коÑоÑÑе бÑÐ´ÐµÑ Ð²Ñ
одиÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ
*
* @param array
* @return void
* @access public
*/
public function setGroups($groups) {
//УÑÑанавливаÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑолÑко Ñогда, когда полÑзоваÑÐµÐ»Ñ Ñоздан
if ($this->getID()) {
//$this->dbh->beginTransaction();
try {
$this->dbh->modify(QAL::DELETE, self::GROUP_TABLE_NAME, null, array('u_id'=>$this->getID()));
foreach ($groups as $groupID) {
$this->dbh->modify(QAL::INSERT, self::GROUP_TABLE_NAME, array('u_id'=>$this->getID(), 'group_id'=>$groupID));
}
//$this->dbh->commit();
}
catch (SystemException $e) {
//$this->dbh->rollback();
//пеÑедаем иÑклÑÑение далÑÑе
throw new SystemException($e->getMessage(), $e->getCode(), $e->getCustomMessage());
}
}
}
/**
* ÐенеÑиÑÑÐµÑ Ð¿Ð°ÑÐ¾Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ Ð´Ð»Ð¸Ð½Ñ Ð¸Ð· ÑлÑÑайнÑÑ
бÑквенно-ÑиÑÑовÑÑ
Ñимволов.
*
* @param int $length
* @return string
* @access public
* @static
*/
public static function generatePassword($length = 8) {
$chars = '0123456789abcdefghjiklmnopqrstuvwxyzABCDEFGHJIKLMNOPQRSTUVWXYZ';
$password = '';
$max = strlen($chars) - 1; // $max = count($chars) - 1;
for ($i = 0; $i < $length; $i++) {
$password .= $chars[mt_rand(0, $max)];
}
return $password;
}
}