Merge branch 'development' into 'master'

Development to master

发布一个稳定的测试版本

See merge request !1
This commit is contained in:
Li Jianxuan 2015-01-05 18:32:13 +08:00
commit e40848e98b
36 changed files with 3631 additions and 363 deletions

View File

@ -41,8 +41,14 @@ class AuthenticationService
$namespace = $e->getRouteMatch()->getParam('__NAMESPACE__');
$controller = $e->getRouteMatch()->getParam('controller');
$action = $e->getRouteMatch()->getParam('action');
if($module == 'Engine' && $namespace == 'ConsoleApp')
{
return true;
}
//view::Dump($e->getRouteMatch()->getMatchedRouteName() . ":" . $controller."-".$action,false);
// view::Dump($e->getRouteMatch()->getMatchedRouteName() . ":" . $controller."-".$action,false);
$this->preCookieCheck();
try{

View File

@ -14,6 +14,8 @@ use Zend\EventManager\EventManagerAwareInterface;
abstract class AbstractEventManager {
protected $events;
public function setEventManager (EventManagerInterface $events) {
$events->setIdentifiers(array(
__CLASS__,

95
Westdc/File/File.php Normal file
View File

@ -0,0 +1,95 @@
<?php
/**
* Created by PhpStorm.
* User: liujin834
* Date: 14/12/26
* Time: 下午3:52
*/
namespace Westdc\File;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
class File implements ServiceManagerAwareInterface{
protected $serviceManager;
public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
return $this;
}
//获取文件扩展名
public function getFileTextExt($file_name)
{
$temp_arr = explode(".", $file_name);
$file_ext = array_pop($temp_arr);
$file_ext = trim($file_ext);
$file_ext = strtolower($file_ext);
return $file_ext;
}
//获取文件Mime通过finfo扩展
public function getFileMime($file_name)
{
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$filetype = finfo_file($finfo, $file_name) ; //文件mime类型
finfo_close($finfo);
return $filetype;
}
//获取某个文件的信息
public function get($id)
{
if(!is_numeric($id) || $id<1)
return false;
$dbService = $this->serviceManager->get('Db');
$db = $dbService->getPdo();
$sql = "SELECT * FROM attachments WHERE id=$id";
$rs = $db->query($sql);
return $rs->fetch();
}
//删除文件
public function delete($id)
{
if(!is_numeric($id) || $id<1)
return false;
$file_info = $this->get($id);
$basePath = $this->getFileSaveDirByType($file_info['filetype']);
@unlink($basePath . $file_info['filename']);
$dbService = $this->serviceManager->get('Db');
$db = $dbService->getPdo();
return $db->exec("DELETE FROM attachments WHERE id=$id");
}
public function getFileSaveDirByType($fileType)
{
$configService = $this->serviceManager->get('ConfigService');
$basePath = "";
switch ($fileType){
case "literature":
$appConfig = $configService->get('application.ini');
$basePath = $appConfig['reference_save_path'];
break;
}
if (!preg_match("/[\/|\\\]+$/", $basePath))
$basePath .= "/";
return $basePath;
}
}

View File

@ -0,0 +1,76 @@
<?php
namespace Westdc\File\Listener;
use Zend\EventManager\EventCollection;
use Zend\EventManager\ListenerAggregateInterface;
use Zend\EventManager\EventManagerInterface;
use Westdc\Service\ServiceManager;
class DefaultFileUploadListener implements ListenerAggregateInterface
{
protected $listeners = array();
protected $serviceManager;
function __construct()
{
$this->serviceManager = new ServiceManager();
$this->serviceManager = $this->serviceManager->getServiceManager();
}
public function attach(EventManagerInterface $events)
{
$this->listeners[] = $events->attach('upload.pre', function($e){
return true;
return ['error' => '文件格式不在可上传的范围内'];
}, 100);
$this->listeners[] = $events->attach('upload.pre', function($e){
return true;
return ['error' => '文件大小超出了限制'];
}, 80);
$this->listeners[] = $events->attach('upload.after', function($e){
$file_data = $e->getParam('file_data');
$authService = $this->serviceManager->get('Auth');
$data = [
'filename' => $file_data['db_path'],
'filetype' => $file_data['file_type'],
'filedesc' => $file_data['file_mime'],
'userid' => $authService->getIdentity('id'),
'filesize' => $file_data['file_size'],
'realname' => $file_data['realname'],
];
if(isset($file_data['language']))
{
$data['language'] = $file_data['language'];
}
$dbServices = $this->serviceManager->get('Db');
$dbh = $dbServices->getDbh();
$attid = $dbh->insert("attachments" , $data , true);
if(is_numeric($attid))
return ['attid' => $attid];
return false;
}, 100);
}
public function detach(EventManagerInterface $events)
{
foreach ($this->listeners as $index => $listener) {
if ($events->detach($listener)) {
unset($this->listeners[$index]);
}
}
}
}

250
Westdc/File/Upload.php Normal file
View File

@ -0,0 +1,250 @@
<?php
/**
* Created by PhpStorm.
* User: liujin834
* Date: 14/12/26
* Time: 下午3:52
*/
namespace Westdc\File;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Westdc\EventModel\AbstractEventManager;
use Westdc\File\Listener\DefaultFileUploadListener;
class Upload extends AbstractEventManager implements ServiceManagerAwareInterface{
protected $serviceManager;
private $uploadPath = "";
private $relativePath = "";
private $fileName = "";
private $config;
private $params;
//日期路径模式
const DATETIME_MODEL_YMD = "Y/M/D/";
const DATETIME_MODEL_YM = "Y/M/";
const DATETIME_MODEL_Y = "Y/";
public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
$this->init();
return $this;
}
public function init()
{
$Listener = new DefaultFileUploadListener;
$this->getEventManager()->attachAggregate($Listener);
$configService = $this->serviceManager->get('ConfigService');
$this->config = $configService->get('file.php');
}
public function __invoke($files,$rootDir = "",$childDir = "",$fileName = "",$dateDirModel = self::DATETIME_MODEL_YMD)
{
return $this->upload($files,$rootDir,$childDir,$fileName,$dateDirModel);
}
/**
* 上传文件
* @param $files 上传文件的信息 e.g.$_FILE['fileData']
* @param string $rootDir 文件存储的根路径(磁盘物理路径),如果没有设置则从 config/autoload/file.php 中读取 upload 配置
* @param string $childDir 根路径中的下一级路径,默认为空
* @param string $fileName 新文件的文件名如果不指定则设置为新的UUID
* @param string $dateDirModel 年月日目录模式,如果设为 false 则存储时不添加年月日路径,年月日路径在子文件夹中创建,unix和linux中需要开启上传目录的权限否则无法创建文件夹
* @return array
*/
public function upload($files,$rootDir = "",$childDir = "",$fileName = "",$dateDirModel = self::DATETIME_MODEL_YMD)
{
if (empty($files) !== false) {
return array("error"=>"请选择要上传的文件.");
}
if (is_uploaded_file($files['tmp_name']) === false) {
return array("error"=>"文件上传失败,请重新上传");
}
$file = $files;
$results = $this->getEventManager()->trigger('upload.pre', $this, compact('file'));
$cache_data = $results->last();
if($cache_data !== true)
{
return $cache_data;
}
$fileService = $this->serviceManager->get('File');
$this->setRootDir($rootDir);
$this->setChildDir($childDir);
if($dateDirModel !== false)
$this->makeDateDir($dateDirModel);
$this->setFileName($fileName , $fileService->getFileTextExt($files['name']));
//移动文件
$file_path = $this->getUploadPath() . $this->getFileName();
if (move_uploaded_file($file['tmp_name'], $file_path) === false) {
return array("error"=>"上传失败,请重试");
}
$file_data = array();
$file_data['file_url'] = $this->getRelativePath() . $this->getFileName();
$file_data['file_size'] = $files['size'];
$file_data['db_path'] = $this->getRelativePath() . $this->getFileName();
$file_data['realname'] = $files['name'];
$file_data['file_ext'] = $fileService->getFileTextExt($files['name']);
$file_data['file_mime'] = $fileService->getFileMime($file_path);
if(!empty($file_data) && is_array($file_data))
{
$file_data = array_merge($file_data,$this->params);
}
$results = $this->getEventManager()->trigger('upload.after', $this, compact('file_data'));
$cache_data = $results->last();
if(is_array($cache_data))
$file_data = array_merge($file_data , $cache_data);
return $file_data;
}//文件上传
/**
* 设置上传文件的根路径这样操作会忽略config中的定义
* 根路径需要自行创建
* 路径结尾必须加 "/"
* @param string $path
* @return bool
*/
public function setRootDir($path = "")
{
if(empty($path))
$this->uploadPath = $this->config->upload;
$this->uploadPath = $path;
if(!preg_match("/[\/|\\\]+$/",$this->uploadPath))
$this->uploadPath .= "/";
return true;
}
/**
* 设置子路径,自动加在根路径之后
* 如果不存在程序将创建
* @param string $dirname
* @return bool | string
*/
public function setChildDir($dirname)
{
if(empty($dirname)) {
return true;
}
$this->uploadPath .= $dirname;
if (!preg_match("/[\/|\\\]+$/", $this->uploadPath))
$this->uploadPath .= "/";
if(!file_exists($this->uploadPath)) {
if(!mkdir($this->uploadPath))
return "failed to create folder :".$this->uploadPath;
}
$this->relativePath = $dirname;
}
/**
* 创建并返回年月日的子目录路径
* @return string
*/
public function makeDateDir($model)
{
$y = date("Y");
$m = date("m");
$d = date("d");
if($model == self::DATETIME_MODEL_YMD || $model == self::DATETIME_MODEL_YM || $model == self::DATETIME_MODEL_Y) {
$current_path = $y . "/";
if (!file_exists($this->uploadPath . $current_path))
mkdir($this->uploadPath . $current_path);
}
if($model == self::DATETIME_MODEL_YMD || $model == self::DATETIME_MODEL_YM){
$current_path .= $m . "/";
if (!file_exists($this->uploadPath . $current_path))
mkdir($this->uploadPath . $current_path);
}
if($model == self::DATETIME_MODEL_YMD) {
$current_path .= $d ."/";
if (!file_exists($this->uploadPath . $current_path))
mkdir($this->uploadPath . $current_path);
}
$this->uploadPath .= $current_path;
$this->relativePath .= $current_path;
return $current_path;
}
/**
* @param $fileName
* @param $fileExt
*/
public function setFileName($fileName,$fileExt)
{
if(!empty($fileName)){
$this->fileName = $fileName . "." .$fileExt;
return;
}
$tools = $this->serviceManager->get('Tools');
$uuid = $tools->uuid();
$this->fileName = $uuid . "." . $fileExt;
}
public function setParams($params)
{
$this->params = $params;
}
/**
* @return string
*/
public function getFileName()
{
return $this->fileName;
}
/**
* @return string
*/
public function getUploadPath()
{
return $this->uploadPath;
}
/**
* @return string
*/
public function getRelativePath()
{
return $this->relativePath;
}
}

View File

@ -14,20 +14,29 @@ class Assist
}
static function addPaginator($data,$ctl,$limit = 10,$viewPartial = "layout/manager/pagination")
static function addPaginator($data,$ctl,$limit = 10,$viewPartial = "layout/manager/pagination" )
{
$request = $ctl->getRequest();
$page = $ctl->params()->fromRoute('page');
$paginator = new \Zend\Paginator\Paginator(new \Zend\Paginator\Adapter\ArrayAdapter($data));
if(is_array($data)){
$data = new \Zend\Paginator\Adapter\ArrayAdapter($data);
}
// elseif($data instanceof ){
//
// }
$paginator = new \Zend\Paginator\Paginator($data);
$paginator->setCurrentPageNumber($page)
->setItemCountPerPage($limit)
->setPageRange(6);
$paginator->setDefaultScrollingStyle('Sliding');
$pagination = $ctl->getServiceLocator()->get('viewhelpermanager')->get('PaginationControl');
$renderer = $ctl->getServiceLocator()->get('Zend\View\Renderer\PhpRenderer');
$paginator->setView($renderer);
$renderer = $ctl->getServiceLocator()->get('Zend\View\Renderer\PhpRenderer');
$paginator->setView($renderer);
$pagination->setDefaultViewPartial($viewPartial);
$ctl->ViewModel->setVariable('paginator',$paginator);

View File

@ -28,6 +28,9 @@ class Auth
public function getIdentity($field)
{
return $this->auth->getIdentity()->$field;
if(isset($this->auth->getIdentity()->$field))
return $this->auth->getIdentity()->$field;
else
return null;
}
}

View File

@ -0,0 +1,132 @@
<?php
/**
* Created by PhpStorm.
* User: liujin834
* Date: 14/12/25
* Time: 下午5:29
*/
namespace Westdc\Helpers;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\Paginator\Adapter\ArrayAdapter;
use Zend\Paginator\Adapter\DbSelect;
use Zend\Paginator\Adapter\DbTableGateway;
use Zend\Paginator\Paginator as Zend_Paginator;
use Zend\Db\Sql\Select;
use Zend\Db\TableGateway\TableGateway;
class Paginator implements ServiceManagerAwareInterface{
protected $serviceManager;
public $sqlQuery,$sqlOrder,$sqlGroup,$sqlHaving;
private $pageLimit,$pageRange,$route,$params;
public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
$this->setPageLimit();
$this->setPageRange();
$this->setRoute();
return $this;
}
public function setPageLimit($limit = 0)
{
$this->pageLimit = (int)$limit;
if(empty($this->pageLimit))
$this->pageLimit = 10;
}
public function setPageRange($range = 0)
{
$this->pageRange = (int)$range;
if(empty($this->pageRange))
$this->pageRange = 6;
}
public function setRoute($route = "",$params = "")
{
if(empty($route)) {
$routeMatch = $this->serviceManager->get('Application')->getMvcEvent()->getRouteMatch();
$this->route = str_replace("/wildcard", "", $routeMatch->getMatchedRouteName());
$this->params = [];
}else{
$this->route = $route;
}
if(empty($params)) {
if(!isset($routeMatch))
$routeMatch = $this->serviceManager->get('Application')->getMvcEvent()->getRouteMatch();
if (!empty($routeMatch->getParam('__CONTROLLER__')))
$this->params['controller'] = $routeMatch->getParam('__CONTROLLER__');
if (!empty($routeMatch->getParam('action')))
$this->params['action'] = $routeMatch->getParam('action');
if (!empty($routeMatch->getParam('ac')))
$this->params['ac'] = $routeMatch->getParam('ac');
if (!empty($routeMatch->getParam['id']))
$this->params['id'] = $routeMatch->getParam('id');
if (!empty($routeMatch->getParam['uuid']))
$this->params['uuid'] = $routeMatch->getParam('uuid');
}else{
$this->params = $params;
}
unset($routeMatch);
}
/**
* @param AbstractActionController $ctl
* @param mixed $data
* @param string $viewPartial
* @return bool
*/
public function add(AbstractActionController $ctl,$data,$viewPartial = "pagination")
{
$page = $ctl->params()->fromRoute('page');
if(is_array($data))
$data = new ArrayAdapter($data);
if($data instanceof Select)
{
$dbService = $this->serviceManager->get('Db');
$zendDb = $dbService->getZendDb();
$data = new DbSelect($data,$zendDb);
}
if($data instanceof TableGateway)
$data = new DbTableGateway($data,$this->sqlQuery,$this->sqlOrder,$this->sqlGroup,$this->sqlHaving);
$paginator = new Zend_Paginator($data);
$paginator->setCurrentPageNumber($page)
->setItemCountPerPage($this->pageLimit)
->setPageRange($this->pageRange);
$pagination = $ctl->getServiceLocator()->get('viewhelpermanager')->get('PaginationControl');
$pageSliding = $pagination(
$paginator,
'Sliding',
$viewPartial,
['route'=>$this->route,'params'=>$this->params]
);
$ctl->ViewModel->setVariable('pagination',$pageSliding);
$ctl->ViewModel->setVariable('paginator',$paginator);
return true;
}
}

204
Westdc/Helpers/Theme.php Normal file
View File

@ -0,0 +1,204 @@
<?php
/**
* Theme 主题
*/
namespace Westdc\Helpers;
class Theme
{
private $render; //传入Zend Render对象
public $plus; //插件
public $ScriptKey = "js"; //js 文件键名
public $CSSKey = "css"; //css 文件键名
function __construct()
{
$this->_init_plus();
}
//初始化插件
function _init_plus()
{
$this->plus = array(
/**********Jquery公共库******/
//Jquery
'jquery'=>array(
$this->ScriptKey => array(
'/js/lib/jquery.lasted.js'
)
),
//Jquery UI
'jquery_ui'=>array(
$this->ScriptKey => array(
'/js/lib/jquery.lasted.js',
'/js/lib/jquery.ui/jquery-ui.lasted.js'
),
$this->CSSKey =>array(
'/js/lib/jquery.ui/jquery-ui.lasted.css'
)
),
/********* Bootstrap ******/
'bootstrap'=>array(
$this->ScriptKey => array(
'/js/lib/bootstrap/js/bootstrap.min.js',
),
$this->CSSKey =>array(
'/js/lib/bootstrap/css/bootstrap.min.css',
'/js/lib/bootstrap/css/bootstrap-responsive.min.css'
)
),
/********Jquery 插件********/
//colorbox
'colorbox' => array(
$this->ScriptKey => array(
'/lib/jquery.colorbox/jquery.colorbox-min.js'
),
$this->CSSKey => array(
'/lib/jquery.colorbox/style2/colorbox.css'
)
),
//inputbg
'inputbg' => array(
$this->ScriptKey => array(
'/js/lib/custom/jquery.inputbg.js'
)
),
//loadinglayer
'loadinglayer' => array(
$this->ScriptKey => array(
'/js/lib/custom/jquery.loadinglayer.js'
)
),
//admin_plugin
'admin_plugin' => array(
$this->ScriptKey => array(
'/js/lib/custom/admin_plugin.js'
)
),
'jplayer' => array(
$this->ScriptKey => array(
'/js/lib/jplayer/jquery.jplayer.min.js'
)
),
//slides
'slides' => array(
$this->ScriptKey => array(
'/js/lib/jquery.slides.min.js'
)
),
'datatable' => array(
$this->ScriptKey => array(
'/js/lib/jquery.datatable/jquery.dataTables.min.js'
),
$this->CSSKey => array(
'/js/lib/jquery.datatable/datatable.css'
)
),
'masonry' => array(
$this->ScriptKey => array(
'/js/lib/jquery.masonry.min.js'
),
),
'jquery-fileupload' => array(
$this->ScriptKey => array(
'/static/lib/jquery-fileupload/vendor/jquery.ui.widget.js',
'/static/lib/jquery-fileupload/jquery.iframe-transport.js',
'/static/lib/jquery-fileupload/jquery.fileupload.js',
),
$this->CSSKey => array(
'/static/lib/jquery-fileupload/css/jquery.fileupload.css',
)
),
'datepicker' => array(
$this->ScriptKey => array(
'/js/lib/datepicker/jquery-ui-1.10.3.custom.min.js'
),
$this->CSSKey => array(
'/js/lib/datepicker/jquery-ui-1.10.3.custom.min.css'
)
),
/*********谷歌地图*********/
//Google Map API v3
'google_map_v3'=>array(
$this->ScriptKey => array(
'http://maps.google.com/maps/api/js?sensor=false&language=zh-cn'
)
),
//Google Map API v3 - KeyDragZone
'google_map_keydragzone' => array(
$this->ScriptKey => array(
'/lib/google-map/keydragzoom.js'
)
),
'kindeditor' => array(
$this->ScriptKey => array(
'/lib/kindeditor/kindeditor-min.js',
'/lib/kindeditor/lang/zh_CN.js'
)
),
//Tianditu
'tianditu'=>array(
$this->ScriptKey => array(
'http://api.tianditu.com/js/maps.js'
)
),
);//插件列表
}// _init_plus()
//前台添加插件
function appendPlus($render,$plus_name){
$plus_name = strtolower($plus_name);
$plusing = $this->plus;
if(!empty($plusing[$plus_name][$this->ScriptKey]))
{
foreach($plusing[$plus_name][$this->ScriptKey] as $k=>$v)
{
$render->headScript()->appendFile($v);
}
}
if(!empty($plusing[$plus_name][$this->CSSKey]))
{
foreach($plusing[$plus_name][$this->CSSKey] as $k=>$v)
{
$render->headLink()->appendStylesheet($v);
}
}
}// AppendPlus
//加载页面中的JS
function AppendModel($render,$model)
{
$model = trim($model);
$render->headScript()->appendFile("/js/lib/custom/models/".$model.".js");
}//
}

View File

@ -2,13 +2,84 @@
namespace Westdc\Helpers;
class Tools {
/**
* 判断是否为UUID字符串
* 返回结果为0或1
*/
/**
* 判断是否为UUID字符串
* @param $uuid
* @return int
*/
public static function isUUID($uuid) {
return preg_match("/^[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}$/",$uuid);
}
/**
* @param $str
* @return bool
*/
public function isEmail($str){
return true;
}
/**
* @param $cmd
*/
public function execBackend($cmd)
{
if (substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start cmd /c ". $cmd, "r"));
}
else {
exec($cmd . " > /dev/null &");
}
return;
}
/**
* 返回的汉语文字信息在windows中是GB2312编码需要手动改成UTF8
* iconv("GB2312","UTF-8",$read);
* @param $cmd
* @return array
*/
public function execFront($cmd)
{
$response = array();
$handle = popen("$cmd 2>&1", 'r');
$read = '';
while ($read = fread($handle, 20096)) {
$response[] = trim($read);
}
pclose($handle);
flush();
return $response;
}
/**
* @return string
*/
public function uuid()
{
return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
// 32 bits for "time_low"
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
// 16 bits for "time_mid"
mt_rand( 0, 0xffff ),
// 16 bits for "time_hi_and_version",
// four most significant bits holds version number 4
mt_rand( 0, 0x0fff ) | 0x4000,
// 16 bits, 8 bits for "clk_seq_hi_res",
// 8 bits for "clk_seq_low",
// two most significant bits holds zero and one for variant DCE1.1
mt_rand( 0, 0x3fff ) | 0x8000,
// 48 bits for "node"
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
);
}
}

