westdc-zf1/application/module/Users/Account.php

390 lines
10 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace Users;
use \Helpers\View as view;
use \Helpers\dbh as dbh;
use \Users\Member;
use \Mail\Mail;
use \Users\Listener\AccountListener;
use \Users\Listener\EditListener;
use \Users\Listener\PwdListener;
class Account extends \Zend_Controller_Plugin_Abstract
{
public $memberTable = "users";
public $FieldIndex = "id";
public $FieldUsername = "username";
public $FieldPasword = "password";
public $FieldLastlogin = "ts_last_login";
public $FieldEmail = "email";
public $FieldLastloginIp = "last_login_ip";
public $GravatarEmailField = "gravatar_email";
public $FieldRealname = "realname";
public $RoleMember = "member";
public $getPwdEmailTemplate = "users-changepassword-en"; //找回密码的邮件模板名称
public $PwdChangedEmailTemplate = "users-password-changed-en"; //密码修改后的邮件模板
private $db;
protected $events = NULL; //事件
private $config;
/*
需要挂载的事件分别放在不同的listener中将各种操作进行模块化细分
*/
function __construct($initializingListener = TRUE,$db = NULL)
{
if(empty($db))
{
$this->db = \Zend_Registry::get('db');
}else{
$this->db = $db;
}
$this->config = \Zend_Registry::get('config');
if($initializingListener === TRUE)
{
$this->loadListener();
}
}
public function loadListener()
{
//主要操作账号注册登录设置session等
$AccountListener = new AccountListener();
@$this->events()->attachAggregate($AccountListener);
//账户编辑
$EditListener = new EditListener();
@$this->events()->attachAggregate($EditListener);
//账户安全性(找回密码)
$PwdListener = new PwdListener();
@$this->events()->attachAggregate($PwdListener);
}
public function events(\Zend_EventManager_EventCollection $events = NULL)
{
if ($events !== NULL) {
$this->events = $events;
} elseif ($this->events === NULL) {
$this->events = new \Zend_EventManager_EventManager(__CLASS__);
}
return $this->events;
}
//获取账号信息,数组
public function getAccountInfo($id = 0)
{
if($id == 0)
{
$id = view::User('id');
}
$sql = "SELECT * FROM {$this->memberTable} WHERE id=$id";
$rs = $this->db->query($sql);
return $rs->fetch();
}
//注册
public function register($data)
{
$params = compact('data');
$results = $this->events()->trigger('register.checkParam', $this, $params);
$cache_data = $results->bottom();
if($cache_data !== true)
{
if(!is_array($cache_data))
{
return array('error'=>$cache_data);
}else{
return $cache_data;
}
}
$results = $this->events()->trigger('register.checkUser', $this, $params);
$cache_data = $results->bottom();
if($cache_data !== true)
{
if(!is_array($cache_data))
{
return array('error'=>$cache_data);
}else{
return $cache_data;
}
}
$loginData = array(
'username'=>$data['username'],
'password'=>$data['password']
);
$data['password'] = md5($data['password']);
$data['usertype'] = "member";
unset($data['confirm_password']);
$dbh = new dbh();
$id = $dbh->insert($this->memberTable,$data,true);
if(!empty($id) && is_numeric($id))
{
$this->storeLogin($loginData);
$mb = new Member();
$mb->putcookie($data[$this->FieldUsername],$data[$this->FieldPasword]); //username, md5(password)
$params = compact('data','id');
$results = $this->events()->trigger('register.success', $this, $params);
return array("success" => 1);
}else{
if($id === false)
{
return array('error'=>'A error occurred,try later');
}else{
return array('error'=>'A error occurred,try later');
}
}
}//register
//登陆
public function login($data)
{
$results = $this->events()->trigger('login.checkParam', $this, compact('data'));
$cache_data = $results->bottom();
if($cache_data !== true)
{
if(!is_array($cache_data))
{
return array('error'=>$cache_data);
}else{
return $cache_data;
}
}
$state = $this->storeLogin($data);
$mb = new Member();
$mb->putcookie($data[$this->FieldUsername],md5($data[$this->FieldPasword]));
return $state;
}//login
//storeLogin
//将登录信息保存在session和cookie中
public function storeLogin($data,$md5verify = true)
{
$auth = \Zend_Auth::getInstance();
$authAdapter = new \Zend_Auth_Adapter_DbTable($this->db);
$authAdapter->setTableName($this->memberTable)
->setIdentityColumn($this->FieldUsername)
->setCredentialColumn($this->FieldPasword);
if($data[$this->FieldPasword] === 0)
{
$password = "0";
}else{
if($md5verify == false)
{
$password = $data[$this->FieldPasword];
}else{
$password = md5($data[$this->FieldPasword]);
}
}
$authAdapter->setIdentity($data[$this->FieldUsername])->setCredential($password);
$result = $auth->authenticate($authAdapter);
if ($result->isValid()) {
$user = $authAdapter->getResultRowObject(null,$this->FieldPasword);
$email = $user->email;
$results = $this->events()->trigger('login.success.createAvatar', $this, compact('email'));
$user->avatar = $results->bottom();
$auth->getStorage()->write($user);
$id = $user->id;
@$results = $this->events()->trigger('login.success.updateStatus', $this, compact('id'));
return array('success'=>1);
}else{
return array("error"=>"Wrong information with in your private data");
}
return array('error'=>'A error occurred');
}
//注册信息参数
public function getRegisterParam(\Zend_Controller_Request_Abstract $request = NULL)
{
if(empty($request))
{
$request = new \Zend_Controller_Request_Http();
}
$data = array(
'username'=>trim($request->getParam('username')),
'password'=>trim($request->getParam('password')),
'confirm_password'=>trim($request->getParam('confirm_password')),
'email' => trim($request->getParam('email')),
'realname' => trim($request->getParam('realname')),
'phone' => trim($request->getParam('phone')),
'unit' => trim($request->getParam('unit')),
'address' => trim($request->getParam('address')),
'project' => trim($request->getParam('project')),
'project_id' => trim($request->getParam('project_id')),
'project_type' => trim($request->getParam('project_type')),
'project_title' => trim($request->getParam('project_title')),
'project_leader'=> trim($request->getParam('project_leader')),
'postcode' => trim($request->getParam('postcode')),
);
return $data;
}
//获取用户账户修改参数
public function getEditParam(\Zend_Controller_Request_Abstract $request)
{
$type = $request->getParam('type');
if($type == "general")
{
$data = array(
'realname'=>$request->getParam('realname'),
'signature'=>$request->getParam('signature'),
'description'=>$request->getParam('description')
);
}
if($type == "password")
{
$data = array(
'password' => $request->getParam('password'),
'password_new'=>$request->getParam('password_new'),
'password_confirm'=>$request->getParam('password_confirm')
);
}
return $data;
}
//编辑
public function edit($data,$type)
{
$results = $this->events()->trigger('edit.checkParam', $this, compact('data','type'));
$cache_data = $results->bottom();
if($cache_data !== true)
{
return $cache_data;
}
if($type == "general")
{
$data['signature'] = htmlspecialchars($data['signature']);
$data['description'] = htmlspecialchars($data['description']);
}else if($type == "password")
{
$data['password'] = md5($data['password_new']);
unset($data['password_new']);
unset($data['password_confirm']);
}else{
return "A error occurred";
}
$dbh = new dbh();
$uid = view::User('id');
if($dbh->update($this->memberTable,$data," id=$uid") === true)
{
return true;
}else{
return false;
}
}
//找回密码
public function getMyPassword($email)
{
$results = $this->events()->trigger('pwd.forgot.checkParam', $this, compact('email'));
$cache_data = $results->bottom();
if($cache_data !== true)
{
return $cache_data;
}
$sql = "SELECT * FROM {$this->memberTable} WHERE email='$email'";
$rs = $this->db->query($sql);
$row = $rs->fetch();
if(!isset($row['username']) || empty($row['username']))
{
return array('error'=>"this email was not found",'place'=>'email');
}
$salt = md5($email.'--'.time().'--'.$row['username']);
$sql = "UPDATE {$this->memberTable} SET salt='$salt' WHERE id={$row['id']}";
$state = $this->db->exec($sql);
if($state<1)
{
return array('error'=>"A error occurred",'place'=>'email');
}
$mail_data = array(
'name'=>$row['realname'],
'link'=> view::getHostLink().'/account/fetchpwd/?salt='.$salt,
'site' => $this->config->title->site
);
$mail = new Mail();
$mail->loadTemplate($this->getPwdEmailTemplate,$mail_data);
$mail->addTo($email,$row['realname']);
$mail->send();
return array("success"=>1);
}
//重置密码
public function resetPassword($data)
{
$results = $this->events()->trigger('pwd.reset.checkParam', $this, compact('data'));
$cache_data = $results->bottom();
if($cache_data !== true)
{
return $cache_data;
}
$sql = "SELECT * FROM {$this->memberTable} WHERE salt=?";
$sth = $this->db->prepare($sql);
$sth->execute(array($data['salt']));
$row = $sth->fetch();
if(!isset($row['username']) || empty($row['username']))
{
return array('error'=>"captcha is wrong",'place'=>'confirm_password');
}
if($row['username'] !== $data['username'])
{
return array('error'=>"captcha is wrong,please reset password again",'place'=>'confirm_password');
}
$sql = "UPDATE {$this->memberTable} SET password='".md5($data['password'])."',salt='' WHERE id={$row['id']}";
$this->db->exec($sql);
$mail_data = array(
'name' => $row['realname'],
'site' => $this->config->title->site
);
$mail = new Mail();
$mail->loadTemplate($this->PwdChangedEmailTemplate,$mail_data);
$mail->addTo($row['email'],$row['realname']);
$mail->send();
return true;
}
}