* convert to unix format.
This commit is contained in:
@@ -1,45 +1,45 @@
|
||||
@ECHO OFF
|
||||
:READ
|
||||
:: SET /P prompts for input and sets the variable
|
||||
:: to whatever the user types
|
||||
SET path=
|
||||
SET suffix=\php.exe
|
||||
SET currentFile=%0
|
||||
SET /P path=Input the path PHP:
|
||||
::ȷ<><C8B7>·<EFBFBD><C2B7><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>\php.exe
|
||||
IF EXIST %path%%suffix% GOTO ONLYDIR
|
||||
IF EXIST %path% GOTO FULLPATH
|
||||
ECHO "%path%" is not valid. Please try again.
|
||||
ECHO.
|
||||
GOTO READ
|
||||
:FULLPATH
|
||||
::·<><C2B7>ȥ<EFBFBD><C8A5>\php.exe
|
||||
if /I %path:~-8% == %suffix% set path=%path:~0,-8%
|
||||
:ONLYDIR
|
||||
::<3A><><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
|
||||
set path=%path%%suffix%
|
||||
set TMPFILE=%random%.tmp
|
||||
set currentFile=%currentFile:~-11%
|
||||
for /r %~dp0 %%i in (*.bat) do (
|
||||
if exist %TMPFILE% (del /f/q %TMPFILE%)
|
||||
::<3A>ų<EFBFBD><C5B3><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||
if not %~dp0%currentFile%==%%i (
|
||||
echo Change %%i
|
||||
for /f "tokens=1,2* delims= " %%j in (%%i) do (
|
||||
::<3A><EFBFBD><DEB8>ļ<EFBFBD><C4BC>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
if exist %%k (if "%%l"=="" (echo %path% %%k>>%TMPFILE%) else (echo %path% %%k %%l>>%TMPFILE%)) else (if "%%k"=="" (echo %%j>>%TMPFILE%) else if "%%l"=="" (echo %%j %%k>>%TMPFILE%) else (echo %%j %%k %%l>>%TMPFILE%))
|
||||
)
|
||||
move /y %TMPFILE% "%%i"
|
||||
)
|
||||
)
|
||||
cd ..\
|
||||
echo Change ztcli.bat
|
||||
::<3A><EFBFBD>ztcli.bat
|
||||
if exist %TMPFILE% (del /f/q %TMPFILE%)
|
||||
for /f "tokens=1,2* delims= " %%j in (ztcli.bat) do (
|
||||
::<3A><EFBFBD><DEB8>ļ<EFBFBD><C4BC>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
if exist %%k (if "%%l"=="" (echo %path% %%k>>%TMPFILE%) else (echo %path% %%k %%l>>%TMPFILE%)) else (if "%%k"=="" (echo %%j>>%TMPFILE%) else if "%%l"=="" (echo %%j %%k>>%TMPFILE%) else (echo %%j %%k %%l>>%TMPFILE%))
|
||||
)
|
||||
move /y %TMPFILE% "ztcli.bat"
|
||||
echo Success!
|
||||
pause
|
||||
@ECHO OFF
|
||||
:READ
|
||||
:: SET /P prompts for input and sets the variable
|
||||
:: to whatever the user types
|
||||
SET path=
|
||||
SET suffix=\php.exe
|
||||
SET currentFile=%0
|
||||
SET /P path=Input the path PHP:
|
||||
::ȷ<><C8B7>·<EFBFBD><C2B7><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>\php.exe
|
||||
IF EXIST %path%%suffix% GOTO ONLYDIR
|
||||
IF EXIST %path% GOTO FULLPATH
|
||||
ECHO "%path%" is not valid. Please try again.
|
||||
ECHO.
|
||||
GOTO READ
|
||||
:FULLPATH
|
||||
::·<><C2B7>ȥ<EFBFBD><C8A5>\php.exe
|
||||
if /I %path:~-8% == %suffix% set path=%path:~0,-8%
|
||||
:ONLYDIR
|
||||
::<3A><><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
|
||||
set path=%path%%suffix%
|
||||
set TMPFILE=%random%.tmp
|
||||
set currentFile=%currentFile:~-11%
|
||||
for /r %~dp0 %%i in (*.bat) do (
|
||||
if exist %TMPFILE% (del /f/q %TMPFILE%)
|
||||
::<3A>ų<EFBFBD><C5B3><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||
if not %~dp0%currentFile%==%%i (
|
||||
echo Change %%i
|
||||
for /f "tokens=1,2* delims= " %%j in (%%i) do (
|
||||
::<3A><EFBFBD><DEB8>ļ<EFBFBD><C4BC>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
if exist %%k (if "%%l"=="" (echo %path% %%k>>%TMPFILE%) else (echo %path% %%k %%l>>%TMPFILE%)) else (if "%%k"=="" (echo %%j>>%TMPFILE%) else if "%%l"=="" (echo %%j %%k>>%TMPFILE%) else (echo %%j %%k %%l>>%TMPFILE%))
|
||||
)
|
||||
move /y %TMPFILE% "%%i"
|
||||
)
|
||||
)
|
||||
cd ..\
|
||||
echo Change ztcli.bat
|
||||
::<3A><EFBFBD>ztcli.bat
|
||||
if exist %TMPFILE% (del /f/q %TMPFILE%)
|
||||
for /f "tokens=1,2* delims= " %%j in (ztcli.bat) do (
|
||||
::<3A><EFBFBD><DEB8>ļ<EFBFBD><C4BC>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
if exist %%k (if "%%l"=="" (echo %path% %%k>>%TMPFILE%) else (echo %path% %%k %%l>>%TMPFILE%)) else (if "%%k"=="" (echo %%j>>%TMPFILE%) else if "%%l"=="" (echo %%j %%k>>%TMPFILE%) else (echo %%j %%k %%l>>%TMPFILE%))
|
||||
)
|
||||
move /y %TMPFILE% "ztcli.bat"
|
||||
echo Success!
|
||||
pause
|
||||
|
||||
@@ -1,60 +1,60 @@
|
||||
<?php
|
||||
/**
|
||||
* The control file of common module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2013 QingDao Nature Easy Soft Network Technology Co,LTD (www.cnezsoft.com)
|
||||
* @license LGPL (http://www.gnu.org/licenses/lgpl.html)
|
||||
* @author Chen congzhi <congzhi@cnezsoft.com>
|
||||
* @package common
|
||||
* @version $Id$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
include '../../config/config.php';
|
||||
|
||||
$modules = array();
|
||||
$moduleRoot = realpath('../../module/') . '/';
|
||||
|
||||
if(is_dir($moduleRoot))
|
||||
{
|
||||
if($dh = opendir($moduleRoot))
|
||||
{
|
||||
while($module = readdir($dh))
|
||||
{
|
||||
if(strpos(basename($module), '.') === false) $modules[] = $module;
|
||||
}
|
||||
closedir($dh);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
die("The module you input does not exist. \n");
|
||||
}
|
||||
|
||||
foreach($modules as $module)
|
||||
{
|
||||
/* 设定各个目录。*/
|
||||
$extRoot = $moduleRoot . DIRECTORY_SEPARATOR. $module . DIRECTORY_SEPARATOR . 'ext';
|
||||
$extControl = $extRoot . DIRECTORY_SEPARATOR . 'control';
|
||||
$extModel = $extRoot . DIRECTORY_SEPARATOR . 'model';
|
||||
$extView = $extRoot . DIRECTORY_SEPARATOR . 'view';
|
||||
$extConfig = $extRoot . DIRECTORY_SEPARATOR . 'config';
|
||||
$extLang = $extRoot . DIRECTORY_SEPARATOR . 'lang' . DIRECTORY_SEPARATOR;
|
||||
|
||||
/* 建立各个扩展目录 */
|
||||
if(!file_exists($extRoot)) mkdir($extRoot, 0777);
|
||||
if(!file_exists($extControl)) mkdir($extControl, 0777);
|
||||
if(!file_exists($extModel)) mkdir($extModel, 0777);
|
||||
if(!file_exists($extView)) mkdir($extView, 0777);
|
||||
if(!file_exists($extConfig)) mkdir($extConfig, 0777);
|
||||
if(!file_exists($extLang)) mkdir($extLang, 0777);
|
||||
|
||||
/* 创建语言目录。*/
|
||||
$langs = array_keys($config->langs);
|
||||
foreach($langs as $lang)
|
||||
{
|
||||
$langPath = $extLang . $lang;
|
||||
if(!file_exists($langPath)) mkdir($langPath, 0777);
|
||||
}
|
||||
|
||||
echo "init $module ... \n";
|
||||
}
|
||||
<?php
|
||||
/**
|
||||
* The control file of common module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2013 QingDao Nature Easy Soft Network Technology Co,LTD (www.cnezsoft.com)
|
||||
* @license LGPL (http://www.gnu.org/licenses/lgpl.html)
|
||||
* @author Chen congzhi <congzhi@cnezsoft.com>
|
||||
* @package common
|
||||
* @version $Id$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
include '../../config/config.php';
|
||||
|
||||
$modules = array();
|
||||
$moduleRoot = realpath('../../module/') . '/';
|
||||
|
||||
if(is_dir($moduleRoot))
|
||||
{
|
||||
if($dh = opendir($moduleRoot))
|
||||
{
|
||||
while($module = readdir($dh))
|
||||
{
|
||||
if(strpos(basename($module), '.') === false) $modules[] = $module;
|
||||
}
|
||||
closedir($dh);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
die("The module you input does not exist. \n");
|
||||
}
|
||||
|
||||
foreach($modules as $module)
|
||||
{
|
||||
/* 设定各个目录。*/
|
||||
$extRoot = $moduleRoot . DIRECTORY_SEPARATOR. $module . DIRECTORY_SEPARATOR . 'ext';
|
||||
$extControl = $extRoot . DIRECTORY_SEPARATOR . 'control';
|
||||
$extModel = $extRoot . DIRECTORY_SEPARATOR . 'model';
|
||||
$extView = $extRoot . DIRECTORY_SEPARATOR . 'view';
|
||||
$extConfig = $extRoot . DIRECTORY_SEPARATOR . 'config';
|
||||
$extLang = $extRoot . DIRECTORY_SEPARATOR . 'lang' . DIRECTORY_SEPARATOR;
|
||||
|
||||
/* 建立各个扩展目录 */
|
||||
if(!file_exists($extRoot)) mkdir($extRoot, 0777);
|
||||
if(!file_exists($extControl)) mkdir($extControl, 0777);
|
||||
if(!file_exists($extModel)) mkdir($extModel, 0777);
|
||||
if(!file_exists($extView)) mkdir($extView, 0777);
|
||||
if(!file_exists($extConfig)) mkdir($extConfig, 0777);
|
||||
if(!file_exists($extLang)) mkdir($extLang, 0777);
|
||||
|
||||
/* 创建语言目录。*/
|
||||
$langs = array_keys($config->langs);
|
||||
foreach($langs as $lang)
|
||||
{
|
||||
$langPath = $extLang . $lang;
|
||||
if(!file_exists($langPath)) mkdir($langPath, 0777);
|
||||
}
|
||||
|
||||
echo "init $module ... \n";
|
||||
}
|
||||
|
||||
124
bin/ztcli
124
bin/ztcli
@@ -1,62 +1,62 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/**
|
||||
* 禅道系统命令行访问入口。使用方法:http://www.zentao.net/help-read-78899.html
|
||||
* The cli router file of zentaopms.
|
||||
*
|
||||
* @copyright Copyright 2009-2013 QingDao Nature Easy Soft Network Technology Co,LTD (www.cnezsoft.com)
|
||||
* @license LGPL (http://www.gnu.org/licenses/lgpl.html)
|
||||
* @author Chunsheng Wang <chunsheng@cnezsoft.com>
|
||||
* @package bin
|
||||
* @version $Id$
|
||||
* @link http://www.ZenTaoPMS.com
|
||||
*/
|
||||
error_reporting(E_ALL ^ E_NOTICE);
|
||||
define('IN_SHELL', true);
|
||||
|
||||
/* Judge the args. */
|
||||
if($argc != 2) die('Usage: ' . basename(__FILE__) . " <request>\n");
|
||||
|
||||
/* Parse the request into params. */
|
||||
$request = parse_url(trim($argv[1]));
|
||||
$_SERVER['HTTP_HOST'] = $request['host'];
|
||||
|
||||
/* Load the framework. */
|
||||
chdir(dirname(dirname(__FILE__)));
|
||||
include './framework/router.class.php';
|
||||
include './framework/control.class.php';
|
||||
include './framework/model.class.php';
|
||||
include './framework/helper.class.php';
|
||||
include './config/config.php';
|
||||
|
||||
if($config->requestType == 'PATH_INFO')
|
||||
{
|
||||
$path = pathinfo($request['path']);
|
||||
if(strpos($path['basename'], $config->requestFix))
|
||||
{
|
||||
$_SERVER['PATH_INFO'] = $path['basename'];
|
||||
}
|
||||
else
|
||||
{
|
||||
if(is_dir('./module/' . $path['basename']))
|
||||
{
|
||||
$_SERVER['PATH_INFO'] = $path['basename'];
|
||||
}
|
||||
else
|
||||
{
|
||||
$_SERVER['PATH_INFO'] = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
parse_str($request['query'], $_GET);
|
||||
$_SERVER['SCRIPT_NAME'] = $_SERVER['HTTP_HOST'] . 'index.php';
|
||||
$_SERVER['REQUEST_URI'] = isset($request['query']) ? $request['query'] : '';
|
||||
}
|
||||
|
||||
/* Instance the app and run it. */
|
||||
$app = router::createApp('pms', dirname(dirname(__FILE__)));
|
||||
$common = $app->loadCommon();
|
||||
$app->parseRequest();
|
||||
$app->loadModule();
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/**
|
||||
* 禅道系统命令行访问入口。使用方法:http://www.zentao.net/help-read-78899.html
|
||||
* The cli router file of zentaopms.
|
||||
*
|
||||
* @copyright Copyright 2009-2013 QingDao Nature Easy Soft Network Technology Co,LTD (www.cnezsoft.com)
|
||||
* @license LGPL (http://www.gnu.org/licenses/lgpl.html)
|
||||
* @author Chunsheng Wang <chunsheng@cnezsoft.com>
|
||||
* @package bin
|
||||
* @version $Id$
|
||||
* @link http://www.ZenTaoPMS.com
|
||||
*/
|
||||
error_reporting(E_ALL ^ E_NOTICE);
|
||||
define('IN_SHELL', true);
|
||||
|
||||
/* Judge the args. */
|
||||
if($argc != 2) die('Usage: ' . basename(__FILE__) . " <request>\n");
|
||||
|
||||
/* Parse the request into params. */
|
||||
$request = parse_url(trim($argv[1]));
|
||||
$_SERVER['HTTP_HOST'] = $request['host'];
|
||||
|
||||
/* Load the framework. */
|
||||
chdir(dirname(dirname(__FILE__)));
|
||||
include './framework/router.class.php';
|
||||
include './framework/control.class.php';
|
||||
include './framework/model.class.php';
|
||||
include './framework/helper.class.php';
|
||||
include './config/config.php';
|
||||
|
||||
if($config->requestType == 'PATH_INFO')
|
||||
{
|
||||
$path = pathinfo($request['path']);
|
||||
if(strpos($path['basename'], $config->requestFix))
|
||||
{
|
||||
$_SERVER['PATH_INFO'] = $path['basename'];
|
||||
}
|
||||
else
|
||||
{
|
||||
if(is_dir('./module/' . $path['basename']))
|
||||
{
|
||||
$_SERVER['PATH_INFO'] = $path['basename'];
|
||||
}
|
||||
else
|
||||
{
|
||||
$_SERVER['PATH_INFO'] = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
parse_str($request['query'], $_GET);
|
||||
$_SERVER['SCRIPT_NAME'] = $_SERVER['HTTP_HOST'] . 'index.php';
|
||||
$_SERVER['REQUEST_URI'] = isset($request['query']) ? $request['query'] : '';
|
||||
}
|
||||
|
||||
/* Instance the app and run it. */
|
||||
$app = router::createApp('pms', dirname(dirname(__FILE__)));
|
||||
$common = $app->loadCommon();
|
||||
$app->parseRequest();
|
||||
$app->loadModule();
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
<?php
|
||||
$config->installed = false;
|
||||
$config->debug = false;
|
||||
$config->requestType = 'PATH_INFO';
|
||||
|
||||
$config->db->host = SAE_MYSQL_HOST_M;
|
||||
$config->db->slaveHost = SAE_MYSQL_HOST_S;
|
||||
$config->db->port = SAE_MYSQL_PORT;
|
||||
$config->db->name = SAE_MYSQL_DB;
|
||||
$config->db->user = SAE_MYSQL_USER;
|
||||
$config->db->password = SAE_MYSQL_PASS;
|
||||
$config->db->prefix = 'zt_';
|
||||
$config->db->checkCentOS = false;
|
||||
|
||||
$config->slaveDB->host = SAE_MYSQL_HOST_S;
|
||||
$config->slaveDB->port = SAE_MYSQL_PORT;
|
||||
$config->slaveDB->name = SAE_MYSQL_DB;
|
||||
$config->slaveDB->user = SAE_MYSQL_USER;
|
||||
$config->slaveDB->password = SAE_MYSQL_PASS;
|
||||
$config->slaveDB->checkCentOS = false;
|
||||
|
||||
$config->webRoot = '/';
|
||||
$config->default->domain = $_SERVER['HTTP_HOST'];
|
||||
$config->default->lang = 'zh-cn';
|
||||
|
||||
$config->sae->storage->domain = 'zentao';
|
||||
|
||||
$saeDB = new saemysql();
|
||||
$saeSQL = "SELECT COUNT(`id`) FROM `" . $config->db->prefix . "config` WHERE 1 LIMIT 0,10";
|
||||
if($saeDB->getData($saeSQL)) $config->installed = true;
|
||||
$saeDB->closeDb();
|
||||
<?php
|
||||
$config->installed = false;
|
||||
$config->debug = false;
|
||||
$config->requestType = 'PATH_INFO';
|
||||
|
||||
$config->db->host = SAE_MYSQL_HOST_M;
|
||||
$config->db->slaveHost = SAE_MYSQL_HOST_S;
|
||||
$config->db->port = SAE_MYSQL_PORT;
|
||||
$config->db->name = SAE_MYSQL_DB;
|
||||
$config->db->user = SAE_MYSQL_USER;
|
||||
$config->db->password = SAE_MYSQL_PASS;
|
||||
$config->db->prefix = 'zt_';
|
||||
$config->db->checkCentOS = false;
|
||||
|
||||
$config->slaveDB->host = SAE_MYSQL_HOST_S;
|
||||
$config->slaveDB->port = SAE_MYSQL_PORT;
|
||||
$config->slaveDB->name = SAE_MYSQL_DB;
|
||||
$config->slaveDB->user = SAE_MYSQL_USER;
|
||||
$config->slaveDB->password = SAE_MYSQL_PASS;
|
||||
$config->slaveDB->checkCentOS = false;
|
||||
|
||||
$config->webRoot = '/';
|
||||
$config->default->domain = $_SERVER['HTTP_HOST'];
|
||||
$config->default->lang = 'zh-cn';
|
||||
|
||||
$config->sae->storage->domain = 'zentao';
|
||||
|
||||
$saeDB = new saemysql();
|
||||
$saeSQL = "SELECT COUNT(`id`) FROM `" . $config->db->prefix . "config` WHERE 1 LIMIT 0,10";
|
||||
if($saeDB->getData($saeSQL)) $config->installed = true;
|
||||
$saeDB->closeDb();
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
<?php
|
||||
$appRoot = dirname(dirname(dirname(__FILE__))) . '/' ;
|
||||
|
||||
$sourceHtaccessFile = $appRoot . 'htaccess';
|
||||
$targetHtaccessFile = $appRoot . '.htaccess';
|
||||
if(file_exists($sourceHtaccessFile))
|
||||
{
|
||||
$targetHtaccessCode = str_replace('index.php', $config->webRoot . 'index.php', file_get_contents($sourceHtaccessFile));
|
||||
file_put_contents($targetHtaccessFile, $targetHtaccessCode);
|
||||
}
|
||||
|
||||
$tmpRoot = $appRoot . '/tmp/';
|
||||
if(!is_dir($tmpRoot))
|
||||
{
|
||||
mkdir($tmpRoot, 0777);
|
||||
mkdir($tmpRoot . 'cache', 0777);
|
||||
mkdir($tmpRoot . 'extension', 0777);
|
||||
mkdir($tmpRoot . 'log', 0777);
|
||||
mkdir($tmpRoot . 'model', 0777);
|
||||
mkdir($tmpRoot . 'svn', 0777);
|
||||
}
|
||||
|
||||
$dataRoot = $appRoot . 'data/';
|
||||
if(!is_dir($dataRoot))
|
||||
{
|
||||
mkdir($dataRoot, 0777);
|
||||
mkdir($dataRoot . 'upload', 0777);
|
||||
}
|
||||
<?php
|
||||
$appRoot = dirname(dirname(dirname(__FILE__))) . '/' ;
|
||||
|
||||
$sourceHtaccessFile = $appRoot . 'htaccess';
|
||||
$targetHtaccessFile = $appRoot . '.htaccess';
|
||||
if(file_exists($sourceHtaccessFile))
|
||||
{
|
||||
$targetHtaccessCode = str_replace('index.php', $config->webRoot . 'index.php', file_get_contents($sourceHtaccessFile));
|
||||
file_put_contents($targetHtaccessFile, $targetHtaccessCode);
|
||||
}
|
||||
|
||||
$tmpRoot = $appRoot . '/tmp/';
|
||||
if(!is_dir($tmpRoot))
|
||||
{
|
||||
mkdir($tmpRoot, 0777);
|
||||
mkdir($tmpRoot . 'cache', 0777);
|
||||
mkdir($tmpRoot . 'extension', 0777);
|
||||
mkdir($tmpRoot . 'log', 0777);
|
||||
mkdir($tmpRoot . 'model', 0777);
|
||||
mkdir($tmpRoot . 'svn', 0777);
|
||||
}
|
||||
|
||||
$dataRoot = $appRoot . 'data/';
|
||||
if(!is_dir($dataRoot))
|
||||
{
|
||||
mkdir($dataRoot, 0777);
|
||||
mkdir($dataRoot . 'upload', 0777);
|
||||
}
|
||||
|
||||
@@ -1,47 +1,47 @@
|
||||
<appwizard>
|
||||
<introduction>
|
||||
<name>禅道项目管理软件SAE版本</name>
|
||||
<author>青岛易软天创网络科技有限公司</author>
|
||||
<icon>default_app_icon</icon>
|
||||
<homepage>http://www.zentao.net/</homepage>
|
||||
<description>
|
||||
<![CDATA[
|
||||
<p>禅道项目管理软件(ZenTaoPMS)是一款国产的,基于LGPL协议,开源免费的项目管理软件,它集产品管理、项目管理、测试管理于一体,同时还包含了事务管理、组织管理等诸多功能,是中小型企业项目管理的首选。禅道项目管理软件使用PHP + MySQL开发,基于自主的PHP开发框架──ZenTaoPHP而成。第三方开发者或者企业可以非常方便的开发插件或者进行定制。</p>
|
||||
]]>
|
||||
</description>
|
||||
</introduction>
|
||||
<platform>
|
||||
<services>
|
||||
<service name="zentao" params="禅道数据存储">Storage</service>
|
||||
<service size="12M">Memcache</service>
|
||||
<service>Mysql</service>
|
||||
</services>
|
||||
<appconfig>
|
||||
<tpl>
|
||||
<![CDATA[
|
||||
name: <<appname>>
|
||||
version: <<version>>
|
||||
cron:
|
||||
- description: cron
|
||||
url: project-computeburn-admin.html
|
||||
schedule: every day of month 00:00
|
||||
timezone: Beijing
|
||||
handle:
|
||||
- rewrite: if(!is_dir() && !is_file()) goto "index.php/%{REQUEST_URI}"
|
||||
- compress: if(out_header["Content-Type"] ~ "text") compress
|
||||
- compress: if(out_header["Content-Type"] ~ "javascript") compress
|
||||
- expire: if(path ~ "\.js$") time 360000
|
||||
- expire: if(path ~ "\.css$") time 360000
|
||||
- expire: if(path ~ "\.gif$") time 360000
|
||||
- expire: if(path ~ "\.png$") time 360000
|
||||
- expire: if(path ~ "\.ico$") time 360000
|
||||
- expire: if(path ~ "\.jpg$") time 360000
|
||||
]]>
|
||||
</tpl>
|
||||
</appconfig>
|
||||
</platform>
|
||||
<code>
|
||||
<initScript>index.php</initScript>
|
||||
</code>
|
||||
</appwizard>
|
||||
|
||||
<appwizard>
|
||||
<introduction>
|
||||
<name>禅道项目管理软件SAE版本</name>
|
||||
<author>青岛易软天创网络科技有限公司</author>
|
||||
<icon>default_app_icon</icon>
|
||||
<homepage>http://www.zentao.net/</homepage>
|
||||
<description>
|
||||
<![CDATA[
|
||||
<p>禅道项目管理软件(ZenTaoPMS)是一款国产的,基于LGPL协议,开源免费的项目管理软件,它集产品管理、项目管理、测试管理于一体,同时还包含了事务管理、组织管理等诸多功能,是中小型企业项目管理的首选。禅道项目管理软件使用PHP + MySQL开发,基于自主的PHP开发框架──ZenTaoPHP而成。第三方开发者或者企业可以非常方便的开发插件或者进行定制。</p>
|
||||
]]>
|
||||
</description>
|
||||
</introduction>
|
||||
<platform>
|
||||
<services>
|
||||
<service name="zentao" params="禅道数据存储">Storage</service>
|
||||
<service size="12M">Memcache</service>
|
||||
<service>Mysql</service>
|
||||
</services>
|
||||
<appconfig>
|
||||
<tpl>
|
||||
<![CDATA[
|
||||
name: <<appname>>
|
||||
version: <<version>>
|
||||
cron:
|
||||
- description: cron
|
||||
url: project-computeburn-admin.html
|
||||
schedule: every day of month 00:00
|
||||
timezone: Beijing
|
||||
handle:
|
||||
- rewrite: if(!is_dir() && !is_file()) goto "index.php/%{REQUEST_URI}"
|
||||
- compress: if(out_header["Content-Type"] ~ "text") compress
|
||||
- compress: if(out_header["Content-Type"] ~ "javascript") compress
|
||||
- expire: if(path ~ "\.js$") time 360000
|
||||
- expire: if(path ~ "\.css$") time 360000
|
||||
- expire: if(path ~ "\.gif$") time 360000
|
||||
- expire: if(path ~ "\.png$") time 360000
|
||||
- expire: if(path ~ "\.ico$") time 360000
|
||||
- expire: if(path ~ "\.jpg$") time 360000
|
||||
]]>
|
||||
</tpl>
|
||||
</appconfig>
|
||||
</platform>
|
||||
<code>
|
||||
<initScript>index.php</initScript>
|
||||
</code>
|
||||
</appwizard>
|
||||
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
Ϊ<EFBFBD>˱<EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮ǰ<EFBFBD><EFBFBD>ϸ<EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
1. <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>벿<EFBFBD><EBB2BF><EFBFBD><EFBFBD>ijһ<C4B3><D2BB><EFBFBD>̷<EFBFBD><CCB7>ĸ<EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>棬<EFBFBD><E6A3AC><EFBFBD><EFBFBD>c:\xampp<70><70><EFBFBD><EFBFBD>d:\xampp<70><70><EFBFBD>ǿ<EFBFBD><C7BF>Եġ<D4B5>
|
||||
2. <20><>Ҫ<EFBFBD>Ķ<EFBFBD>xampp<70><70>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⡣
|
||||
3. zentaoamp-control-cn.exe<78>Ǹ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>壬zentaoamp-control-en.exe<78><65>Ӣ<EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>塣<EFBFBD><E5A1A3><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣapache, mysql<71><6C>
|
||||
4. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>apache<68><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿ں<CBBF><DABA>Ƿ<EFBFBD><C7B7><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿ڳ<CBBF>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>88<38>˿ڡ<CBBF><DAA1><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD>ϲ<EFBFBD><CFB2>Ƕ˿ڳ<CBBF>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뿼<EFBFBD>ǰ<EFBFBD>װvc<76><63><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>
|
||||
32λϵͳ<CFB5><CDB3><EFBFBD>أ<EFBFBD>http://www.microsoft.com/downloads/details.aspx?FamilyID=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF
|
||||
64λϵͳ<CFB5><CDB3><EFBFBD>أ<EFBFBD>http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=15336
|
||||
5. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>mysql<71><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿ں<CBBF><DABA>Ƿ<EFBFBD><C7B7><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3308<30>˿ڡ<CBBF>
|
||||
6. <20><><EFBFBD><EFBFBD>ϵͳĬ<CDB3>ϵĹ<CFB5><C4B9><EFBFBD>Ա<EFBFBD>ʺ<EFBFBD><CABA><EFBFBD>admin<69><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>123456<35><36>
|
||||
7. <20><><EFBFBD>ݿ<EFBFBD>Ĭ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>root<6F><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ա<EFBFBD>
|
||||
8. <20><><EFBFBD><EFBFBD><EFBFBD>뿪<EFBFBD><EBBFAA><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>壬<EFBFBD><E5A3AC>mysql<71><6C>apache<68><65>װΪ<D7B0><CEAA><EFBFBD><EFBFBD><F1A3ACB7><EFBFBD><EFBFBD><EFBFBD>Ϊapachezt, mysqlzt<7A><74>
|
||||
|
||||
<EFBFBD><EFBFBD>ϸ<EFBFBD>Ľ<EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>http://www.zentao.net/help-read-79597.html
|
||||
Ϊ<EFBFBD>˱<EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮ǰ<EFBFBD><EFBFBD>ϸ<EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
1. <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>벿<EFBFBD><EBB2BF><EFBFBD><EFBFBD>ijһ<C4B3><D2BB><EFBFBD>̷<EFBFBD><CCB7>ĸ<EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>棬<EFBFBD><E6A3AC><EFBFBD><EFBFBD>c:\xampp<70><70><EFBFBD><EFBFBD>d:\xampp<70><70><EFBFBD>ǿ<EFBFBD><C7BF>Եġ<D4B5>
|
||||
2. <20><>Ҫ<EFBFBD>Ķ<EFBFBD>xampp<70><70>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⡣
|
||||
3. zentaoamp-control-cn.exe<78>Ǹ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>壬zentaoamp-control-en.exe<78><65>Ӣ<EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>塣<EFBFBD><E5A1A3><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣapache, mysql<71><6C>
|
||||
4. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>apache<68><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿ں<CBBF><DABA>Ƿ<EFBFBD><C7B7><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿ڳ<CBBF>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>88<38>˿ڡ<CBBF><DAA1><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD>ϲ<EFBFBD><CFB2>Ƕ˿ڳ<CBBF>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>뿼<EFBFBD>ǰ<EFBFBD>װvc<76><63><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>
|
||||
32λϵͳ<CFB5><CDB3><EFBFBD>أ<EFBFBD>http://www.microsoft.com/downloads/details.aspx?FamilyID=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF
|
||||
64λϵͳ<CFB5><CDB3><EFBFBD>أ<EFBFBD>http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=15336
|
||||
5. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>mysql<71><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿ں<CBBF><DABA>Ƿ<EFBFBD><C7B7><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD><D4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3308<30>˿ڡ<CBBF>
|
||||
6. <20><><EFBFBD><EFBFBD>ϵͳĬ<CDB3>ϵĹ<CFB5><C4B9><EFBFBD>Ա<EFBFBD>ʺ<EFBFBD><CABA><EFBFBD>admin<69><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>123456<35><36>
|
||||
7. <20><><EFBFBD>ݿ<EFBFBD>Ĭ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>root<6F><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ա<EFBFBD>
|
||||
8. <20><><EFBFBD><EFBFBD><EFBFBD>뿪<EFBFBD><EBBFAA><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>壬<EFBFBD><E5A3AC>mysql<71><6C>apache<68><65>װΪ<D7B0><CEAA><EFBFBD><EFBFBD><F1A3ACB7><EFBFBD><EFBFBD><EFBFBD>Ϊapachezt, mysqlzt<7A><74>
|
||||
|
||||
<EFBFBD><EFBFBD>ϸ<EFBFBD>Ľ<EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>http://www.zentao.net/help-read-79597.html
|
||||
|
||||
@@ -1,55 +1,55 @@
|
||||
<IfModule env_module>
|
||||
SetEnv MIBDIRS "/xampp/php/extras/mibs"
|
||||
SetEnv MYSQL_HOME "\\xampp\\mysql\\bin"
|
||||
SetEnv OPENSSL_CONF "/xampp/apache/bin/openssl.cnf"
|
||||
SetEnv PHP_PEAR_SYSCONF_DIR "\\xampp\\php"
|
||||
SetEnv PHPRC "\\xampp\\php"
|
||||
SetEnv TMP "\\xampp\\tmp"
|
||||
</IfModule>
|
||||
|
||||
LoadFile "/xampp/php/php5ts.dll"
|
||||
LoadModule php5_module "/xampp/php/php5apache2_4.dll"
|
||||
|
||||
<FilesMatch "\.php$">
|
||||
SetHandler application/x-httpd-php
|
||||
</FilesMatch>
|
||||
<FilesMatch "\.phps$">
|
||||
SetHandler application/x-httpd-php-source
|
||||
</FilesMatch>
|
||||
|
||||
<IfModule php5_module>
|
||||
PHPINIDir "/xampp/php"
|
||||
</IfModule>
|
||||
|
||||
<IfModule mime_module>
|
||||
AddType text/html .php .phps
|
||||
</IfModule>
|
||||
|
||||
<IfModule alias_module>
|
||||
Alias /phpmyadmin "/xampp/admin/phpmyadmin/"
|
||||
<Directory "/xampp/admin/phpmyadmin">
|
||||
AllowOverride AuthConfig
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
Alias /zentao "/xampp/zentao/www/"
|
||||
<Directory "/xampp/zentao/www">
|
||||
Order deny,allow
|
||||
Allow from all
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
</Directory>
|
||||
</IfModule>
|
||||
|
||||
<LocationMatch "^/(?i:(?:xampp|security|licenses|phpmyadmin|webalizer|server-status|server-info))">
|
||||
Order deny,allow
|
||||
Deny from all
|
||||
Allow from 127.0.0.1
|
||||
</LocationMatch>
|
||||
|
||||
# setting of gzip.
|
||||
DeflateCompressionLevel 9
|
||||
AddOutputFilterByType DEFLATE text/html text/css application/javascript
|
||||
|
||||
# turn off etag.
|
||||
FileEtag none
|
||||
<IfModule env_module>
|
||||
SetEnv MIBDIRS "/xampp/php/extras/mibs"
|
||||
SetEnv MYSQL_HOME "\\xampp\\mysql\\bin"
|
||||
SetEnv OPENSSL_CONF "/xampp/apache/bin/openssl.cnf"
|
||||
SetEnv PHP_PEAR_SYSCONF_DIR "\\xampp\\php"
|
||||
SetEnv PHPRC "\\xampp\\php"
|
||||
SetEnv TMP "\\xampp\\tmp"
|
||||
</IfModule>
|
||||
|
||||
LoadFile "/xampp/php/php5ts.dll"
|
||||
LoadModule php5_module "/xampp/php/php5apache2_4.dll"
|
||||
|
||||
<FilesMatch "\.php$">
|
||||
SetHandler application/x-httpd-php
|
||||
</FilesMatch>
|
||||
<FilesMatch "\.phps$">
|
||||
SetHandler application/x-httpd-php-source
|
||||
</FilesMatch>
|
||||
|
||||
<IfModule php5_module>
|
||||
PHPINIDir "/xampp/php"
|
||||
</IfModule>
|
||||
|
||||
<IfModule mime_module>
|
||||
AddType text/html .php .phps
|
||||
</IfModule>
|
||||
|
||||
<IfModule alias_module>
|
||||
Alias /phpmyadmin "/xampp/admin/phpmyadmin/"
|
||||
<Directory "/xampp/admin/phpmyadmin">
|
||||
AllowOverride AuthConfig
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
Alias /zentao "/xampp/zentao/www/"
|
||||
<Directory "/xampp/zentao/www">
|
||||
Order deny,allow
|
||||
Allow from all
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
</Directory>
|
||||
</IfModule>
|
||||
|
||||
<LocationMatch "^/(?i:(?:xampp|security|licenses|phpmyadmin|webalizer|server-status|server-info))">
|
||||
Order deny,allow
|
||||
Deny from all
|
||||
Allow from 127.0.0.1
|
||||
</LocationMatch>
|
||||
|
||||
# setting of gzip.
|
||||
DeflateCompressionLevel 9
|
||||
AddOutputFilterByType DEFLATE text/html text/css application/javascript
|
||||
|
||||
# turn off etag.
|
||||
FileEtag none
|
||||
|
||||
@@ -1,144 +1,144 @@
|
||||
<?php
|
||||
/**
|
||||
* The config file of ZenTaoPMS.
|
||||
*
|
||||
* Don't modify this file directly, copy the item to my.php and change it.
|
||||
*
|
||||
* @copyright Copyright 2009-2013 QingDao Nature Easy Soft Network Technology Co,LTD (www.cnezsoft.com)
|
||||
* @license LGPL (http://www.gnu.org/licenses/lgpl.html)
|
||||
* @author Chunsheng Wang <chunsheng@cnezsoft.com>
|
||||
* @package config
|
||||
* @version $Id$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
/* Basic settings. */
|
||||
$config = new config();
|
||||
$config->version = '4.0.beta2'; // The version of zentaopms. Don't change it.
|
||||
$config->encoding = 'UTF-8'; // The encoding of zentaopms.
|
||||
$config->cookieLife = time() + 2592000; // The cookie life time.
|
||||
$config->timezone = 'Asia/Shanghai'; // The time zone setting, for more see http://www.php.net/manual/en/timezones.php
|
||||
$config->webRoot = ''; // The root path of the pms.
|
||||
|
||||
/* The request settings. */
|
||||
$config->requestType = 'PATH_INFO'; // The request type: PATH_INFO|GET, if PATH_INFO, must use url rewrite.
|
||||
$config->pathType = 'clean'; // If the request type is PATH_INFO, the path type.
|
||||
$config->requestFix = '-'; // The divider in the url when PATH_INFO.
|
||||
$config->moduleVar = 'm'; // requestType=GET: the module var name.
|
||||
$config->methodVar = 'f'; // requestType=GET: the method var name.
|
||||
$config->viewVar = 't'; // requestType=GET: the view var name.
|
||||
$config->sessionVar = 'sid'; // requestType=GET: the session var name.
|
||||
|
||||
/* Supported views. */
|
||||
$config->views = ',html,json,';
|
||||
|
||||
/* Set the wide window size. */
|
||||
$config->wideSize = 1400;
|
||||
|
||||
/* Supported languages. */
|
||||
$config->langs['zh-cn'] = '中文简体';
|
||||
$config->langs['zh-tw'] = '中文繁體';
|
||||
$config->langs['en'] = 'English';
|
||||
|
||||
/* Default settings. */
|
||||
$config->default = new stdclass();
|
||||
$config->default->view = 'html'; // Default view.
|
||||
$config->default->lang = 'en'; // Default language.
|
||||
$config->default->theme = 'default'; // Default theme.
|
||||
$config->default->module = 'index'; // Default module.
|
||||
$config->default->method = 'index'; // Default method.
|
||||
|
||||
/* Upload settings. */
|
||||
$config->file = new stdclass();
|
||||
$config->file->dangers = 'php,jsp,py,rb,asp,'; // Dangerous files.
|
||||
$config->file->maxSize = 1024 * 1024; // Max size.
|
||||
|
||||
/* Master database settings. */
|
||||
$config->db = new stdclass();
|
||||
$config->db->persistant = false; // Pconnect or not.
|
||||
$config->db->driver = 'mysql'; // Must be MySQL. Don't support other database server yet.
|
||||
$config->db->encoding = 'UTF8'; // Encoding of database.
|
||||
$config->db->strictMode = false; // Turn off the strict mode of MySQL.
|
||||
//$config->db->emulatePrepare = true; // PDO::ATTR_EMULATE_PREPARES
|
||||
//$config->db->bufferQuery = true; // PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
|
||||
|
||||
/* Slave database settings. */
|
||||
$config->slaveDB = new stdclass();
|
||||
$config->slaveDB->persistant = false;
|
||||
$config->slaveDB->driver = 'mysql';
|
||||
$config->slaveDB->encoding = 'UTF8';
|
||||
$config->slaveDB->strictMode = false;
|
||||
$config->slaveDB->checkCentOS= true;
|
||||
|
||||
/* Include the custom config file. */
|
||||
$configRoot = dirname(__FILE__) . DIRECTORY_SEPARATOR;
|
||||
$myConfig = $configRoot . 'my.php';
|
||||
if(file_exists($myConfig)) include $myConfig;
|
||||
|
||||
/* Set default table prefix. */
|
||||
if(!isset($config->db->prefix)) $config->db->prefix = 'zt_';
|
||||
|
||||
/* Define the tables. */
|
||||
define('TABLE_COMPANY', '`' . $config->db->prefix . 'company`');
|
||||
define('TABLE_DEPT', '`' . $config->db->prefix . 'dept`');
|
||||
define('TABLE_CONFIG', '`' . $config->db->prefix . 'config`');
|
||||
define('TABLE_USER', '`' . $config->db->prefix . 'user`');
|
||||
define('TABLE_TODO', '`' . $config->db->prefix . 'todo`');
|
||||
define('TABLE_GROUP', '`' . $config->db->prefix . 'group`');
|
||||
define('TABLE_GROUPPRIV', '`' . $config->db->prefix . 'groupPriv`');
|
||||
define('TABLE_USERGROUP', '`' . $config->db->prefix . 'userGroup`');
|
||||
define('TABLE_USERQUERY', '`' . $config->db->prefix . 'userQuery`');
|
||||
define('TABLE_USERCONTACT', '`' . $config->db->prefix . 'userContact`');
|
||||
|
||||
define('TABLE_BUG', '`' . $config->db->prefix . 'bug`');
|
||||
define('TABLE_CASE', '`' . $config->db->prefix . 'case`');
|
||||
define('TABLE_CASESTEP', '`' . $config->db->prefix . 'caseStep`');
|
||||
define('TABLE_TESTTASK', '`' . $config->db->prefix . 'testTask`');
|
||||
define('TABLE_TESTRUN', '`' . $config->db->prefix . 'testRun`');
|
||||
define('TABLE_TESTRESULT', '`' . $config->db->prefix . 'testResult`');
|
||||
define('TABLE_USERTPL', '`' . $config->db->prefix . 'userTPL`');
|
||||
|
||||
define('TABLE_PRODUCT', '`' . $config->db->prefix . 'product`');
|
||||
define('TABLE_STORY', '`' . $config->db->prefix . 'story`');
|
||||
define('TABLE_STORYSPEC', '`' . $config->db->prefix . 'storySpec`');
|
||||
define('TABLE_PRODUCTPLAN', '`' . $config->db->prefix . 'productPlan`');
|
||||
define('TABLE_RELEASE', '`' . $config->db->prefix . 'release`');
|
||||
|
||||
define('TABLE_PROJECT', '`' . $config->db->prefix . 'project`');
|
||||
define('TABLE_TASK', '`' . $config->db->prefix . 'task`');
|
||||
define('TABLE_TEAM', '`' . $config->db->prefix . 'team`');
|
||||
define('TABLE_PROJECTPRODUCT','`' . $config->db->prefix . 'projectProduct`');
|
||||
define('TABLE_PROJECTSTORY', '`' . $config->db->prefix . 'projectStory`');
|
||||
define('TABLE_TASKESTIMATE', '`' . $config->db->prefix . 'taskEstimate`');
|
||||
define('TABLE_EFFORT', '`' . $config->db->prefix . 'effort`');
|
||||
define('TABLE_BURN', '`' . $config->db->prefix . 'burn`');
|
||||
define('TABLE_BUILD', '`' . $config->db->prefix . 'build`');
|
||||
|
||||
define('TABLE_DOCLIB', '`' . $config->db->prefix . 'docLib`');
|
||||
define('TABLE_DOC', '`' . $config->db->prefix . 'doc`');
|
||||
|
||||
define('TABLE_MODULE', '`' . $config->db->prefix . 'module`');
|
||||
define('TABLE_ACTION', '`' . $config->db->prefix . 'action`');
|
||||
define('TABLE_FILE', '`' . $config->db->prefix . 'file`');
|
||||
define('TABLE_HISTORY', '`' . $config->db->prefix . 'history`');
|
||||
define('TABLE_EXTENSION', '`' . $config->db->prefix . 'extension`');
|
||||
define('TABLE_WEBAPP', '`' . $config->db->prefix . 'webapp`');
|
||||
|
||||
$config->objectTables['product'] = TABLE_PRODUCT;
|
||||
$config->objectTables['story'] = TABLE_STORY;
|
||||
$config->objectTables['productplan'] = TABLE_PRODUCTPLAN;
|
||||
$config->objectTables['release'] = TABLE_RELEASE;
|
||||
$config->objectTables['project'] = TABLE_PROJECT;
|
||||
$config->objectTables['task'] = TABLE_TASK;
|
||||
$config->objectTables['build'] = TABLE_BUILD;
|
||||
$config->objectTables['bug'] = TABLE_BUG;
|
||||
$config->objectTables['case'] = TABLE_CASE;
|
||||
$config->objectTables['testcase'] = TABLE_CASE;
|
||||
$config->objectTables['testtask'] = TABLE_TESTTASK;
|
||||
$config->objectTables['user'] = TABLE_USER;
|
||||
$config->objectTables['doc'] = TABLE_DOC;
|
||||
$config->objectTables['doclib'] = TABLE_DOCLIB;
|
||||
$config->objectTables['todo'] = TABLE_TODO;
|
||||
|
||||
/* Include extension config files. */
|
||||
$extConfigFiles = glob($configRoot . 'ext/*.php');
|
||||
if($extConfigFiles) foreach($extConfigFiles as $extConfigFile) include $extConfigFile;
|
||||
<?php
|
||||
/**
|
||||
* The config file of ZenTaoPMS.
|
||||
*
|
||||
* Don't modify this file directly, copy the item to my.php and change it.
|
||||
*
|
||||
* @copyright Copyright 2009-2013 QingDao Nature Easy Soft Network Technology Co,LTD (www.cnezsoft.com)
|
||||
* @license LGPL (http://www.gnu.org/licenses/lgpl.html)
|
||||
* @author Chunsheng Wang <chunsheng@cnezsoft.com>
|
||||
* @package config
|
||||
* @version $Id$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
/* Basic settings. */
|
||||
$config = new config();
|
||||
$config->version = '4.0.beta2'; // The version of zentaopms. Don't change it.
|
||||
$config->encoding = 'UTF-8'; // The encoding of zentaopms.
|
||||
$config->cookieLife = time() + 2592000; // The cookie life time.
|
||||
$config->timezone = 'Asia/Shanghai'; // The time zone setting, for more see http://www.php.net/manual/en/timezones.php
|
||||
$config->webRoot = ''; // The root path of the pms.
|
||||
|
||||
/* The request settings. */
|
||||
$config->requestType = 'PATH_INFO'; // The request type: PATH_INFO|GET, if PATH_INFO, must use url rewrite.
|
||||
$config->pathType = 'clean'; // If the request type is PATH_INFO, the path type.
|
||||
$config->requestFix = '-'; // The divider in the url when PATH_INFO.
|
||||
$config->moduleVar = 'm'; // requestType=GET: the module var name.
|
||||
$config->methodVar = 'f'; // requestType=GET: the method var name.
|
||||
$config->viewVar = 't'; // requestType=GET: the view var name.
|
||||
$config->sessionVar = 'sid'; // requestType=GET: the session var name.
|
||||
|
||||
/* Supported views. */
|
||||
$config->views = ',html,json,';
|
||||
|
||||
/* Set the wide window size. */
|
||||
$config->wideSize = 1400;
|
||||
|
||||
/* Supported languages. */
|
||||
$config->langs['zh-cn'] = '中文简体';
|
||||
$config->langs['zh-tw'] = '中文繁體';
|
||||
$config->langs['en'] = 'English';
|
||||
|
||||
/* Default settings. */
|
||||
$config->default = new stdclass();
|
||||
$config->default->view = 'html'; // Default view.
|
||||
$config->default->lang = 'en'; // Default language.
|
||||
$config->default->theme = 'default'; // Default theme.
|
||||
$config->default->module = 'index'; // Default module.
|
||||
$config->default->method = 'index'; // Default method.
|
||||
|
||||
/* Upload settings. */
|
||||
$config->file = new stdclass();
|
||||
$config->file->dangers = 'php,jsp,py,rb,asp,'; // Dangerous files.
|
||||
$config->file->maxSize = 1024 * 1024; // Max size.
|
||||
|
||||
/* Master database settings. */
|
||||
$config->db = new stdclass();
|
||||
$config->db->persistant = false; // Pconnect or not.
|
||||
$config->db->driver = 'mysql'; // Must be MySQL. Don't support other database server yet.
|
||||
$config->db->encoding = 'UTF8'; // Encoding of database.
|
||||
$config->db->strictMode = false; // Turn off the strict mode of MySQL.
|
||||
//$config->db->emulatePrepare = true; // PDO::ATTR_EMULATE_PREPARES
|
||||
//$config->db->bufferQuery = true; // PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
|
||||
|
||||
/* Slave database settings. */
|
||||
$config->slaveDB = new stdclass();
|
||||
$config->slaveDB->persistant = false;
|
||||
$config->slaveDB->driver = 'mysql';
|
||||
$config->slaveDB->encoding = 'UTF8';
|
||||
$config->slaveDB->strictMode = false;
|
||||
$config->slaveDB->checkCentOS= true;
|
||||
|
||||
/* Include the custom config file. */
|
||||
$configRoot = dirname(__FILE__) . DIRECTORY_SEPARATOR;
|
||||
$myConfig = $configRoot . 'my.php';
|
||||
if(file_exists($myConfig)) include $myConfig;
|
||||
|
||||
/* Set default table prefix. */
|
||||
if(!isset($config->db->prefix)) $config->db->prefix = 'zt_';
|
||||
|
||||
/* Define the tables. */
|
||||
define('TABLE_COMPANY', '`' . $config->db->prefix . 'company`');
|
||||
define('TABLE_DEPT', '`' . $config->db->prefix . 'dept`');
|
||||
define('TABLE_CONFIG', '`' . $config->db->prefix . 'config`');
|
||||
define('TABLE_USER', '`' . $config->db->prefix . 'user`');
|
||||
define('TABLE_TODO', '`' . $config->db->prefix . 'todo`');
|
||||
define('TABLE_GROUP', '`' . $config->db->prefix . 'group`');
|
||||
define('TABLE_GROUPPRIV', '`' . $config->db->prefix . 'groupPriv`');
|
||||
define('TABLE_USERGROUP', '`' . $config->db->prefix . 'userGroup`');
|
||||
define('TABLE_USERQUERY', '`' . $config->db->prefix . 'userQuery`');
|
||||
define('TABLE_USERCONTACT', '`' . $config->db->prefix . 'userContact`');
|
||||
|
||||
define('TABLE_BUG', '`' . $config->db->prefix . 'bug`');
|
||||
define('TABLE_CASE', '`' . $config->db->prefix . 'case`');
|
||||
define('TABLE_CASESTEP', '`' . $config->db->prefix . 'caseStep`');
|
||||
define('TABLE_TESTTASK', '`' . $config->db->prefix . 'testTask`');
|
||||
define('TABLE_TESTRUN', '`' . $config->db->prefix . 'testRun`');
|
||||
define('TABLE_TESTRESULT', '`' . $config->db->prefix . 'testResult`');
|
||||
define('TABLE_USERTPL', '`' . $config->db->prefix . 'userTPL`');
|
||||
|
||||
define('TABLE_PRODUCT', '`' . $config->db->prefix . 'product`');
|
||||
define('TABLE_STORY', '`' . $config->db->prefix . 'story`');
|
||||
define('TABLE_STORYSPEC', '`' . $config->db->prefix . 'storySpec`');
|
||||
define('TABLE_PRODUCTPLAN', '`' . $config->db->prefix . 'productPlan`');
|
||||
define('TABLE_RELEASE', '`' . $config->db->prefix . 'release`');
|
||||
|
||||
define('TABLE_PROJECT', '`' . $config->db->prefix . 'project`');
|
||||
define('TABLE_TASK', '`' . $config->db->prefix . 'task`');
|
||||
define('TABLE_TEAM', '`' . $config->db->prefix . 'team`');
|
||||
define('TABLE_PROJECTPRODUCT','`' . $config->db->prefix . 'projectProduct`');
|
||||
define('TABLE_PROJECTSTORY', '`' . $config->db->prefix . 'projectStory`');
|
||||
define('TABLE_TASKESTIMATE', '`' . $config->db->prefix . 'taskEstimate`');
|
||||
define('TABLE_EFFORT', '`' . $config->db->prefix . 'effort`');
|
||||
define('TABLE_BURN', '`' . $config->db->prefix . 'burn`');
|
||||
define('TABLE_BUILD', '`' . $config->db->prefix . 'build`');
|
||||
|
||||
define('TABLE_DOCLIB', '`' . $config->db->prefix . 'docLib`');
|
||||
define('TABLE_DOC', '`' . $config->db->prefix . 'doc`');
|
||||
|
||||
define('TABLE_MODULE', '`' . $config->db->prefix . 'module`');
|
||||
define('TABLE_ACTION', '`' . $config->db->prefix . 'action`');
|
||||
define('TABLE_FILE', '`' . $config->db->prefix . 'file`');
|
||||
define('TABLE_HISTORY', '`' . $config->db->prefix . 'history`');
|
||||
define('TABLE_EXTENSION', '`' . $config->db->prefix . 'extension`');
|
||||
define('TABLE_WEBAPP', '`' . $config->db->prefix . 'webapp`');
|
||||
|
||||
$config->objectTables['product'] = TABLE_PRODUCT;
|
||||
$config->objectTables['story'] = TABLE_STORY;
|
||||
$config->objectTables['productplan'] = TABLE_PRODUCTPLAN;
|
||||
$config->objectTables['release'] = TABLE_RELEASE;
|
||||
$config->objectTables['project'] = TABLE_PROJECT;
|
||||
$config->objectTables['task'] = TABLE_TASK;
|
||||
$config->objectTables['build'] = TABLE_BUILD;
|
||||
$config->objectTables['bug'] = TABLE_BUG;
|
||||
$config->objectTables['case'] = TABLE_CASE;
|
||||
$config->objectTables['testcase'] = TABLE_CASE;
|
||||
$config->objectTables['testtask'] = TABLE_TESTTASK;
|
||||
$config->objectTables['user'] = TABLE_USER;
|
||||
$config->objectTables['doc'] = TABLE_DOC;
|
||||
$config->objectTables['doclib'] = TABLE_DOCLIB;
|
||||
$config->objectTables['todo'] = TABLE_TODO;
|
||||
|
||||
/* Include extension config files. */
|
||||
$extConfigFiles = glob($configRoot . 'ext/*.php');
|
||||
if($extConfigFiles) foreach($extConfigFiles as $extConfigFile) include $extConfigFile;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
[InternetShortcut]
|
||||
URL=http://www.zentao.net/help-read-79236.html
|
||||
IDList=
|
||||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://www.zentao.net/help-read-79236.html
|
||||
IDList=
|
||||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
|
||||
10
doc/HELP.url
10
doc/HELP.url
@@ -1,5 +1,5 @@
|
||||
[InternetShortcut]
|
||||
URL=http://www.zentao.net/help-read-79236.html
|
||||
IDList=
|
||||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://www.zentao.net/help-read-79236.html
|
||||
IDList=
|
||||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
|
||||
72
doc/INSTALL
72
doc/INSTALL
@@ -1,36 +1,36 @@
|
||||
1. system required
|
||||
|
||||
zentao needs apache, php(>5.2) and mysql.
|
||||
|
||||
2. install the allinone package on windows
|
||||
|
||||
We have build an allinone package for windows systems. This package comes from the xampp project which is a great AMP tool.
|
||||
|
||||
2.1 download our .exe package.
|
||||
2.2 double click the .exe and extract it into c:\xampp or d:\xampp, keep it under the root directory.
|
||||
2.3 start zentao
|
||||
|
||||
cd c:\xampp, there'is control panel tools. double click it, it will stay on the tray menu at the bottom of the window.
|
||||
click the zentao icon, then the menu will show, you can choose the "start zentao", waiting for a moment.
|
||||
Then you can visit zentao through http://localhost/zentao/
|
||||
|
||||
3. install the allinone package on linux
|
||||
|
||||
We also build an allinone package for linux systems from the xampp tool.
|
||||
|
||||
3.1 download our .7z package, and save it to /opt/
|
||||
3.2 cd /opt/ and chmod a+rx *.7z and then execute the 7z file, which will self extrct.
|
||||
3.3 after extract, the directory should be /opt/lampp
|
||||
3.4 cd /opt/lampp, and execute sudo ./start or sudo ./start88 to start apache in 88 port and mysql in 3308 port.
|
||||
3.5 then you can visit zentao through http://localhost/zentao/
|
||||
|
||||
4. install the source code.
|
||||
|
||||
4.1 install one AMP package. you can install other AMP package. Make sure the version of apache, php and mysql meets the needs of zetnao.
|
||||
4.2 download our zip package.
|
||||
4.3 unpack it.
|
||||
after download our zip package, save it to the apache's htdocs path and unpack it to zentaopms. make sure the zentaopms path can be
|
||||
visited through browse.
|
||||
4.4 start the installation
|
||||
open your browser and visit the zentaopms path, for example http://192.168.1.1/zentaopms/, then the install wizard will launch, you can install it
|
||||
step by step.
|
||||
1. system required
|
||||
|
||||
zentao needs apache, php(>5.2) and mysql.
|
||||
|
||||
2. install the allinone package on windows
|
||||
|
||||
We have build an allinone package for windows systems. This package comes from the xampp project which is a great AMP tool.
|
||||
|
||||
2.1 download our .exe package.
|
||||
2.2 double click the .exe and extract it into c:\xampp or d:\xampp, keep it under the root directory.
|
||||
2.3 start zentao
|
||||
|
||||
cd c:\xampp, there'is control panel tools. double click it, it will stay on the tray menu at the bottom of the window.
|
||||
click the zentao icon, then the menu will show, you can choose the "start zentao", waiting for a moment.
|
||||
Then you can visit zentao through http://localhost/zentao/
|
||||
|
||||
3. install the allinone package on linux
|
||||
|
||||
We also build an allinone package for linux systems from the xampp tool.
|
||||
|
||||
3.1 download our .7z package, and save it to /opt/
|
||||
3.2 cd /opt/ and chmod a+rx *.7z and then execute the 7z file, which will self extrct.
|
||||
3.3 after extract, the directory should be /opt/lampp
|
||||
3.4 cd /opt/lampp, and execute sudo ./start or sudo ./start88 to start apache in 88 port and mysql in 3308 port.
|
||||
3.5 then you can visit zentao through http://localhost/zentao/
|
||||
|
||||
4. install the source code.
|
||||
|
||||
4.1 install one AMP package. you can install other AMP package. Make sure the version of apache, php and mysql meets the needs of zetnao.
|
||||
4.2 download our zip package.
|
||||
4.3 unpack it.
|
||||
after download our zip package, save it to the apache's htdocs path and unpack it to zentaopms. make sure the zentaopms path can be
|
||||
visited through browse.
|
||||
4.4 start the installation
|
||||
open your browser and visit the zentaopms path, for example http://192.168.1.1/zentaopms/, then the install wizard will launch, you can install it
|
||||
step by step.
|
||||
|
||||
44
doc/THANKS
44
doc/THANKS
@@ -1,22 +1,22 @@
|
||||
禅道项目管理软件在开发过程中,得到了众多朋友的支持,在此表示感谢。
|
||||
下面是不完全名单,如有遗漏,烦请告知,chunsheng#cnezsoft.com
|
||||
|
||||
感谢各位购买禅道产品或者服务的客户,有您的支持,禅道会越走越坚定,越来越踏实;
|
||||
感谢之前所有参与或帮助过BugFree1.x的朋友们,有你们陪着一路走来,才有了禅道今天的发展,尤其感谢原来的版主 Mr.lee,希望有机会再合作;
|
||||
感谢BugFree2.x项目的团队,和你们的分歧,最终促使我来做一款真正的项目管理软件,而非仅仅微软的复制品;
|
||||
感谢原阿里巴巴的同事梅坚先生,是你将scrum介绍到了中国雅虎,正是那时我开始了解学习scrum;
|
||||
感谢原阿里巴巴的同事史峰先生,感谢你在禅道项目设计初期提出的很多建议;
|
||||
感谢我的好朋友李玉鹏,感谢我们之间心有灵犀的讨论,确定了禅道很多的设计方案;
|
||||
感谢原阿里巴巴的其他同事们,禅道的很多想法正是和你们工作时碰撞产生的火花;
|
||||
感谢普加网(青岛普加智能信息有限公司,www.pujia.com)在禅道前期开发过程中给予的大力支持;
|
||||
感谢whjmyu, sophia, 21bird, 云飞扬对禅道项目的贡献,谢谢你们的辛勤付出;
|
||||
感谢各位贡献QQ群的群主们,有了你们的QQ群,我们才有更好的沟通交流的地方;
|
||||
感谢众多网友积极给予的建议和反馈,有你们的参与,禅道会越来越好;
|
||||
感谢ELING(QQ:467303906)设计了精美的Logo,感谢蓝虎魄(QQ:649009995)设计了禅道1.0正式版的界面,感谢catouse设计的最新版本的界面;
|
||||
感谢公司成立以来曾一起共事过的朋友,虽然我们不再是同事,但感谢你们在禅道最困难的时候对禅道的付出;
|
||||
|
||||
感谢我们现在一起共事的同事,感谢您的不离不弃,一起坚守,相信我们一起努力,会赢得一片属于自己的自由璀璨的天空;
|
||||
|
||||
王春生 青岛易软天创网络科技有限公司
|
||||
|
||||
2012-10-8
|
||||
禅道项目管理软件在开发过程中,得到了众多朋友的支持,在此表示感谢。
|
||||
下面是不完全名单,如有遗漏,烦请告知,chunsheng#cnezsoft.com
|
||||
|
||||
感谢各位购买禅道产品或者服务的客户,有您的支持,禅道会越走越坚定,越来越踏实;
|
||||
感谢之前所有参与或帮助过BugFree1.x的朋友们,有你们陪着一路走来,才有了禅道今天的发展,尤其感谢原来的版主 Mr.lee,希望有机会再合作;
|
||||
感谢BugFree2.x项目的团队,和你们的分歧,最终促使我来做一款真正的项目管理软件,而非仅仅微软的复制品;
|
||||
感谢原阿里巴巴的同事梅坚先生,是你将scrum介绍到了中国雅虎,正是那时我开始了解学习scrum;
|
||||
感谢原阿里巴巴的同事史峰先生,感谢你在禅道项目设计初期提出的很多建议;
|
||||
感谢我的好朋友李玉鹏,感谢我们之间心有灵犀的讨论,确定了禅道很多的设计方案;
|
||||
感谢原阿里巴巴的其他同事们,禅道的很多想法正是和你们工作时碰撞产生的火花;
|
||||
感谢普加网(青岛普加智能信息有限公司,www.pujia.com)在禅道前期开发过程中给予的大力支持;
|
||||
感谢whjmyu, sophia, 21bird, 云飞扬对禅道项目的贡献,谢谢你们的辛勤付出;
|
||||
感谢各位贡献QQ群的群主们,有了你们的QQ群,我们才有更好的沟通交流的地方;
|
||||
感谢众多网友积极给予的建议和反馈,有你们的参与,禅道会越来越好;
|
||||
感谢ELING(QQ:467303906)设计了精美的Logo,感谢蓝虎魄(QQ:649009995)设计了禅道1.0正式版的界面,感谢catouse设计的最新版本的界面;
|
||||
感谢公司成立以来曾一起共事过的朋友,虽然我们不再是同事,但感谢你们在禅道最困难的时候对禅道的付出;
|
||||
|
||||
感谢我们现在一起共事的同事,感谢您的不离不弃,一起坚守,相信我们一起努力,会赢得一片属于自己的自由璀璨的天空;
|
||||
|
||||
王春生 青岛易软天创网络科技有限公司
|
||||
|
||||
2012-10-8
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
[InternetShortcut]
|
||||
URL=http://www.zentao.net/video-browse.html
|
||||
IDList=
|
||||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://www.zentao.net/video-browse.html
|
||||
IDList=
|
||||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,421 +1,421 @@
|
||||
// --------------------------------------------------------------------------------
|
||||
// PclZip 2.8.2 - readme.txt
|
||||
// --------------------------------------------------------------------------------
|
||||
// License GNU/LGPL - August 2009
|
||||
// Vincent Blavet - vincent@phpconcept.net
|
||||
// http://www.phpconcept.net
|
||||
// --------------------------------------------------------------------------------
|
||||
// $Id: readme.txt,v 1.60 2009/09/30 20:35:21 vblavet Exp $
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
0 - Sommaire
|
||||
============
|
||||
1 - Introduction
|
||||
2 - What's new
|
||||
3 - Corrected bugs
|
||||
4 - Known bugs or limitations
|
||||
5 - License
|
||||
6 - Warning
|
||||
7 - Documentation
|
||||
8 - Author
|
||||
9 - Contribute
|
||||
|
||||
1 - Introduction
|
||||
================
|
||||
|
||||
PclZip is a library that allow you to manage a Zip archive.
|
||||
|
||||
Full documentation about PclZip can be found here : http://www.phpconcept.net/pclzip
|
||||
|
||||
2 - What's new
|
||||
==============
|
||||
|
||||
Version 2.8.2 :
|
||||
- PCLZIP_CB_PRE_EXTRACT and PCLZIP_CB_POST_EXTRACT are now supported with
|
||||
extraction as a string (PCLZIP_OPT_EXTRACT_AS_STRING). The string
|
||||
can also be modified in the post-extract call back.
|
||||
**Bugs correction :
|
||||
- PCLZIP_OPT_REMOVE_ALL_PATH was not working correctly
|
||||
- Remove use of eval() and do direct call to callback functions
|
||||
- Correct support of 64bits systems (Thanks to WordPress team)
|
||||
|
||||
Version 2.8.1 :
|
||||
- Move option PCLZIP_OPT_BY_EREG to PCLZIP_OPT_BY_PREG because ereg() is
|
||||
deprecated in PHP 5.3. When using option PCLZIP_OPT_BY_EREG, PclZip will
|
||||
automatically replace it by PCLZIP_OPT_BY_PREG.
|
||||
|
||||
Version 2.8 :
|
||||
- Improve extraction of zip archive for large files by using temporary files
|
||||
This feature is working like the one defined in r2.7.
|
||||
Options are renamed : PCLZIP_OPT_TEMP_FILE_ON, PCLZIP_OPT_TEMP_FILE_OFF,
|
||||
PCLZIP_OPT_TEMP_FILE_THRESHOLD
|
||||
- Add a ratio constant PCLZIP_TEMPORARY_FILE_RATIO to configure the auto
|
||||
sense of temporary file use.
|
||||
- Bug correction : Reduce filepath in returned file list to remove ennoying
|
||||
'.//' preambule in file path.
|
||||
|
||||
Version 2.7 :
|
||||
- Improve creation of zip archive for large files :
|
||||
PclZip will now autosense the configured memory and use temporary files
|
||||
when large file is suspected.
|
||||
This feature can also ne triggered by manual options in create() and add()
|
||||
methods. 'PCLZIP_OPT_ADD_TEMP_FILE_ON' force the use of temporary files,
|
||||
'PCLZIP_OPT_ADD_TEMP_FILE_OFF' disable the autosense technic,
|
||||
'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD' allow for configuration of a size
|
||||
threshold to use temporary files.
|
||||
Using "temporary files" rather than "memory" might take more time, but
|
||||
might give the ability to zip very large files :
|
||||
Tested on my win laptop with a 88Mo file :
|
||||
Zip "in-memory" : 18sec (max_execution_time=30, memory_limit=180Mo)
|
||||
Zip "tmporary-files" : 23sec (max_execution_time=30, memory_limit=30Mo)
|
||||
- Replace use of mktime() by time() to limit the E_STRICT error messages.
|
||||
- Bug correction : When adding files with full windows path (drive letter)
|
||||
PclZip is now working. Before, if the drive letter is not the default
|
||||
path, PclZip was not able to add the file.
|
||||
|
||||
Version 2.6 :
|
||||
- Code optimisation
|
||||
- New attributes PCLZIP_ATT_FILE_COMMENT gives the ability to
|
||||
add a comment for a specific file. (Don't really know if this is usefull)
|
||||
- New attribute PCLZIP_ATT_FILE_CONTENT gives the ability to add a string
|
||||
as a file.
|
||||
- New attribute PCLZIP_ATT_FILE_MTIME modify the timestamp associated with
|
||||
a file.
|
||||
- Correct a bug. Files archived with a timestamp with 0h0m0s were extracted
|
||||
with current time
|
||||
- Add CRC value in the informations returned back for each file after an
|
||||
action.
|
||||
- Add missing closedir() statement.
|
||||
- When adding a folder, and removing the path of this folder, files were
|
||||
incorrectly added with a '/' at the beginning. Which means files are
|
||||
related to root in unix systems. Corrected.
|
||||
- Add conditional if before constant definition. This will allow users
|
||||
to redefine constants without changing the file, and then improve
|
||||
upgrade of pclzip code for new versions.
|
||||
|
||||
Version 2.5 :
|
||||
- Introduce the ability to add file/folder with individual properties (file descriptor).
|
||||
This gives for example the ability to change the filename of a zipped file.
|
||||
. Able to add files individually
|
||||
. Able to change full name
|
||||
. Able to change short name
|
||||
. Compatible with global options
|
||||
- New attributes : PCLZIP_ATT_FILE_NAME, PCLZIP_ATT_FILE_NEW_SHORT_NAME, PCLZIP_ATT_FILE_NEW_FULL_NAME
|
||||
- New error code : PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE
|
||||
- Add a security control feature. PclZip can extract any file in any folder
|
||||
of a system. People may use this to upload a zip file and try to override
|
||||
a system file. The PCLZIP_OPT_EXTRACT_DIR_RESTRICTION will give the
|
||||
ability to forgive any directory transversal behavior.
|
||||
- New PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : check extraction path
|
||||
- New error code : PCLZIP_ERR_DIRECTORY_RESTRICTION
|
||||
- Modification in PclZipUtilPathInclusion() : dir and path beginning with ./ will be prepend
|
||||
by current path (getcwd())
|
||||
|
||||
Version 2.4 :
|
||||
- Code improvment : try to speed up the code by removing unusefull call to pack()
|
||||
- Correct bug in delete() : delete() should be called with no argument. This was not
|
||||
the case in 2.3. This is corrected in 2.4.
|
||||
- Correct a bug in path_inclusion function. When the path has several '../../', the
|
||||
result was bad.
|
||||
- Add a check for magic_quotes_runtime configuration. If enabled, PclZip will
|
||||
disable it while working and det it back to its original value.
|
||||
This resolve a lots of bad formated archive errors.
|
||||
- Bug correction : PclZip now correctly unzip file in some specific situation,
|
||||
when compressed content has same size as uncompressed content.
|
||||
- Bug correction : When selecting option 'PCLZIP_OPT_REMOVE_ALL_PATH',
|
||||
directories are not any more created.
|
||||
- Code improvment : correct unclosed opendir(), better handling of . and .. in
|
||||
loops.
|
||||
|
||||
|
||||
Version 2.3 :
|
||||
- Correct a bug with PHP5 : affecting the value 0xFE49FFE0 to a variable does not
|
||||
give the same result in PHP4 and PHP5 ....
|
||||
|
||||
Version 2.2 :
|
||||
- Try development of PCLZIP_OPT_CRYPT .....
|
||||
However this becomes to a stop. To crypt/decrypt I need to multiply 2 long integers,
|
||||
the result (greater than a long) is not supported by PHP. Even the use of bcmath
|
||||
functions does not help. I did not find yet a solution ...;
|
||||
- Add missing '/' at end of directory entries
|
||||
- Check is a file is encrypted or not. Returns status 'unsupported_encryption' and/or
|
||||
error code PCLZIP_ERR_UNSUPPORTED_ENCRYPTION.
|
||||
- Corrected : Bad "version need to extract" field in local file header
|
||||
- Add private method privCheckFileHeaders() in order to check local and central
|
||||
file headers. PclZip is now supporting purpose bit flag bit 3. Purpose bit flag bit 3 gives
|
||||
the ability to have a local file header without size, compressed size and crc filled.
|
||||
- Add a generic status 'error' for file status
|
||||
- Add control of compression type. PclZip only support deflate compression method.
|
||||
Before v2.2, PclZip does not check the compression method used in an archive while
|
||||
extracting. With v2.2 PclZip returns a new error status for a file using an unsupported
|
||||
compression method. New status is "unsupported_compression". New error code is
|
||||
PCLZIP_ERR_UNSUPPORTED_COMPRESSION.
|
||||
- Add optional attribute PCLZIP_OPT_STOP_ON_ERROR. This will stop the extract of files
|
||||
when errors like 'a folder with same name exists' or 'a newer file exists' or
|
||||
'a write protected file' exists, rather than set a status for the concerning file
|
||||
and resume the extract of the zip.
|
||||
- Add optional attribute PCLZIP_OPT_REPLACE_NEWER. This will force, during an extract' the
|
||||
replacement of the file, even if a newer version of the file exists.
|
||||
Note that today if a file with the same name already exists but is older it will be
|
||||
replaced by the extracted one.
|
||||
- Improve PclZipUtilOption()
|
||||
- Support of zip archive with trailing bytes. Before 2.2, PclZip checks that the central
|
||||
directory structure is the last data in the archive. Crypt encryption/decryption of
|
||||
zip archive put trailing 0 bytes after decryption. PclZip is now supporting this.
|
||||
|
||||
Version 2.1 :
|
||||
- Add the ability to abort the extraction by using a user callback function.
|
||||
The user can now return the value '2' in its callback which indicates to stop the
|
||||
extraction. For a pre call-back extract is stopped before the extration of the current
|
||||
file. For a post call back, the extraction is stopped after.
|
||||
- Add the ability to extract a file (or several files) directly in the standard output.
|
||||
This is done by the new parameter PCLZIP_OPT_EXTRACT_IN_OUTPUT with method extract().
|
||||
- Add support for parameters PCLZIP_OPT_COMMENT, PCLZIP_OPT_ADD_COMMENT,
|
||||
PCLZIP_OPT_PREPEND_COMMENT. This will create, replace, add, or prepend comments
|
||||
in the zip archive.
|
||||
- When merging two archives, the comments are not any more lost, but merged, with a
|
||||
blank space separator.
|
||||
- Corrected bug : Files are not deleted when all files are asked to be deleted.
|
||||
- Corrected bug : Folders with name '0' made PclZip to abort the create or add feature.
|
||||
|
||||
|
||||
Version 2.0 :
|
||||
***** Warning : Some new features may break the backward compatibility for your scripts.
|
||||
Please carefully read the readme file.
|
||||
- Add the ability to delete by Index, name and regular expression. This feature is
|
||||
performed by the method delete(), which uses the optional parameters
|
||||
PCLZIP_OPT_BY_INDEX, PCLZIP_OPT_BY_NAME, PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG.
|
||||
- Add the ability to extract by regular expression. To extract by regexp you must use the method
|
||||
extract(), with the option PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG
|
||||
(depending if you want to use ereg() or preg_match() syntax) followed by the
|
||||
regular expression pattern.
|
||||
- Add the ability to extract by index, directly with the extract() method. This is a
|
||||
code improvment of the extractByIndex() method.
|
||||
- Add the ability to extract by name. To extract by name you must use the method
|
||||
extract(), with the option PCLZIP_OPT_BY_NAME followed by the filename to
|
||||
extract or an array of filenames to extract. To extract all a folder, use the folder
|
||||
name rather than the filename with a '/' at the end.
|
||||
- Add the ability to add files without compression. This is done with a new attribute
|
||||
which is PCLZIP_OPT_NO_COMPRESSION.
|
||||
- Add the attribute PCLZIP_OPT_EXTRACT_AS_STRING, which allow to extract a file directly
|
||||
in a string without using any file (or temporary file).
|
||||
- Add constant PCLZIP_SEPARATOR for static configuration of filename separators in a single string.
|
||||
The default separator is now a comma (,) and not any more a blank space.
|
||||
THIS BREAK THE BACKWARD COMPATIBILITY : Please check if this may have an impact with
|
||||
your script.
|
||||
- Improve algorythm performance by removing the use of temporary files when adding or
|
||||
extracting files in an archive.
|
||||
- Add (correct) detection of empty filename zipping. This can occurs when the removed
|
||||
path is the same
|
||||
as a zipped dir. The dir is not zipped (['status'] = filtered), only its content.
|
||||
- Add better support for windows paths (thanks for help from manus@manusfreedom.com).
|
||||
- Corrected bug : When the archive file already exists with size=0, the add() method
|
||||
fails. Corrected in 2.0.
|
||||
- Remove the use of OS_WINDOWS constant. Use php_uname() function rather.
|
||||
- Control the order of index ranges in extract by index feature.
|
||||
- Change the internal management of folders (better handling of internal flag).
|
||||
|
||||
|
||||
Version 1.3 :
|
||||
- Removing the double include check. This is now done by include_once() and require_once()
|
||||
PHP directives.
|
||||
- Changing the error handling mecanism : Remove the use of an external error library.
|
||||
The former PclError...() functions are replaced by internal equivalent methods.
|
||||
By changing the environment variable PCLZIP_ERROR_EXTERNAL you can still use the former library.
|
||||
Introducing the use of constants for error codes rather than integer values. This will help
|
||||
in futur improvment.
|
||||
Introduction of error handling functions like errorCode(), errorName() and errorInfo().
|
||||
- Remove the deprecated use of calling function with arguments passed by reference.
|
||||
- Add the calling of extract(), extractByIndex(), create() and add() functions
|
||||
with variable options rather than fixed arguments.
|
||||
- Add the ability to remove all the file path while extracting or adding,
|
||||
without any need to specify the path to remove.
|
||||
This is available for extract(), extractByIndex(), create() and add() functionS by using
|
||||
the new variable options parameters :
|
||||
- PCLZIP_OPT_REMOVE_ALL_PATH : by indicating this option while calling the fct.
|
||||
- Ability to change the mode of a file after the extraction (chmod()).
|
||||
This is available for extract() and extractByIndex() functionS by using
|
||||
the new variable options parameters.
|
||||
- PCLZIP_OPT_SET_CHMOD : by setting the value of this option.
|
||||
- Ability to definition call-back options. These call-back will be called during the adding,
|
||||
or the extracting of file (extract(), extractByIndex(), create() and add() functions) :
|
||||
- PCLZIP_CB_PRE_EXTRACT : will be called before each extraction of a file. The user
|
||||
can trigerred the change the filename of the extracted file. The user can triggered the
|
||||
skip of the extraction. This is adding a 'skipped' status in the file list result value.
|
||||
- PCLZIP_CB_POST_EXTRACT : will be called after each extraction of a file.
|
||||
Nothing can be triggered from that point.
|
||||
- PCLZIP_CB_PRE_ADD : will be called before each add of a file. The user
|
||||
can trigerred the change the stored filename of the added file. The user can triggered the
|
||||
skip of the add. This is adding a 'skipped' status in the file list result value.
|
||||
- PCLZIP_CB_POST_ADD : will be called after each add of a file.
|
||||
Nothing can be triggered from that point.
|
||||
- Two status are added in the file list returned as function result : skipped & filename_too_long
|
||||
'skipped' is used when a call-back function ask for skipping the file.
|
||||
'filename_too_long' is used while adding a file with a too long filename to archive (the file is
|
||||
not added)
|
||||
- Adding the function PclZipUtilPathInclusion(), that check the inclusion of a path into
|
||||
a directory.
|
||||
- Add a check of the presence of the archive file before some actions (like list, ...)
|
||||
- Add the initialisation of field "index" in header array. This means that by
|
||||
default index will be -1 when not explicitly set by the methods.
|
||||
|
||||
Version 1.2 :
|
||||
- Adding a duplicate function.
|
||||
- Adding a merge function. The merge function is a "quick merge" function,
|
||||
it just append the content of an archive at the end of the first one. There
|
||||
is no check for duplicate files or more recent files.
|
||||
- Improve the search of the central directory end.
|
||||
|
||||
Version 1.1.2 :
|
||||
|
||||
- Changing the license of PclZip. PclZip is now released under the GNU / LGPL license
|
||||
(see License section).
|
||||
- Adding the optional support of a static temporary directory. You will need to configure
|
||||
the constant PCLZIP_TEMPORARY_DIR if you want to use this feature.
|
||||
- Improving the rename() function. In some cases rename() does not work (different
|
||||
Filesystems), so it will be replaced by a copy() + unlink() functions.
|
||||
|
||||
Version 1.1.1 :
|
||||
|
||||
- Maintenance release, no new feature.
|
||||
|
||||
Version 1.1 :
|
||||
|
||||
- New method Add() : adding files in the archive
|
||||
- New method ExtractByIndex() : partial extract of the archive, files are identified by
|
||||
their index in the archive
|
||||
- New method DeleteByIndex() : delete some files/folder entries from the archive,
|
||||
files are identified by their index in the archive.
|
||||
- Adding a test of the zlib extension presence. If not present abort the script.
|
||||
|
||||
Version 1.0.1 :
|
||||
|
||||
- No new feature
|
||||
|
||||
|
||||
3 - Corrected bugs
|
||||
==================
|
||||
|
||||
Corrected in Version 2.0 :
|
||||
- Corrected : During an extraction, if a call-back fucntion is used and try to skip
|
||||
a file, all the extraction process is stopped.
|
||||
|
||||
Corrected in Version 1.3 :
|
||||
- Corrected : Support of static synopsis for method extract() is broken.
|
||||
- Corrected : invalid size of archive content field (0xFF) should be (0xFFFF).
|
||||
- Corrected : When an extract is done with a remove_path parameter, the entry for
|
||||
the directory with exactly the same path is not skipped/filtered.
|
||||
- Corrected : extractByIndex() and deleteByIndex() were not managing index in the
|
||||
right way. For example indexes '1,3-5,11' will only extract files 1 and 11. This
|
||||
is due to a sort of the index resulting table that puts 11 before 3-5 (sort on
|
||||
string and not interger). The sort is temporarilly removed, this means that
|
||||
you must provide a sorted list of index ranges.
|
||||
|
||||
Corrected in Version 1.2 :
|
||||
|
||||
- Nothing.
|
||||
|
||||
Corrected in Version 1.1.2 :
|
||||
|
||||
- Corrected : Winzip is unable to delete or add new files in a PclZip created archives.
|
||||
|
||||
Corrected in Version 1.1.1 :
|
||||
|
||||
- Corrected : When archived file is not compressed (0% compression), the
|
||||
extract method fails.
|
||||
|
||||
Corrected in Version 1.1 :
|
||||
|
||||
- Corrected : Adding a complete tree of folder may result in a bad archive
|
||||
creation.
|
||||
|
||||
Corrected in Version 1.0.1 :
|
||||
|
||||
- Corrected : Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024).
|
||||
|
||||
|
||||
4 - Known bugs or limitations
|
||||
=============================
|
||||
|
||||
Please publish bugs reports in SourceForge :
|
||||
http://sourceforge.net/tracker/?group_id=40254&atid=427564
|
||||
|
||||
In Version 2.x :
|
||||
- PclZip does only support file uncompressed or compressed with deflate (compression method 8)
|
||||
- PclZip does not support password protected zip archive
|
||||
- Some concern were seen when changing mtime of a file while archiving.
|
||||
Seems to be linked to Daylight Saving Time (PclTest_changing_mtime).
|
||||
|
||||
In Version 1.2 :
|
||||
|
||||
- merge() methods does not check for duplicate files or last date of modifications.
|
||||
|
||||
In Version 1.1 :
|
||||
|
||||
- Limitation : Using 'extract' fields in the file header in the zip archive is not supported.
|
||||
- WinZip is unable to delete a single file in a PclZip created archive. It is also unable to
|
||||
add a file in a PclZip created archive. (Corrected in v.1.2)
|
||||
|
||||
In Version 1.0.1 :
|
||||
|
||||
- Adding a complete tree of folder may result in a bad archive
|
||||
creation. (Corrected in V.1.1).
|
||||
- Path given to methods must be in the unix format (/) and not the Windows format (\).
|
||||
Workaround : Use only / directory separators.
|
||||
- PclZip is using temporary files that are sometime the name of the file with a .tmp or .gz
|
||||
added suffix. Files with these names may already exist and may be overwritten.
|
||||
Workaround : none.
|
||||
- PclZip does not check if the zlib extension is present. If it is absent, the zip
|
||||
file is not created and the lib abort without warning.
|
||||
Workaround : enable the zlib extension on the php install
|
||||
|
||||
In Version 1.0 :
|
||||
|
||||
- Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024).
|
||||
(Corrected in v.1.0.1)
|
||||
- Limitation : Multi-disk zip archive are not supported.
|
||||
|
||||
|
||||
5 - License
|
||||
===========
|
||||
|
||||
Since version 1.1.2, PclZip Library is released under GNU/LGPL license.
|
||||
This library is free, so you can use it at no cost.
|
||||
|
||||
HOWEVER, if you release a script, an application, a library or any kind of
|
||||
code using PclZip library (or a part of it), YOU MUST :
|
||||
- Indicate in the documentation (or a readme file), that your work
|
||||
uses PclZip Library, and make a reference to the author and the web site
|
||||
http://www.phpconcept.net
|
||||
- Gives the ability to the final user to update the PclZip libary.
|
||||
|
||||
I will also appreciate that you send me a mail (vincent@phpconcept.net), just to
|
||||
be aware that someone is using PclZip.
|
||||
|
||||
For more information about GNU/LGPL license : http://www.gnu.org
|
||||
|
||||
6 - Warning
|
||||
=================
|
||||
|
||||
This library and the associated files are non commercial, non professional work.
|
||||
It should not have unexpected results. However if any damage is caused by this software
|
||||
the author can not be responsible.
|
||||
The use of this software is at the risk of the user.
|
||||
|
||||
7 - Documentation
|
||||
=================
|
||||
PclZip User Manuel is available in English on PhpConcept : http://www.phpconcept.net/pclzip/man/en/index.php
|
||||
A Russian translation was done by Feskov Kuzma : http://php.russofile.ru/ru/authors/unsort/zip/
|
||||
|
||||
8 - Author
|
||||
==========
|
||||
|
||||
This software was written by Vincent Blavet (vincent@phpconcept.net) on its leasure time.
|
||||
|
||||
9 - Contribute
|
||||
==============
|
||||
If you want to contribute to the development of PclZip, please contact vincent@phpconcept.net.
|
||||
If you can help in financing PhpConcept hosting service, please go to
|
||||
http://www.phpconcept.net/soutien.php
|
||||
// --------------------------------------------------------------------------------
|
||||
// PclZip 2.8.2 - readme.txt
|
||||
// --------------------------------------------------------------------------------
|
||||
// License GNU/LGPL - August 2009
|
||||
// Vincent Blavet - vincent@phpconcept.net
|
||||
// http://www.phpconcept.net
|
||||
// --------------------------------------------------------------------------------
|
||||
// $Id: readme.txt,v 1.60 2009/09/30 20:35:21 vblavet Exp $
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
0 - Sommaire
|
||||
============
|
||||
1 - Introduction
|
||||
2 - What's new
|
||||
3 - Corrected bugs
|
||||
4 - Known bugs or limitations
|
||||
5 - License
|
||||
6 - Warning
|
||||
7 - Documentation
|
||||
8 - Author
|
||||
9 - Contribute
|
||||
|
||||
1 - Introduction
|
||||
================
|
||||
|
||||
PclZip is a library that allow you to manage a Zip archive.
|
||||
|
||||
Full documentation about PclZip can be found here : http://www.phpconcept.net/pclzip
|
||||
|
||||
2 - What's new
|
||||
==============
|
||||
|
||||
Version 2.8.2 :
|
||||
- PCLZIP_CB_PRE_EXTRACT and PCLZIP_CB_POST_EXTRACT are now supported with
|
||||
extraction as a string (PCLZIP_OPT_EXTRACT_AS_STRING). The string
|
||||
can also be modified in the post-extract call back.
|
||||
**Bugs correction :
|
||||
- PCLZIP_OPT_REMOVE_ALL_PATH was not working correctly
|
||||
- Remove use of eval() and do direct call to callback functions
|
||||
- Correct support of 64bits systems (Thanks to WordPress team)
|
||||
|
||||
Version 2.8.1 :
|
||||
- Move option PCLZIP_OPT_BY_EREG to PCLZIP_OPT_BY_PREG because ereg() is
|
||||
deprecated in PHP 5.3. When using option PCLZIP_OPT_BY_EREG, PclZip will
|
||||
automatically replace it by PCLZIP_OPT_BY_PREG.
|
||||
|
||||
Version 2.8 :
|
||||
- Improve extraction of zip archive for large files by using temporary files
|
||||
This feature is working like the one defined in r2.7.
|
||||
Options are renamed : PCLZIP_OPT_TEMP_FILE_ON, PCLZIP_OPT_TEMP_FILE_OFF,
|
||||
PCLZIP_OPT_TEMP_FILE_THRESHOLD
|
||||
- Add a ratio constant PCLZIP_TEMPORARY_FILE_RATIO to configure the auto
|
||||
sense of temporary file use.
|
||||
- Bug correction : Reduce filepath in returned file list to remove ennoying
|
||||
'.//' preambule in file path.
|
||||
|
||||
Version 2.7 :
|
||||
- Improve creation of zip archive for large files :
|
||||
PclZip will now autosense the configured memory and use temporary files
|
||||
when large file is suspected.
|
||||
This feature can also ne triggered by manual options in create() and add()
|
||||
methods. 'PCLZIP_OPT_ADD_TEMP_FILE_ON' force the use of temporary files,
|
||||
'PCLZIP_OPT_ADD_TEMP_FILE_OFF' disable the autosense technic,
|
||||
'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD' allow for configuration of a size
|
||||
threshold to use temporary files.
|
||||
Using "temporary files" rather than "memory" might take more time, but
|
||||
might give the ability to zip very large files :
|
||||
Tested on my win laptop with a 88Mo file :
|
||||
Zip "in-memory" : 18sec (max_execution_time=30, memory_limit=180Mo)
|
||||
Zip "tmporary-files" : 23sec (max_execution_time=30, memory_limit=30Mo)
|
||||
- Replace use of mktime() by time() to limit the E_STRICT error messages.
|
||||
- Bug correction : When adding files with full windows path (drive letter)
|
||||
PclZip is now working. Before, if the drive letter is not the default
|
||||
path, PclZip was not able to add the file.
|
||||
|
||||
Version 2.6 :
|
||||
- Code optimisation
|
||||
- New attributes PCLZIP_ATT_FILE_COMMENT gives the ability to
|
||||
add a comment for a specific file. (Don't really know if this is usefull)
|
||||
- New attribute PCLZIP_ATT_FILE_CONTENT gives the ability to add a string
|
||||
as a file.
|
||||
- New attribute PCLZIP_ATT_FILE_MTIME modify the timestamp associated with
|
||||
a file.
|
||||
- Correct a bug. Files archived with a timestamp with 0h0m0s were extracted
|
||||
with current time
|
||||
- Add CRC value in the informations returned back for each file after an
|
||||
action.
|
||||
- Add missing closedir() statement.
|
||||
- When adding a folder, and removing the path of this folder, files were
|
||||
incorrectly added with a '/' at the beginning. Which means files are
|
||||
related to root in unix systems. Corrected.
|
||||
- Add conditional if before constant definition. This will allow users
|
||||
to redefine constants without changing the file, and then improve
|
||||
upgrade of pclzip code for new versions.
|
||||
|
||||
Version 2.5 :
|
||||
- Introduce the ability to add file/folder with individual properties (file descriptor).
|
||||
This gives for example the ability to change the filename of a zipped file.
|
||||
. Able to add files individually
|
||||
. Able to change full name
|
||||
. Able to change short name
|
||||
. Compatible with global options
|
||||
- New attributes : PCLZIP_ATT_FILE_NAME, PCLZIP_ATT_FILE_NEW_SHORT_NAME, PCLZIP_ATT_FILE_NEW_FULL_NAME
|
||||
- New error code : PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE
|
||||
- Add a security control feature. PclZip can extract any file in any folder
|
||||
of a system. People may use this to upload a zip file and try to override
|
||||
a system file. The PCLZIP_OPT_EXTRACT_DIR_RESTRICTION will give the
|
||||
ability to forgive any directory transversal behavior.
|
||||
- New PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : check extraction path
|
||||
- New error code : PCLZIP_ERR_DIRECTORY_RESTRICTION
|
||||
- Modification in PclZipUtilPathInclusion() : dir and path beginning with ./ will be prepend
|
||||
by current path (getcwd())
|
||||
|
||||
Version 2.4 :
|
||||
- Code improvment : try to speed up the code by removing unusefull call to pack()
|
||||
- Correct bug in delete() : delete() should be called with no argument. This was not
|
||||
the case in 2.3. This is corrected in 2.4.
|
||||
- Correct a bug in path_inclusion function. When the path has several '../../', the
|
||||
result was bad.
|
||||
- Add a check for magic_quotes_runtime configuration. If enabled, PclZip will
|
||||
disable it while working and det it back to its original value.
|
||||
This resolve a lots of bad formated archive errors.
|
||||
- Bug correction : PclZip now correctly unzip file in some specific situation,
|
||||
when compressed content has same size as uncompressed content.
|
||||
- Bug correction : When selecting option 'PCLZIP_OPT_REMOVE_ALL_PATH',
|
||||
directories are not any more created.
|
||||
- Code improvment : correct unclosed opendir(), better handling of . and .. in
|
||||
loops.
|
||||
|
||||
|
||||
Version 2.3 :
|
||||
- Correct a bug with PHP5 : affecting the value 0xFE49FFE0 to a variable does not
|
||||
give the same result in PHP4 and PHP5 ....
|
||||
|
||||
Version 2.2 :
|
||||
- Try development of PCLZIP_OPT_CRYPT .....
|
||||
However this becomes to a stop. To crypt/decrypt I need to multiply 2 long integers,
|
||||
the result (greater than a long) is not supported by PHP. Even the use of bcmath
|
||||
functions does not help. I did not find yet a solution ...;
|
||||
- Add missing '/' at end of directory entries
|
||||
- Check is a file is encrypted or not. Returns status 'unsupported_encryption' and/or
|
||||
error code PCLZIP_ERR_UNSUPPORTED_ENCRYPTION.
|
||||
- Corrected : Bad "version need to extract" field in local file header
|
||||
- Add private method privCheckFileHeaders() in order to check local and central
|
||||
file headers. PclZip is now supporting purpose bit flag bit 3. Purpose bit flag bit 3 gives
|
||||
the ability to have a local file header without size, compressed size and crc filled.
|
||||
- Add a generic status 'error' for file status
|
||||
- Add control of compression type. PclZip only support deflate compression method.
|
||||
Before v2.2, PclZip does not check the compression method used in an archive while
|
||||
extracting. With v2.2 PclZip returns a new error status for a file using an unsupported
|
||||
compression method. New status is "unsupported_compression". New error code is
|
||||
PCLZIP_ERR_UNSUPPORTED_COMPRESSION.
|
||||
- Add optional attribute PCLZIP_OPT_STOP_ON_ERROR. This will stop the extract of files
|
||||
when errors like 'a folder with same name exists' or 'a newer file exists' or
|
||||
'a write protected file' exists, rather than set a status for the concerning file
|
||||
and resume the extract of the zip.
|
||||
- Add optional attribute PCLZIP_OPT_REPLACE_NEWER. This will force, during an extract' the
|
||||
replacement of the file, even if a newer version of the file exists.
|
||||
Note that today if a file with the same name already exists but is older it will be
|
||||
replaced by the extracted one.
|
||||
- Improve PclZipUtilOption()
|
||||
- Support of zip archive with trailing bytes. Before 2.2, PclZip checks that the central
|
||||
directory structure is the last data in the archive. Crypt encryption/decryption of
|
||||
zip archive put trailing 0 bytes after decryption. PclZip is now supporting this.
|
||||
|
||||
Version 2.1 :
|
||||
- Add the ability to abort the extraction by using a user callback function.
|
||||
The user can now return the value '2' in its callback which indicates to stop the
|
||||
extraction. For a pre call-back extract is stopped before the extration of the current
|
||||
file. For a post call back, the extraction is stopped after.
|
||||
- Add the ability to extract a file (or several files) directly in the standard output.
|
||||
This is done by the new parameter PCLZIP_OPT_EXTRACT_IN_OUTPUT with method extract().
|
||||
- Add support for parameters PCLZIP_OPT_COMMENT, PCLZIP_OPT_ADD_COMMENT,
|
||||
PCLZIP_OPT_PREPEND_COMMENT. This will create, replace, add, or prepend comments
|
||||
in the zip archive.
|
||||
- When merging two archives, the comments are not any more lost, but merged, with a
|
||||
blank space separator.
|
||||
- Corrected bug : Files are not deleted when all files are asked to be deleted.
|
||||
- Corrected bug : Folders with name '0' made PclZip to abort the create or add feature.
|
||||
|
||||
|
||||
Version 2.0 :
|
||||
***** Warning : Some new features may break the backward compatibility for your scripts.
|
||||
Please carefully read the readme file.
|
||||
- Add the ability to delete by Index, name and regular expression. This feature is
|
||||
performed by the method delete(), which uses the optional parameters
|
||||
PCLZIP_OPT_BY_INDEX, PCLZIP_OPT_BY_NAME, PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG.
|
||||
- Add the ability to extract by regular expression. To extract by regexp you must use the method
|
||||
extract(), with the option PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG
|
||||
(depending if you want to use ereg() or preg_match() syntax) followed by the
|
||||
regular expression pattern.
|
||||
- Add the ability to extract by index, directly with the extract() method. This is a
|
||||
code improvment of the extractByIndex() method.
|
||||
- Add the ability to extract by name. To extract by name you must use the method
|
||||
extract(), with the option PCLZIP_OPT_BY_NAME followed by the filename to
|
||||
extract or an array of filenames to extract. To extract all a folder, use the folder
|
||||
name rather than the filename with a '/' at the end.
|
||||
- Add the ability to add files without compression. This is done with a new attribute
|
||||
which is PCLZIP_OPT_NO_COMPRESSION.
|
||||
- Add the attribute PCLZIP_OPT_EXTRACT_AS_STRING, which allow to extract a file directly
|
||||
in a string without using any file (or temporary file).
|
||||
- Add constant PCLZIP_SEPARATOR for static configuration of filename separators in a single string.
|
||||
The default separator is now a comma (,) and not any more a blank space.
|
||||
THIS BREAK THE BACKWARD COMPATIBILITY : Please check if this may have an impact with
|
||||
your script.
|
||||
- Improve algorythm performance by removing the use of temporary files when adding or
|
||||
extracting files in an archive.
|
||||
- Add (correct) detection of empty filename zipping. This can occurs when the removed
|
||||
path is the same
|
||||
as a zipped dir. The dir is not zipped (['status'] = filtered), only its content.
|
||||
- Add better support for windows paths (thanks for help from manus@manusfreedom.com).
|
||||
- Corrected bug : When the archive file already exists with size=0, the add() method
|
||||
fails. Corrected in 2.0.
|
||||
- Remove the use of OS_WINDOWS constant. Use php_uname() function rather.
|
||||
- Control the order of index ranges in extract by index feature.
|
||||
- Change the internal management of folders (better handling of internal flag).
|
||||
|
||||
|
||||
Version 1.3 :
|
||||
- Removing the double include check. This is now done by include_once() and require_once()
|
||||
PHP directives.
|
||||
- Changing the error handling mecanism : Remove the use of an external error library.
|
||||
The former PclError...() functions are replaced by internal equivalent methods.
|
||||
By changing the environment variable PCLZIP_ERROR_EXTERNAL you can still use the former library.
|
||||
Introducing the use of constants for error codes rather than integer values. This will help
|
||||
in futur improvment.
|
||||
Introduction of error handling functions like errorCode(), errorName() and errorInfo().
|
||||
- Remove the deprecated use of calling function with arguments passed by reference.
|
||||
- Add the calling of extract(), extractByIndex(), create() and add() functions
|
||||
with variable options rather than fixed arguments.
|
||||
- Add the ability to remove all the file path while extracting or adding,
|
||||
without any need to specify the path to remove.
|
||||
This is available for extract(), extractByIndex(), create() and add() functionS by using
|
||||
the new variable options parameters :
|
||||
- PCLZIP_OPT_REMOVE_ALL_PATH : by indicating this option while calling the fct.
|
||||
- Ability to change the mode of a file after the extraction (chmod()).
|
||||
This is available for extract() and extractByIndex() functionS by using
|
||||
the new variable options parameters.
|
||||
- PCLZIP_OPT_SET_CHMOD : by setting the value of this option.
|
||||
- Ability to definition call-back options. These call-back will be called during the adding,
|
||||
or the extracting of file (extract(), extractByIndex(), create() and add() functions) :
|
||||
- PCLZIP_CB_PRE_EXTRACT : will be called before each extraction of a file. The user
|
||||
can trigerred the change the filename of the extracted file. The user can triggered the
|
||||
skip of the extraction. This is adding a 'skipped' status in the file list result value.
|
||||
- PCLZIP_CB_POST_EXTRACT : will be called after each extraction of a file.
|
||||
Nothing can be triggered from that point.
|
||||
- PCLZIP_CB_PRE_ADD : will be called before each add of a file. The user
|
||||
can trigerred the change the stored filename of the added file. The user can triggered the
|
||||
skip of the add. This is adding a 'skipped' status in the file list result value.
|
||||
- PCLZIP_CB_POST_ADD : will be called after each add of a file.
|
||||
Nothing can be triggered from that point.
|
||||
- Two status are added in the file list returned as function result : skipped & filename_too_long
|
||||
'skipped' is used when a call-back function ask for skipping the file.
|
||||
'filename_too_long' is used while adding a file with a too long filename to archive (the file is
|
||||
not added)
|
||||
- Adding the function PclZipUtilPathInclusion(), that check the inclusion of a path into
|
||||
a directory.
|
||||
- Add a check of the presence of the archive file before some actions (like list, ...)
|
||||
- Add the initialisation of field "index" in header array. This means that by
|
||||
default index will be -1 when not explicitly set by the methods.
|
||||
|
||||
Version 1.2 :
|
||||
- Adding a duplicate function.
|
||||
- Adding a merge function. The merge function is a "quick merge" function,
|
||||
it just append the content of an archive at the end of the first one. There
|
||||
is no check for duplicate files or more recent files.
|
||||
- Improve the search of the central directory end.
|
||||
|
||||
Version 1.1.2 :
|
||||
|
||||
- Changing the license of PclZip. PclZip is now released under the GNU / LGPL license
|
||||
(see License section).
|
||||
- Adding the optional support of a static temporary directory. You will need to configure
|
||||
the constant PCLZIP_TEMPORARY_DIR if you want to use this feature.
|
||||
- Improving the rename() function. In some cases rename() does not work (different
|
||||
Filesystems), so it will be replaced by a copy() + unlink() functions.
|
||||
|
||||
Version 1.1.1 :
|
||||
|
||||
- Maintenance release, no new feature.
|
||||
|
||||
Version 1.1 :
|
||||
|
||||
- New method Add() : adding files in the archive
|
||||
- New method ExtractByIndex() : partial extract of the archive, files are identified by
|
||||
their index in the archive
|
||||
- New method DeleteByIndex() : delete some files/folder entries from the archive,
|
||||
files are identified by their index in the archive.
|
||||
- Adding a test of the zlib extension presence. If not present abort the script.
|
||||
|
||||
Version 1.0.1 :
|
||||
|
||||
- No new feature
|
||||
|
||||
|
||||
3 - Corrected bugs
|
||||
==================
|
||||
|
||||
Corrected in Version 2.0 :
|
||||
- Corrected : During an extraction, if a call-back fucntion is used and try to skip
|
||||
a file, all the extraction process is stopped.
|
||||
|
||||
Corrected in Version 1.3 :
|
||||
- Corrected : Support of static synopsis for method extract() is broken.
|
||||
- Corrected : invalid size of archive content field (0xFF) should be (0xFFFF).
|
||||
- Corrected : When an extract is done with a remove_path parameter, the entry for
|
||||
the directory with exactly the same path is not skipped/filtered.
|
||||
- Corrected : extractByIndex() and deleteByIndex() were not managing index in the
|
||||
right way. For example indexes '1,3-5,11' will only extract files 1 and 11. This
|
||||
is due to a sort of the index resulting table that puts 11 before 3-5 (sort on
|
||||
string and not interger). The sort is temporarilly removed, this means that
|
||||
you must provide a sorted list of index ranges.
|
||||
|
||||
Corrected in Version 1.2 :
|
||||
|
||||
- Nothing.
|
||||
|
||||
Corrected in Version 1.1.2 :
|
||||
|
||||
- Corrected : Winzip is unable to delete or add new files in a PclZip created archives.
|
||||
|
||||
Corrected in Version 1.1.1 :
|
||||
|
||||
- Corrected : When archived file is not compressed (0% compression), the
|
||||
extract method fails.
|
||||
|
||||
Corrected in Version 1.1 :
|
||||
|
||||
- Corrected : Adding a complete tree of folder may result in a bad archive
|
||||
creation.
|
||||
|
||||
Corrected in Version 1.0.1 :
|
||||
|
||||
- Corrected : Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024).
|
||||
|
||||
|
||||
4 - Known bugs or limitations
|
||||
=============================
|
||||
|
||||
Please publish bugs reports in SourceForge :
|
||||
http://sourceforge.net/tracker/?group_id=40254&atid=427564
|
||||
|
||||
In Version 2.x :
|
||||
- PclZip does only support file uncompressed or compressed with deflate (compression method 8)
|
||||
- PclZip does not support password protected zip archive
|
||||
- Some concern were seen when changing mtime of a file while archiving.
|
||||
Seems to be linked to Daylight Saving Time (PclTest_changing_mtime).
|
||||
|
||||
In Version 1.2 :
|
||||
|
||||
- merge() methods does not check for duplicate files or last date of modifications.
|
||||
|
||||
In Version 1.1 :
|
||||
|
||||
- Limitation : Using 'extract' fields in the file header in the zip archive is not supported.
|
||||
- WinZip is unable to delete a single file in a PclZip created archive. It is also unable to
|
||||
add a file in a PclZip created archive. (Corrected in v.1.2)
|
||||
|
||||
In Version 1.0.1 :
|
||||
|
||||
- Adding a complete tree of folder may result in a bad archive
|
||||
creation. (Corrected in V.1.1).
|
||||
- Path given to methods must be in the unix format (/) and not the Windows format (\).
|
||||
Workaround : Use only / directory separators.
|
||||
- PclZip is using temporary files that are sometime the name of the file with a .tmp or .gz
|
||||
added suffix. Files with these names may already exist and may be overwritten.
|
||||
Workaround : none.
|
||||
- PclZip does not check if the zlib extension is present. If it is absent, the zip
|
||||
file is not created and the lib abort without warning.
|
||||
Workaround : enable the zlib extension on the php install
|
||||
|
||||
In Version 1.0 :
|
||||
|
||||
- Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024).
|
||||
(Corrected in v.1.0.1)
|
||||
- Limitation : Multi-disk zip archive are not supported.
|
||||
|
||||
|
||||
5 - License
|
||||
===========
|
||||
|
||||
Since version 1.1.2, PclZip Library is released under GNU/LGPL license.
|
||||
This library is free, so you can use it at no cost.
|
||||
|
||||
HOWEVER, if you release a script, an application, a library or any kind of
|
||||
code using PclZip library (or a part of it), YOU MUST :
|
||||
- Indicate in the documentation (or a readme file), that your work
|
||||
uses PclZip Library, and make a reference to the author and the web site
|
||||
http://www.phpconcept.net
|
||||
- Gives the ability to the final user to update the PclZip libary.
|
||||
|
||||
I will also appreciate that you send me a mail (vincent@phpconcept.net), just to
|
||||
be aware that someone is using PclZip.
|
||||
|
||||
For more information about GNU/LGPL license : http://www.gnu.org
|
||||
|
||||
6 - Warning
|
||||
=================
|
||||
|
||||
This library and the associated files are non commercial, non professional work.
|
||||
It should not have unexpected results. However if any damage is caused by this software
|
||||
the author can not be responsible.
|
||||
The use of this software is at the risk of the user.
|
||||
|
||||
7 - Documentation
|
||||
=================
|
||||
PclZip User Manuel is available in English on PhpConcept : http://www.phpconcept.net/pclzip/man/en/index.php
|
||||
A Russian translation was done by Feskov Kuzma : http://php.russofile.ru/ru/authors/unsort/zip/
|
||||
|
||||
8 - Author
|
||||
==========
|
||||
|
||||
This software was written by Vincent Blavet (vincent@phpconcept.net) on its leasure time.
|
||||
|
||||
9 - Contribute
|
||||
==============
|
||||
If you want to contribute to the development of PclZip, please contact vincent@phpconcept.net.
|
||||
If you can help in financing PhpConcept hosting service, please go to
|
||||
http://www.phpconcept.net/soutien.php
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,218 +1,218 @@
|
||||
/*******************************************************************
|
||||
* The http://phpmailer.codeworxtech.com/ website now carries a few *
|
||||
* advertisements through the Google Adsense network. Please visit *
|
||||
* the advertiser sites and help us offset some of our costs. *
|
||||
* Thanks .... *
|
||||
********************************************************************/
|
||||
|
||||
PHPMailer
|
||||
Full Featured Email Transfer Class for PHP
|
||||
==========================================
|
||||
|
||||
Version 5.0.0 (April 02, 2009)
|
||||
|
||||
With the release of this version, we are initiating a new version numbering
|
||||
system to differentiate from the PHP4 version of PHPMailer.
|
||||
|
||||
Most notable in this release is fully object oriented code.
|
||||
|
||||
We now have available the PHPDocumentor (phpdocs) documentation. This is
|
||||
separate from the regular download to keep file sizes down. Please see the
|
||||
download area of http://phpmailer.codeworxtech.com.
|
||||
|
||||
We also have created a new test script (see /test_script) that you can use
|
||||
right out of the box. Copy the /test_script folder directly to your server (in
|
||||
the same structure ... with class.phpmailer.php and class.smtp.php in the
|
||||
folder above it. Then launch the test script with:
|
||||
http://www.yourdomain.com/phpmailer/test_script/index.php
|
||||
from this one script, you can test your server settings for mail(), sendmail (or
|
||||
qmail), and SMTP. This will email you a sample email (using contents.html for
|
||||
the email body) and two attachments. One of the attachments is used as an inline
|
||||
image to demonstrate how PHPMailer will automatically detect if attachments are
|
||||
the same source as inline graphics and only include one version. Once you click
|
||||
the Submit button, the results will be displayed including any SMTP debug
|
||||
information and send status. We will also display a version of the script that
|
||||
you can cut and paste to include in your projects. Enjoy!
|
||||
|
||||
Version 2.3 (November 08, 2008)
|
||||
|
||||
We have removed the /phpdoc from the downloads. All documentation is now on
|
||||
the http://phpmailer.codeworxtech.com website.
|
||||
|
||||
The phpunit.php has been updated to support PHP5.
|
||||
|
||||
For all other changes and notes, please see the changelog.
|
||||
|
||||
Donations are accepted at PayPal with our id "paypal@worxteam.com".
|
||||
|
||||
Version 2.2 (July 15 2008)
|
||||
|
||||
- see the changelog.
|
||||
|
||||
Version 2.1 (June 04 2008)
|
||||
|
||||
With this release, we are announcing that the development of PHPMailer for PHP5
|
||||
will be our focus from this date on. We have implemented all the enhancements
|
||||
and fixes from the latest release of PHPMailer for PHP4.
|
||||
|
||||
Far more important, though, is that this release of PHPMailer (v2.1) is
|
||||
fully tested with E_STRICT error checking enabled.
|
||||
|
||||
** NOTE: WE HAVE A NEW LANGUAGE VARIABLE FOR DIGITALLY SIGNED S/MIME EMAILS.
|
||||
IF YOU CAN HELP WITH LANGUAGES OTHER THAN ENGLISH AND SPANISH, IT WOULD BE
|
||||
APPRECIATED.
|
||||
|
||||
We have now added S/MIME functionality (ability to digitally sign emails).
|
||||
BIG THANKS TO "sergiocambra" for posting this patch back in November 2007.
|
||||
The "Signed Emails" functionality adds the Sign method to pass the private key
|
||||
filename and the password to read it, and then email will be sent with
|
||||
content-type multipart/signed and with the digital signature attached.
|
||||
|
||||
A quick note on E_STRICT:
|
||||
|
||||
- In about half the test environments the development version was subjected
|
||||
to, an error was thrown for the date() functions (used at line 1565 and 1569).
|
||||
This is NOT a PHPMailer error, it is the result of an incorrectly configured
|
||||
PHP5 installation. The fix is to modify your 'php.ini' file and include the
|
||||
date.timezone = America/New York
|
||||
directive, (for your own server timezone)
|
||||
- If you do get this error, and are unable to access your php.ini file, there is
|
||||
a workaround. In your PHP script, add
|
||||
date_default_timezone_set('America/Toronto');
|
||||
|
||||
* do NOT try to use
|
||||
$myVar = date_default_timezone_get();
|
||||
as a test, it will throw an error.
|
||||
|
||||
We have also included more example files to show the use of "sendmail", "mail()",
|
||||
"smtp", and "gmail".
|
||||
|
||||
We are also looking for more programmers to join the volunteer development team.
|
||||
If you have an interest in this, please let us know.
|
||||
|
||||
Enjoy!
|
||||
|
||||
|
||||
Version 2.1.0beta1 & beta2
|
||||
|
||||
please note, this is BETA software
|
||||
** DO NOT USE THIS IN PRODUCTION OR LIVE PROJECTS
|
||||
INTENDED STRICTLY FOR TESTING
|
||||
|
||||
** NOTE:
|
||||
|
||||
As of November 2007, PHPMailer has a new project team headed by industry
|
||||
veteran Andy Prevost (codeworxtech). The first release in more than two
|
||||
years will focus on fixes, adding ease-of-use enhancements, provide
|
||||
basic compatibility with PHP4 and PHP5 using PHP5 backwards compatibility
|
||||
features. A new release is planned before year-end 2007 that will provide
|
||||
full compatiblity with PHP4 and PHP5, as well as more bug fixes.
|
||||
|
||||
We are looking for project developers to assist in restoring PHPMailer to
|
||||
its leadership position. Our goals are to simplify use of PHPMailer, provide
|
||||
good documentation and examples, and retain backward compatibility to level
|
||||
1.7.3 standards.
|
||||
|
||||
If you are interested in helping out, visit http://sourceforge.net/projects/phpmailer
|
||||
and indicate your interest.
|
||||
|
||||
**
|
||||
|
||||
http://phpmailer.sourceforge.net/
|
||||
|
||||
This software is licenced under the LGPL. Please read LICENSE for information on the
|
||||
software availability and distribution.
|
||||
|
||||
Class Features:
|
||||
- Send emails with multiple TOs, CCs, BCCs and REPLY-TOs
|
||||
- Redundant SMTP servers
|
||||
- Multipart/alternative emails for mail clients that do not read HTML email
|
||||
- Support for 8bit, base64, binary, and quoted-printable encoding
|
||||
- Uses the same methods as the very popular AspEmail active server (COM) component
|
||||
- SMTP authentication
|
||||
- Native language support
|
||||
- Word wrap, and more!
|
||||
|
||||
Why you might need it:
|
||||
|
||||
Many PHP developers utilize email in their code. The only PHP function
|
||||
that supports this is the mail() function. However, it does not expose
|
||||
any of the popular features that many email clients use nowadays like
|
||||
HTML-based emails and attachments. There are two proprietary
|
||||
development tools out there that have all the functionality built into
|
||||
easy to use classes: AspEmail(tm) and AspMail. Both of these
|
||||
programs are COM components only available on Windows. They are also a
|
||||
little pricey for smaller projects.
|
||||
|
||||
Since I do Linux development I<>ve missed these tools for my PHP coding.
|
||||
So I built a version myself that implements the same methods (object
|
||||
calls) that the Windows-based components do. It is open source and the
|
||||
LGPL license allows you to place the class in your proprietary PHP
|
||||
projects.
|
||||
|
||||
|
||||
Installation:
|
||||
|
||||
Copy class.phpmailer.php into your php.ini include_path. If you are
|
||||
using the SMTP mailer then place class.smtp.php in your path as well.
|
||||
In the language directory you will find several files like
|
||||
phpmailer.lang-en.php. If you look right before the .php extension
|
||||
that there are two letters. These represent the language type of the
|
||||
translation file. For instance "en" is the English file and "br" is
|
||||
the Portuguese file. Chose the file that best fits with your language
|
||||
and place it in the PHP include path. If your language is English
|
||||
then you have nothing more to do. If it is a different language then
|
||||
you must point PHPMailer to the correct translation. To do this, call
|
||||
the PHPMailer SetLanguage method like so:
|
||||
|
||||
// To load the Portuguese version
|
||||
$mail->SetLanguage("br", "/optional/path/to/language/directory/");
|
||||
|
||||
That's it. You should now be ready to use PHPMailer!
|
||||
|
||||
|
||||
A Simple Example:
|
||||
|
||||
<?php
|
||||
require("class.phpmailer.php");
|
||||
|
||||
$mail = new PHPMailer();
|
||||
|
||||
$mail->IsSMTP(); // set mailer to use SMTP
|
||||
$mail->Host = "smtp1.example.com;smtp2.example.com"; // specify main and backup server
|
||||
$mail->SMTPAuth = true; // turn on SMTP authentication
|
||||
$mail->Username = "jswan"; // SMTP username
|
||||
$mail->Password = "secret"; // SMTP password
|
||||
|
||||
$mail->From = "from@example.com";
|
||||
$mail->FromName = "Mailer";
|
||||
$mail->AddAddress("josh@example.net", "Josh Adams");
|
||||
$mail->AddAddress("ellen@example.com"); // name is optional
|
||||
$mail->AddReplyTo("info@example.com", "Information");
|
||||
|
||||
$mail->WordWrap = 50; // set word wrap to 50 characters
|
||||
$mail->AddAttachment("/var/tmp/file.tar.gz"); // add attachments
|
||||
$mail->AddAttachment("/tmp/image.jpg", "new.jpg"); // optional name
|
||||
$mail->IsHTML(true); // set email format to HTML
|
||||
|
||||
$mail->Subject = "Here is the subject";
|
||||
$mail->Body = "This is the HTML message body <b>in bold!</b>";
|
||||
$mail->AltBody = "This is the body in plain text for non-HTML mail clients";
|
||||
|
||||
if(!$mail->Send())
|
||||
{
|
||||
echo "Message could not be sent. <p>";
|
||||
echo "Mailer Error: " . $mail->ErrorInfo;
|
||||
exit;
|
||||
}
|
||||
|
||||
echo "Message has been sent";
|
||||
?>
|
||||
|
||||
CHANGELOG
|
||||
|
||||
See ChangeLog.txt
|
||||
|
||||
Download: http://sourceforge.net/project/showfiles.php?group_id=26031
|
||||
|
||||
Andy Prevost
|
||||
/*******************************************************************
|
||||
* The http://phpmailer.codeworxtech.com/ website now carries a few *
|
||||
* advertisements through the Google Adsense network. Please visit *
|
||||
* the advertiser sites and help us offset some of our costs. *
|
||||
* Thanks .... *
|
||||
********************************************************************/
|
||||
|
||||
PHPMailer
|
||||
Full Featured Email Transfer Class for PHP
|
||||
==========================================
|
||||
|
||||
Version 5.0.0 (April 02, 2009)
|
||||
|
||||
With the release of this version, we are initiating a new version numbering
|
||||
system to differentiate from the PHP4 version of PHPMailer.
|
||||
|
||||
Most notable in this release is fully object oriented code.
|
||||
|
||||
We now have available the PHPDocumentor (phpdocs) documentation. This is
|
||||
separate from the regular download to keep file sizes down. Please see the
|
||||
download area of http://phpmailer.codeworxtech.com.
|
||||
|
||||
We also have created a new test script (see /test_script) that you can use
|
||||
right out of the box. Copy the /test_script folder directly to your server (in
|
||||
the same structure ... with class.phpmailer.php and class.smtp.php in the
|
||||
folder above it. Then launch the test script with:
|
||||
http://www.yourdomain.com/phpmailer/test_script/index.php
|
||||
from this one script, you can test your server settings for mail(), sendmail (or
|
||||
qmail), and SMTP. This will email you a sample email (using contents.html for
|
||||
the email body) and two attachments. One of the attachments is used as an inline
|
||||
image to demonstrate how PHPMailer will automatically detect if attachments are
|
||||
the same source as inline graphics and only include one version. Once you click
|
||||
the Submit button, the results will be displayed including any SMTP debug
|
||||
information and send status. We will also display a version of the script that
|
||||
you can cut and paste to include in your projects. Enjoy!
|
||||
|
||||
Version 2.3 (November 08, 2008)
|
||||
|
||||
We have removed the /phpdoc from the downloads. All documentation is now on
|
||||
the http://phpmailer.codeworxtech.com website.
|
||||
|
||||
The phpunit.php has been updated to support PHP5.
|
||||
|
||||
For all other changes and notes, please see the changelog.
|
||||
|
||||
Donations are accepted at PayPal with our id "paypal@worxteam.com".
|
||||
|
||||
Version 2.2 (July 15 2008)
|
||||
|
||||
- see the changelog.
|
||||
|
||||
Version 2.1 (June 04 2008)
|
||||
|
||||
With this release, we are announcing that the development of PHPMailer for PHP5
|
||||
will be our focus from this date on. We have implemented all the enhancements
|
||||
and fixes from the latest release of PHPMailer for PHP4.
|
||||
|
||||
Far more important, though, is that this release of PHPMailer (v2.1) is
|
||||
fully tested with E_STRICT error checking enabled.
|
||||
|
||||
** NOTE: WE HAVE A NEW LANGUAGE VARIABLE FOR DIGITALLY SIGNED S/MIME EMAILS.
|
||||
IF YOU CAN HELP WITH LANGUAGES OTHER THAN ENGLISH AND SPANISH, IT WOULD BE
|
||||
APPRECIATED.
|
||||
|
||||
We have now added S/MIME functionality (ability to digitally sign emails).
|
||||
BIG THANKS TO "sergiocambra" for posting this patch back in November 2007.
|
||||
The "Signed Emails" functionality adds the Sign method to pass the private key
|
||||
filename and the password to read it, and then email will be sent with
|
||||
content-type multipart/signed and with the digital signature attached.
|
||||
|
||||
A quick note on E_STRICT:
|
||||
|
||||
- In about half the test environments the development version was subjected
|
||||
to, an error was thrown for the date() functions (used at line 1565 and 1569).
|
||||
This is NOT a PHPMailer error, it is the result of an incorrectly configured
|
||||
PHP5 installation. The fix is to modify your 'php.ini' file and include the
|
||||
date.timezone = America/New York
|
||||
directive, (for your own server timezone)
|
||||
- If you do get this error, and are unable to access your php.ini file, there is
|
||||
a workaround. In your PHP script, add
|
||||
date_default_timezone_set('America/Toronto');
|
||||
|
||||
* do NOT try to use
|
||||
$myVar = date_default_timezone_get();
|
||||
as a test, it will throw an error.
|
||||
|
||||
We have also included more example files to show the use of "sendmail", "mail()",
|
||||
"smtp", and "gmail".
|
||||
|
||||
We are also looking for more programmers to join the volunteer development team.
|
||||
If you have an interest in this, please let us know.
|
||||
|
||||
Enjoy!
|
||||
|
||||
|
||||
Version 2.1.0beta1 & beta2
|
||||
|
||||
please note, this is BETA software
|
||||
** DO NOT USE THIS IN PRODUCTION OR LIVE PROJECTS
|
||||
INTENDED STRICTLY FOR TESTING
|
||||
|
||||
** NOTE:
|
||||
|
||||
As of November 2007, PHPMailer has a new project team headed by industry
|
||||
veteran Andy Prevost (codeworxtech). The first release in more than two
|
||||
years will focus on fixes, adding ease-of-use enhancements, provide
|
||||
basic compatibility with PHP4 and PHP5 using PHP5 backwards compatibility
|
||||
features. A new release is planned before year-end 2007 that will provide
|
||||
full compatiblity with PHP4 and PHP5, as well as more bug fixes.
|
||||
|
||||
We are looking for project developers to assist in restoring PHPMailer to
|
||||
its leadership position. Our goals are to simplify use of PHPMailer, provide
|
||||
good documentation and examples, and retain backward compatibility to level
|
||||
1.7.3 standards.
|
||||
|
||||
If you are interested in helping out, visit http://sourceforge.net/projects/phpmailer
|
||||
and indicate your interest.
|
||||
|
||||
**
|
||||
|
||||
http://phpmailer.sourceforge.net/
|
||||
|
||||
This software is licenced under the LGPL. Please read LICENSE for information on the
|
||||
software availability and distribution.
|
||||
|
||||
Class Features:
|
||||
- Send emails with multiple TOs, CCs, BCCs and REPLY-TOs
|
||||
- Redundant SMTP servers
|
||||
- Multipart/alternative emails for mail clients that do not read HTML email
|
||||
- Support for 8bit, base64, binary, and quoted-printable encoding
|
||||
- Uses the same methods as the very popular AspEmail active server (COM) component
|
||||
- SMTP authentication
|
||||
- Native language support
|
||||
- Word wrap, and more!
|
||||
|
||||
Why you might need it:
|
||||
|
||||
Many PHP developers utilize email in their code. The only PHP function
|
||||
that supports this is the mail() function. However, it does not expose
|
||||
any of the popular features that many email clients use nowadays like
|
||||
HTML-based emails and attachments. There are two proprietary
|
||||
development tools out there that have all the functionality built into
|
||||
easy to use classes: AspEmail(tm) and AspMail. Both of these
|
||||
programs are COM components only available on Windows. They are also a
|
||||
little pricey for smaller projects.
|
||||
|
||||
Since I do Linux development I<>ve missed these tools for my PHP coding.
|
||||
So I built a version myself that implements the same methods (object
|
||||
calls) that the Windows-based components do. It is open source and the
|
||||
LGPL license allows you to place the class in your proprietary PHP
|
||||
projects.
|
||||
|
||||
|
||||
Installation:
|
||||
|
||||
Copy class.phpmailer.php into your php.ini include_path. If you are
|
||||
using the SMTP mailer then place class.smtp.php in your path as well.
|
||||
In the language directory you will find several files like
|
||||
phpmailer.lang-en.php. If you look right before the .php extension
|
||||
that there are two letters. These represent the language type of the
|
||||
translation file. For instance "en" is the English file and "br" is
|
||||
the Portuguese file. Chose the file that best fits with your language
|
||||
and place it in the PHP include path. If your language is English
|
||||
then you have nothing more to do. If it is a different language then
|
||||
you must point PHPMailer to the correct translation. To do this, call
|
||||
the PHPMailer SetLanguage method like so:
|
||||
|
||||
// To load the Portuguese version
|
||||
$mail->SetLanguage("br", "/optional/path/to/language/directory/");
|
||||
|
||||
That's it. You should now be ready to use PHPMailer!
|
||||
|
||||
|
||||
A Simple Example:
|
||||
|
||||
<?php
|
||||
require("class.phpmailer.php");
|
||||
|
||||
$mail = new PHPMailer();
|
||||
|
||||
$mail->IsSMTP(); // set mailer to use SMTP
|
||||
$mail->Host = "smtp1.example.com;smtp2.example.com"; // specify main and backup server
|
||||
$mail->SMTPAuth = true; // turn on SMTP authentication
|
||||
$mail->Username = "jswan"; // SMTP username
|
||||
$mail->Password = "secret"; // SMTP password
|
||||
|
||||
$mail->From = "from@example.com";
|
||||
$mail->FromName = "Mailer";
|
||||
$mail->AddAddress("josh@example.net", "Josh Adams");
|
||||
$mail->AddAddress("ellen@example.com"); // name is optional
|
||||
$mail->AddReplyTo("info@example.com", "Information");
|
||||
|
||||
$mail->WordWrap = 50; // set word wrap to 50 characters
|
||||
$mail->AddAttachment("/var/tmp/file.tar.gz"); // add attachments
|
||||
$mail->AddAttachment("/tmp/image.jpg", "new.jpg"); // optional name
|
||||
$mail->IsHTML(true); // set email format to HTML
|
||||
|
||||
$mail->Subject = "Here is the subject";
|
||||
$mail->Body = "This is the HTML message body <b>in bold!</b>";
|
||||
$mail->AltBody = "This is the body in plain text for non-HTML mail clients";
|
||||
|
||||
if(!$mail->Send())
|
||||
{
|
||||
echo "Message could not be sent. <p>";
|
||||
echo "Mailer Error: " . $mail->ErrorInfo;
|
||||
exit;
|
||||
}
|
||||
|
||||
echo "Message has been sent";
|
||||
?>
|
||||
|
||||
CHANGELOG
|
||||
|
||||
See ChangeLog.txt
|
||||
|
||||
Download: http://sourceforge.net/project/showfiles.php?group_id=26031
|
||||
|
||||
Andy Prevost
|
||||
|
||||
@@ -1,194 +1,194 @@
|
||||
<?php
|
||||
/**
|
||||
* The zfile library of zentaopms.
|
||||
*
|
||||
* @copyright Copyright 2009-2013 QingDao Nature Easy Soft Network Technology Co,LTD (www.cnezsoft.com)
|
||||
* @license LGPL (http://www.gnu.org/licenses/lgpl.html)
|
||||
* @author Chunsheng Wang <chunsheng@cnezsoft.com>
|
||||
* @package Zfile
|
||||
* @version $Id: zfile.class.php 2605 2013-01-09 07:22:58Z wwccss $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
class zfile
|
||||
{
|
||||
/**
|
||||
* Copy a directory from an directory to another directory.
|
||||
*
|
||||
* @param string $from
|
||||
* @param string $to
|
||||
* @access public
|
||||
* @return array copied files.
|
||||
*/
|
||||
public function copyDir($from, $to)
|
||||
{
|
||||
static $copiedFiles = array();
|
||||
|
||||
if(!is_dir($from) or !is_readable($from)) return $copiedFiles;
|
||||
if(!is_dir($to))
|
||||
{
|
||||
if(!is_writable(dirname($to))) return $copiedFiles;
|
||||
mkdir($to);
|
||||
}
|
||||
|
||||
$from = realpath($from) . '/';
|
||||
$to = realpath($to) . '/';
|
||||
$entries = scandir($from);
|
||||
|
||||
foreach($entries as $entry)
|
||||
{
|
||||
if($entry == '.' or $entry == '..' or $entry == '.svn') continue;
|
||||
|
||||
$fullEntry = $from . $entry;
|
||||
if(is_file($fullEntry))
|
||||
{
|
||||
if(file_exists($to . $entry))
|
||||
{
|
||||
unlink($to . $entry);
|
||||
}
|
||||
copy($fullEntry, $to . $entry);
|
||||
$copiedFiles[] = $to . $entry;
|
||||
}
|
||||
else
|
||||
{
|
||||
$nextFrom = $from . $entry;
|
||||
$nextTo = $to . $entry;
|
||||
$this->copyDir($nextFrom, $nextTo);
|
||||
}
|
||||
}
|
||||
return $copiedFiles;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a dir.
|
||||
*
|
||||
* @param string $dir
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function removeDir($dir)
|
||||
{
|
||||
$dir = realpath($dir) . '/';
|
||||
if($dir == '/') return false;
|
||||
|
||||
if(!is_writable($dir)) return false;
|
||||
if(!is_dir($dir)) return true;
|
||||
|
||||
$entries = scandir($dir);
|
||||
foreach($entries as $entry)
|
||||
{
|
||||
if($entry == '.' or $entry == '..' or $entry == '.svn') continue;
|
||||
|
||||
$fullEntry = $dir . $entry;
|
||||
if(is_file($fullEntry))
|
||||
{
|
||||
unlink($fullEntry);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->removeDir($fullEntry);
|
||||
}
|
||||
}
|
||||
if(!@rmdir($dir)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get files under a directory recursive.
|
||||
*
|
||||
* @param string $dir
|
||||
* @param array $exceptions
|
||||
* @access private
|
||||
* @return array
|
||||
*/
|
||||
public function readDir($dir, $exceptions = array())
|
||||
{
|
||||
static $files = array();
|
||||
|
||||
if(!is_dir($dir)) return $files;
|
||||
|
||||
$dir = realpath($dir) . '/';
|
||||
$entries = scandir($dir);
|
||||
|
||||
foreach($entries as $entry)
|
||||
{
|
||||
if($entry == '.' or $entry == '..' or $entry == '.svn') continue;
|
||||
if(in_array($entry, $exceptions)) continue;
|
||||
|
||||
$fullEntry = $dir . $entry;
|
||||
if(is_file($fullEntry))
|
||||
{
|
||||
$files[] = $dir . $entry;
|
||||
}
|
||||
else
|
||||
{
|
||||
$nextDir = $dir . $entry;
|
||||
$this->readDir($nextDir);
|
||||
}
|
||||
}
|
||||
return $files;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a dir.
|
||||
*
|
||||
* @param string $dir
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function mkdir($dir)
|
||||
{
|
||||
return mkdir($dir, 0755, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a file
|
||||
*
|
||||
* @param string $file
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function removeFile($file)
|
||||
{
|
||||
if(!file_exists($file)) return true;
|
||||
return @unlink($file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Batch remove files. use glob function.
|
||||
*
|
||||
* @param string $patern
|
||||
* @access public
|
||||
* @return avoid
|
||||
*/
|
||||
public function batchRemoveFile($patern)
|
||||
{
|
||||
$files = glob($patern);
|
||||
foreach($files as $file) @unlink($file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a file
|
||||
*
|
||||
* @param string from
|
||||
* @param string to
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function copyFile($from, $to)
|
||||
{
|
||||
return @copy($from, $to);
|
||||
}
|
||||
|
||||
/**
|
||||
* Rename a file or directory.
|
||||
*
|
||||
* @param string from
|
||||
* @param string to
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function rename($from, $to)
|
||||
{
|
||||
return rename($from, $to);
|
||||
}
|
||||
}
|
||||
<?php
|
||||
/**
|
||||
* The zfile library of zentaopms.
|
||||
*
|
||||
* @copyright Copyright 2009-2013 QingDao Nature Easy Soft Network Technology Co,LTD (www.cnezsoft.com)
|
||||
* @license LGPL (http://www.gnu.org/licenses/lgpl.html)
|
||||
* @author Chunsheng Wang <chunsheng@cnezsoft.com>
|
||||
* @package Zfile
|
||||
* @version $Id: zfile.class.php 2605 2013-01-09 07:22:58Z wwccss $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
class zfile
|
||||
{
|
||||
/**
|
||||
* Copy a directory from an directory to another directory.
|
||||
*
|
||||
* @param string $from
|
||||
* @param string $to
|
||||
* @access public
|
||||
* @return array copied files.
|
||||
*/
|
||||
public function copyDir($from, $to)
|
||||
{
|
||||
static $copiedFiles = array();
|
||||
|
||||
if(!is_dir($from) or !is_readable($from)) return $copiedFiles;
|
||||
if(!is_dir($to))
|
||||
{
|
||||
if(!is_writable(dirname($to))) return $copiedFiles;
|
||||
mkdir($to);
|
||||
}
|
||||
|
||||
$from = realpath($from) . '/';
|
||||
$to = realpath($to) . '/';
|
||||
$entries = scandir($from);
|
||||
|
||||
foreach($entries as $entry)
|
||||
{
|
||||
if($entry == '.' or $entry == '..' or $entry == '.svn') continue;
|
||||
|
||||
$fullEntry = $from . $entry;
|
||||
if(is_file($fullEntry))
|
||||
{
|
||||
if(file_exists($to . $entry))
|
||||
{
|
||||
unlink($to . $entry);
|
||||
}
|
||||
copy($fullEntry, $to . $entry);
|
||||
$copiedFiles[] = $to . $entry;
|
||||
}
|
||||
else
|
||||
{
|
||||
$nextFrom = $from . $entry;
|
||||
$nextTo = $to . $entry;
|
||||
$this->copyDir($nextFrom, $nextTo);
|
||||
}
|
||||
}
|
||||
return $copiedFiles;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a dir.
|
||||
*
|
||||
* @param string $dir
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function removeDir($dir)
|
||||
{
|
||||
$dir = realpath($dir) . '/';
|
||||
if($dir == '/') return false;
|
||||
|
||||
if(!is_writable($dir)) return false;
|
||||
if(!is_dir($dir)) return true;
|
||||
|
||||
$entries = scandir($dir);
|
||||
foreach($entries as $entry)
|
||||
{
|
||||
if($entry == '.' or $entry == '..' or $entry == '.svn') continue;
|
||||
|
||||
$fullEntry = $dir . $entry;
|
||||
if(is_file($fullEntry))
|
||||
{
|
||||
unlink($fullEntry);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->removeDir($fullEntry);
|
||||
}
|
||||
}
|
||||
if(!@rmdir($dir)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get files under a directory recursive.
|
||||
*
|
||||
* @param string $dir
|
||||
* @param array $exceptions
|
||||
* @access private
|
||||
* @return array
|
||||
*/
|
||||
public function readDir($dir, $exceptions = array())
|
||||
{
|
||||
static $files = array();
|
||||
|
||||
if(!is_dir($dir)) return $files;
|
||||
|
||||
$dir = realpath($dir) . '/';
|
||||
$entries = scandir($dir);
|
||||
|
||||
foreach($entries as $entry)
|
||||
{
|
||||
if($entry == '.' or $entry == '..' or $entry == '.svn') continue;
|
||||
if(in_array($entry, $exceptions)) continue;
|
||||
|
||||
$fullEntry = $dir . $entry;
|
||||
if(is_file($fullEntry))
|
||||
{
|
||||
$files[] = $dir . $entry;
|
||||
}
|
||||
else
|
||||
{
|
||||
$nextDir = $dir . $entry;
|
||||
$this->readDir($nextDir);
|
||||
}
|
||||
}
|
||||
return $files;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a dir.
|
||||
*
|
||||
* @param string $dir
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function mkdir($dir)
|
||||
{
|
||||
return mkdir($dir, 0755, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a file
|
||||
*
|
||||
* @param string $file
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function removeFile($file)
|
||||
{
|
||||
if(!file_exists($file)) return true;
|
||||
return @unlink($file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Batch remove files. use glob function.
|
||||
*
|
||||
* @param string $patern
|
||||
* @access public
|
||||
* @return avoid
|
||||
*/
|
||||
public function batchRemoveFile($patern)
|
||||
{
|
||||
$files = glob($patern);
|
||||
foreach($files as $file) @unlink($file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a file
|
||||
*
|
||||
* @param string from
|
||||
* @param string to
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function copyFile($from, $to)
|
||||
{
|
||||
return @copy($from, $to);
|
||||
}
|
||||
|
||||
/**
|
||||
* Rename a file or directory.
|
||||
*
|
||||
* @param string from
|
||||
* @param string to
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function rename($from, $to)
|
||||
{
|
||||
return rename($from, $to);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user