View File

@ -8,36 +8,185 @@
namespace Westdc\Mail;
use Zend\EventManager\EventManagerInterface;
use Zend\EventManager\EventManager;
use Zend\EventManager\EventManagerAwareInterface;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Westdc\EventModel\AbstractEventManager;
use Westdc\Service\ServiceManager as WestdcServiceManager;
use Zend\Mail\Message;
use Zend\Mail\Transport\Smtp as SmtpTransport;
use Zend\Mail\Transport\SmtpOptions;
use Zend\Mime\Message as MimeMessage;
use Zend\Mime\Part as MimePart;
class Mail {
class Mail extends AbstractEventManager implements ServiceManagerAwareInterface{
function __construct()
protected $serviceManager;
public $mail;
public $config;
public $subject;
public $body;
public $type;
public $transport;
public $from;
public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
}
$this->init();
public function setEventManager(EventManagerInterface $events)
{
$events->setIdentifiers(array(
__CLASS__,
get_called_class(),
));
$this->events = $events;
return $this;
}
public function getEventManager()
private function init()
{
if (NULL === $this->events) {
$this->setEventManager(new EventManager());
if(!$this->serviceManager instanceof ServiceManager)
{
$serviceManager = new WestdcServiceManager();
$this->serviceManager = $serviceManager->getServiceManager();
}
return $this->events;
$this->loadConfigure();
$this->smtp();
$this->buildMailMessage();
}
//单独调用Mail类的时候需要先执行委托函数
public function __invoke()
{
$this->init();
}
public function loadConfigure()
{
$configService = $this->serviceManager->get('ConfigService');
$this->config = $configService->get('email.ini');
}
public function smtp()
{
$this->transport = new SmtpTransport();
$options = new SmtpOptions(array(
'name' => $this->config['smtp']['hostname'],
'host' => $this->config['smtp']['host'],
'port' => $this->config['smtp']['port'], // Notice port change for TLS is 587
'connection_class' => $this->config['smtp']['auth'],
'connection_config' => array(
'username' => $this->config['smtp']['username'],
'password' => $this->config['smtp']['password'],
'ssl' => $this->config['smtp']['ssl'],
),
));
$this->transport->setOptions($options);
}
public function buildMailMessage($mail = NULL)
{
if(empty($mail))
{
$this->mail = new Message();
}else{
$this->mail = $mail;
}
$this->mail->setEncoding("UTF-8");
}
//设置默认发件人
public function setDefaultFrom()
{
$this->mail->setFrom($this->config['smtp']['username'],$this->config['smtp']['name']);
}
//添加收件人
public function addTo($email,$name)
{
$this->mail->addTo($email,$name);
}
//加载模板
public function loadTemplate($id,$data){
$mailTemplate = $this->serviceManager->get('Mail/Template');
$content = $mailTemplate->load($id,$data);
$this->subject = $content['subject'];
$this->body = $content['body'];
$this->type = $content['type'];
}//加载模板
/**
* @param $from
*/
public function setFrom($from)
{
$this->from = $from;
}
/**
* @param null $from
* @return bool
*/
public function preSend($from = NULL)
{
if(empty($this->subject) || empty($this->body))
{
return "邮件信息不完整";
}
if($this->type == 'html')
{
$bodyPart = new MimeMessage();
$bodyMessage = new MimePart($this->body);
$bodyMessage->type = 'text/html';
$bodyPart->setParts(array($bodyMessage));
$this->mail->setBody($bodyPart);
}else{
$this->mail->setBody($this->body);
}
if(empty($from) && empty($this->from))
{
$this->setDefaultFrom();
}else{
if(!empty($this->from))
$this->mail->setFrom($this->from['email'],$this->from['name']);
if(!empty($from))
$this->mail->setFrom($from['email'],$from['name']);
}
$this->mail->setSubject($this->subject);
return true;
}
//使用loadTemplate 的结果发送邮件
//在此之前需要使用 $this->mail->addTo()添加收件人
/**
* @param null $from
*/
public function send($from = NULL){
if(!$status = $this->preSend($from))
return $status;
try {
$this->transport->send($this->mail);
return true;
}catch(\Exception $e)
{
throw new \RuntimeException($e->getMessage());
}
}
}

View File

@ -1,32 +1,41 @@
<?php
/**
* Created by PhpStorm.
* User: Li Jianxuan
* Date: 14-9-19
* Time: 下午4:22
* User: liujin834
* Date: 15/1/3
* Time: 下午9:57
*/
namespace Westdc\Mail;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Westdc\EventModel\AbstractEventManager;
class MailService implements ServiceManagerAwareInterface {
class Queue extends AbstractEventManager implements ServiceManagerAwareInterface{
/**
* @var ServiceManager
*/
protected $serviceManager;
/**
* @param ServiceManager $serviceManager
* @return service
*/
public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
$this->init();
return $this;
}
private function init()
{
}
public function add(){
}
public function show(){
}
}

90
Westdc/Mail/Sender.php Normal file
View File

@ -0,0 +1,90 @@
<?php
/**
* Created by PhpStorm.
* User: Li Jianxuan
* Date: 14-9-19
* Time: 下午3:43
*/
namespace Westdc\Mail;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
class Sender implements ServiceManagerAwareInterface{
protected $serviceManager;
public $debug = 0;
public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
return $this;
}
/**
* 发送即时邮件
* @param $options
* @return bool
*/
public function backend($options)
{
$cmd = "php ".CURRENT_BOOTSTRAP_SCRIPT;
$cmd .= ' mail send';
$cmd .= ' --email="'.$options['email'].'"';
$cmd .= ' --name="'.$options['name'].'"';
$cmd .= ' --template="'.$options['template'].'"';
if(isset($options['data']))
{
$data = json_encode($options['data']);
$cmd .= ' --data=\''.$data.'\'';
}
$tools = $this->serviceManager->get('Tools');
if($this->debug == 0)
{
$tools->execBackend($cmd);
return true;
}
var_dump($tools->execFront($cmd));
return true;
}
/**
* 将邮件添加到发送列队降低内存和cpu消耗但是用户无法即时收到适用于通知类型的邮件和大批量发送的邮件
* @param $options
* @return bool
*/
public function queue($options)
{
$cmd = "php ".CURRENT_BOOTSTRAP_SCRIPT;
$cmd .= ' mail queue';
$cmd .= ' --email="'.$options['email'].'"';
$cmd .= ' --name="'.$options['name'].'"';
$cmd .= ' --template="'.$options['template'].'"';
if(isset($options['data']))
{
$data = json_encode($options['data']);
$cmd .= ' --data=\''.$data.'\'';
}
$tools = $this->serviceManager->get('Tools');
if($this->debug == 0)
{
$tools->execBackend($cmd);
return true;
}
var_dump($tools->execFront($cmd));
return true;
return true;
}
}

139
Westdc/Mail/Template.php Normal file
View File

@ -0,0 +1,139 @@
<?php
namespace Westdc\Mail;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
class Template implements ServiceManagerAwareInterface
{
protected $serviceManager;
private $db;
const DEFAULT_TEMPLATE_TYPE = 'text';
public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
$this->init();
return $this;
}
private function init()
{
$dbService = $this->serviceManager->get('Db');
$this->db = $dbService->getPdo();
}
public function fetchAll()
{
$sql='SELECT * FROM emailtext';
$rs=$this->db->query($sql);
return $rs->fetchAll(\PDO::FETCH_ASSOC);
}
//插入邮件模板
public function insert($data)
{
$temp=$this->fetch($data['template']);
if(isset($temp['id']) && is_numeric($temp['id']) && $temp['id']>0)
{
return '该邮件模板标识已经存在,请更换标识!';
}
$dbhService = $this->serviceManager->get('Db');
$dbh = $dbhService->getDbh();
if(empty($data['subject']))
{
$data['subject']='未命名模板';
}
$rs = $dbh->insert('emailtext',$data,1);
return $rs;
}
//删除邮件模板
public function del($id)
{
$sql = "DELETE FROM emailtext WHERE id=$id";
$rs = $this->db->exec($sql);
return $rs;
}
//更新邮件模板
public function update($data,$id)
{
$temp=$this->fetch($data['template']);
if(isset($temp['id']) && is_numeric($temp['id']) && $temp['id']>0)
{
if($id!=$temp['id'])
return '该邮件模板标识已经存在,请更换标识!';
}
$dbhService = $this->serviceManager->get('Db');
$dbh = $dbhService->getDbh();
$rs = $dbh->update('emailtext',$data,"id=$id",1);
return $rs;
}
public function fetch($key)
{
if(is_numeric($key))
{
$sql="SELECT * FROM emailtext WHERE id=$key";
}else
{
$sql="SELECT * FROM emailtext WHERE template='$key'";
}
$rs=$this->db->query($sql);
return $rs->fetch();
}
/**
* @param $key
* @param $data
* @return array
*/
public function load($key,$data){
$template_data = $this->fetch($key);
if(empty($data) || !is_array($data) || count($data) < 1)
return [
'subject' => $template_data['subject'],
'body' => $template_data['body'],
'type' => isset($template_data['type']) ? $template_data['type'] : self::DEFAULT_TEMPLATE_TYPE
];
$patterns = array();
$replacements = array();
foreach($data as $k=>$v)
{
$patterns[]='/{'.$k.'}/i';
$replacements[]=$v;
}
ksort($patterns);
ksort($replacements);
$replaced_body = preg_replace($patterns, $replacements, $template_data['body']);
$replaced_subject = preg_replace($patterns, $replacements, $template_data['subject']);
return [
'subject' => $replaced_subject,
'body' => $replaced_body,
'type' => isset($template_data['type']) ? $template_data['type'] : self::DEFAULT_TEMPLATE_TYPE
];
}//function load
}

View File

@ -1,6 +1,8 @@
<?php
namespace Westdc\Member;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Westdc\EventModel\AbstractEventManager;
use Zend\Authentication\AuthenticationService;
use Zend\Authentication\Storage\Session as SessionStorage;
@ -13,7 +15,8 @@ use Westdc\Db\Db as Zend_Db;
use Westdc\Mail\Mail;
use Westdc\User\Member;
class Account extends AbstractEventManager
class Account extends AbstractEventManager implements ServiceManagerAwareInterface
{
public $memberTable = "tbl_member";
public $FieldUsername = "username";
@ -31,9 +34,23 @@ class Account extends AbstractEventManager
function __construct()
{
$this->db = new Db();
$this->config = Config::get();
}
public function init()
{
$dbService = $this->serviceManager->get('Db');
$this->db = $dbService->getPdo();
}
public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
$this->init();
return $this;
}
//获取账号信息,数组
public function getAccountInfo($id = 0)

View File

@ -124,12 +124,5 @@ class Cookie
setcookie('user','',time()-99999,'/');
setcookie('scr','',time()-99999,'/');
}
public function getUser()
{
$sql = "SELECT * FROM ".$this->memberTable." m ORDER BY m.id DESC";
$rs = $this->db->query($sql);
return $rs->fetchAll();
}
}

171
Westdc/Metadata/Dataset.php Normal file
View File

@ -0,0 +1,171 @@
<?php
/**
* Created by PhpStorm.
* User: liujin834
* Date: 14/12/21
* Time: 下午4:46
*/
namespace Westdc\Metadata;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Westdc\EventModel\AbstractEventManager;
class Dataset extends AbstractEventManager implements ServiceManagerAwareInterface{
protected $serviceManager;
private $db;
public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
$this->init();
return $this;
}
private function init()
{
$dbService = $this->serviceManager->get('Db');
$this->db = $dbService->getPdo();
}
/**
* 查询某个元数据的数据集信息(数据存储位置)
* @param $uuid
* @return mixed
*/
public function fetch($uuid)
{
$sql = "SELECT * FROM dataset WHERE uuid=?";
$sth = $this->db->prepare($sql);
$sth ->execute(array($uuid));
return $sth->fetch();
}
/**
*
* @param $uuid
* @param $host
* @param $path
* @return bool|string
*/
public function record($uuid,$host,$path)
{
$tools = $this->serviceManager->get('Tools');
if( false == $tools->isUUID($uuid) )
return "Invalid UUID";
$data = $this->fetch($uuid);
if(isset($data['id']) && $data['id'] > 0)
return $this->update($uuid,$host,$path);
else
return $this->insert($uuid,$host,$path);
}
/**
* @param $uuid
* @param $host
* @param $path
* @return bool
*/
public function update($uuid,$host,$path)
{
$sql = "UPDATE dataset SET host='$host',path='$path' WHERE uuid='$uuid'";
if($this->db->exec($sql) > 0)
{
$this->proftpUpload($uuid,$host);
$this->getEventManager()->trigger('dataset.update.success', $this, compact('uuid','host','path'));
return true;
}else{
return false;
}
}
/**
* @param $uuid
* @param $host
* @param $path
* @return bool
*/
public function insert($uuid,$host,$path)
{
$dbService = $this->serviceManager->get('Db');
$dbh = $dbService->getDbh();
$id = $dbh->insert('dataset',[
'uuid' => $uuid,
'host' => $host,
'path' => $path,
],true);
if(is_numeric($id) && $id>0)
{
$this->proftpUpload($uuid,$host);
$this->getEventManager()->trigger('dataset.insert.success', $this, compact('id','uuid','host','path'));
return true;
}else{
return false;
}
}
/**
* @param $uuid
* @return bool
*/
public function delete($uuid)
{
$sql = "DELETE FROM dataset WHERE uuid='$uuid'";
if($this->db->exec($sql) > 0)
{
$this->getEventManager()->trigger('dataset.delete.success', $this, compact('uuid'));
return true;
}else{
return false;
}
}
public function reload($uuid)
{
$data = $this->fetch($uuid);
if(!isset($data['id']) || empty($data['id']))
{
return "未找到对应的记录,无法完成更新";
}
try {
$this->proftpUpload($uuid, $data['host']);
}catch(\Exception $e){
return $e->getMessage();
}
return true;
}
/**
* @param $uuid
* @param $host
*/
public function proftpUpload($uuid,$host)
{
if ($host=='ftp1.westgis.ac.cn')
{
//var_dump("http://ftp1.westgis.ac.cn/proftp_upload.php?uuid=".$uuid."&filelist=1");
file_get_contents("http://ftp1.westgis.ac.cn/proftp_upload.php?uuid=".$uuid."&filelist=1");
} else if ($host=='ftp2.westgis.ac.cn') {
//var_dump("http://ftp1.westgis.ac.cn/proftp_upload.php?uuid=".$uuid."&filelist=1");
file_get_contents("http://ftp2.westgis.ac.cn/proftp_upload.php?uuid=".$uuid."&filelist=1");
}
}
}

View File

@ -8,10 +8,70 @@
namespace Westdc\Metadata;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Westdc\EventModel\AbstractEventManager;
class Metadata extends AbstractEventManager implements ServiceManagerAwareInterface{
protected $serviceManager;
private $db;
public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
$this->init();
return $this;
}
private function init()
{
$dbService = $this->serviceManager->get('Db');
$this->db = $dbService->getPdo();
}
class Metadata {
public function simpleFetch($uuid)
{
$sql="select * from metadata where uuid='$uuid'";
$rs = $this->db->query($sql);
return $rs->fetch();
}//simpleFetch
/**
* 通过UUID删除元数据
* @param $uuid
* @return bool|string
*/
public function delete($uuid)
{
$tools = $this->serviceManager->get('Tools');
if( false == $tools->isUUID($uuid) )
return "参数错误";
$sql = "delete from mdstatus where uuid='$uuid'";
$sql1 = "delete from mdauthor where uuid='$uuid'";
$sql2="delete from metadata where uuid='$uuid'";
try{
$this->db->exec($sql);
$this->db->exec($sql1);
$this->db->exec($sql2);
$search=new Search();
$search->del($uuid,'uuid');
}catch(\Exception $e){
return $e->getMessage();
}
return true;
}//delete 删除元数据
}

292
Westdc/Metadata/Search.php Normal file
View File

@ -0,0 +1,292 @@
<?php
/**
* Created by PhpStorm.
* User: liujin834
* Date: 14/12/21
* Time: 上午11:11
*/
namespace Westdc\Metadata;
class Search
{
var $terms;
var $text;
var $xs;
var $search;
var $error;
var $pager;
var $count;
var $related;
var $corrected;
var $total;
var $search_cost;
var $docs;
var $hot;
var $base_url;
var $expanded;
//require_once '/home/wlx/xunsearch/sdk/php/lib/XS.php';
private function safe_query($search)
{
return preg_replace('/%|_|\'|\\\\/', '\\\\$0', stripslashes($search));
}
function parse_search($search="", $safe = true)
{
if (empty($search)) $search=$this->text;
$temp = array();
preg_match_all('/"([^"]+)"|([^\\s]+)/', (( $safe ) ? $this->safe_query($search) : $search), $temp);
for ($i = 1; $i < count($temp); $i++)
{
foreach ( $temp[$i] as $value )
{
if ( strlen($value) >= 3 )
{
$this->terms[] = $value;
}
}
}
}
function sql_expr($field)
{
$sql=" 1=1 ";
if (!is_array($field))
{
$field=array($field);
}
if (!count($this->terms))
$this->parse_search();
foreach($this->terms as $t)
{
$sql.=" and (1<>1 ";
foreach($field as $f)
{
$sql.=" or ".$f." ilike '%".$t."%' ";
}
$sql.=") ";
}
return $sql;
}
function __construct($text='')
{
require_once '/home/wlx/xunsearch/sdk/php/lib/XS.php';
$this->xs=new XS('heihe');
$this->search=$this->xs->search;
$this->terms = array();
$this->text=$text;
// other variable maybe used
$this->count = $this->total = $this->search_cost = 0;
$this->docs = $this->related = $this->corrected =$this->expanded = $this->hot = array();
$this->error = $this->pager = $this->base_url='';
}
function dosearch()
{
//
// 支持的 GET 参数列表
// q: 查询语句
// m: 开启模糊搜索,其值为 yes/no
// f: 只搜索某个字段,其值为字段名称,要求该字段的索引方式为 self/both
// s: 排序字段名称及方式其值形式为xxx_ASC 或 xxx_DESC
// p: 显示第几页,每页数量为 XSSearch::PAGE_SIZE 即 10 条
// ie: 查询语句编码,默认为 UTF-8
// oe: 输出编码,默认为 UTF-8
// xml: 是否将搜索结果以 XML 格式输出,其值为 yes/no
//
// variables
$eu = '';
$__ = array('q', 'm', 'f', 's', 'p', 'ie', 'oe', 'syn', 'xml','east','west','south','north','begin','end');
foreach ($__ as $_)
$$_ = isset($_GET[$_]) ? $_GET[$_] : '';
// recheck request parameters
$q = get_magic_quotes_gpc() ? stripslashes($q) : $q;
$f = empty($f) ? '_all' : $f;
${'m_check'} = ($m == 'yes' ? ' checked' : '');
${'syn_check'} = ($syn == 'yes' ? ' checked' : '');
${'f_' . $f} = ' checked';
${'s_' . $s} = ' selected';
if (!isset($q)) $q='';
// base url
$this->base_url = '/search?q=' . urlencode($q) . '&m=' . $m . '&f=' . $f . '&s=' . $s .'&begin='.$begin.'&end='.$end.'&east='.$east.'&north='.$north.'&west='.$west.'&south='.$south. $eu;
$total_begin = microtime(true);
// perform the search
try
{
$this->search->setCharset('UTF-8');
if (empty($q))
{
// just show hot query
$this->hot = $this->search->getHotQuery();
}
{
// fuzzy search
$this->search->setFuzzy($m === 'yes');
// synonym search
$this->search->setAutoSynonyms($syn === 'yes');
// set query
if (!empty($f) && $f != '_all')
{
$this->search->setQuery($f . ':(' . $q . ')');
}
else
{
$this->search->setQuery($q);
}
//spatial search
if (!empty($east) && !empty($west) && !empty($south) && !empty($north))
{
$this->search->addRange('east',null,$east);
$this->search->addRange('west',$west,null);
$this->search->addRange('south',$south,null);
$this->search->addRange('north',null,$north);
}
//date search
if (!empty($begin))
{
$from=strtotime($begin);
$this->search->addRange('timebegin',$from,null);
}
if (!empty($end))
{
$to=strtotime($end);
$this->search->addRange('timeend',null,$to);
}
// set sort
if (($pos = strrpos($s, '_')) !== false)
{
$sf = substr($s, 0, $pos);
$st = substr($s, $pos + 1);
$this->search->setSort($sf, $st === 'ASC');
}
// set offset, limit
$p = max(1, intval($p));
$n = XSSearch::PAGE_SIZE;
$this->search->setLimit($n, ($p - 1) * $n);
// get the result
$search_begin = microtime(true);
$this->docs = $this->search->search();
$this->search_cost = microtime(true) - $search_begin;
// get other result
$this->count = $this->search->getLastCount();
$this->total = $this->search->getDbTotal();
if ($xml !== 'yes')
{
if ($this->count<1)
$this->expanded=$this->search->getExpandedQuery($q);
// try to corrected, if resul too few
if ($this->count < 1 || $this->count < ceil(0.001 * $this->total))
$this->corrected = $this->search->getCorrectedQuery();
// get related query
$this->related = $this->search->getRelatedQuery();
}
// gen pager
if ($this->count > $n)
{
$pb = max($p - 5, 1);
$pe = min($pb + 10, ceil($this->count / $n) + 1);
$this->pager = '';
do
{
$this->pager .= ($pb == $p) ? '<strong>' . $p . '</strong>' : '<a href="' . $this->base_url . '&p=' . $pb . '">[' . $pb . ']</a>';
}
while (++$pb < $pe);
}
}
}
catch (XSException $e)
{
$this->error = strval($e);
}
// calculate total time cost
$this->total_cost = microtime(true) - $total_begin;
// XML OUPUT
if ($xml === 'yes' && !empty($q))
{
header("Content-Type: text/xml; charset=$oe");
echo "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
echo "<xs:result count=\"$this->count\" total=\"$this->total\" cost=\"$this->total_cost\" xmlns:xs=\"http://www.xunsearch.com\">\n";
if ($this->error !== '')
echo " <error><![CDATA[" . $this->error . "]]></error>\n";
foreach ($this->docs as $doc)
{
echo " <doc index=\"" . $doc->rank() . "\" percent=\"" . $doc->percent() . "%\">\n";
foreach ($doc as $k => $v)
{
echo " <$k>";
if (is_numeric($v))
echo $v;
else
echo "\n <![CDATA[" . $v . "]]>\n ";
echo "</$k>\n";
}
echo " </doc>\n";
}
echo "</xs:result>\n";
exit(0);
}
}
//搜索建议
function suggest($q)
{
$terms = array();
if (!empty($q) && strpos($q, ':') === false)
{
try {
$terms = $this->search->setCharset('UTF-8')->getExpandedQuery($q);
} catch (XSException $e) { }
}
return json_encode($terms);
}
//添加新文档
//$data: 包含field和value的数组
function add($data)
{
$doc=new XSDocument;
$index=$this->xs->index;
$doc->setFields($data);
$index->add($doc);
}
//更新已有文档
//$data: 包含field和value的数组
function update($data)
{
$doc=new XSDocument;
$index=$this->xs->index;
$doc->setFields($data);
$index->update($doc);
}
//根据主键删除对应的索引
function del($data,$field='')
{
$index=$this->xs->index;
if (empty($field))
$index->del($data);
else {
$index->del($data,$field);
}
}
}

View File

@ -0,0 +1,84 @@
<?php
namespace Westdc\Reference\Handler;
use Zend\EventManager\EventInterface;
use Westdc\Service\AbstractServiceManager;
//事件中存在的操作
class RisHandler extends AbstractServiceManager
{
private $db; //传入PDO对象误
private $config; //全局配置
private $table;
public $tbl_maillog = ""; //邮件日志表
function __construct($db = NULL)
{
$this->dbService = $this->getServiceManager()->get('Db');
$this->db = $this->dbService->getPdo();
$this->table = new \stdClass;
$this->table->reference = "reference";
$this->table->reference_author = "ref_author";
$this->table->reference_tag = "ref_tag";
}
//检查ris中的文献是否已经存在
public function checkRisReference(EventInterface $e)
{
$ref = $e->getParam('ref');
$wheresql = array();
if(preg_match("/\'/",$ref['title']))
{
$ref['title'] = preg_replace("/\'/","''",$ref['title']);
}
$wheresql[] = " lower(title)=lower('{$ref['title']}') ";
$wheresql[] = " year='{$ref['year']}' ";
//暂时不使用期刊限制
/*if(isset($ref['publisher']))
{
$wheresql[] = " publisher='{$ref['publisher']}' ";
}*/
if(count($wheresql) > 0)
{
$wheresql = " WHERE ".join(" and ",$wheresql);
}else{
$wheresql = "";
}
$sql="select * from {$this->table->reference} $wheresql";
$sth=$this->db->query($sql);
$row=$sth->fetch();
$id=$row['id'];
if(!empty($row['id']))
{
return $id;
}else{
return 0;
}
}
//删除作者
public function deleteAuthor(EventInterface $e)
{
$id = $e->getParam('id');
$sql = "DELETE FROM {$this->table->reference_author} WHERE id=$id ";
return $this->db->exec($sql);
}
public function deleteTag(EventInterface $e)
{
$id = $e->getParam('id');
$sql = "DELETE FROM {$this->table->reference_tag} WHERE id=$id ";
return $this->db->exec($sql);
}
}

View File

@ -0,0 +1,29 @@
<?php
namespace Westdc\Reference\Listener;
use Westdc\Reference\Handler\RisHandler;
use Zend\EventManager\ListenerAggregateInterface;
use Zend\EventManager\EventManagerInterface;
class RisListener implements ListenerAggregateInterface
{
protected $listeners = array();
public function attach(EventManagerInterface $events)
{
$Handler = new RisHandler();
$events->attach('checkLoad', array($Handler, 'checkRisReference'), 100);
$events->attach('delete.after', array($Handler, 'deleteAuthor'), 100);
$events->attach('delete.after', array($Handler, 'deleteTag'), 80);
}
public function detach(EventManagerInterface $events)
{
foreach ($this->listeners as $index => $listener) {
if ($events->detach($listener)) {
unset($this->listeners[$index]);
}
}
}
}

View File

@ -0,0 +1,784 @@
<?php
namespace Westdc\Reference;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Westdc\EventModel\AbstractEventManager;
use Westdc\Reference\Listener\ReferenceListener;
class Reference extends AbstractEventManager implements ServiceManagerAwareInterface{
protected $serviceManager;
private $db; //传入PDO对象.
protected $events = NULL;
public $table;
public $keyword;
public $order;
public $sort = "DESC";
public $field;
public $reftype;
function __construct($db = NULL,$mail = NULL)
{
}
public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
$this->init();
return $this;
}
private function init(){
$dbService = $this->serviceManager->get('Db');
$this->db = $dbService->getPdo();
unset($dbService);
$this->table = new \stdClass();
$this->table->reference = "reference";
$this->table->reference_author = "ref_author";
$this->table->source = "source";
$this->table->metadata_reference = "mdref";
$this->table->reference_tag = "ref_tag";
$this->table->metadata = "metadata";
$this->table->attachments = "attachments";
}
/**
* 添加或编辑文献
* @param $data
* @param int $id
* @return bool|string
*/
public function reference($data,$id = 0)
{
$params = compact('data');
$results = $this->getEventManager()->trigger('submit.before', $this, $params);
$cache_data = $results->bottom();
if($cache_data !== true)
{
return $cache_data;
}
$results = $this->getEventManager()->trigger('submit.processData', $this, $params);
$data = $results->bottom();
$dbServices = $this->serviceManager->get('Db');
$dbh = $dbServices->getDbh();
if(empty($id))
{
$id = $dbh->insert($this->table->reference,$data,true);
}else{
if(!$dbh->update($this->table->reference,$data," id=$id ",true))
{
return "修改失败!请重试";
}
}
if(!empty($id) && is_numeric($id))
{
return true;
}else{
return "修改失败";
}
}
//上传文献PDF
public function uploadReferencePdf($file,$autoread = false)
{
$configService = $this->serviceManager->get('ConfigService');
$appConfig = $configService->get('application.ini');
$fileUploadService = $this->serviceManager->get('File/Upload');
$fileUploadService->setParams(['file_type' => 'literature']);
$file_info = $fileUploadService($file,$appConfig['reference_save_path'],"","",$fileUploadService::DATETIME_MODEL_Y);
if(isset($file_info['error']) && !empty($file_info['error']))
{
return array("error" => $file_info['error']);
}
if($autoread)
{
$params = compact('file_data');
$results = $this->events()->trigger('upload.insertToReferenceTable', $this, $params);
$cache_data = $results->bottom();
$file_info = array_merge($file_info,$cache_data);
}
return $file_info;
}
//通过文件名自动提取文章标题
public function getReferenceTitleFromFilenName($filename)
{
$file = new Files();
$title = str_replace( ".".$file->getFileTextExt($filename),"",$filename);
return $title;
}
//删除文献文件
public function deleteReferenceAttchment($attid)
{
if(empty($attid) || !is_numeric($attid))
{
return array("error"=>"参数错误");
}
$files = new Files();
$status = $files->delete($attid);
if($status !== true)
{
return array("error"=>$status);
}else{
return array("success"=>1);
}
}
//所有文献
public function fetchAll()
{
$wheresql = array();
if(!empty($this->keyword))
{
$wheresql[] = " ({$this->table->reference}.title LIKE '%{$this->keyword}%' OR {$this->table->reference}.reference LIKE '%{$this->keyword}%') ";
}
if(!empty($this->field))
{
foreach($this->field as $k=>$v)
{
if(!empty($v))
{
if(!is_numeric($v)) $v="'{$v}'";
$wheresql[] = " ({$this->table->reference}.{$k}={$v} ) ";
}else{
if(is_numeric($v))
$wheresql[] = " ({$this->table->reference}.{$k} IS NULL OR {$this->table->reference}.{$k}=0 ) ";
else
$wheresql[] = " ({$this->table->reference}.{$k} IS NULL ) ";
}//if(empty($v)
}//foreach
}
if(count($wheresql)>0)
{
$wheresql = " WHERE ".join(" AND ",$wheresql);
}else{
$wheresql = "";
}
if(empty($this->order))
{
$order = "{$this->table->reference}.title";
}else{
$order = "{$this->table->reference}.{$this->order}";
}
$sql = "SELECT {$this->table->reference}.* FROM
{$this->table->reference}
$wheresql
ORDER BY $order {$this->sort}";
$rs = $this->db->query($sql);
return $rs->fetchAll();
}
//获取专题数据的文献
public function fetchThemeReferences($code)
{
$wheresql = array();
//$wheresql[] = " s.code='$code' ";
if(!empty($this->keyword))
{
$wheresql[] = " (ref.title iLIKE '%{$this->keyword}%' OR ref.reference iLIKE '%{$this->keyword}%') ";
}
if(count($wheresql)>0)
{
$wheresql = " and ".join(" AND ",$wheresql);
}else{
$wheresql = "";
}
if(empty($this->order))
{
$order = "ref.year,ref.title";
}else{
$order = "ref.{$this->order} {$this->sort}";
}
$sql="select distinct ref.* from {$this->table->reference} ref where ref.id in (select r.refid from mdref r
left join datasource ds on r.uuid=ds.uuid left join {$this->table->source} s on s.id=ds.sourceid
where s.code='$code')
$wheresql
ORDER BY $order";
$rs=$this->db->query($sql);
return $rs->fetchAll();
}
//Get WestDC references
public function fetchWestdcReferences()
{
$wheresql = array();
$wheresql[]=" r.uuid='e31f5ea7-a4af-4ae3-9ac1-1a84132c4338' ";
if(!empty($this->keyword))
{
$wheresql[] = " (ref.title LIKE '%{$this->keyword}%' OR ref.reference LIKE '%{$this->keyword}%') ";
}
if(count($wheresql)>0)
{
$wheresql = " WHERE ".join(" AND ",$wheresql);
}else{
$wheresql = "";
}
if(empty($this->order))
{
$order = "ref.year,ref.title";
}else{
$order = "ref.{$this->order} {$this->sort}";
}
$sql="select distinct ref.* from mdref r left join {$this->table->reference} ref on r.refid=ref.id
$wheresql
ORDER BY $order";
$rs=$this->db->query($sql);
return $rs->fetchAll();
}
//Get references which need to deal with
public function fetchTodoReferences()
{
$wheresql = array();
$wheresql[]=" ref.id not in (select distinct refid from mdref) ";
if(!empty($this->keyword))
{
$wheresql[] = " (ref.title LIKE '%{$this->keyword}%' OR ref.reference LIKE '%{$this->keyword}%') ";
}
if(count($wheresql)>0)
{
$wheresql = " WHERE ".join(" AND ",$wheresql);
}else{
$wheresql = "";
}
if(empty($this->order))
{
$order = "ref.year,ref.title";
}else{
$order = "ref.{$this->order} {$this->sort}";
}
$sql="select distinct ref.* from {$this->table->reference} ref
$wheresql
ORDER BY $order";
$rs=$this->db->query($sql);
return $rs->fetchAll();
}
//Get data author references which need to deal with
public function fetchAuthorReferences()
{
$wheresql = array();
$wheresql[] = " ref.ris is NULL ";
$wheresql[]=" ref.id in (select distinct refid from mdref where reftype=0) ";
if(!empty($this->keyword))
{
$wheresql[] = " (ref.title LIKE '%{$this->keyword}%' OR ref.reference LIKE '%{$this->keyword}%') ";
}
if(count($wheresql)>0)
{
$wheresql = " WHERE ".join(" AND ",$wheresql);
}else{
$wheresql = "";
}
if(empty($this->order))
{
$order = "ref.year,ref.title";
}else{
$order = "ref.{$this->order} {$this->sort}";
}
$sql="select distinct ref.* from {$this->table->reference} ref
$wheresql
ORDER BY $order";
$rs=$this->db->query($sql);
return $rs->fetchAll();
}
//Get references by data UUID
public function fetchReferencesByUUID($uuid)
{
$wheresql = array();
$wheresql[]=" r.uuid='$uuid' ";
if(!empty($this->keyword))
{
$wheresql[] = " (ref.title LIKE '%{$this->keyword}%' OR ref.reference LIKE '%{$this->keyword}%') ";
}
if(count($wheresql)>0)
{
$wheresql = " WHERE ".join(" AND ",$wheresql);
}else{
$wheresql = "";
}
if(empty($this->order))
{
$order = "ref.year,ref.title";
}else{
$order = "ref.{$this->order} {$this->sort}";
}
$sql="select distinct ref.*,r.reftype,r.place,r.id as mrid from {$this->table->reference} ref left join {$this->table->metadata_reference} r on ref.id=r.refid
$wheresql
ORDER BY $order";
$rs=$this->db->query($sql);
return $rs->fetchAll();
}
//Get references with data UUID
public function fetchReferencesWithUUID($uuid)
{
$wheresql = array();
//$wheresql[]=" r.uuid='$uuid' ";
if(!empty($this->keyword))
{
$wheresql[] = " (ref.title LIKE '%{$this->keyword}%' OR ref.reference LIKE '%{$this->keyword}%') ";
}
if(count($wheresql)>0)
{
$wheresql = " WHERE ".join(" AND ",$wheresql);
}else{
$wheresql = "";
}
if(empty($this->order))
{
$order = "ref.year,ref.title";
}else{
$order = "ref.{$this->order} {$this->sort}";
}
$sql="select distinct ref.*,r.reftype,r.place,r.id as mrid from {$this->table->reference} ref left join
(select * from {$this->table->metadata_reference} r where uuid='$uuid') r on ref.id=r.refid
$wheresql
ORDER BY $order";
$rs=$this->db->query($sql);
return $rs->fetchAll();
}
//单条文献的信息
public function getOneReferenceData($id)
{
if(empty($id) || !is_numeric($id))
{
return false;
}
$sql = "SELECT * FROM {$this->table->reference} WHERE id=$id LIMIT 1";
$rs = $this->db->query($sql);
$row = $rs->fetch();
if ($row['attid'])
{
$fileService = $this->serviceManager->get('File');
$attfile = $fileService->get($row['attid']);
$row['file'] = $attfile;
}
return $row;
}
//获得reference类型的附件
public function getReferenceFiles()
{
$wheresql = [
"att.filetype='literature'",
];
if(!empty($this->keyword))
{
$wheresql[] = " (att.realname LIKE '%{$this->keyword}%' OR att.filename LIKE '%{$this->keyword}%') ";
}
$wheresql = " WHERE ".join(" AND ",$wheresql);
$sql = "SELECT att.*,ref.attid,ref.id as refid FROM {$this->table->attachments} att
LEFT JOIN {$this->table->reference} ref ON att.id=ref.attid
$wheresql";
$rs = $this->db->query($sql);
$rows = $rs->fetchAll();
return $rows;
}
//删除文献
public function deleteReference($id,$delete_att = false)
{
if(empty($id) || !is_numeric($id))
{
return false;
}
if($delete_att == false)
{
$sql = "DELETE FROM {$this->table->reference} WHERE id=$id";
@$this->db->exec($sql);
$sql = "DELETE FROM {$this->table->metadata_reference} WHERE refid=$id";
@$this->db->exec($sql);
$this->deleteReferenceAuthor($id);
$this->deleteReferenceTag($id);
return true;
}else{
}
}
//删除作者信息
public function deleteReferenceAuthor($id)
{
if(empty($id) || !is_numeric($id))
{
return false;
}
$sql = "DELETE FROM {$this->table->reference_author} WHERE id=$id ";
return $this->db->exec($sql);
}
//删除标签信息
public function deleteReferenceTag($id)
{
if(empty($id) || !is_numeric($id))
{
return false;
}
$sql = "DELETE FROM {$this->table->reference_tag} WHERE id=$id ";
return $this->db->exec($sql);
}
//建立文献与数据的关系
public function createRelationFromReferenceToData($refid,$uuid,$reftype,$place,$id = NULL)
{
if(empty($refid) || !is_numeric($refid))
{
return "参数错误";
}
$tools = $this->serviceManager->get('Tools');
if(!$tools->isUuid($uuid))
{
return "参数错误";
}
$data = array(
'uuid'=>$uuid,
'refid'=>$refid,
'reftype'=>$reftype,
'place'=>$place
);
$dbService = $this->serviceManager->get('Db');
$dbh = $dbService->getDbh();
if(empty($id))
{
$id = $dbh->insert($this->table->metadata_reference,$data,true);
if(is_numeric($id))
{
return $id;
}else{
return "关系写入失败,请检查是否已经存在";
}
}else{
$status = $dbh->update($this->table->metadata_reference,$data," id=$id ");
if($status === true)
{
return $id;
}else{
return "修改失败";
}
}
}
//获得某个文献关联的数据 (根据文献获得数据)
public function getDataByReference($id)
{
if(empty($id) || !is_numeric($id))
{
return "参数错误";
}
$sql = "SELECT mr.id,mr.refid,mr.reftype,mr.place,md.title,md.uuid FROM {$this->table->metadata_reference} mr
LEFT JOIN {$this->table->metadata} md ON mr.uuid=md.uuid
WHERE mr.refid=$id
ORDER BY mr.place ASC";
$rs = $this->db->query($sql);
$rows = $rs->fetchAll();
return $rows;
}
//获得某个数据关联的文献 (根据数据获得文献)
public function getReferenceByData($uuid)
{
if(!view::isUuid($uuid))
{
return "参数错误";
}
$sql = "SELECT mr.reftype,mr.place,md.title,md.uuid FROM {$this->table->metadata_reference} mr
LEFT JOIN {$this->table->metadata} md
WHERE mr.uuid = $uuid";
$rs = $this->db->query($sql);
$rows = $rs->fetchAll();
return $rows;
}
//文献类型
public function referenceType()
{
return array(
0 => '相关文献',//作者建议的文献或数据中心建议的文献
1 => '施引文献',
2 => '参考文献',
3 => '多篇文献',
4 => '专题文献'
);
}
//写入数据文献
public function makeMdref($data,$id = NULL)
{
$results = $this->getEventManager()->trigger('mdref.pre', $this, compact('data'));
$cache_data = $results->bottom();
if($cache_data !== true)
{
return $cache_data;
}
$results = $this->getEventManager()->trigger('mdref.processData', $this, compact('data'));
$data = $results->last();
$id = $this->createRelationFromReferenceToData($data['refid'],$data['uuid'],$data['reftype'],$data['place'],$id);
if(is_numeric($id))
{
return true;
}else{
return $id;
}
}
//删除数据文献
public function delMdref($id)
{
if(empty($id) || !is_numeric($id))
{
return "参数错误";
}
$sql = "DELETE FROM {$this->table->metadata_reference} WHERE id=$id";
if($this->db->exec($sql))
{
return true;
}else{
return "删除失败";
}
}
//按年份获得文献数量
public function countByYear()
{
$sql = "SELECT count(id) as num,year FROM {$this->table->reference} GROUP BY year ORDER BY year DESC";
$rs = $this->db->query($sql);
$rows = $rs->fetchAll();
return $rows;
}
//获得作者
public function getAuthorByReference($id,$join = false)
{
if(is_numeric($id))
{
$sql = "SELECT * FROM {$this->table->reference_author} WHERE id=$id ORDER BY place ASC";
$rs = $this->db->query($sql);
if(!$join)
{
return $rs->fetchAll();
}else{
foreach($rows = $rs->fetchAll() as $k=>$v)
{
$rows[$k] = (string)$v['firstname'].$v['lastname'];
}
return $rows;
}
}
if(is_array($id))
{
$sql = "SELECT * FROM {$this->table->reference_author} WHERE id IN (".join(",",$id).")";
$rs = $this->db->query($sql);
return $rs->fetchAll();
}
return;
}
//获得标签
public function getTagsByReference($id,$single = false)
{
if(is_numeric($id))
{
$sql = "SELECT * FROM {$this->table->reference_tag} WHERE id=$id";
$rs = $this->db->query($sql);
if(!$single)
{
return $rs->fetchAll();
}else{
foreach($rows = $rs->fetchAll() as $k=>$v)
{
$rows[$k] = (string)$v['tag'];
}
return $rows;
}
}
return;
}
//Get data author references
//$ordertype 0: by data, 1: by literature
public function getReferencesByAuthor($uid,$ordertype=0,$reftype=0)
{
$wheresql = array();
$wheresql[] = " a.userid=$uid ";
$wheresql[] = " a.status=1 ";
if(!empty($this->keyword))
{
if($ordertype==0)
{
$wheresql[] = " (md.title LIKE '%{$this->keyword}%' OR md.description LIKE '%{$this->keyword}%') ";
}else{
$wheresql[] = " (ref.title LIKE '%{$this->keyword}%' OR ref.reference LIKE '%{$this->keyword}%') ";
}
}
if(count($wheresql)>0)
{
$wheresql = " WHERE ".join(" AND ",$wheresql);
}else{
$wheresql = "";
}
if($ordertype==0)
{
$order = "md.title";
$sql="SELECT md.title,md.uuid,count(mr.id) as c FROM metadata md
LEFT JOIN (select * from mdref where reftype=$reftype) mr ON md.uuid=mr.uuid
LEFT JOIN mdauthor a ON md.uuid=a.uuid
left join reference ref on mr.refid=ref.id
$wheresql
group by md.title,md.uuid
ORDER BY c desc,$order";
}else{
$order = "ref.title";
$sql="SELECT ref.*,count(mr.uuid) as c FROM metadata md
LEFT JOIN mdref mr ON md.uuid=mr.uuid
LEFT JOIN mdauthor a ON md.uuid=a.uuid
left join reference ref on mr.refid=ref.id
$wheresql and mr.reftype=$reftype
group by ref.id
ORDER BY c desc,$order";
}
$rs=$this->db->query($sql);
return $rs->fetchAll();
}
//Get author references by data uuid
public function getReferencesByAuthorUUID($uid,$uuid)
{
$wheresql = array();
$wheresql[] = " a.userid=$uid ";
$wheresql[] = " a.status=1 ";
$wheresql[] = " mr.uuid='$uuid' ";
if(!empty($this->keyword))
{
$wheresql[] = " (ref.title LIKE '%{$this->keyword}%' OR ref.reference LIKE '%{$this->keyword}%') ";
}
if(count($wheresql)>0)
{
$wheresql = " WHERE ".join(" AND ",$wheresql);
}else{
$wheresql = "";
}
$order = "ref.title";
$sql="SELECT md.title as mdtitle,md.uuid,ref.id,ref.reference,ref.link,mr.place,mr.id as mrid,mr.reftype FROM mdref mr
LEFT JOIN metadata md ON md.uuid=mr.uuid
LEFT JOIN mdauthor a ON md.uuid=a.uuid
left join reference ref on mr.refid=ref.id
$wheresql
order by mr.reftype,mr.place ASC,ref.id DESC,md.ts_created desc";
$rs=$this->db->query($sql);
return $rs->fetchAll();
}
//数据作者修改推荐文献的排序
public function changeOrderByAuthor($uid,$id,$order)
{
$sql="update mdref set place=$order where id=$id and uuid in
(select uuid from mdauthor where status=1 and userid=$uid)";
if($this->db->exec($sql))
{
return true;
}else{
return false;
}
}
//数据作者移除推荐文献
public function removeReferenceByAuthor($uid,$id)
{
$sql = "DELETE FROM mdref WHERE id=$id and uuid in (select uuid from mdauthor where userid=$uid AND status=1)";
if($this->db->exec($sql))
{
return true;
}else{
return false;
}
}
//数据作者添加推荐文献
public function insertMdrefByAuthor($uid,$refid,$uuid,$place,$reftype=0)
{
$sql="select * from mdauthor where status=1 and uuid='$uuid' and userid=$uid";
$rs=$this->db->fetchRow($sql);
if ($rs)
{
$id = $this->createRelationFromReferenceToData($refid,$uuid,$reftype,$place);
if(is_numeric($id))
{
return true;
}else{
return $id;
}
} else {
return false;
}
}
}

333
Westdc/Reference/Ris.php Normal file
View File

@ -0,0 +1,333 @@
<?php
namespace Westdc\Reference;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Westdc\EventModel\AbstractEventManager;
use Westdc\Reference\Listener\RisListener;
use LibRIS\RISReader;
use LibRIS\RISTags;
use LibRIS\RISWriter;
class Ris extends AbstractEventManager implements ServiceManagerAwareInterface
{
protected $serviceManager;
public $table;
public $ris_records = NULL;
private $dbh;
public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
$this->init();
return $this;
}
public function init()
{
$Listener = new RisListener;
$this->getEventManager()->attachAggregate($Listener);
$this->table = new \stdClass;
$this->table->reference = "reference";
$this->table->reference_author = "ref_author";
$this->table->reference_tag = "ref_tag";
}
//ris导入
public function loadout()
{
$file = $this->uploadRisFile();
$text = $this->loadRisText();
if(empty($text) && $file === false)
{
return "导入失败请选择要导入的文件或直接使用ris文本";
}
$records = array();
if($file !== false)
{
$records = array_merge($records,$this->processRis($file,NULL));
}
if(!empty($text))
{
$records = array_merge($records,$this->processRis(NULL,$text));
}
$this->ris_records = $records;
$data = $this->reBuildRisArray($records);
return $data;
}
//上传RIS文件
public function uploadRisFile()
{
if(!isset($_FILES['Filedata']))
{
return;
}
$file = $_FILES['Filedata'];
if (@is_uploaded_file($file['tmp_name']) === false) {
return;
}
return $file;
}
//文本直接导入
public function loadRisText()
{
if(!isset($_REQUEST['ristext']))
{
return;
}
$text = $_REQUEST['ristext'];
return $text;
}
//处理ris文件
public function processRis($file = NULL,$text = NULL)
{
$ris = new RISReader();
if(!empty($file) && empty($text))
{
$ris->parseFile($file['tmp_name']);
}else{
$ris->parseString($text);
}
$records = $ris->getRecords();
return $records;
}
//对解析过的数据进行编排
public function reBuildRisArray($records)
{
$data = array();
foreach($records as $k=>$ref)
{
$data[$k] = array();
foreach($ref as $index=>$value)
{
if(isset($this->attr[$index]))
{
$index_name = $this->attr[$index];
if(count($value) > 1)
{
$data[$k][$index_name] = array();
foreach($value as $item)
{
$data[$k][$index_name][] = $item;
}
}else{
$data[$k][$index_name] = $value[0];
}
}
}
}
unset($records);
return $data;
}
//将解析好的ris数据写入数据库
public function pushToDataTable($data){
if(!is_array($data) || count($data) < 1)
{
return false;
}
$dbService = $this->serviceManager->get('Db');
$dbh = $this->dbh = $dbService->getDbh();
foreach($data as $k=>$ref)
{
if (is_null($ref['title']))
{
return;
}
@$tags = $ref['tags'];
@$author = $ref['author'];
$ref['ris'] = $this->makeRisData(array(0=>$this->ris_records[$k]));
$results = $this->getEventManager()->trigger('checkLoad', $this, compact('ref'));
$id = $results->bottom();
if ($id > 0)
{
$this->unsetVar($ref);
$this->getEventManager()->trigger('delete.after', $this, compact('id'));
unset($ref['reference']);
$dbh->update($this->table->reference,$ref," id=$id ");
} else {
$ref['reference'] = $this->makeReferenceFlag($ref);
$this->unsetVar($ref);
$id = $dbh->insert($this->table->reference,$ref,true);
}
$this->insertTags($id,$tags);
$this->insertAuthor($id,$author);
}
}
//更新单个reference的RIS
public function updateWithRis($id,$ref)
{
if(empty($id) || !is_numeric($id))
{
return false;
}
if (is_null($ref['title']))
{
return;
}
@$tags = $ref['tags'];
@$author = $ref['author'];
$ref['ris'] = $this->makeRisData(array(0=>$this->ris_records[0]));
$this->getEventManager()->trigger('delete.after', $this, compact('id'));
$this->getEventManager()->trigger('delete.after', $this, compact('id'));
$this->unsetVar($ref);
if(isset($ref['reference'])) unset($ref['reference']);
$dbService = $this->serviceManager->get('Db');
$this->dbh = $dbh = $dbService->getDbh();
if($dbh->update($this->table->reference,$ref," id=$id "))
{
$this->insertTags($id,$tags);
$this->insertAuthor($id,$author);
return true;
}else{
return false;
}
}
//写入标签
public function insertTags($id,$tags){
if(is_array($tags) && count($tags) > 0)
{
foreach($tags as $v)
{
$this->dbh->insert($this->table->reference_tag,array('id'=>$id,'tag'=>$v));
}
return true;
}else{
return false;
}
}
//写入作者
public function insertAuthor($id,$author)
{
$index = 0;
if(is_array($author) && count($author) > 0)
{
foreach($author as $v)
{
$index ++ ;
$author_splited = $this->splitAuthor($v);
$this->dbh->insert($this->table->reference_author,array('id'=>$id , 'lastname'=>$author_splited['lastname'] , 'firstname'=>$author_splited['firstname'] , 'place'=>$index ));
}
return true;
}else{
if(is_string($author))
{
$author_splited = $this->splitAuthor($author);
$this->dbh->insert($this->table->reference_author,array('id'=>$id , 'lastname'=>$author_splited['lastname'] , 'firstname'=>$author_splited['firstname'] , 'place'=>0 ));
}
return false;
}
}
//创建ris格式的数据
public function makeRisData($ref)
{
$ris_writer = new RISWriter();
return $ris_writer->writeRecords($ref);
}
//创建reference 字段
public function makeReferenceFlag($ref){
$str='';
if(is_array($ref['author']) && count($ref['author']) > 0)
{
$str .= join(', ',$ref['author']).'. ';
} else if (is_string($ref['author'])) {
$str .= $ref['author'].'. ';
}
$str .= $ref['title'].'. ';
$str .= $ref['publisher'].', ';
isset($ref['year']) ? $str .= $ref['year'].', ':"";
isset($ref['volume']) ? $str .= $ref['volume']:"";
isset($ref['issue']) ? $str .= '('.$ref['issue'].')':"";
isset($ref['pages']) ? $str .= ':'.$ref['pages']:"";
isset($ref['endpage'])? $str .= '-'.$ref['endpage']:"";
isset($ref['doi']) ? $str .= '. doi:'.$ref['doi'] : "";
return $str;
}
//卸载不需要的变量
public function unsetVar(&$ref)
{
unset($ref['pages']);
unset($ref['endpage']);
unset($ref['issue']);
unset($ref['volume']);
unset($ref['tags']);
unset($ref['author']);
}
//将作者名字分割为数组
public function splitAuthor($author){
if(preg_match("/\,/",$author))
{
$arr = explode(",",$author);
return array(
'lastname' => trim($arr[0]),
'firstname' => trim($arr[1])
);
}else{
return array(
'firstname' => '',
'lastname' => trim($author)
);
}
}
public $attr = array(
'TY' => 'type',
'TI' => 'title',
'AU' => 'author',
'PY' => 'year',
'LA' => 'language',
'KW' => 'tags',
'AB' => 'abstract',
'DO' => 'doi',
'T2' => 'publisher',
'VL' => 'volume',
'IS' => 'issue',
'SP' => 'pages',
'EP' => 'endpage'
);
}

View File

@ -0,0 +1,139 @@
<?php
namespace Westdc\Reference;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use LibRIS\RISReader;
use LibRIS\RISTags;
use LibRIS\RISWriter;
class RisExport implements ServiceManagerAwareInterface
{
protected $serviceManager;
private $table;
private $db;
public $ris_records = NULL;
protected $ris;
public $attr;
public $attr_flip;
public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
$this->init();
return $this;
}
public function init()
{
$this->table = new \stdClass;
$this->table->reference = "reference";
$dbService = $this->serviceManager->get('Db');
$this->db = $dbService->getPdo();
}
//读取数据
public function preRead($mode = "all")
{
if($mode == "all")
{
$sql = "SELECT * FROM {$this->table->reference} where length(ris)<10 or ris is null ORDER BY year DESC,title ASC,id ASC";
$rs = $this->db->query($sql);
return $rs->fetchAll();
}
}//preRead
//将数据组成RIS数组格式
public function processArrayDataToRisData($arrayData,$risPrior = true,$mixAuthor = true,$mixTags = true)
{
if(!is_array($arrayData))
{
return false;
}
$risData = array();
if($risPrior === true)
{
$risReader = new RISReader();
}
$this->ris = $this->serviceManager->get('Reference/Ris');
$this->attr = $this->ris->attr;
$this->attr_flip = array_flip($this->ris->attr);
unset($this->ris);
$this->reference = $this->serviceManager->get('Reference');
foreach($arrayData as $k=>$v)
{
$risData[$k] = $this->transformToRis($v);
if($mixAuthor === true || $mixTags === true)
{
if($mixAuthor === true)
{
$author = $this->reference->getAuthorByReference($v['id'],true);
if(is_array($author) && count($author)>0)
{
$risData[$k] = array_merge($risData[$k],array("AU"=>$author));
}
unset($author);
}//mixAuthor
if($mixTags === true)
{
$tags = $this->reference->getTagsByReference($v['id'],true);
if(is_array($tags) && count($tags) > 0)
{
$risData[$k] = array_merge($risData[$k],array("KW"=>$tags));
}
unset($tags);
}
}
if(!is_array($risData[$k]) || count($risData[$k]) < 1)
{
unset($risData[$k]);
}
unset($arrayData[$k]);
}
return $risData;
}//processArrayDataToRisData
//单条记录的整编
public function transformToRis($record)
{
$arr = array();
foreach($record as $k=>$v)
{
if(!empty($v))
{
if(isset($this->attr_flip[$k]))
{
//echo $k ."-". $this->attr_flip[$k] . '-' .$v;
//echo "<br />";
$arr[$this->attr_flip[$k]] = array(0=>$v);
}
}
}
//echo "<br />";
return $arr;
}//transformToRis
//输出成文件
public function output($risData)
{
$risWirte = new RISWriter();
return @$risWirte->writeRecords($risData);
}//output
}

260
Westdc/Review/Review.php Normal file
View File

@ -0,0 +1,260 @@
<?php
/**
* Created by PhpStorm.
* User: liujin834
* Date: 15/1/1
* Time: 下午8:04
*/
namespace Westdc\Review;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Westdc\EventModel\AbstractEventManager;
class Review extends AbstractEventManager implements ServiceManagerAwareInterface{
protected $serviceManager;
public $opt,$orderSql = "",$limitSql = "",$sortSql = "";
const REVIEW_STATUS_CANCELED = -1; //取消评审
const REVIEW_STATUS_DEFAULT = 0; //初始状态
const REVIEW_STATUS_ACCEPT = 1; //接收元数据,进入评审状态
const REVIEW_STATUS_EXPERT_INVITED = 2; //开始邀请专家
const REVIEW_STATUS_EXPERT_ACCEPT = 3; //专家接受邀请
const REVIEW_STATUS_EXPERT_FEEDBACK = 4; //专家有反馈
const REVIEW_STATUS_PUBLISH = 5; //已发布
public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
$this->init();
return $this;
}
private function init(){
$dbService = $this->serviceManager->get('Db');
$this->db = $dbService->getPdo();
unset($dbService);
$this->opt = new \stdClass;
}
/**
* 处理sql中用到的排序limit等语句
*/
private function processOptions()
{
if(isset($this->opt->limit) && $this->opt->limit > 0)
$this->limitSql = "LIMIT {$this->opt->limit}";
if(isset($this->opt->order) && !empty($this->opt->order)) {
$this->orderSql = "ORDER BY {$this->opt->order}";
if (isset($this->opt->sortSql) && !empty($this->opt->sortSql))
$this->sortSql = "{$this->opt->sort}";
else
$this->sortSql = "DESC";
}
}
/**
* 获得最新的数据
* @return mixed
*/
public function getLatest()
{
$this->processOptions();
$sql = "select m.id,md.title,u.username,u.realname,m.status from mdstatus m
right join metadata md on md.uuid=m.uuid
left join users u on u.id=m.userid
order by m.id desc
{$this->limitSql}";
$rs = $this->db->query($sql);
return $rs->fetchAll();
}//getLatest()
/**
* 获得管理员负责的评审
* @param $userId
* @return mixed
*/
public function getAdminReview($userId)
{
$this->processOptions();
$sql = "select m.id,md.title,u.username,u.realname,m.status from mdstatus m
right join metadata md on md.uuid=m.uuid
left join users u on u.id=m.userid
where u.id='$userId'
{$this->limitSql}";
$rs = $this->db->query($sql);
return $rs->fetchAll();
} //getAdminReview
/**
* 投稿元数据
* @return mixed
*/
public function getDraft(){
$this->processOptions();
$searchJoin = "";
if(isset($this->opt->keyword) && !empty($this->opt->keyword))
{
$searchJoin = " AND md.title LIKE '%{$this->opt->keyword}%'";
}
if(empty($this->orderSql))
{
$this->orderSql = "ORDER BY m.ts_created DESC";
}
$sql = "SELECT m.id,md.title,md.uuid,u.username,u.realname,m.status,m.ts_created,gn.id as gnid FROM mdstatus m
RIGHT JOIN metadata md ON md.uuid=m.uuid
LEFT JOIN users u ON u.id=m.userid
LEFT JOIN geonetworkmetadata gn ON m.uuid=gn.uuid
WHERE m.status=0 $searchJoin
{$this->orderSql} {$this->sortSql}
{$this->limitSql}";
$rs = $this->db->query($sql);
return $rs->fetchAll();
}//getDraft()
/**
* 取消评审
* @param $id
* @return bool
*/
public function cancel($id){
if(!is_numeric($id) || $id<1)
return false;
return $this->changeStatus($id,self::REVIEW_STATUS_CANCELED);
}
/**
* 接收投稿的元数据
* @param $id
* @return bool
*/
public function accept($id){
if($this->getStatus($id) != self::REVIEW_STATUS_DEFAULT)
return [
'评审状态错误,有可能的错误是:',
'此评审已被取消,请到<b>已取消评审的元数据</b>中将其重置',
'此评审已经被接收',
'此评审已经处于待分配责任编辑、邀请专家、等待专家评审、已通过评审的状态中'
];
$status = $this->changeStatus($id,self::REVIEW_STATUS_ACCEPT);
if(false === $status){
return false;
}
$authorEmail = $this->getAuthor($id);
foreach($authorEmail as $v)
{
$mailSender = $this->serviceManager->get('Mail/Sender');
$mailSender->backend([
'email' => $v['email'],
'name' => !empty($v['realname']) ? $v['realname']:$v['username'],
'template' => 'review-new-accept',
'data' => [
'uuid' => $v['uuid'],
'title' => $v['title'],
]
]);
}
return true;
}//accept($id)
/**
* 获得某条评审涉及的元数据相关作者信息email,元数据标题uuid)
* @param $id
* @return mixed
*/
public function getAuthor($id){
$sql = "SELECT DISTINCT u.email,u.realname,u.username,m.title,m.uuid FROM mdstatus s
LEFT JOIN metadata m ON s.uuid=m.uuid
RIGHT JOIN mdauthor a ON s.uuid=a.uuid
LEFT JOIN users u ON a.userid=u.id
WHERE s.id=$id
ORDER BY u.email";
$rs = $this->db->query($sql);
return $rs->fetchAll(\PDO::FETCH_ASSOC);
}
public function reset($id){
}
/**
* 更改mdstatus中的status字段
* @param $id
* @param $status
* @return bool
*/
function changeStatus($id,$status){
$statusValues = array(
self::REVIEW_STATUS_CANCELED, //取消评审
self::REVIEW_STATUS_DEFAULT, //初始状态
self::REVIEW_STATUS_ACCEPT, //接受元数据评审,进入评审阶段
self::REVIEW_STATUS_EXPERT_INVITED, //开始邀请专家,送审阶段
self::REVIEW_STATUS_EXPERT_ACCEPT, //专家接受邀请,在审阶段
self::REVIEW_STATUS_EXPERT_FEEDBACK,//专家反馈,在审
self::REVIEW_STATUS_PUBLISH, //评审结束,发布
6,7
);
if(empty($id) || !isset($status) || !in_array($status,$statusValues))
{
return false;
}
else
{
if($status==1)
{$sql = "update mdstatus set status='$status',ts_accepted='now()' where id in ($id)"; }
else if($status==5)
{$sql = "update mdstatus set status='$status',ts_finished='now()' where id in ($id)";}
else
{$sql = "update mdstatus set status='$status' where id in ($id)";}
try{
if($this->db->exec($sql)>0)
{
return true;
}
}
catch(\Exception $e)
{
return false;
}
}
}//changestatus 更改状态
/**
* 获取mdstatus表中的status字段
* @param $id
* @return mixed
*/
public function getStatus($id)
{
$sql = "SELECT status FROM mdstatus WHERE id=$id";
$rs = $this->db->query($sql);
return $rs->fetchColumn(0);
}
}

View File

@ -0,0 +1,14 @@
<?php
/**
* Created by PhpStorm.
* User: liujin834
* Date: 14/12/14
* Time: 下午8:51
*/
namespace Westdc\Service\ServiceAgent;
class ConfigService extends Config{
}

View File

@ -0,0 +1,17 @@
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2014/11/4
* Time: 11:23
*/
namespace Westdc\Service\ServiceAgent;
use Westdc\User\User as Westdc_User;
class User extends Westdc_User
{
}

View File

@ -12,8 +12,31 @@ use Zend\ServiceManager\AbstractFactoryInterface;
class ServiceFactory implements AbstractFactoryInterface{
private $invokedService;
private $invokedNames;
private $currentServiceType;
function __construct()
{
$this->invokedService = $this->getInvokedServiceFromConfig();
$this->invokedNames = array_keys($this->invokedService);
}
private function getInvokedServiceFromConfig()
{
return include dirname(__FILE__) . "/service.lazy.config.php";
}
public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
{
if(!is_array($this->invokedService))
throw new \RuntimeException('lazy services not found');
if(in_array($requestedName , $this->invokedNames))
{
$this->currentServiceType = "lazy";
return true;
}
$serviceAgentDir = __DIR__ . "/ServiceAgent";
@ -24,6 +47,7 @@ class ServiceFactory implements AbstractFactoryInterface{
while(false !== ($file = readdir($handle)))
{
if(substr($file,0,strlen($file)-4) == (string)$requestedName) {
$this->currentServiceType = "agent";
return true;
}
}
@ -36,13 +60,30 @@ class ServiceFactory implements AbstractFactoryInterface{
public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
{
$serviceName = __NAMESPACE__ . "\\ServiceAgent\\" . $requestedName;
switch($this->currentServiceType)
{
case 'lazy':
$service = new $this->invokedService[$requestedName];
$service = new $serviceName;
$service->WESTDC_SERVICE_TYPE = "lazy";
$service->WESTDC_SERVICE_NAME = $requestedName;
$service->name = $requestedName;
return $service;
case 'agent':
$serviceName = __NAMESPACE__ . "\\ServiceAgent\\" . $requestedName;
$service = new $serviceName;
$service->WESTDC_SERVICE_TYPE = "agent";
$service->WESTDC_SERVICE_NAME = $requestedName;
return $service;
}
return $service;
}
}

View File

@ -16,8 +16,15 @@ class ServiceManager {
function __construct()
{
$this->serviceManager = new Zend_ServiceManager();
$this->serviceManager = new Zend_ServiceManager;
$this->serviceManager->addAbstractFactory(new ServiceFactory);
$configService = $this->serviceManager->get('ConfigService');
$invoked_services = $configService->get('service.invoked.ini');
foreach($invoked_services as $k=>$v) {
$this->serviceManager->setInvokableClass($k, $v);
}
}
public function addKey($key,$value = "")

View File

@ -0,0 +1,4 @@
<?php
return array(
'Tools' => 'Westdc\Helpers\Tools'
);

View File

@ -375,12 +375,17 @@ class Account implements EventManagerAwareInterface
$mail_data = array(
'name'=>$row['realname'],
);
$mail = new Mail();
$mail->loadTemplate($mail_template,$mail_data);
$mail->addTo($row['email'],$row['realname']);
$mail->send();
return true;
try {
$mail = new Mail();
$mail->loadTemplate($mail_template, $mail_data);
$mail->addTo($row['email'], $row['realname']);
$mail->send();
return true;
}catch(\Exception $e){
}
}

View File

@ -1,135 +0,0 @@
<?php
namespace Westdc\User;
use Westdc\Helpers\Config;
use Westdc\Db\PDO as Db;
class Cookie
{
var $ck='Dxe8SqIcmyUf';
var $db; //传入PDO对象
var $mid; //会员ID
public $scr; //cookie 安全码 $_COOKIE['scr']
public $user;//cookie User $_COOKIE['user']
public $srpwd;//执行checkcookie后方可调用
public $memberTable = "users";
public $FieldUsername = "username";
public $FieldPasword = "password";
public $FieldLastlogin = "ts_last_login";
public $FieldEmail = "email";
public $FieldLastloginIp = "last_login_ip";
public $GravatarEmailField = "gravatar_email";
public $RoleMember = "member";
function __construct()
{
$this->db = new Db();
$this->config = Config::get();
if(!empty($_COOKIE['scr']))
{
$this->scr = $_COOKIE['scr'];
}
if(!empty($_COOKIE['user']))
{
$this->user= $_COOKIE['user'];
}
}
/**
* 检测cookie
*/
public function checkcookie()
{
$uname = $this->user;
$hash = $this->scr;
if(!empty($uname) && !empty($hash))
{
if (preg_match("/[<|>|#|$|%|^|*|(|)|{|}|'|\"|;|:]/i",$uname) || preg_match("/[<|>|#|$|%|^|*|(|)|{|}|'|\"|;|:]/i",$hash))
{
$this->mid=0;
return false;
}
else{
$sql = "select {$this->FieldUsername} as userid,{$this->FieldPasword} as pwd from {$this->memberTable} where {$this->FieldUsername}='$uname'";
$rs = $this->db->query($sql);
$row = $rs->fetch();
$scr = $this->makescr($row['userid'],$row['pwd']);
if($hash == $scr)
{
$this->srpwd=$row['pwd'];
return true;
}
else {
return false;
}
}//cookie安全
}else {
return false;
}//exit
}//function checkcookie
/**
* putcookie
*
* 登陆成功后放置cookie包含安全码
*
* @param String $uname
* @param String $pwd
* @param Int $time
*/
public function putcookie($uname,$pwd,$time = 604800)
{
try {
$scrString = $this->makescr($uname,$pwd);//加密验证串:防止用户密码被盗防止伪造cookie。
if(!is_numeric($time))
{
$time = 604800;
}
setcookie('user',$uname,time()+$time,'/');
setcookie('scr',$scrString,time()+$time,'/');
return true;
} catch (Exception $e) {
return false;
}
}//function putcookie
/**
* 生成安全码
*
* @param String $u
* @param String $p
*/
public function makescr($u,$p)
{
return substr(md5($u.$p.$this->ck),3,20);
}
/**
* 清除cookie
*/
static function flushcookie()
{
setcookie('user','',time()-99999,'/');
setcookie('scr','',time()-99999,'/');
}
public function getUser()
{
$sql = "SELECT * FROM ".$this->memberTable." m ORDER BY m.id DESC";
$rs = $this->db->query($sql);
return $rs->fetchAll();
}
}

View File

@ -1,135 +0,0 @@
<?php
namespace Sookon\User;
use Sookon\Helpers\Config;
use Sookon\Helpers\PDO as Db;
class Member
{
var $ck='Dxe8SqIcmyUf';
var $db; //传入PDO对象
var $mid; //会员ID
public $scr; //cookie 安全码 $_COOKIE['scr']
public $user;//cookie User $_COOKIE['user']
public $srpwd;//执行checkcookie后方可调用
public $memberTable = "tbl_member";
public $FieldUsername = "username";
public $FieldPasword = "password";
public $FieldLastlogin = "ts_last_login";
public $FieldEmail = "email";
public $FieldLastloginIp = "last_login_ip";
public $GravatarEmailField = "gravatar_email";
public $RoleMember = "member";
function __construct()
{
$this->db = new Db();
$this->config = Config::get();
if(!empty($_COOKIE['scr']))
{
$this->scr = $_COOKIE['scr'];
}
if(!empty($_COOKIE['user']))
{
$this->user= $_COOKIE['user'];
}
}
/**
* 检测cookie
*/
public function checkcookie()
{
$uname = $this->user;
$hash = $this->scr;
if(!empty($uname) && !empty($hash))
{
if (preg_match("/[<|>|#|$|%|^|*|(|)|{|}|'|\"|;|:]/i",$uname) || preg_match("/[<|>|#|$|%|^|*|(|)|{|}|'|\"|;|:]/i",$hash))
{
$this->mid=0;
return false;
}
else{
$sql = "select {$this->FieldUsername} as userid,{$this->FieldPasword} as pwd from {$this->memberTable} where {$this->FieldUsername}='$uname'";
$rs = $this->db->query($sql);
$row = $rs->fetch();
$scr = $this->makescr($row['userid'],$row['pwd']);
if($hash == $scr)
{
$this->srpwd=$row['pwd'];
return true;
}
else {
return false;
}
}//cookie安全
}else {
return false;
}//exit
}//function checkcookie
/**
* putcookie
*
* 登陆成功后放置cookie包含安全码
*
* @param String $uname
* @param String $pwd
* @param Int $time
*/
public function putcookie($uname,$pwd,$time = 604800)
{
try {
$scrString = $this->makescr($uname,$pwd);//加密验证串:防止用户密码被盗防止伪造cookie。
if(!is_numeric($time))
{
$time = 604800;
}
setcookie('user',$uname,time()+$time,'/');
setcookie('scr',$scrString,time()+$time,'/');
return true;
} catch (Exception $e) {
return false;
}
}//function putcookie
/**
* 生成安全码
*
* @param String $u
* @param String $p
*/
public function makescr($u,$p)
{
return substr(md5($u.$p.$this->ck),3,20);
}
/**
* 清除cookie
*/
static function flushcookie()
{
setcookie('user','',time()-99999,'/');
setcookie('scr','',time()-99999,'/');
}
public function getUser()
{
$sql = "SELECT * FROM ".$this->memberTable." m ORDER BY m.id DESC";
$rs = $this->db->query($sql);
return $rs->fetchAll();
}
}

54
Westdc/User/Status.php Normal file
View File

@ -0,0 +1,54 @@
<?php
/**
* Created by PhpStorm.
* User: Li Jianxuan
* Date: 14-9-19
* Time: 下午3:21
*/
namespace Westdc\User;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
class Status implements ServiceManagerAwareInterface{
protected $serviceManager;
private $db;
public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
$this->init();
return $this;
}
private function init()
{
$dbService = $this->serviceManager->get('Db');
$this->db = $dbService->getPdo();
}
public function getUserCount(){
$sql="select count(id) as total from users";
$uq=$this->db->query($sql);
return $uq->fetchColumn(0);
}
public function getAdminCount(){
$sql="select count(id) as total from users where usertype='administrator'";
$uq=$this->db->query($sql);
return $uq->fetchColumn(0);
}
}

View File

@ -8,8 +8,39 @@
namespace Westdc\User;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Westdc\EventModel\AbstractEventManager;
class User extends AbstractEventManager implements ServiceManagerAwareInterface{
protected $serviceManager;
private $db;
public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
$this->init();
return $this;
}
private function init()
{
$dbService = $this->serviceManager->get('Db');
$this->db = $dbService->getPdo();
}
public function fetchAll(){
$sql = "select * from users where usertype = 'member'";
$rs = $this->db->query($sql);
return $rs->fetchAll(\PDO::FETCH_ASSOC);
class User {
}
}

View File

@ -1,32 +0,0 @@
<?php
/**
* Created by PhpStorm.
* User: Li Jianxuan
* Date: 14-9-19
* Time: 下午4:23
*/
namespace Westdc\User;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
class UserService implements ServiceManagerAwareInterface{
/**
* @var ServiceManager
*/
protected $serviceManager;
/**
* @param ServiceManager $serviceManager
* @return service
*/
public function setServiceManager(ServiceManager $serviceManager)
{
$this->serviceManager = $serviceManager;
return $this;
}
}