Initial commit,修正

This commit is contained in:
2025-07-13 19:37:38 +08:00
parent 38ce288e27
commit 65bbd06981
12384 changed files with 3985464 additions and 8 deletions
+358
View File
@@ -0,0 +1,358 @@
<?php
/** File PDO.class.php *
* Porting of native PHP 5.1 PDO *
* object usable with PHP 4.X.X *
* and PHP 5.0.X version. *
* ------------------------------------ *
*(C) Andrea Giammarchi [2005/10/19] *
* ____________________________________ */
// check and preserve native PDO driver, for PHP4 or PHP 5.0 users
if(!class_exists('PDO')) {
// SUPPORTED STATIC ENVIROMENT VARIABLES
define('PDO_ATTR_SERVER_VERSION', 4); // server version
define('PDO_ATTR_CLIENT_VERSION', 5); // client version
define('PDO_ATTR_SERVER_INFO', 6); // server informations
define('PDO_ATTR_PERSISTENT', 12); // connection mode, persistent or normal
// SUPPORTED STATIC PDO FETCH MODE VARIABLES
define('PDO_FETCH_ASSOC', 2); // such mysql_fetch_assoc
define('PDO_FETCH_NUM', 3); // such mysql_fetch_row
define('PDO_FETCH_BOTH', 4); // such mysql_fetch_array
define('PDO_FETCH_OBJ', 5); // such mysql_fetch_object
// UNSUPPORTED STATIC PDO FETCH MODE VARIABLES
define('PDO_FETCH_LAZY', 1); // usable but not supported, default is PDO_FETCH_BOTH and will be used
define('PDO_FETCH_BOUND', 6); // usable but not supported, default is PDO_FETCH_BOTH and will be used
/**
* Class PDO
* PostgreSQL, SQLITE and MYSQL PDO support for PHP 4.X.X or PHP 5.0.X users, compatible with PHP 5.1.0 (RC1).
*
* DESCRIPTION [directly from http://us2.php.net/manual/en/ref.pdo.php]
* The PHP Data Objects (PDO) extension defines a lightweight, consistent interface for accessing databases in PHP.
* Each database driver that implements the PDO interface can expose database-specific features as regular extension functions.
* Note that you cannot perform any database functions using the PDO extension by itself;
* you must use a database-specific PDO driver to access a database server.
*
* HOW TO USE
* To know how to use PDO driver and all its methods visit php.net wonderful documentation.
* http://us2.php.net/manual/en/ref.pdo.php
* In this class some methods are not available and actually this porting is only for MySQL, SQLITE and PostgreSQL.
*
* LIMITS
* For some reasons ( time and php used version with this class ) some PDO methods are not availables and
* someother are not totally supported.
*
* PDO :: UNSUPPORTED METHODS:
* - beginTransaction [ mysql 3 has not transaction and manage them is possible only with a direct BEGIN
* or COMMIT query ]
* - commit
* - rollback
*
* PDO :: NOT TOTALLY SUPPORTED METHODS:
* - getAttribute [ accepts only PDO_ATTR_SERVER_INFO, PDO_ATTR_SERVER_VERSION,
* PDO_ATTR_CLIENT_VERSION and PDO_ATTR_PERSISTENT attributes ]
* - setAttribute [ supports only PDO_ATTR_PERSISTENT modification ]
* - lastInsertId [ only fo PostgreSQL , returns only pg_last_oid ]
*
* - - - - - - - - - - - - - - - - - - - -
*
* PDOStatement :: UNSUPPORTED METHODS:
* - bindColumn [ is not possible to undeclare a variable and using global scope is not
* really a good idea ]
*
* PDOStatement :: NOT TOTALLY SUPPORTED METHODS:
* - getAttribute [ accepts only PDO_ATTR_SERVER_INFO, PDO_ATTR_SERVER_VERSION,
* PDO_ATTR_CLIENT_VERSION and PDO_ATTR_PERSISTENT attributes ]
* - setAttribute [ supports only PDO_ATTR_PERSISTENT modification ]
* - setFetchMode [ supports only PDO_FETCH_NUM, PDO_FETCH_ASSOC, PDO_FETCH_OBJ and
* PDO_FETCH_BOTH database reading mode ]
* ---------------------------------------------
* @Compatibility >= PHP 4
* @Dependencies PDO_mysql.class.php
* PDO_sqlite.class.php
* PDOStatement_mysql.class.php
* PDOStatement_sqlite.class.php
* @Author Andrea Giammarchi
* @Site http://www.devpro.it/
* @Mail andrea [ at ] 3site [ dot ] it
* @Date 2005/10/13
* @LastModified 2005/12/01 21:40
* @Version 0.1b - tested, supports only PostgreSQL, MySQL or SQLITE databases
*/
class PDO {
/** Modified on 2005/12/01 to support new PDO constants on PHP 5.1.X */
const FETCH_ASSOC = PDO_FETCH_ASSOC;
const FETCH_NUM = PDO_FETCH_NUM;
const FETCH_BOTH = PDO_FETCH_BOTH;
const FETCH_OBJ = PDO_FETCH_OBJ;
const FETCH_LAZY = PDO_FETCH_LAZY;
const FETCH_BOUND = PDO_FETCH_BOUND;
const ATTR_SERVER_VERSION = PDO_ATTR_SERVER_VERSION;
const ATTR_CLIENT_VERSION = PDO_ATTR_CLIENT_VERSION;
const ATTR_SERVER_INFO = PDO_ATTR_SERVER_INFO;
const ATTR_PERSISTENT = PDO_ATTR_PERSISTENT;
/**
* 'Private' variables:
* __driver:PDO_* Dedicated PDO database class
*/
var $__driver;
/**
* Public constructor
* http://us2.php.net/manual/en/function.pdo-construct.php
*/
function PDO($string_dsn, $string_username = '', $string_password = '', $array_driver_options = null) {
$con = &$this->__getDNS($string_dsn);
if($con['dbtype'] === 'mysql') {
require_once('PDO_mysql.class.php');
if(isset($con['port']))
$con['host'] .= ':'.$con['port'];
$this->__driver = new PDO_mysql(
$con['host'],
$con['dbname'],
$string_username,
$string_password
);
}
elseif($con['dbtype'] === 'sqlite2' || $con['dbtype'] === 'sqlite') {
require_once('PDO_sqlite.class.php');
$this->__driver = new PDO_sqlite($con['dbname']);
}
elseif($con['dbtype'] === 'pgsql') {
require_once('PDO_pgsql.class.php');
$string_dsn = "host={$con['host']} dbname={$con['dbname']} user={$string_username} password={$string_password}";
if(isset($con['port']))
$string_dsn .= " port={$con['port']}";
$this->__driver = new PDO_pgsql($string_dsn);
}
}
/** UNSUPPORTED
* Public method
* http://us2.php.net/manual/en/function.pdo-begintransaction.php
*/
function beginTransaction() {
$this->__driver->beginTransaction();
}
/** NOT NATIVE BUT MAYBE USEFULL FOR PHP < 5.1 PDO DRIVER
* Public method
* Calls database_close function.
* this->close( Void ):Boolean
* @Return Boolean True on success, false otherwise
*/
function close() {
return $this->__driver->close();
}
/** UNSUPPORTED
* Public method
* http://us2.php.net/manual/en/function.pdo-commit.php
*/
function commit() {
$this->__driver->commit();
}
/**
* Public method
* http://us2.php.net/manual/en/function.pdo-exec.php
*/
function exec($query) {
return $this->__driver->exec($query);
}
/**
* Public method
* http://us2.php.net/manual/en/function.pdo-errorcode.php
*/
function errorCode() {
return $this->__driver->errorCode();
}
/**
* Public method
* http://us2.php.net/manual/en/function.pdo-errorinfo.php
*/
function errorInfo() {
return $this->__driver->errorInfo();
}
/** NOT TOTALLY UNSUPPORTED
* Public method
* http://us2.php.net/manual/en/function.pdo-getattribute.php
*/
function getAttribute($attribute) {
return $this->__driver->getAttribute($attribute);
}
/**
* Public method
* http://us2.php.net/manual/en/function.pdo-lastinsertid.php
*/
function lastInsertId() {
return $this->__driver->lastInsertId();
}
/**
* Public method
* http://us2.php.net/manual/en/function.pdo-prepare.php
*/
function prepare($query, $array = Array()) {
return $this->__driver->prepare($query, $array = Array());
}
/**
* Public method
* http://us2.php.net/manual/en/function.pdo-query.php
*/
function query($query) {
return $this->__driver->query($query);
}
/**
* Public method
* http://us2.php.net/manual/en/function.pdo-quote.php
*/
function quote($string) {
return $this->__driver->quote($string);
}
/** UNSUPPORTED
* Public method
* http://us2.php.net/manual/en/function.pdo-rollback.php
*/
function rollBack() {
$this->__driver->rollBack();
}
/** NOT TOTALLY UNSUPPORTED
* Public method
* http://us2.php.net/manual/en/function.pdo-setattribute.php
*/
function setAttribute($attribute, $mixed) {
return $this->__driver->setAttribute($attribute, $mixed);
}
// PRIVATE METHOD [uncommented]
function __getDNS(&$string) {
$result = array();
$pos = strpos($string, ':');
$parameters = explode(';', substr($string, ($pos + 1)));
$result['dbtype'] = strtolower(substr($string, 0, $pos));
for($a = 0, $b = count($parameters); $a < $b; $a++) {
$tmp = explode('=', $parameters[$a]);
if(count($tmp) == 2)
$result[$tmp[0]] = $tmp[1];
else
$result['dbname'] = $parameters[$a];
}
return $result;
}
}
}
// If you have PHP 5.1 but want to test this class, declare PDO variables as _PDO variables
else {
/**
* Class _PDO
* (C) Andrea Giammarchi
* Please read PDO class comments to know more
*/
class _PDO {
const FETCH_ASSOC = PDO::FETCH_ASSOC;
const FETCH_NUM = PDO::FETCH_NUM;
const FETCH_BOTH = PDO::FETCH_BOTH;
const FETCH_OBJ = PDO::FETCH_OBJ;
const FETCH_LAZY = PDO::FETCH_LAZY;
const FETCH_BOUND = PDO::FETCH_BOUND;
const ATTR_SERVER_VERSION = PDO::ATTR_SERVER_VERSION;
const ATTR_CLIENT_VERSION = PDO::ATTR_CLIENT_VERSION;
const ATTR_SERVER_INFO = PDO::ATTR_SERVER_INFO;
const ATTR_PERSISTENT = PDO::ATTR_PERSISTENT;
var $__driver;
function _PDO($string_dsn, $string_username = '', $string_password = '', $array_driver_options = null) {
$con = &$this->__getDNS($string_dsn);
if($con['dbtype'] === 'mysql') {
require_once('PDO_mysql.class.php');
if(isset($con['port']))
$con['host'] .= ':'.$con['port'];
$this->__driver = new PDO_mysql(
$con['host'],
$con['dbname'],
$string_username,
$string_password
);
}
elseif($con['dbtype'] === 'sqlite2' || $con['dbtype'] === 'sqlite') {
require_once('PDO_sqlite.class.php');
$this->__driver = new PDO_sqlite($con['dbname']);
}
elseif($con['dbtype'] === 'pgsql') {
require_once('PDO_pgsql.class.php');
$string_dsn = "host={$con['host']} dbname={$con['dbname']} user={$string_username} password={$string_password}";
if(isset($con['port']))
$string_dsn .= " port={$con['port']}";
$this->__driver = new PDO_pgsql($string_dsn);
}
}
function beginTransaction() {
$this->__driver->beginTransaction();
}
function close() {
return $this->__driver->close();
}
function commit() {
$this->__driver->commit();
}
function exec($query) {
return $this->__driver->exec($query);
}
function errorCode() {
return $this->__driver->errorCode();
}
function errorInfo() {
return $this->__driver->errorInfo();
}
function getAttribute($attribute) {
return $this->__driver->getAttribute($attribute);
}
function lastInsertId() {
return $this->__driver->lastInsertId();
}
function prepare($query, $array = Array()) {
return $this->__driver->prepare($query, $array = Array());
}
function query($query) {
return $this->__driver->query($query);
}
function quote($string) {
return $this->__driver->quote($string);
}
function rollBack() {
$this->__driver->rollBack();
}
function setAttribute($attribute, $mixed) {
return $this->__driver->setAttribute($attribute, $mixed);
}
function __getDNS(&$string) {
$result = array();
$pos = strpos($string, ':');
$parameters = explode(';', substr($string, ($pos + 1)));
$result['dbtype'] = strtolower(substr($string, 0, $pos));
for($a = 0, $b = count($parameters); $a < $b; $a++) {
$tmp = explode('=', $parameters[$a]);
if(count($tmp) == 2)
$result[$tmp[0]] = $tmp[1];
else
$result['dbname'] = $parameters[$a];
}
return $result;
}
}
}
?>
+362
View File
@@ -0,0 +1,362 @@
<?php
/** File PDOStatement_mysql.class.php *
*(C) Andrea Giammarchi [2005/10/13] */
/**
* Class PDOStatement_mysql
* This class is used from class PDO_mysql to manage a MySQL database.
* Look at PDO.clas.php file comments to know more about MySQL connection.
* ---------------------------------------------
* @Compatibility >= PHP 4
* @Dependencies PDO.class.php
* PDO_mysql.class.php
* @Author Andrea Giammarchi
* @Site http://www.devpro.it/
* @Mail andrea [ at ] 3site [ dot ] it
* @Date 2005/10/13
* @LastModified 2006/01/29 09:30 [fixed execute bug]
* @Version 0.1b - tested
*/
class PDOStatement_mysql {
/**
* 'Private' variables:
* __connection:Resource Database connection
* __dbinfo:Array Array with 4 elements used to manage connection
* __persistent:Boolean Connection mode, is true on persistent, false on normal (deafult) connection
* __query:String Last query used
* __result:Resource Last result from last query
* __fetchmode:Integer constant PDO_FETCH_* result mode
* __errorCode:String Last error string code
* __errorInfo:Array Last error informations, code, number, details
* __boundParams:Array Stored bindParam
*/
var $__connection;
var $__dbinfo;
var $__persistent = false;
var $__query = '';
var $__result = null;
var $__fetchmode = PDO::FETCH_BOTH;
var $__errorCode = '';
var $__errorInfo = Array('');
var $__boundParams = Array();
/**
* Public constructor:
* Called from PDO to create a PDOStatement for this database
* new PDOStatement_sqlite( &$__query:String, &$__connection:Resource, $__dbinfo:Array )
* @Param String query to prepare
* @Param Resource database connection
* @Param Array 4 elements array to manage connection
*/
function PDOStatement_mysql(&$__query, &$__connection, &$__dbinfo) {
$this->__query = &$__query;
$this->__connection = &$__connection;
$this->__dbinfo = &$__dbinfo;
}
/**
* Public method:
* Replace ? or :named values to execute prepared query
* this->bindParam( $mixed:Mixed, &$variable:Mixed, $type:Integer, $lenght:Integer ):Void
* @Param Mixed Integer or String to replace prepared value
* @Param Mixed variable to replace
* @Param Integer this variable is not used but respects PDO original accepted parameters
* @Param Integer this variable is not used but respects PDO original accepted parameters
*/
function bindParam($mixed, &$variable, $type = null, $lenght = null) {
if(is_string($mixed))
$this->__boundParams[$mixed] = $variable;
else
array_push($this->__boundParams, $variable);
}
/**
* Public method:
* Checks if query was valid and returns how may fields returns
* this->columnCount( void ):Void
*/
function columnCount() {
$result = 0;
if(!is_null($this->__result))
$result = mysql_num_fields($this->__result);
return $result;
}
/**
* Public method:
* Returns a code rappresentation of an error
* this->errorCode( void ):String
* @Return String String rappresentation of the error
*/
function errorCode() {
return $this->__errorCode;
}
/**
* Public method:
* Returns an array with error informations
* this->errorInfo( void ):Array
* @Return Array Array with 3 keys:
* 0 => error code
* 1 => error number
* 2 => error string
*/
function errorInfo() {
return $this->__errorInfo;
}
/**
* Public method:
* Excecutes a query and returns true on success or false.
* this->exec( $array:Array ):Boolean
* @Param Array If present, it should contain all replacements for prepared query
* @Return Boolean true if query has been done without errors, false otherwise
*/
function execute($array = Array()) {
if(count($this->__boundParams) > 0)
$array = &$this->__boundParams;
$__query = $this->__query;
if(count($array) > 0) {
foreach($array as $k => $v) {
if(!is_int($k) || substr($k, 0, 1) === ':') {
if(!isset($tempf))
$tempf = $tempr = array();
array_push($tempf, $k);
array_push($tempr, '"'.mysql_escape_string($v).'"');
}
else {
$parse = create_function('$v', 'return \'"\'.mysql_escape_string($v).\'"\';');
$__query = preg_replace("/(\?)/e", '$parse($array[$k++]);', $__query);
break;
}
}
if(isset($tempf)) {
foreach ($tempf as $k=>$v) {
$search[$k] = '/' . preg_quote($tempf[$k],'`') . '\b/';
}
$__query = preg_replace($search, $tempr, $__query);
//$__query = str_replace($tempf, $tempr, $__query);
}
}
if(is_null($this->__result = &$this->__uquery($__query)))
$keyvars = false;
else
$keyvars = true;
$this->__boundParams = array();
return $keyvars;
}
/**
* Public method:
* Returns, if present, next row of executed query or false.
* this->fetch( $mode:Integer, $cursor:Integer, $offset:Integer ):Mixed
* @Param Integer PDO_FETCH_* constant to know how to read next row, default PDO_FETCH_BOTH
* NOTE: if $mode is omitted is used default setted mode, PDO_FETCH_BOTH
* @Param Integer this variable is not used but respects PDO original accepted parameters
* @Param Integer this variable is not used but respects PDO original accepted parameters
* @Return Mixed Next row of executed query or false if there is nomore.
*/
function fetch($mode = PDO_FETCH_ASSOC, $cursor = null, $offset = null) {
if(func_num_args() == 0)
$mode = &$this->__fetchmode;
$result = false;
if(!is_null($this->__result)) {
switch($mode) {
case PDO::FETCH_NUM:
$result = mysql_fetch_row($this->__result);
break;
case PDO::FETCH_ASSOC:
$result = mysql_fetch_assoc($this->__result);
break;
case PDO::FETCH_OBJ:
$result = mysql_fetch_object($this->__result);
break;
case PDO::FETCH_BOTH:
default:
$result = mysql_fetch_array($this->__result);
break;
}
}
if(!$result)
$this->__result = null;
return $result;
}
/**
* Public method:
* Returns an array with all rows of executed query.
* this->fetchAll( $mode:Integer ):Array
* @Param Integer PDO_FETCH_* constant to know how to read all rows, default PDO_FETCH_BOTH
* NOTE: this doesn't work as fetch method, then it will use always PDO_FETCH_BOTH
* if this param is omitted
* @Return Array An array with all fetched rows
*/
function fetchAll($mode = PDO_FETCH_ASSOC) {
$result = array();
if(!is_null($this->__result)) {
switch($mode) {
case PDO::FETCH_NUM:
while($r = mysql_fetch_row($this->__result))
array_push($result, $r);
break;
case PDO::FETCH_ASSOC:
while($r = mysql_fetch_assoc($this->__result))
array_push($result, $r);
break;
case PDO::FETCH_OBJ:
while($r = mysql_fetch_object($this->__result))
array_push($result, $r);
break;
case PDO::FETCH_BOTH:
default:
while($r = mysql_fetch_array($this->__result))
array_push($result, $r);
break;
}
}
$this->__result = null;
return $result;
}
/**
* Public method:
* Returns, if present, first column of next row of executed query
* this->fetchSingle( void ):Mixed
* @Return Mixed Null or next row's first column
*/
function fetchSingle() {
$result = null;
if(!is_null($this->__result)) {
$result = @mysql_fetch_row($this->__result);
if($result)
$result = $result[0];
else
$this->__result = null;
}
return $result;
}
function fetchColumn($column=0) {
$row = mysql_fetch_row($this->__result);
return $row[$column];
}
/**
* Public method:
* Returns number of last affected database rows
* this->rowCount( void ):Integer
* @Return Integer number of last affected rows
* NOTE: works with INSERT, UPDATE and DELETE query type
*/
function rowCount() {
return mysql_affected_rows($this->__connection);
}
// NOT TOTALLY SUPPORTED PUBLIC METHODS
/**
* Public method:
* Quotes correctly a string for this database
* this->getAttribute( $attribute:Integer ):Mixed
* @Param Integer a constant [ PDO_ATTR_SERVER_INFO,
* PDO_ATTR_SERVER_VERSION,
* PDO_ATTR_CLIENT_VERSION,
* PDO_ATTR_PERSISTENT ]
* @Return Mixed correct information or false
*/
function getAttribute($attribute) {
$result = false;
switch($attribute) {
case PDO_ATTR_SERVER_INFO:
$result = mysql_get_host_info($this->__connection);
break;
case PDO_ATTR_SERVER_VERSION:
$result = mysql_get_server_info($this->__connection);
break;
case PDO_ATTR_CLIENT_VERSION:
$result = mysql_get_client_info();
break;
case PDO_ATTR_PERSISTENT:
$result = $this->__persistent;
break;
}
return $result;
}
/**
* Public method:
* Sets database attributes, in this version only connection mode.
* this->setAttribute( $attribute:Integer, $mixed:Mixed ):Boolean
* @Param Integer PDO_* constant, in this case only PDO_ATTR_PERSISTENT
* @Param Mixed value for PDO_* constant, in this case a Boolean value
* true for permanent connection, false for default not permament connection
* @Return Boolean true on change, false otherwise
*/
function setAttribute($attribute, $mixed) {
$result = false;
if($attribute === PDO_ATTR_PERSISTENT && $mixed != $this->__persistent) {
$result = true;
$this->__persistent = (boolean) $mixed;
mysql_close($this->__connection);
if($this->__persistent === true)
$this->__connection = &mysql_pconnect($this->__dbinfo[0], $this->__dbinfo[1], $this->__dbinfo[2]);
else
$this->__connection = &mysql_connect($this->__dbinfo[0], $this->__dbinfo[1], $this->__dbinfo[2]);
mysql_select_db($this->__dbinfo[3], $this->__connection);
}
return $result;
}
/**
* Public method:
* Sets default fetch mode to use with this->fetch() method.
* this->setFetchMode( $mode:Integer ):Boolean
* @Param Integer PDO_FETCH_* constant to use while reading an execute query with fetch() method.
* NOTE: PDO_FETCH_LAZY and PDO_FETCH_BOUND are not supported
* @Return Boolean true on change, false otherwise
*/
function setFetchMode($mode) {
$result = false;
switch($mode) {
case PDO_FETCH_NUM:
case PDO_FETCH_ASSOC:
case PDO_FETCH_OBJ:
case PDO_FETCH_BOTH:
$result = true;
$this->__fetchmode = &$mode;
break;
}
return $result;
}
// UNSUPPORTED PUBLIC METHODS
function bindColumn($mixewd, &$param, $type = null, $max_length = null, $driver_option = null) {
return false;
}
function __setErrors($er) {
if(!is_resource($this->__connection)) {
$errno = mysql_errno();
$errst = mysql_error();
}
else {
$errno = mysql_errno($this->__connection);
$errst = mysql_error($this->__connection);
}
$this->__errorCode = &$er;
$this->__errorInfo = Array($this->__errorCode, $errno, $errst);
$this->__result = null;
}
function __uquery(&$query) {
if(!@$query = mysql_query($query, $this->__connection)) {
$this->__setErrors('SQLER');
$query = null;
}
return $query;
}
}
?>
+265
View File
@@ -0,0 +1,265 @@
<?php
/** File PDO_mysql.class.php *
*(C) Andrea Giammarchi [2005/10/13] */
// Requires PDOStatement_mysql.class.php , drived by PDO.class.php file
require_once('PDOStatement_mysql.class.php');
/**
* Class PDO_mysql
* This class is used from class PDO to manage a MySQL database.
* Look at PDO.clas.php file comments to know more about MySQL connection.
* ---------------------------------------------
* @Compatibility >= PHP 4
* @Dependencies PDO.class.php
* PDOStatement_mysql.class.php
* @Author Andrea Giammarchi
* @Site http://www.devpro.it/
* @Mail andrea [ at ] 3site [ dot ] it
* @Date 2005/10/13
* @LastModified 2005/18/14 12:30
* @Version 0.1 - tested
*/
class PDO_mysql {
/**
* 'Private' variables:
* __connection:Resource Database connection
* __dbinfo:Array Array with 4 elements used to manage connection
* __persistent:Boolean Connection mode, is true on persistent, false on normal (deafult) connection
* __errorCode:String Last error code
* __errorInfo:Array Detailed errors
*/
var $__connection;
var $__dbinfo;
var $__persistent = false;
var $__errorCode = '';
var $__errorInfo = Array('');
/**
* Public constructor:
* Checks connection and database selection
* new PDO_mysql( &$host:String, &$db:String, &$user:String, &$pass:String )
* @Param String host with or without port info
* @Param String database name
* @Param String database user
* @Param String database password
*/
function PDO_mysql(&$host, &$db, &$user, &$pass) {
if(!@$this->__connection = &mysql_connect($host, $user, $pass))
$this->__setErrors('DBCON');
else {
if(!@mysql_select_db($db, $this->__connection))
$this->__setErrors('DBER');
else
$this->__dbinfo = Array($host, $user, $pass, $db);
}
}
/** NOT NATIVE BUT MAYBE USEFULL FOR PHP < 5.1 PDO DRIVER
* Public method
* Calls mysql_close function.
* this->close( Void ):Boolean
* @Return Boolean True on success, false otherwise
*/
function close() {
$result = is_resource($this->__connection);
if($result) {
mysql_close($this->__connection);
}
return $result;
}
/**
* Public method:
* Returns a code rappresentation of an error
* this->errorCode( void ):String
* @Return String String rappresentation of the error
*/
function errorCode() {
return $this->__errorCode;
}
/**
* Public method:
* Returns an array with error informations
* this->errorInfo( void ):Array
* @Return Array Array with 3 keys:
* 0 => error code
* 1 => error number
* 2 => error string
*/
function errorInfo() {
return $this->__errorInfo;
}
/**
* Public method:
* Excecutes a query and returns affected rows
* this->exec( $query:String ):Mixed
* @Param String query to execute
* @Return Mixed Number of affected rows or false on bad query.
*/
function exec($query) {
$result = 0;
if(!is_null($this->__uquery($query)))
$result = mysql_affected_rows($this->__connection);
if(is_null($result))
$result = false;
return $result;
}
/**
* Public method:
* Returns last inserted id
* this->lastInsertId( void ):Number
* @Return Number Last inserted id
*/
function lastInsertId() {
$id = mysql_insert_id($this->__connection);
if ($id > 0) {
return $id;
} else {
$query = $this->prepare('SELECT last_insert_id()');
$query->execute();
return $query->fetchColumn();
}
}
/**
* Public method:
* Returns a new PDOStatement
* this->prepare( $query:String, $array:Array ):PDOStatement
* @Param String query to prepare
* @Param Array this variable is not used but respects PDO original accepted parameters
* @Return PDOStatement new PDOStatement to manage
*/
function prepare($query, $array = Array()) {
return new PDOStatement_mysql($query, $this->__connection, $this->__dbinfo);
}
/**
* Public method:
* Executes directly a query and returns an array with result or false on bad query
* this->query( $query:String ):Mixed
* @Param String query to execute
* @Return Mixed false on error, array with all info on success
*/
function query($query) {
$query = @mysql_unbuffered_query($query, $this->__connection);
if($query) {
$result = Array();
while($r = mysql_fetch_assoc($query))
array_push($result, $r);
}
else {
$result = false;
$this->__setErrors('SQLER');
}
return $result;
}
/**
* Public method:
* Quotes correctly a string for this database
* this->quote( $string:String ):String
* @Param String string to quote
* @Return String a correctly quoted string
*/
function quote($string) {
return ('"'.mysql_escape_string($string).'"');
}
// NOT TOTALLY SUPPORTED PUBLIC METHODS
/**
* Public method:
* Quotes correctly a string for this database
* this->getAttribute( $attribute:Integer ):Mixed
* @Param Integer a constant [ PDO_ATTR_SERVER_INFO,
* PDO_ATTR_SERVER_VERSION,
* PDO_ATTR_CLIENT_VERSION,
* PDO_ATTR_PERSISTENT ]
* @Return Mixed correct information or false
*/
function getAttribute($attribute) {
$result = false;
switch($attribute) {
case PDO_ATTR_SERVER_INFO:
$result = mysql_get_host_info($this->__connection);
break;
case PDO_ATTR_SERVER_VERSION:
$result = mysql_get_server_info($this->__connection);
break;
case PDO_ATTR_CLIENT_VERSION:
$result = mysql_get_client_info();
break;
case PDO_ATTR_PERSISTENT:
$result = $this->__persistent;
break;
}
return $result;
}
/**
* Public method:
* Sets database attributes, in this version only connection mode.
* this->setAttribute( $attribute:Integer, $mixed:Mixed ):Boolean
* @Param Integer PDO_* constant, in this case only PDO_ATTR_PERSISTENT
* @Param Mixed value for PDO_* constant, in this case a Boolean value
* true for permanent connection, false for default not permament connection
* @Return Boolean true on change, false otherwise
*/
function setAttribute($attribute, $mixed) {
$result = false;
if($attribute === PDO_ATTR_PERSISTENT && $mixed != $this->__persistent) {
$result = true;
$this->__persistent = (boolean) $mixed;
mysql_close($this->__connection);
if($this->__persistent === true)
$this->__connection = &mysql_pconnect($this->__dbinfo[0], $this->__dbinfo[1], $this->__dbinfo[2]);
else
$this->__connection = &mysql_connect($this->__dbinfo[0], $this->__dbinfo[1], $this->__dbinfo[2]);
mysql_select_db($this->__dbinfo[3], $this->__connection);
}
return $result;
}
// UNSUPPORTED PUBLIC METHODS
function beginTransaction() {
return false;
}
function commit() {
return false;
}
function rollBack() {
return false;
}
// PRIVATE METHODS [ UNCOMMENTED ]
function __setErrors($er) {
if(!is_resource($this->__connection)) {
$errno = mysql_errno();
$errst = mysql_error();
}
else {
$errno = mysql_errno($this->__connection);
$errst = mysql_error($this->__connection);
}
$this->__errorCode = &$er;
$this->__errorInfo = Array($this->__errorCode, $errno, $errst);
}
function __uquery(&$query) {
if(!@$query = mysql_query($query, $this->__connection)) {
$this->__setErrors('SQLER');
$query = null;
}
return $query;
}
}
?>
+864
View File
@@ -0,0 +1,864 @@
<?php
/**
*
* @author Fm453
* @remark 数据模型批处理类
*/
defined('HI_FM') or exit("Access Denied");
global $_FM;
global $_FM_CORE;
$_FM_CORE = dirname(__FILE__).'/';
class dataModel
{
protected $siteid;
protected $name; //表名(并非完整的数据表名)
protected $sourceTable; //源表
//表命名规范:主系统前缀_本商城程序前缀_功能类_具体表(表名_区分字符)_表类型后缀
protected $self; //模型主表;仅允许系统级的生成(最低到shop级别)
protected $form; //模型实例表(根据模型生成不同的实例)
protected $param; //模型关联参数(同一模型,对应不同站点、公号、实例时,参数可分别设置)
protected $order; //实例产生的数据提交表单
protected $addon; //模型表单附加参数表(附加参数与主表关联参数冲突时,附加参数优先)
protected $data; //收集的数据表
protected $attr; //数据属性表(用于对数据进行细分场景隔离的规则微调——因为该规则默认会在关联参数表或其他设置中事先声明;同一份数据,不同场景下可见性、读写权限等可不同-极少用到)
protected $pre; //表预编辑操作记录
protected $dbPrefix;//系统统一规定的表前缀
protected $tablePrefix;//内部规则约定的表功能前缀(用于对数据表文件进行文件夹归档保存等场景使用)
protected $tableType;//表类型(用于规定表后缀)
protected $tableName;//综合prefix\name\type拼接格式化的表名称
protected $tableTitle; //表备注(comment)
protected $sql = array();
protected $tables = array();//表SQL的配置集
protected $type = array();//表归属类(用于后台一些统计时作归纳之用)
/*
数据库前缀
*/
function db_prefix($prefix)
{
return $prefix;
}
/*
数据表后缀集
$comment 是否带注释,默认否
*/
function table_suffix($comment=null)
{
if(!$comment){
return ['self','form','param','order','addon','data','attr','pre'];
}else{
return [
'self'=>'主表',
'form'=>'实例表',
'param'=>'主参数表',
'order'=>'数据提交/收集表单表',
'addon'=>'附加参数表',
'data'=>'具体数据表',
'attr'=>'数据属性微调表',
'pre'=>'数据表预编辑操作记录',
];
}
}
/*
数据表过滤校验字段集
$suffix 表后缀类型
*/
function table_fileds($suffix)
{
switch($suffix) {
case 'self':
$fields = ['title','keywords','displayorder','status','deleted','statuscode'];
break;
case 'form':
$fields = ['s_sn','uid','title','value','displayorder','status','deleted','statuscode'];
break;
case 'param':
$fields = ['s_sn','f_sn','uid','setfor','title','key','value','displayorder','status','deleted','statuscode'];
break;
case 'order':
$fields = ['s_sn','f_sn','mid','fid','title','value','displayorder','status','deleted','statuscode'];
break;
case 'addon':
$fields = ['s_sn','f_sn','o_sn','mid','fid','setfor','title','key','value','displayorder','status','deleted','statuscode'];
break;
case 'data':
$fields = ['s_sn','f_sn','o_sn','mid','fid','setfor','title','key','value','displayorder','status','deleted','statuscode'];
break;
case 'attr':
$fields = ['t_sn','uid','mid','fid','suffix','setfor','title','key','value','displayorder','status','deleted','statuscode'];
break;
case 'pre':
$fields = ['tid','uid','mid','fid','suffix','setfor','value','displayorder','status','deleted','statuscode'];
break;
default:
$fields = ['id','sn','siteid','platid','uniacid','shopid','createtime','updatetime','update_at'];
break;
}
return $fields;
}
/*
数据过滤校验
*/
function data_filter($dataPost)
{
$newData = array();
//需要直接过滤掉的部分
$keys = ['id','siteid','createtime','updatetime','update_at'];
foreach($keys as $key){
if(isset($dataPost[$key])){
unset($dataPost[$key]);
}
}
//需要从GET中取得的字段,此处也需过滤掉
$keys = ['uniacid','platid','shopid'];
foreach($keys as $key){
if(isset($dataPost[$key])){
unset($dataPost[$key]);
}
}
//格式化为整型数字并保留的字段
$keys = ['displayorder','status','statuscode','deleted'];
foreach($keys as $key){
if(isset($dataPost[$key])){
$dataPost[$key] = intval($dataPost[$key]);
$newData[$key] = intval($dataPost[$key]);
}
}
//格式化为整型数字但不保留的字段
$keys = ['partnerid','uid','mid','fid'];
foreach($keys as $key){
if(isset($dataPost[$key])){
$newData[$key] = intval($dataPost[$key]);
unset($dataPost[$key]);
}
}
//约定SQL命令辅助(sql_开头)
$keys = ['orders','limits'];
foreach($keys as $key){
if(isset($dataPost['sql_'.$key]) && is_array($dataPost['sql_'.$key])) {
$newData['sqls'][$key] = $dataPost['sql_'.$key];
unset($dataPost['sql_'.$key]);
}else{
$newData['sqls'][$key] = array();
}
}
//约定搜索条件辅助(searchings数组)
/*
@status 指定状态(数据是否启用)(0,1)
@deleted 指定状态(数据是否删除)(0,1)
@keyword 指定要匹配的关键词(模糊检索)
@filter 用于设定数据过滤条件(数组集,要匹配的字段=》字段值)($col=>$val)
@plat 指定跨平台搜索
*/
$keys = ['status','deleted','keyword','filter','plat'];
$newData['searching'] = array();
foreach($keys as $key){
if(isset($dataPost['searching'][$key])) {
$newData['searching'][$key] = $dataPost['searching'][$key];
unset($dataPost['searching'][$key]);
}
}
$hasSearchAddons = (isset($dataPost['searching']) && count($dataPost['searching'])>0) ? true : false;
if($hasSearchAddons){
$newData['searching']['addons'] = array();
foreach($dataPost['searching'] as $key => $value){
$newData['searching']['addons'][$key] = $value;
unset($dataPost['searching'][$key]);
}
}
unset($dataPost['searching']);
//初始化赋值 TBD
$keys = ['statuscode'=>64];
//剩余部分
$newData['addons'] = array();
foreach($dataPost as $key => $v){
$newData['addons'][$key] = $v;
}
return $newData;
}
/*
根据表功能类型进行数据格式化
*/
function data_format($data,$suffix)
{
global $_FM;
$newData = array();
switch($suffix){
case 'self':
//取各类型表字段
$columns1 = $this->table_fileds($suffix);
$columns2 = $this->table_fileds('');
//去除非字段集内的部分
foreach($data as $key => $v){
if(in_array($key,$columns1) || in_array($key,$columns2)){
$newData[$key] = $data[$key];
}
}
//进一步整理
$newData['siteid'] = $_FM['apiCert']['siteId'];
$newData['platid'] = $_FM['platid'];
$newData['uniacid'] = $_FM['uniacid'];
$newData['shopid'] = $_FM['shopid'];
break;
case 'form':
//取各类型表字段
$columns1 = $this->table_fileds($suffix);
$columns2 = $this->table_fileds('');
//去除非字段集内的部分
foreach($data as $key => $v){
if(in_array($key,$columns1) || in_array($key,$columns2)){
$newData[$key] = $data[$key];
}
}
//进一步整理
$newData['siteid'] = $_FM['apiCert']['siteId'];
$newData['platid'] = $_FM['platid'];
$newData['uniacid'] = $_FM['uniacid'];
$newData['shopid'] = $_FM['shopid'];
break;
case 'order':
//取各类型表字段
$columns1 = $this->table_fileds($suffix);
$columns2 = $this->table_fileds('');
//去除非字段集内的部分
foreach($data as $key => $v){
if(in_array($key,$columns1) || in_array($key,$columns2)){
$newData[$key] = $data[$key];
}
}
//进一步整理
$newData['siteid'] = $_FM['apiCert']['siteId'];
$newData['platid'] = $_FM['platid'];
$newData['uniacid'] = $_FM['uniacid'];
$newData['shopid'] = $_FM['shopid'];
break;
case 'param':
//要在此处格式化掉sn等数据
$reset = ['sn','s_sn','f_sn','o_sn'];
foreach($data as $key => $value)
{
if(in_array($key,$reset)) {
unset($data[$key]);
}
}
foreach($data as $key => $value)
{
$temp = array();
$setfor = $key; //析取setfor
$temp['setfor'] = $setfor;
if(is_array($value))
{
//仍是数组,继续
foreach($value as $k => $v)
{
$title = $k; //析取title
$temp['title'] = $k;
if(is_array($v))
{
//仍是数组,继续
foreach($v as $kk => $vv){
$temp['key'] = $kk; //析取key
$temp['value'] = serialize($vv); //不再往下构造了——三级数组保存式(setfor-title-key=>value)
$newData[] = $temp;
}
}else{
$temp['key'] = $k;
$temp['value'] = serialize($v);
$newData[] = $temp;
}
}
}else{
$temp['title'] = $setfor;
$temp['key'] = $setfor;
$temp['value'] = serialize($value);
$newData[] = $temp;
}
}
break;
case 'addon':
//要在此处格式化掉sn等数据
$reset = ['sn','s_sn','f_sn','o_sn','partnerid','mid','fid'];
foreach($data as $key => $value)
{
if(in_array($key,$reset)) {
unset($data[$key]);
}
}
foreach($data as $key => $value)
{
$temp = array();
$setfor = $key; //析取setfor
$temp['setfor'] = $setfor;
if(is_array($value))
{
//仍是数组,继续
foreach($value as $k => $v)
{
$title = $k; //析取title
$temp['title'] = $k;
if(is_array($v))
{
//仍是数组,继续
foreach($v as $kk => $vv){
$temp['key'] = $kk; //析取key
$temp['value'] = serialize($vv); //不再往下构造了——三级数组保存式(setfor-title-key=>value)
$newData[] = $temp;
}
}else{
$temp['key'] = $k;
$temp['value'] = serialize($v);
$newData[] = $temp;
}
}
}else{
$temp['title'] = $setfor;
$temp['key'] = $setfor;
$temp['value'] = serialize($value);
$newData[] = $temp;
}
}
break;
case 'data':
//要在此处格式化掉sn等数据
$reset = ['sn'];
foreach($data as $key => $value)
{
if(in_array($key,$reset)) {
unset($data[$key]);
}
}
foreach($data as $key => $value)
{
$temp = array();
$setfor = $key; //析取setfor
$temp['setfor'] = $setfor;
if(is_array($value))
{
//仍是数组,继续
foreach($value as $k => $v)
{
$title = $k; //析取title
$temp['title'] = $k;
if(is_array($v))
{
//仍是数组,继续
foreach($v as $kk => $vv){
$temp['key'] = $kk; //析取key
$temp['value'] = serialize($vv); //不再往下构造了——三级数组保存式(setfor-title-key=>value)
$newData[] = $temp;
}
}else{
$temp['key'] = $k;
$temp['value'] = serialize($v);
$newData[] = $temp;
}
}
}else{
$temp['title'] = $setfor;
$temp['key'] = $setfor;
$temp['value'] = serialize($value);
$newData[] = $temp;
}
}
break;
case 'attr':
break;
default:
break;
}
return $newData;
}
/*
SQL命令生成
根据参数生成某类表的SQL命令并返回
*/
function get_sql_all($params)
{
global $_FM;
$sqls = array();
$dbPrefix = $params['dbPrefix'];
$tablePrefix = $params['tablePrefix'];
$name = $params['name'];
$tableTitle = $params['tableTitle'];
$type = $params['type'];
$tableTypes = $this->table_suffix();
foreach($tableTypes as $k){
$sqls[$k] = $this->get_sql($dbPrefix,$tablePrefix,$name,$k,$tableTitle,$type);
}
$result = '';
foreach($sqls as $k => $sql){
$columns = $sqls[$k]['columns'];
unset($columns['id']); //将id字段排除(新表创建时自动添加了)
$indexes = $sqls[$k]['indexes'];
unset($indexes['id']); //将id字段排除(新表创建时自动添加了)
$result .= '<br><br>';
$result .= $sql = $sqls[$k]['sql'];
//1st 创建字段
foreach($columns as $column){
$result .= '<br>';
$result .= $column;
}
//2nd 创建索引
foreach($indexes as $index){
$result .= '<br>';
$result .= $index;
}
}
$sqls = array($result);
return $result;
}
/*
SQL命令生成-返回单表命令集:[sql]-表创建命令(带id字段);[columns]-表字段创建命令集(适用于新建);[indexes]-表索引创建命令集(适用于新建);[changec]-表字段调整命令集(适用于后期维护表-TBD)
@db 目标数据库
@dbPrefix 数据库系统前缀
@tablePrefix 数据表类型前缀
@name 类表名称
@tableType 目标数据表后缀(self,param,form,addon,order,data,attr,pre)
@tableTitle 类表备注/注释
@type 表功能类约定(数组)
*/
function get_sql($dbPrefix,$tablePrefix,$name,$tableType,$tableTitle,$type)
{
$dbPrefix = isset($dbPrefix) ? $dbPrefix : false;
$dbPrefix = ($dbPrefix) ? $dbPrefix.'_' : '';
$tablePrefix = isset($tablePrefix) ? $tablePrefix : false;
$tablePrefix = ($tablePrefix) ? $tablePrefix.'_' : '';
$type = (!is_array($type) || empty($type)) ? array("all") : $type;
if(!isset($name)){
if(FM_DEBUG){
trigger_error('未传入name参数', E_USER_ERROR);
}
return false;
}
if(!isset($tableType)){
if(FM_DEBUG){
trigger_error('未传入tableType参数', E_USER_ERROR);
}
return false;
}
$tableName = $dbPrefix.$tablePrefix.$name.'_'.$tableType;
$tables[$tableName] = array();
$tables[$tableName]['name'] = $tableTitle;
$key = "\$table['".$tableName."']['name']"; //原生成到php文件以便动态调用的方法,带了$table变量名的
$key = "name"; //直接生成固定表名的方法
$sql[$key] = $tables[$tableName]['name'];
$tables[$tableName]['type'] = $type;
$key = "\$table\[\'".$tableName."\'\]\[\'type\'\]";
$key = "type";
$sql[$key] = $tables[$tableName]['type'];
switch($tableType) {
case 'self':
$createsql = "CREATE TABLE IF NOT EXISTS ".$tableName." (`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '表记录序号ID', PRIMARY KEY (`id`) USING BTREE) ENGINE=InnoDB CHARSET=utf8 COLLATE utf8_general_ci COMMENT='".$tableTitle."主表' ;";
$columns = array();
$columns['id'] = "ALTER TABLE ".$tableName." ADD `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '表记录序号ID' ;";
$columns['sn'] = "ALTER TABLE ".$tableName." ADD `sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '与其他表进行关联的唯一记录编码' ;";
$columns['siteid'] = "ALTER TABLE ".$tableName." ADD `siteid` INT(11) UNSIGNED NOT NULL COMMENT '所属安装站点编码' ;";
$columns['platid'] = "ALTER TABLE ".$tableName." ADD `platid` INT(11) UNSIGNED NOT NULL COMMENT '所属平台编码' ;";
$columns['uniacid'] = "ALTER TABLE ".$tableName." ADD `uniacid` INT(11) UNSIGNED NOT NULL COMMENT '所属公众号编码' ;";
$columns['shopid'] = "ALTER TABLE ".$tableName." ADD `shopid` INT(11) UNSIGNED NOT NULL COMMENT '所属商铺编码' ;";
$columns['title'] = "ALTER TABLE ".$tableName." ADD `title` VARCHAR(255) NOT NULL COMMENT '标题' ;";
$columns['keywords'] = "ALTER TABLE ".$tableName." ADD `keywords` VARCHAR(255) NOT NULL COMMENT '供检索的关键词串' ;";
$columns['displayorder'] = "ALTER TABLE ".$tableName." ADD `displayorder` INT(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '排序权重' ;";
$columns['status'] = "ALTER TABLE ".$tableName." ADD `status` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '站内状态代码' ;";
$columns['deleted'] = "ALTER TABLE ".$tableName." ADD `deleted` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT '是否删除(1是0否)' ;";
$columns['createtime'] = "ALTER TABLE ".$tableName." ADD `createtime` INT(11) UNSIGNED NOT NULL COMMENT '记录创建时间' ;";
$columns['updatetime'] = "ALTER TABLE ".$tableName." ADD `updatetime` INT(11) UNSIGNED NOT NULL COMMENT '记录更新时间' ;";
$columns['statuscode'] = "ALTER TABLE ".$tableName." ADD `statuscode` TINYINT(3) NOT NULL DEFAULT '0' COMMENT '全站状态代码(-128~127)' ;";
$columns['update_at'] = "ALTER TABLE ".$tableName." ADD `update_at` TIMESTAMP on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录更新时间' ;";
$indexes = array();
$index = "`id` (`id`)";
$indexes['id'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`sn` (`sn`)";
$indexes['sn'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`siteid` (`siteid`)";
$indexes['siteid'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`uniacid` (`uniacid`)";
$indexes['uniacid'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`shopid` (`shopid`)";
$indexes['shopid'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`keywords` (`keywords`)";
$indexes['keywords'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
//$indexes['\/\/'] = "为了提高效率,根据建议,优选6个索引序列,前两个为常用;使用顺序不可更改";
break;
case 'form':
$createsql = "CREATE TABLE IF NOT EXISTS ".$tableName." (`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '表记录序号ID', PRIMARY KEY (`id`) USING BTREE) ENGINE=InnoDB CHARSET=utf8 COLLATE utf8_general_ci COMMENT='".$tableTitle."实例表' ;";
$columns = array();
$columns['id'] = "ALTER TABLE ".$tableName." ADD `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '表记录序号ID' ;";
$columns['sn'] = "ALTER TABLE ".$tableName." ADD `sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '与其他表进行关联的唯一记录编码' ;";
$columns['s_sn'] = "ALTER TABLE ".$tableName." ADD `s_sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '对应主表的记录编码' ;";
$columns['siteid'] = "ALTER TABLE ".$tableName." ADD `siteid` INT(11) UNSIGNED NOT NULL COMMENT '所属安装站点编码' ;";
$columns['platid'] = "ALTER TABLE ".$tableName." ADD `platid` INT(11) UNSIGNED NOT NULL COMMENT '所属平台编码' ;";
$columns['uniacid'] = "ALTER TABLE ".$tableName." ADD `uniacid` INT(11) UNSIGNED NOT NULL COMMENT '所属公众号编码' ;";
$columns['shopid'] = "ALTER TABLE ".$tableName." ADD `shopid` INT(11) UNSIGNED NOT NULL COMMENT '所属商铺编码' ;";
$columns['partnerid'] = "ALTER TABLE ".$tableName." ADD `partnerid` INT(11) UNSIGNED NOT NULL COMMENT '所属合作商户编码' ;";
$columns['uid'] = "ALTER TABLE ".$tableName." ADD `uid` INT(11) UNSIGNED NOT NULL COMMENT '所属后台用户编码' ;";
$columns['title'] = "ALTER TABLE ".$tableName." ADD `title` VARCHAR(255) NOT NULL COMMENT '标题' ;";
$columns['value'] = "ALTER TABLE ".$tableName." ADD `value` TEXT NOT NULL COMMENT '具体内容或描述' ;";
$columns['displayorder'] = "ALTER TABLE ".$tableName." ADD `displayorder` INT(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '排序权重' ;";
$columns['status'] = "ALTER TABLE ".$tableName." ADD `status` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '站内状态代码' ;";
$columns['deleted'] = "ALTER TABLE ".$tableName." ADD `deleted` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT '是否删除(1是0否)' ;";
$columns['createtime'] = "ALTER TABLE ".$tableName." ADD `createtime` INT(11) UNSIGNED NOT NULL COMMENT '记录创建时间' ;";
$columns['updatetime'] = "ALTER TABLE ".$tableName." ADD `updatetime` INT(11) UNSIGNED NOT NULL COMMENT '记录更新时间' ;";
$columns['statuscode'] = "ALTER TABLE ".$tableName." ADD `statuscode` TINYINT(3) NOT NULL DEFAULT '0' COMMENT '全站状态代码(-128~127)' ;";
$columns['update_at'] = "ALTER TABLE ".$tableName." ADD `update_at` TIMESTAMP on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录更新时间' ;";
$indexes = array();
$index = "`id` (`id`)";
$indexes['id'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`sn` (`sn`)";
$indexes['sn'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`s_sn` (`s_sn`)";
$indexes['s_sn'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`siteid` (`siteid`)";
$indexes['siteid'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`uniacid` (`uniacid`)";
$indexes['uniacid'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`title` (`title`)";
$indexes['title'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
//$indexes['\/\/'] = "为了提高效率,根据建议,优选6个索引序列,前两个为常用;使用顺序不可更改";
break;
case 'param':
$createsql = "CREATE TABLE IF NOT EXISTS ".$tableName." (`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '表记录序号ID', PRIMARY KEY (`id`) USING BTREE) ENGINE=MyISAM CHARSET=utf8 COLLATE utf8_general_ci COMMENT='".$tableTitle."主参数表' ;";
$columns = array();
$columns['id'] = "ALTER TABLE ".$tableName." ADD `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '表记录序号ID' ;";
$columns['sn'] = "ALTER TABLE ".$tableName." ADD `sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '与其他表进行关联的唯一记录编码' ;";
$columns['s_sn'] = "ALTER TABLE ".$tableName." ADD `s_sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '对应主表的记录编码' ;";
$columns['f_sn'] = "ALTER TABLE ".$tableName." ADD `f_sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '对应实例表的记录编码' ;";
$columns['siteid'] = "ALTER TABLE ".$tableName." ADD `siteid` INT(11) UNSIGNED NOT NULL COMMENT '所属安装站点编码' ;";
$columns['platid'] = "ALTER TABLE ".$tableName." ADD `platid` INT(11) UNSIGNED NOT NULL COMMENT '所属平台编码' ;";
$columns['uniacid'] = "ALTER TABLE ".$tableName." ADD `uniacid` INT(11) UNSIGNED NOT NULL COMMENT '所属公众号编码' ;";
$columns['shopid'] = "ALTER TABLE ".$tableName." ADD `shopid` INT(11) UNSIGNED NOT NULL COMMENT '所属商铺编码' ;";
$columns['partnerid'] = "ALTER TABLE ".$tableName." ADD `partnerid` INT(11) UNSIGNED NOT NULL COMMENT '所属合作商户编码' ;";
$columns['setfor'] = "ALTER TABLE ".$tableName." ADD `setfor` VARCHAR(50) NOT NULL COMMENT '参数归属类别' ;";
$columns['title'] = "ALTER TABLE ".$tableName." ADD `title` VARCHAR(255) NOT NULL COMMENT '参数标题' ;";
$columns['key'] = "ALTER TABLE ".$tableName." ADD `key` VARCHAR(255) NOT NULL COMMENT '参数键值' ;";
$columns['value'] = "ALTER TABLE ".$tableName." ADD `value` TEXT NOT NULL COMMENT '参数具体值' ;";
$columns['displayorder'] = "ALTER TABLE ".$tableName." ADD `displayorder` INT(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '排序权重' ;";
$columns['status'] = "ALTER TABLE ".$tableName." ADD `status` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '站内状态代码' ;";
$columns['deleted'] = "ALTER TABLE ".$tableName." ADD `deleted` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT '是否删除(1是0否)' ;";
$columns['createtime'] = "ALTER TABLE ".$tableName." ADD `createtime` INT(11) UNSIGNED NOT NULL COMMENT '记录创建时间' ;";
$columns['updatetime'] = "ALTER TABLE ".$tableName." ADD `updatetime` INT(11) UNSIGNED NOT NULL COMMENT '记录更新时间' ;";
$columns['statuscode'] = "ALTER TABLE ".$tableName." ADD `statuscode` TINYINT(3) NOT NULL DEFAULT '0' COMMENT '全站状态代码(-128~127)' ;";
$columns['update_at'] = "ALTER TABLE ".$tableName." ADD `update_at` TIMESTAMP on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录更新时间' ;";
$indexes = array();
$index = "`id` (`id`)";
$indexes['id'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`sn` (`sn`)";
$indexes['sn'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`s_sn` (`s_sn`)";
$indexes['s_sn'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`setfor` (`setfor`)";
$indexes['setfor'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`title` (`title`)";
$indexes['title'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`key` (`key`)";
$indexes['key'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
//$indexes['\/\/'] = "为了提高效率,根据建议,优选6个索引序列,前两个为常用;使用顺序不可更改";
break;
case 'order':
$createsql = "CREATE TABLE IF NOT EXISTS ".$tableName." (`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '表记录序号ID', PRIMARY KEY (`id`) USING BTREE) ENGINE=InnoDB CHARSET=utf8 COLLATE utf8_general_ci COMMENT='".$tableTitle."数据提交/收集表单表' ;";
$columns = array();
$columns['id'] = "ALTER TABLE ".$tableName." ADD `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '表记录序号ID' ;";
$columns['sn'] = "ALTER TABLE ".$tableName." ADD `sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '与其他表进行关联的唯一记录编码' ;";
$columns['s_sn'] = "ALTER TABLE ".$tableName." ADD `s_sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '对应主表的记录编码' ;";
$columns['f_sn'] = "ALTER TABLE ".$tableName." ADD `f_sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '对应实例表的记录编码' ;";
$columns['siteid'] = "ALTER TABLE ".$tableName." ADD `siteid` INT(11) UNSIGNED NOT NULL COMMENT '所属安装站点编码' ;";
$columns['platid'] = "ALTER TABLE ".$tableName." ADD `platid` INT(11) UNSIGNED NOT NULL COMMENT '所属平台编码' ;";
$columns['uniacid'] = "ALTER TABLE ".$tableName." ADD `uniacid` INT(11) UNSIGNED NOT NULL COMMENT '所属公众号编码' ;";
$columns['shopid'] = "ALTER TABLE ".$tableName." ADD `shopid` INT(11) UNSIGNED NOT NULL COMMENT '所属商铺编码' ;";
$columns['partnerid'] = "ALTER TABLE ".$tableName." ADD `partnerid` INT(11) UNSIGNED NOT NULL COMMENT '所属合作商户编码' ;";
$columns['mid'] = "ALTER TABLE ".$tableName." ADD `mid` INT(11) UNSIGNED NOT NULL COMMENT '所属前台会员编码' ;";
$columns['fid'] = "ALTER TABLE ".$tableName." ADD `fid` INT(11) UNSIGNED NOT NULL COMMENT '所属前台粉丝(非注册用户)编码' ;";
$columns['title'] = "ALTER TABLE ".$tableName." ADD `title` VARCHAR(255) NOT NULL COMMENT '标题' ;";
$columns['value'] = "ALTER TABLE ".$tableName." ADD `value` TEXT NOT NULL COMMENT '具体内容或描述' ;";
$columns['displayorder'] = "ALTER TABLE ".$tableName." ADD `displayorder` INT(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '排序权重' ;";
$columns['status'] = "ALTER TABLE ".$tableName." ADD `status` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '站内状态代码' ;";
$columns['deleted'] = "ALTER TABLE ".$tableName." ADD `deleted` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT '是否删除(1是0否)' ;";
$columns['createtime'] = "ALTER TABLE ".$tableName." ADD `createtime` INT(11) UNSIGNED NOT NULL COMMENT '记录创建时间' ;";
$columns['updatetime'] = "ALTER TABLE ".$tableName." ADD `updatetime` INT(11) UNSIGNED NOT NULL COMMENT '记录更新时间' ;";
$columns['statuscode'] = "ALTER TABLE ".$tableName." ADD `statuscode` TINYINT(3) NOT NULL DEFAULT '0' COMMENT '全站状态代码(-128~127)' ;";
$columns['update_at'] = "ALTER TABLE ".$tableName." ADD `update_at` TIMESTAMP on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录更新时间' ;";
$indexes = array();
$indexes['siteid']="`siteid` (`siteid`)";
$indexes['uniacid']="`uniacid` (`uniacid`)";
$index = "`id` (`id`)";
$indexes['id'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`sn` (`sn`)";
$indexes['sn'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`s_sn` (`s_sn`)";
$indexes['s_sn'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`f_sn` (`f_sn`)";
$indexes['f_sn'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`siteid` (`siteid`)";
$indexes['siteid'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`uniacid` (`uniacid`)";
$indexes['uniacid'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
//$indexes['\/\/'] = "为了提高效率,根据建议,优选6个索引序列,前两个为常用;使用顺序不可更改";
break;
case 'addon':
$createsql = "CREATE TABLE IF NOT EXISTS ".$tableName." (`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '表记录序号ID', PRIMARY KEY (`id`) USING BTREE) ENGINE=MyISAM CHARSET=utf8 COLLATE utf8_general_ci COMMENT='".$tableTitle."附加参数表' ;";
$columns = array();
$columns['id'] = "ALTER TABLE ".$tableName." ADD `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '表记录序号ID' ;";
$columns['sn'] = "ALTER TABLE ".$tableName." ADD `sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '与其他表进行关联的唯一记录编码' ;";
$columns['s_sn'] = "ALTER TABLE ".$tableName." ADD `s_sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '对应主表的记录编码' ;";
$columns['f_sn'] = "ALTER TABLE ".$tableName." ADD `f_sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '对应实例表的记录编码' ;";
$columns['o_sn'] = "ALTER TABLE ".$tableName." ADD `o_sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '对应数据提交表单的记录编码' ;";
$columns['siteid'] = "ALTER TABLE ".$tableName." ADD `siteid` INT(11) UNSIGNED NOT NULL COMMENT '所属安装站点编码' ;";
$columns['platid'] = "ALTER TABLE ".$tableName." ADD `platid` INT(11) UNSIGNED NOT NULL COMMENT '所属平台编码' ;";
$columns['uniacid'] = "ALTER TABLE ".$tableName." ADD `uniacid` INT(11) UNSIGNED NOT NULL COMMENT '所属公众号编码' ;";
$columns['shopid'] = "ALTER TABLE ".$tableName." ADD `shopid` INT(11) UNSIGNED NOT NULL COMMENT '所属商铺编码' ;";
$columns['partnerid'] = "ALTER TABLE ".$tableName." ADD `partnerid` INT(11) UNSIGNED NOT NULL COMMENT '所属合作商户编码' ;";
$columns['mid'] = "ALTER TABLE ".$tableName." ADD `mid` INT(11) UNSIGNED NOT NULL COMMENT '所属前台会员编码' ;";
$columns['fid'] = "ALTER TABLE ".$tableName." ADD `fid` INT(11) UNSIGNED NOT NULL COMMENT '所属前台粉丝(非注册用户)编码' ;";
$columns['setfor'] = "ALTER TABLE ".$tableName." ADD `setfor` VARCHAR(50) NOT NULL COMMENT '参数归属类别' ;";
$columns['title'] = "ALTER TABLE ".$tableName." ADD `title` VARCHAR(255) NOT NULL COMMENT '参数标题' ;";
$columns['key'] = "ALTER TABLE ".$tableName." ADD `key` VARCHAR(255) NOT NULL COMMENT '参数键值' ;";
$columns['value'] = "ALTER TABLE ".$tableName." ADD `value` TEXT NOT NULL COMMENT '参数具体值' ;";
$columns['displayorder'] = "ALTER TABLE ".$tableName." ADD `displayorder` INT(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '排序权重' ;";
$columns['status'] = "ALTER TABLE ".$tableName." ADD `status` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '站内状态代码' ;";
$columns['deleted'] = "ALTER TABLE ".$tableName." ADD `deleted` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT '是否删除(1是0否)' ;";
$columns['createtime'] = "ALTER TABLE ".$tableName." ADD `createtime` INT(11) UNSIGNED NOT NULL COMMENT '记录创建时间' ;";
$columns['updatetime'] = "ALTER TABLE ".$tableName." ADD `updatetime` INT(11) UNSIGNED NOT NULL COMMENT '记录更新时间' ;";
$columns['statuscode'] = "ALTER TABLE ".$tableName." ADD `statuscode` TINYINT(3) NOT NULL DEFAULT '0' COMMENT '全站状态代码(-128~127)' ;";
$columns['update_at'] = "ALTER TABLE ".$tableName." ADD `update_at` TIMESTAMP on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录更新时间' ;";
$indexes = array();
$index = "`id` (`id`)";
$indexes['id'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`sn` (`sn`)";
$indexes['sn'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`o_sn` (`o_sn`)";
$indexes['o_sn'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`setfor` (`setfor`)";
$indexes['setfor'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`title` (`title`)";
$indexes['title'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`key` (`key`)";
$indexes['key'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
//$indexes['\/\/'] = "为了提高效率,根据建议,优选6个索引序列,前两个为常用;使用顺序不可更改";
break;
case 'data':
$createsql = "CREATE TABLE IF NOT EXISTS ".$tableName." (`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '表记录序号ID', PRIMARY KEY (`id`) USING BTREE) ENGINE=MyISAM CHARSET=utf8 COLLATE utf8_general_ci COMMENT='".$tableTitle."具体数据表' ;";
$columns = array();
$columns['id'] = "ALTER TABLE ".$tableName." ADD `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '表记录序号ID' ;";
$columns['sn'] = "ALTER TABLE ".$tableName." ADD `sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '与其他表进行关联的唯一记录编码' ;";
$columns['s_sn'] = "ALTER TABLE ".$tableName." ADD `s_sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '对应主表的记录编码' ;";
$columns['f_sn'] = "ALTER TABLE ".$tableName." ADD `f_sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '对应实例表的记录编码' ;";
$columns['o_sn'] = "ALTER TABLE ".$tableName." ADD `o_sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '对应数据提交表单的记录编码' ;";
$columns['siteid'] = "ALTER TABLE ".$tableName." ADD `siteid` INT(11) UNSIGNED NOT NULL COMMENT '所属安装站点编码' ;";
$columns['platid'] = "ALTER TABLE ".$tableName." ADD `platid` INT(11) UNSIGNED NOT NULL COMMENT '所属平台编码' ;";
$columns['uniacid'] = "ALTER TABLE ".$tableName." ADD `uniacid` INT(11) UNSIGNED NOT NULL COMMENT '所属公众号编码' ;";
$columns['shopid'] = "ALTER TABLE ".$tableName." ADD `shopid` INT(11) UNSIGNED NOT NULL COMMENT '所属商铺编码' ;";
$columns['partnerid'] = "ALTER TABLE ".$tableName." ADD `partnerid` INT(11) UNSIGNED NOT NULL COMMENT '所属合作商户编码' ;";
$columns['mid'] = "ALTER TABLE ".$tableName." ADD `mid` INT(11) UNSIGNED NOT NULL COMMENT '所属前台会员编码' ;";
$columns['fid'] = "ALTER TABLE ".$tableName." ADD `fid` INT(11) UNSIGNED NOT NULL COMMENT '所属前台粉丝(非注册用户)编码' ;";
$columns['setfor'] = "ALTER TABLE ".$tableName." ADD `setfor` VARCHAR(50) NOT NULL COMMENT '参数归属类别' ;";
$columns['title'] = "ALTER TABLE ".$tableName." ADD `title` VARCHAR(255) NOT NULL COMMENT '参数标题' ;";
$columns['key'] = "ALTER TABLE ".$tableName." ADD `key` VARCHAR(255) NOT NULL COMMENT '参数键值' ;";
$columns['value'] = "ALTER TABLE ".$tableName." ADD `value` TEXT NOT NULL COMMENT '参数具体值' ;";
$columns['displayorder'] = "ALTER TABLE ".$tableName." ADD `displayorder` INT(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '排序权重' ;";
$columns['status'] = "ALTER TABLE ".$tableName." ADD `status` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '站内状态代码' ;";
$columns['deleted'] = "ALTER TABLE ".$tableName." ADD `deleted` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT '是否删除(1是0否)' ;";
$columns['createtime'] = "ALTER TABLE ".$tableName." ADD `createtime` INT(11) UNSIGNED NOT NULL COMMENT '记录创建时间' ;";
$columns['updatetime'] = "ALTER TABLE ".$tableName." ADD `updatetime` INT(11) UNSIGNED NOT NULL COMMENT '记录更新时间' ;";
$columns['statuscode'] = "ALTER TABLE ".$tableName." ADD `statuscode` TINYINT(3) NOT NULL DEFAULT '0' COMMENT '全站状态代码(-128~127)' ;";
$columns['update_at'] = "ALTER TABLE ".$tableName." ADD `update_at` TIMESTAMP on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录更新时间' ;";
$indexes = array();
$index = "`id` (`id`)";
$indexes['id'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`sn` (`sn`)";
$indexes['sn'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`o_sn` (`o_sn`)";
$indexes['o_sn'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`mid` (`mid`)";
$indexes['mid'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`setfor` (`setfor`)";
$indexes['setfor'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`title` (`title`)";
$indexes['title'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`key` (`key`)";
$indexes['key'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
//$indexes['\/\/'] = "为了提高效率,根据建议,优选6个索引序列,前两个为常用;使用顺序不可更改";
break;
case 'attr':
$createsql = "CREATE TABLE IF NOT EXISTS ".$tableName." (`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '表记录序号ID', PRIMARY KEY (`id`) USING BTREE) ENGINE=MyISAM CHARSET=utf8 COLLATE utf8_general_ci COMMENT='".$tableTitle."数据属性微调表' ;";
$columns = array();
$columns['id'] = "ALTER TABLE ".$tableName." ADD `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '表记录序号ID' ;";
$columns['sn'] = "ALTER TABLE ".$tableName." ADD `sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '与其他表进行关联的唯一记录编码' ;";
$columns['t_sn'] = "ALTER TABLE ".$tableName." ADD `t_sn` BIGINT(20) UNSIGNED NOT NULL COMMENT '对应数据表的记录编码' ;";
$columns['siteid'] = "ALTER TABLE ".$tableName." ADD `siteid` INT(11) UNSIGNED NOT NULL COMMENT '所属安装站点编码' ;";
$columns['platid'] = "ALTER TABLE ".$tableName." ADD `platid` INT(11) UNSIGNED NOT NULL COMMENT '所属平台编码' ;";
$columns['uniacid'] = "ALTER TABLE ".$tableName." ADD `uniacid` INT(11) UNSIGNED NOT NULL COMMENT '所属公众号编码' ;";
$columns['shopid'] = "ALTER TABLE ".$tableName." ADD `shopid` INT(11) UNSIGNED NOT NULL COMMENT '所属商铺编码' ;";
$columns['partnerid'] = "ALTER TABLE ".$tableName." ADD `partnerid` INT(11) UNSIGNED NOT NULL COMMENT '所属合作商户编码' ;";
$columns['uid'] = "ALTER TABLE ".$tableName." ADD `uid` INT(11) UNSIGNED NOT NULL COMMENT '所属后台会员编码' ;";
$columns['mid'] = "ALTER TABLE ".$tableName." ADD `mid` INT(11) UNSIGNED NOT NULL COMMENT '所属前台会员编码' ;";
$columns['fid'] = "ALTER TABLE ".$tableName." ADD `fid` INT(11) UNSIGNED NOT NULL COMMENT '所属前台粉丝(非注册用户)编码' ;";
$columns['suffix'] = "ALTER TABLE ".$tableName." ADD `suffix` VARCHAR(50) NOT NULL COMMENT '对应表后缀(用于区分表)' ;";
$columns['setfor'] = "ALTER TABLE ".$tableName." ADD `setfor` VARCHAR(50) NOT NULL COMMENT '参数归属类别' ;";
$columns['title'] = "ALTER TABLE ".$tableName." ADD `title` VARCHAR(255) NOT NULL COMMENT '参数标题' ;";
$columns['key'] = "ALTER TABLE ".$tableName." ADD `key` VARCHAR(255) NOT NULL COMMENT '参数键值' ;";
$columns['value'] = "ALTER TABLE ".$tableName." ADD `value` TEXT NOT NULL COMMENT '参数具体值' ;";
$columns['displayorder'] = "ALTER TABLE ".$tableName." ADD `displayorder` INT(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '排序权重' ;";
$columns['status'] = "ALTER TABLE ".$tableName." ADD `status` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '站内状态代码' ;";
$columns['deleted'] = "ALTER TABLE ".$tableName." ADD `deleted` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT '是否删除(1是0否)' ;";
$columns['createtime'] = "ALTER TABLE ".$tableName." ADD `createtime` INT(11) UNSIGNED NOT NULL COMMENT '记录创建时间' ;";
$columns['updatetime'] = "ALTER TABLE ".$tableName." ADD `updatetime` INT(11) UNSIGNED NOT NULL COMMENT '记录更新时间' ;";
$columns['statuscode'] = "ALTER TABLE ".$tableName." ADD `statuscode` TINYINT(3) NOT NULL DEFAULT '0' COMMENT '全站状态代码(-128~127)' ;";
$columns['update_at'] = "ALTER TABLE ".$tableName." ADD `update_at` TIMESTAMP on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录更新时间' ;";
$indexes = array();
$index = "`id` (`id`)";
$indexes['id'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`sn` (`sn`)";
$indexes['sn'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`t_sn` (`t_sn`)";
$indexes['t_sn'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`uid` (`uid`)";
$indexes['uid'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`mid` (`mid`)";
$indexes['mid'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`setfor` (`setfor`)";
$indexes['setfor'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
//$indexes['\/\/'] = "为了提高效率,根据建议,优选6个索引序列,前两个为常用;使用顺序不可更改";
break;
case 'pre':
$createsql = "CREATE TABLE IF NOT EXISTS ".$tableName." (`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '表记录序号ID', PRIMARY KEY (`id`) USING BTREE) ENGINE=MyISAM CHARSET=utf8 COLLATE utf8_general_ci COMMENT='".$tableTitle."数据表预编辑操作记录' ;";
$columns = array();
$columns['id'] = "ALTER TABLE ".$tableName." ADD `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '表记录序号ID' ;";
$columns['tid'] = "ALTER TABLE ".$tableName." ADD `tid` BIGINT(20) UNSIGNED NOT NULL COMMENT '对应数据表的记录id' ;";
$columns['siteid'] = "ALTER TABLE ".$tableName." ADD `siteid` INT(11) UNSIGNED NOT NULL COMMENT '所属安装站点编码' ;";
$columns['uniacid'] = "ALTER TABLE ".$tableName." ADD `uniacid` INT(11) UNSIGNED NOT NULL COMMENT '所属公众号编码' ;";
$columns['uid'] = "ALTER TABLE ".$tableName." ADD `uid` INT(11) UNSIGNED NOT NULL COMMENT '操作者所属后台会员编码' ;";
$columns['mid'] = "ALTER TABLE ".$tableName." ADD `mid` INT(11) UNSIGNED NOT NULL COMMENT '操作者所属前台会员编码' ;";
$columns['fid'] = "ALTER TABLE ".$tableName." ADD `fid` INT(11) UNSIGNED NOT NULL COMMENT '操作者所属前台粉丝(非注册用户)编码' ;";
$columns['suffix'] = "ALTER TABLE ".$tableName." ADD `suffix` VARCHAR(50) NOT NULL COMMENT '对应表后缀(用于区分表)' ;";
$columns['setfor'] = "ALTER TABLE ".$tableName." ADD `setfor` VARCHAR(50) NOT NULL COMMENT '对应字段' ;";
$columns['value'] = "ALTER TABLE ".$tableName." ADD `value` TEXT NOT NULL COMMENT '参数具体值' ;";
$columns['status'] = "ALTER TABLE ".$tableName." ADD `status` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '站内状态代码' ;";
$columns['deleted'] = "ALTER TABLE ".$tableName." ADD `deleted` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT '是否删除(1是0否)' ;";
$columns['createtime'] = "ALTER TABLE ".$tableName." ADD `createtime` INT(11) UNSIGNED NOT NULL COMMENT '记录创建时间' ;";
$columns['statuscode'] = "ALTER TABLE ".$tableName." ADD `statuscode` TINYINT(3) NOT NULL DEFAULT '0' COMMENT '全站状态代码(-128~127)' ;";
$columns['create_at'] = "ALTER TABLE ".$tableName." ADD `create_at`TIMESTAMP on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录更新时间' ;";
$indexes = array();
$index = "`id` (`id`)";
$indexes['id'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`tid` (`tid`)";
$indexes['tid'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`uid` (`uid`)";
$indexes['uid'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`mid` (`mid`)";
$indexes['mid'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`siteid` (`siteid`)";
$indexes['siteid'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
$index = "`setfor` (`setfor`)";
$indexes['setfor'] = "ALTER TABLE ".$tableName." ADD INDEX".$index.";";
//$indexes['\/\/'] = "为了提高效率,根据建议,优选6个索引序列,前两个为常用;使用顺序不可更改";
break;
default:
break;
}
$tables[$tableName]['sql'] = $createsql;
$key = "\$table\[\'".$tableName."\'\]\[\'sql\'\]";
$key = "sql";
$sql[$key] = $tables[$tableName]['sql'];
$key = "\$table\[\'".$tableName."\'\]\[\'columns\'\]";
$key = "columns";
$sql[$key] = $columns;
$key = "\$table\[\'".$tableName."\'\]\[\'indexes\'\]";
$key = "indexes";
$sql[$key] = $indexes;
return $sql;
}
}
+491
View File
@@ -0,0 +1,491 @@
<?php
/**
* [WeEngine System] Copyright (c) 2014 WE7.CC
* WeEngine is NOT a free software, it under the license terms, visited http://www.we7.cc/ for more details.
*/
defined('HI_FM') or exit("Access Denied");
define('PDO_DEBUG', true);
global $_FM;
$_FM_CORE = dirname(__FILE__).'/';
class FMDB {
protected $pdo;
protected $cfg;
protected $tablepre;
protected $result;
protected $statement;
protected $errors = array();
protected $link = array();
public function getPDO() {
return $this->pdo;
}
public function __construct($data = array()) {
$this->cfg = $data;
$cfg = $data;
$this->tablepre = $cfg['tablepre'];
$this->connect($cfg);
}
public function connect() {
global $_FM_CORE;
$cfg = $this->cfg;
if(empty($cfg)) {
exit("数据库连接配置不当,请检查!'");
}
$dsn = "mysql:dbname={$cfg['database']};host={$cfg['host']};port={$cfg['port']}";
$dbclass = '';
$options = array();
if (class_exists('PDO')) {
if (extension_loaded("pdo_mysql") && in_array('mysql', PDO::getAvailableDrivers())) {
$dbclass = 'PDO';
$options = array(PDO::ATTR_PERSISTENT => $cfg['pconnect']);
} else {
if(!class_exists('_PDO')) {
fm_load()->fm_class('PDO');
}
$dbclass = '_PDO';
}
} else {
fm_load()->fm_class('PDO');
$dbclass = 'PDO';
}
$this->pdo = new $dbclass($dsn, $cfg['username'], $cfg['password'], $options);
$sql = "SET NAMES '{$cfg['charset']}';";
$this->pdo->exec($sql);
$this->pdo->exec("SET sql_mode='';");
if(PDO_DEBUG) {
$info = array();
$info['sql'] = $sql;
$info['error'] = $this->pdo->errorInfo();
$this->debug(false, $info);
}
}
public function prepare($sql) {
$statement = $this->pdo->prepare($sql);
return $statement;
}
public function query($sql, $params = array()) {
$starttime = microtime();
if (empty($params)) {
$result = $this->pdo->exec($sql);
if(PDO_DEBUG) {
$info = array();
$info['sql'] = $sql;
$info['error'] = $this->pdo->errorInfo();
$this->debug(false, $info);
}
return $result;
}
$statement = $this->prepare($sql);
$result = $statement->execute($params);
if(PDO_DEBUG) {
$info = array();
$info['sql'] = $sql;
$info['params'] = $params;
$info['error'] = $statement->errorInfo();
$this->debug(false, $info);
}
$endtime = microtime();
//$this->performance($sql, $endtime - $starttime);
if (!$result) {
return false;
} else {
return $statement->rowCount();
}
}
public function fetchcolumn($sql, $params = array(), $column = 0) {
$starttime = microtime();
$statement = $this->prepare($sql);
$result = $statement->execute($params);
if(PDO_DEBUG) {
$info = array();
$info['sql'] = $sql;
$info['params'] = $params;
$info['error'] = $statement->errorInfo();
$this->debug(false, $info);
}
$endtime = microtime();
$this->performance($sql, $endtime - $starttime);
if (!$result) {
return false;
} else {
return $statement->fetchColumn($column);
}
}
public function fetch($sql, $params = array()) {
$starttime = microtime();
$statement = $this->prepare($sql);
$result = $statement->execute($params);
if(PDO_DEBUG) {
$info = array();
$info['sql'] = $sql;
$info['params'] = $params;
$info['error'] = $statement->errorInfo();
$this->debug(false, $info);
}
$endtime = microtime();
$this->performance($sql, $endtime - $starttime);
if (!$result) {
return false;
} else {
return $statement->fetch(pdo::FETCH_ASSOC);
}
}
public function fetchall($sql, $params = array(), $keyfield = '') {
$starttime = microtime();
$statement = $this->prepare($sql);
$result = $statement->execute($params);
if(PDO_DEBUG) {
$info = array();
$info['sql'] = $sql;
$info['params'] = $params;
$info['error'] = $statement->errorInfo();
$this->debug(false, $info);
}
$endtime = microtime();
$this->performance($sql, $endtime - $starttime);
if (!$result) {
return false;
} else {
if (empty($keyfield)) {
return $statement->fetchAll(pdo::FETCH_ASSOC);
} else {
$temp = $statement->fetchAll(pdo::FETCH_ASSOC);
$rs = array();
if (!empty($temp)) {
foreach ($temp as $key => &$row) {
if (isset($row[$keyfield])) {
$rs[$row[$keyfield]] = $row;
} else {
$rs[] = $row;
}
}
}
return $rs;
}
}
}
public function get($tablename, $params = array(), $fields = array()) {
$select = '*';
if (!empty($fields)){
if (is_array($fields)) {
$select = '`'.implode('`,`', $fields).'`';
} else {
$select = $fields;
}
}
$condition = $this->implode($params, 'AND');
$sql = "SELECT {$select} FROM " . $this->tablename($tablename) . (!empty($condition['fields']) ? " WHERE {$condition['fields']}" : '') . " LIMIT 1";
return $this->fetch($sql, $condition['params']);
}
public function getall($tablename, $params = array(), $fields = array(), $keyfield = '', $orderby = array(), $limit = array()) {
$select = '*';
if (!empty($fields)){
if (is_array($fields)) {
$select = '`'.implode('`,`', $fields).'`';
} else {
$select = $fields;
}
}
$condition = $this->implode($params, 'AND');
if (!empty($limit)) {
if (is_array($limit)) {
if (count($limit) == 1) {
$limitsql = " LIMIT " . $limit[0];
} else {
$limitsql = " LIMIT " . ($limit[0] - 1) * $limit[1] . ', ' . $limit[1];
}
} else {
$limitsql = strexists(strtoupper($limit), 'LIMIT') ? " $limit " : " LIMIT $limit";
}
}
if (!empty($orderby)) {
if (is_array($orderby)) {
$orderbysql = implode(',', $orderbysql);
} else {
$orderbysql = $orderby;
}
}
$sql = "SELECT {$select} FROM " .$this->tablename($tablename) . (!empty($condition['fields']) ? " WHERE {$condition['fields']}" : '') . (!empty($orderbysql) ? " ORDER BY $orderbysql " : '') . $limitsql;
return $this->fetchall($sql, $condition['params'], $keyfield);
}
public function getslice($tablename, $params = array(), $limit = array(), &$total = null, $fields = array(), $keyfield = '', $orderby = array()) {
$select = '*';
if (!empty($fields)){
if (is_array($fields)) {
$select = '`'.implode('`,`', $fields).'`';
} else {
$select = $fields;
}
}
$condition = $this->implode($params, 'AND');
if (!empty($limit)) {
if (is_array($limit)) {
$limitsql = " LIMIT " . ($limit[0] - 1) * $limit[1] . ', ' . $limit[1];
} else {
$limitsql = strexists(strtoupper($limit), 'LIMIT') ? " $limit " : " LIMIT $limit";
}
}
if (!empty($orderby)) {
if (is_array($orderby)) {
$orderbysql = implode(',', $orderbysql);
} else {
$orderbysql = $orderby;
}
}
$sql = "SELECT {$select} FROM " . $this->tablename($tablename) . (!empty($condition['fields']) ? " WHERE {$condition['fields']}" : '') . (!empty($orderbysql) ? " ORDER BY $orderbysql " : '') . $limitsql;
$total = pdo_fetchcolumn("SELECT COUNT(*) FROM " . tablename($tablename) . (!empty($condition['fields']) ? " WHERE {$condition['fields']}" : ''), $condition['params']);
return $this->fetchall($sql, $condition['params'], $keyfield);
}
public function getcolumn($tablename, $params = array(), $field) {
$result = $this->get($tablename, $params, array($field));
if (!empty($result)) {
return $result[$field];
} else {
return false;
}
}
public function update($table, $data = array(), $params = array(), $glue = 'AND') {
$fields = $this->implode($data, ',');
$condition = $this->implode($params, $glue);
$params = array_merge($fields['params'], $condition['params']);
$sql = "UPDATE " . $this->tablename($table) . " SET {$fields['fields']}";
$sql .= $condition['fields'] ? ' WHERE '.$condition['fields'] : '';
return $this->query($sql, $params);
}
public function insert($table, $data = array(), $replace = FALSE) {
$cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
$condition = $this->implode($data, ',');
return $this->query("$cmd " . $this->tablename($table) . " SET {$condition['fields']}", $condition['params']);
}
public function insertid() {
return $this->pdo->lastInsertId();
}
public function delete($table, $params = array(), $glue = 'AND') {
$condition = $this->implode($params, $glue);
$sql = "DELETE FROM " . $this->tablename($table);
$sql .= $condition['fields'] ? ' WHERE '.$condition['fields'] : '';
return $this->query($sql, $condition['params']);
}
public function begin() {
$this->pdo->beginTransaction();
}
public function commit() {
$this->pdo->commit();
}
public function rollback() {
$this->pdo->rollBack();
}
private function implode($params, $glue = ',') {
$result = array('fields' => ' 1 ', 'params' => array());
$split = '';
$suffix = '';
$allow_operator = array('>', '<', '<>', '!=', '>=', '<=', '+=', '-=', 'LIKE', 'like');
if (in_array(strtolower($glue), array('and', 'or'))) {
$suffix = '__';
}
if (!is_array($params)) {
$result['fields'] = $params;
return $result;
}
if (is_array($params)) {
$result['fields'] = '';
foreach ($params as $fields => $value) {
$operator = '';
if (strpos($fields, ' ') !== FALSE) {
list($fields, $operator) = explode(' ', $fields, 2);
if (!in_array($operator, $allow_operator)) {
$operator = '';
}
}
if (empty($operator)) {
$fields = trim($fields);
if (is_array($value)) {
$operator = 'IN';
} else {
$operator = '=';
}
} elseif ($operator == '+=') {
$operator = " = `$fields` + ";
} elseif ($operator == '-=') {
$operator = " = `$fields` - ";
}
if (is_array($value)) {
$insql = array();
foreach ($value as $k => $v) {
$insql[] = ":{$suffix}{$fields}_{$k}";
$result['params'][":{$suffix}{$fields}_{$k}"] = is_null($v) ? '' : $v;
}
$result['fields'] .= $split . "`$fields` {$operator} (".implode(",", $insql).")";
$split = ' ' . $glue . ' ';
} else {
$result['fields'] .= $split . "`$fields` {$operator} :{$suffix}$fields";
$split = ' ' . $glue . ' ';
$result['params'][":{$suffix}$fields"] = is_null($value) ? '' : $value;
}
}
}
return $result;
}
public function run($sql, $stuff = 'ims_') {
if(!isset($sql) || empty($sql)) return;
$sql = str_replace("\r", "\n", str_replace(' ' . $stuff, ' ' . $this->tablepre, $sql));
$sql = str_replace("\r", "\n", str_replace(' `' . $stuff, ' `' . $this->tablepre, $sql));
$ret = array();
$num = 0;
$sql = preg_replace("/\;[ \f\t\v]+/", ';', $sql);
foreach(explode(";\n", trim($sql)) as $query) {
$ret[$num] = '';
$queries = explode("\n", trim($query));
foreach($queries as $query) {
$ret[$num] .= (isset($query[0]) && $query[0] == '#') || (isset($query[1]) && isset($query[1]) && $query[0].$query[1] == '--') ? '' : $query;
}
$num++;
}
unset($sql);
foreach($ret as $query) {
$query = trim($query);
if($query) {
$this->query($query, array());
}
}
}
public function fieldexists($tablename, $fieldname) {
$isexists = $this->fetch("DESCRIBE " . $this->tablename($tablename) . " `{$fieldname}`", array());
return !empty($isexists) ? true : false;
}
public function indexexists($tablename, $indexname) {
if (!empty($indexname)) {
$indexs = $this->fetchall("SHOW INDEX FROM " . $this->tablename($tablename), array(), '');
if (!empty($indexs) && is_array($indexs)) {
foreach ($indexs as $row) {
if ($row['Key_name'] == $indexname) {
return true;
}
}
}
}
return false;
}
public function tablename($table) {
return "`{$this->tablepre}{$table}`";
}
public function debug($output = true, $append = array()) {
if(!empty($append)) {
$output = false;
array_push($this->errors, $append);
}
if($output) {
print_r($this->errors);
} else {
if (!empty($append['error'][1])) {
$traces = debug_backtrace();
$ts = '';
foreach($traces as $trace) {
$trace['file'] = str_replace('\\', '/', $trace['file']);
$trace['file'] = str_replace(IA_ROOT, '', $trace['file']);
$ts .= "file: {$trace['file']}; line: {$trace['line']}; <br />";
}
$params = var_export($append['params'], true);
if (!function_exists('message')) {
load()->web('common');
load()->web('template');
}
message("SQL: <br/>{$append['sql']}<hr/>Params: <br/>{$params}<hr/>SQL Error: <br/>{$append['error'][2]}<hr/>Traces: <br/>{$ts}");
}
}
return $this->errors;
}
public function tableexists($table) {
if(!empty($table)) {
$data = $this->fetch("SHOW TABLES LIKE '{$this->tablepre}{$table}'", array());
if(!empty($data)) {
$data = array_values($data);
$tablename = $this->tablepre . $table;
if(in_array($tablename, $data)) {
return true;
} else {
return false;
}
} else {
return false;
}
} else {
return false;
}
}
private function performance($sql, $runtime = 0) {
global $_FM;
if ($runtime == 0) {
return false;
}
if (strexists($sql, 'c_performance')) {
return false;
}
if (empty($_W['config']['setting']['maxtimesql'])) {
$_W['config']['setting']['maxtimesql'] = 5;
}
if ($runtime > $_W['config']['setting']['maxtimesql']) {
$sqldata = array(
'type' => '2',
'runtime' => $runtime,
'runurl' => 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'],
'runsql' => $sql,
'createtime' => time()
);
$this->insert('c_performance', $sqldata);
}
return true;
}
}
+37
View File
@@ -0,0 +1,37 @@
# phpstorm project files
.idea
# netbeans project files
nbproject
# zend studio for eclipse project files
.buildpath
.project
.settings
# windows thumbnail cache
Thumbs.db
# composer vendor dir
/vendor
# composer itself is not needed
composer.phar
# Mac DS_Store Files
.DS_Store
# phpunit itself is not needed
phpunit.phar
# local phpunit config
/phpunit.xml
# tests 目录
/tests
# composer.lock 文件
composer.lock
# .htaccess 文件
.htaccess
+22
View File
@@ -0,0 +1,22 @@
The MIT License (MIT)
Copyright (c) 2014 疯狂的dabing
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+162
View File
@@ -0,0 +1,162 @@
Yii2-UEditor-Extension
======================
Yii2的百度UEditor扩展
由于bower上的包是纯源码,需要用grunt打包后才能使用,因此扩展自带了1.4.3版本的UEditor资源包。
扩展特点:
1. 支持多实例
2. 支持缩略图(默认开启 `200x200`)
3. 支持缩放(默认关闭)
4. 支持水印(默认关闭)
5. 图片管理加载优化
安装
------------
推荐使用 [composer](http://getcomposer.org/download/) 来安装扩展.
使用如下命令安装:
```
php composer.phar require --prefer-dist crazydb/yii2-ueditor "*"
```
或者将 `"crazydb/yii2-ueditor": "*"` 添加到项目的 `composer.json` 文件.
使用方法
-----
安装完毕后,进行简单的配置即可使用。
### 后端支持
1) 继承 `crazydb\ueditor\UEditorController` 来实现自己的后端。(推荐)
```php
class EditorController extends crazydb\ueditor\UEditorController
{
public function init(){
parent::init();
//do something
//这里可以对扩展的访问权限进行控制
}
public function actionConfig(){
//do something
//这里可以对 config 请求进行自定义响应
}
// more modify ...
// 更多的修改
}
```
通过继承来编写自己的 Controller,可以精细的控制每个 action 的响应,推荐使用这种方式使用。
需要注意的是在 View 模板文件中使用扩展的时候需要指定 `serverUrl` 为自己编写的 controller 地址。
2) 通过配置 `controllerMap` 使用默认的后端。
修改配置文件,基础模板的配置文件是 `config/web.php`, 高级模板的配置文件是 `config/main.php`。
```php
'controllerMap' => [
'ueditor' => [
'class' => 'crazydb\ueditor\UEditorController',
]
],
```
简单配置即可使用,还可以配置更多选项:
```
'controllerMap' => [
'ueditor' => [
'class' => 'crazydb\ueditor\UEditorController',
'thumbnail' => false,//如果将'thumbnail'设置为空,将不生成缩略图。
'watermark' => [ //默认不生存水印
'path' => '', //水印图片路径
'start' => [0, 0] //水印图片位置
],
'zoom' => ['height' => 500, 'width' => 500], //缩放,默认不缩放
'config' => [
//server config @see http://fex-team.github.io/ueditor/#server-config
'imagePathFormat' => '/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}',
'scrawlPathFormat' => '/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}',
'snapscreenPathFormat' => '/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}',
'catcherPathFormat' => '/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}',
'videoPathFormat' => '/upload/video/{yyyy}{mm}{dd}/{time}{rand:6}',
'filePathFormat' => '/upload/file/{yyyy}{mm}{dd}/{rand:4}_{filename}',
'imageManagerListPath' => '/upload/image/',
'fileManagerListPath' => '/upload/file/',
]
]
],
```
后端配置参考官网[后端配置说明](http://fex-team.github.io/ueditor/#server-config "后端配置")。
扩展默认生成 `200x200` 的缩略图,缩略图大小可以通过 `thumbnail` 来控制。
```
'thumbnail' => ['height' => 200, 'width' => 200]
```
如果将 `thumbnail` 设置为 `false`,就不会生成缩略图。
更多配置可以查看 `UEditorController`的 public 属性。
### 在模板中使用
1) 使用 ActiveRecord
就像使用普通的扩展一样。
```
<?= $form->field($model, 'content')->widget(\crazydb\ueditor\UEditor::className()) ?>
```
或者
```
<?= \crazydb\ueditor\UEditor::widget([
'model' => $model,
'attribute' => 'content',
]) ?>
```
还可以配置更多属性:
```
<?= \crazydb\ueditor\UEditor::widget([
'model' => $model,
'attribute' => 'content',
'config' => [
//client config @see http://fex-team.github.io/ueditor/#start-config
'serverUrl' => ['/ueditor/index'],//确保serverUrl正确指向后端地址
'lang' => 'zh-cn'
]
]) ?>
```
需要注意的是 `serverUrl` 属性,默认后端地址是 `/ueditor/index`,如果配置了多个后端,则需要分别指定。
2) 当作普通表单使用
```
<?= \crazydb\ueditor\UEditor::widget([
'name' => $name,
'value' => $value,
]) ?>
```
相关链接
-----
@see https://github.com/fex-team/ueditor
+150
View File
@@ -0,0 +1,150 @@
<?php
/**
* UEditor Widget扩展
* @author xbzbing<xbzbing@gmail.com>
* @link www.crazydb.com
*
* UEditor版本v1.4.3.1
* Yii版本2.0+
*
* 使用方法:
* 1、AR
*
* <?=$form->field($model, 'content')->widget(\crazydb\ueditor\UEditor::className())?>
*
* 或者
*
* <?=\crazydb\ueditor\UEditor::widget([
* 'model' => $model,
* 'attribute' => 'content',
* ])?>
*
*
* 2、普通表单
*
* <?=\crazydb\ueditor\UEditor::widget([
* 'name' => $name,
* 'value' => $value,
* ])>
*/
namespace crazydb\ueditor;
use yii;
use yii\helpers\Html;
use yii\helpers\Url;
use yii\helpers\Json;
/**
* Class UEditor
* UEditor Widget的主类,用于前端显示编辑器
* @package crazydb\ueditor
*/
class UEditor extends yii\widgets\InputWidget
{
/**
* 生成的ueditor对象的名称,默认为editor。
* 主要用于同一个页面的多个editor实例的管理。
* @var string
*/
public $name;
/**
* UEditor配置
* @var array
*/
public $config = [];
/**
* 初始化一些配置。
* 由于不引入config.js文件,因此需要手动配置一些东西。
*/
public function init()
{
parent::init();
//注册资源文件
$asset = UEditorAsset::register($this->getView());
//设置UEditor实例的名字
if (!$this->name)
$this->name = $this->hasModel() ? $this->model->formName() . '_' . $this->attribute : 'ueditor_' . $this->id;
//常用配置项
if (empty($this->config['UEDITOR_HOME_URL']))
$this->config['UEDITOR_HOME_URL'] = $asset->baseUrl . '/';
if (empty($this->config['serverUrl']))
$this->config['serverUrl'] = Url::to(['/ueditor/index']);
elseif (is_array($this->config['serverUrl']))
$this->config['serverUrl'] = Url::to($this->config['serverUrl']);
if (empty($this->config['lang']))
$this->config['lang'] = 'zh-cn';
if (empty($this->config['initialFrameHeight']))
$this->config['initialFrameHeight'] = 400;
if (empty($this->config['initialFrameWidth']))
$this->config['initialFrameWidth'] = '100%';
if (empty($this->config['enableAutoSave']))
$this->config['enableAutoSave'] = false;
//扩展默认不直接引入config.js文件,因此需要自定义配置项.
if (empty($this->config['toolbars'])) {
//为了避免每次使用都输入乱七八糟的按钮,这里预先定义一些常用的编辑器按钮。
//这是一个丑陋的二维数组
$this->config['toolbars'] = [
[
'fullscreen', 'source', 'undo', 'redo', '|',
'customstyle', 'paragraph', 'fontfamily', 'fontsize'
],
[
'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat',
'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|',
'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', '|',
'rowspacingtop', 'rowspacingbottom', 'lineheight', '|',
'directionalityltr', 'directionalityrtl', 'indent', '|'
],
[
'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|',
'link', 'unlink', '|',
'insertimage', 'emotion', 'scrawl', 'insertvideo', 'music', 'attachment', 'map', 'insertcode', 'pagebreak', '|',
'horizontal', 'inserttable', '|',
'print', 'preview', 'searchreplace', 'help'
]
];
}
}
/**
* 输出widget页面,注册相关JS代码。
*/
public function run()
{
$id = $this->hasModel() ? Html::getInputId($this->model, $this->attribute) : $this->id;
$config = Json::encode($this->config);
//ready部分代码,是为了缩略图管理。UEditor本身就很大,在后台直接加载大文件图片会很卡。
$script = <<<UEDITOR
var {$this->name} = UE.getEditor('{$id}',{$config});
{$this->name}.ready(function(){
this.addListener( "beforeInsertImage", function ( type, imgObjs ) {
for(var i=0;i < imgObjs.length;i++){
imgObjs[i].src = imgObjs[i].src.replace(".thumbnail","");
}
});
});
UEDITOR;
$this->getView()->registerJs($script);
if ($this->hasModel())
return Html::activeTextarea($this->model, $this->attribute);
else
return Html::textarea($this->name, $this->value, ['id' => $id]);
}
}
+62
View File
@@ -0,0 +1,62 @@
<?php
/**
* UEditor Widget扩展
*
* @author xbzbing<xbzbing@gmail.com>
* @link www.crazydb.com
*
* UEditor版本v1.4.3.1
* Yii版本2.0+
*/
namespace crazydb\ueditor;
use yii\web\AssetBundle;
/**
* Class UEditorAsset
* 负责UEditor的资源文件引入。
* 由于bower上的源码是纯源码,需要用grunt打包后才能使用,因此扩展自带了1.4.3版本的UEditor核心文件。
*
* @package crazydb\ueditor
*/
class UEditorAsset extends AssetBundle {
/**
* UEditor路径
* @var
*/
public $sourcePath;
/**
* UEditor加载需要的JS文件。
* ueditor.config.js中是默认配置项,不建议直接引入。
* @var array
*/
public $js = [
//'ueditor.all.js',
];
/**
* UEditor加载需要的CSS文件。
* UEditor 会自动加载默认皮肤,CSS这里不必指定
*
* @var array
*/
public $css = [];
public $publishOptions = [
'except' => [
'php/',
'index.html',
'.gitignore'
]
];
public function init() {
parent::init();
if($this->sourcePath == null)
$this->sourcePath = __DIR__ . DIRECTORY_SEPARATOR . 'assets';
}
}
+460
View File
@@ -0,0 +1,460 @@
<?php
/**
* UEditor Widget扩展
* @author xbzbing<xbzbing@gmail.com>
* @link www.crazydb.com
*
* UEditor版本v1.4.3.1
* Yii 版本 2.0+
*/
namespace crazydb\ueditor;
use yii;
use yii\imagine\Image;
use yii\web\Controller;
/**
* Class UEditorController
* 负责UEditor后台响应
* @package crazydb\ueditor
*/
class UEditorController extends Controller
{
/**
* UEditor的配置
* @see http://fex-team.github.io/ueditor/#start-config
* @var array
*/
public $config;
/**
* 列出文件/图片时需要忽略的文件夹
* 主要用于处理缩略图管理,兼容比如elFinder之类的程序
* @var array
*/
public $ignoreDir = [
'.thumbnails'
];
/**
* 缩略图设置
* 默认为200*200,如果设置为空数组则不生成缩略图
* @var array
*/
public $thumbnail = ['height' => 200, 'width' => 200];
/**
* 图片缩放设置
* 默认不缩放。
* 配置如 ['height'=>200,'width'=>200]
* @var array
*/
public $zoom = [];
/**
* 水印设置
* 参考配置如下:
* ['path'=>'水印图片位置','start'=>[0, 0]]
* 默认位置为[0, 0],可不配置
* @var array
*/
public $watermark = [];
/**
* 默认 action
* @var string
*/
public $defaultAction = 'index';
/**
* Web根目录
* @var string
*/
protected $webroot;
public function init()
{
parent::init();
//CSRF 基于 POST 验证,UEditor 无法添加自定义 POST 数据,同时由于这里不会产生安全问题,故简单粗暴地取消 CSRF 验证。
//如需 CSRF 防御,可以使用 server_param 方法,然后在这里将 Get 的 CSRF 添加到 POST 的数组中。。。
Yii::$app->request->enableCsrfValidation = false;
//当客户使用低版本IE时,会使用swf上传插件,维持认证状态可以参考文档UEditor「自定义请求参数」部分。
//http://fex.baidu.com/ueditor/#server-server_param
//保留UE默认的配置引入方式
if (file_exists(__DIR__ . '/config.json'))
$CONFIG = json_decode(preg_replace("/\/\*[\s\S]+?\*\//", '', file_get_contents(__DIR__ . '/config.json')), true);
else
$CONFIG = [];
if (!is_array($this->config))
$this->config = [];
if (!is_array($CONFIG))
$CONFIG = [];
$default = [
'imagePathFormat' => '/upload/image/{yyyy}{mm}{dd}/{time}{rand:8}',
'scrawlPathFormat' => '/upload/image/{yyyy}{mm}{dd}/{time}{rand:8}',
'snapscreenPathFormat' => '/upload/image/{yyyy}{mm}{dd}/{time}{rand:8}',
'catcherPathFormat' => '/upload/image/{yyyy}{mm}{dd}/{time}{rand:8}',
'videoPathFormat' => '/upload/video/{yyyy}{mm}{dd}/{time}{rand:8}',
'filePathFormat' => '/upload/file/{yyyy}{mm}{dd}/{rand:8}_{filename}',
'imageManagerListPath' => '/upload/image/',
'fileManagerListPath' => '/upload/file/',
];
$this->config = $this->config + $default + $CONFIG;
$this->webroot = Yii::getAlias('@webroot');
if(!is_array($this->thumbnail))
$this->thumbnail = false;
}
/**
* 蛋疼的统一后台入口
*/
public function actionIndex()
{
$action = strtolower(Yii::$app->request->get('action', 'config'));
$actions = [
'uploadimage' => 'upload-image',
'uploadscrawl' => 'upload-scrawl',
'uploadvideo' => 'upload-video',
'uploadfile' => 'upload-file',
'listimage' => 'list-image',
'listfile' => 'list-file',
'catchimage' => 'catch-image',
'config' => 'config',
'listinfo' => 'list-info'
];
if (isset($actions[$action]))
return $this->run($actions[$action]);
else
return $this->show(['state' => 'Unknown action.']);
}
/**
* 显示配置信息
*/
public function actionConfig()
{
return $this->show($this->config);
}
/**
* 上传图片
*/
public function actionUploadImage()
{
$config = [
'pathFormat' => $this->config['imagePathFormat'],
'maxSize' => $this->config['imageMaxSize'],
'allowFiles' => $this->config['imageAllowFiles']
];
$fieldName = $this->config['imageFieldName'];
$result = $this->upload($fieldName, $config);
return $this->show($result);
}
/**
* 上传涂鸦
*/
public function actionUploadScrawl()
{
$config = [
'pathFormat' => $this->config['scrawlPathFormat'],
'maxSize' => $this->config['scrawlMaxSize'],
'allowFiles' => $this->config['scrawlAllowFiles'],
'oriName' => 'scrawl.png'
];
$fieldName = $this->config['scrawlFieldName'];
$result = $this->upload($fieldName, $config, 'base64');
return $this->show($result);
}
/**
* 上传视频
*/
public function actionUploadVideo()
{
$config = [
'pathFormat' => $this->config['videoPathFormat'],
'maxSize' => $this->config['videoMaxSize'],
'allowFiles' => $this->config['videoAllowFiles']
];
$fieldName = $this->config['videoFieldName'];
$result = $this->upload($fieldName, $config);
return $this->show($result);
}
/**
* 上传文件
*/
public function actionUploadFile()
{
$config = [
'pathFormat' => $this->config['filePathFormat'],
'maxSize' => $this->config['fileMaxSize'],
'allowFiles' => $this->config['fileAllowFiles']
];
$fieldName = $this->config['fileFieldName'];
$result = $this->upload($fieldName, $config);
return $this->show($result);
}
/**
* 文件列表
*/
public function actionListFile()
{
$allowFiles = $this->config['fileManagerAllowFiles'];
$listSize = $this->config['fileManagerListSize'];
$path = $this->config['fileManagerListPath'];
$result = $this->manage($allowFiles, $listSize, $path);
return $this->show($result);
}
/**
* 图片列表
*/
public function actionListImage()
{
$allowFiles = $this->config['imageManagerAllowFiles'];
$listSize = $this->config['imageManagerListSize'];
$path = $this->config['imageManagerListPath'];
$result = $this->manage($allowFiles, $listSize, $path);
return $this->show($result);
}
/**
* 获取远程图片
*/
public function actionCatchImage()
{
/* 上传配置 */
$config = [
'pathFormat' => $this->config['catcherPathFormat'],
'maxSize' => $this->config['catcherMaxSize'],
'allowFiles' => $this->config['catcherAllowFiles'],
'oriName' => 'remote.png'
];
$fieldName = $this->config['catcherFieldName'];
/* 抓取远程图片 */
$list = [];
if (isset($_POST[$fieldName])) {
$source = $_POST[$fieldName];
} else {
$source = $_GET[$fieldName];
}
foreach ($source as $imgUrl) {
$item = new Uploader($imgUrl, $config, 'remote');
$info = $item->getFileInfo();
$info['thumbnail'] = $this->imageHandle($info['url']);
$list[] = [
'state' => $info['state'],
'url' => $info['url'],
'source' => $imgUrl
];
}
/* 返回抓取数据 */
return [
'state' => count($list) ? 'SUCCESS' : 'ERROR',
'list' => $list
];
}
/**
* 各种上传
* @param $fieldName
* @param $config
* @param $base64
* @return array
*/
protected function upload($fieldName, $config, $base64 = 'upload')
{
$up = new Uploader($fieldName, $config, $base64);
$info = $up->getFileInfo();
if ($this->thumbnail && $info['state'] == 'SUCCESS' && in_array($info['type'], ['.png', '.jpg', '.bmp', '.gif'])) {
$info['thumbnail'] = Yii::$app->request->baseUrl . $this->imageHandle($info['url']);
}
$info['url'] = Yii::$app->request->baseUrl . $info['url'];
$info['original'] = htmlspecialchars($info['original']);
$info['width'] = $info['height'] = 500;
return $info;
}
/**
* 自动处理图片
* @param $fullName
* @return mixed|string
*/
protected function imageHandle($fullName)
{
if (substr($fullName, 0, 1) != '/')
$fullName = '/' . $fullName;
$file = $fullName;
//先处理缩略图
if ($this->thumbnail && !empty($this->thumbnail['height']) && !empty($this->thumbnail['width'])) {
$file = pathinfo($file);
$file = $file['dirname'] . '/' . $file['filename'] . '_thumbnail.' . $file['extension'];
Image::thumbnail($this->webroot . $fullName, intval($this->thumbnail['width']), intval($this->thumbnail['height']))
->save($this->webroot . $file);
}
//再处理缩放,默认不缩放
//...缩放效果非常差劲-,-
if (isset($this->zoom['height']) && isset($this->zoom['width'])) {
$size = $this->getSize($this->webroot . $fullName);
if ($size && $size[0] > 0 && $size[1] > 0) {
$ratio = min([$this->zoom['height'] / $size[0], $this->zoom['width'] / $size[1], 1]);
Image::thumbnail($this->webroot . $fullName, ceil($size[0] * $ratio), ceil($size[1] * $ratio))
->save($this->webroot . $fullName);
}
}
//最后生成水印
if (isset($this->watermark['path']) && file_exists($this->watermark['path'])) {
if (!isset($this->watermark['start']))
$this->watermark['start'] = [0, 0];
Image::watermark($file, $this->watermark['path'], $this->watermark['start'])
->save($file);
}
return $file;
}
/**
* 获取图片的大小
* 主要用于获取图片大小并
* @param $file
* @return array
*/
protected function getSize($file)
{
if (!file_exists($file))
return [];
$info = pathinfo($file);
$image = null;
switch (strtolower($info['extension'])) {
case 'gif':
$image = imagecreatefromgif($file);
break;
case 'jpg':
case 'jpeg':
$image = imagecreatefromjpeg($file);
break;
case 'png':
$image = imagecreatefrompng($file);
break;
default:
break;
}
if ($image == null)
return [];
else
return [imagesx($image), imagesy($image)];
}
/**
* 文件和图片管理action使用
* @param $allowFiles
* @param $listSize
* @param $path
* @return array
*/
protected function manage($allowFiles, $listSize, $path)
{
$allowFiles = substr(str_replace('.', '|', join('', $allowFiles)), 1);
/* 获取参数 */
$size = isset($_GET['size']) ? $_GET['size'] : $listSize;
$start = isset($_GET['start']) ? $_GET['start'] : 0;
$end = $start + $size;
/* 获取文件列表 */
$path = $this->webroot . (substr($path, 0, 1) == '/' ? '' : '/') . $path;
$files = $this->getFiles($path, $allowFiles);
if (!count($files)) {
$result = [
'state' => 'no match file',
'list' => [],
'start' => $start,
'total' => count($files),
];
return $result;
}
/* 获取指定范围的列表 */
$len = count($files);
for ($i = min($end, $len) - 1, $list = []; $i < $len && $i >= 0 && $i >= $start; $i--) {
$list[] = $files[$i];
}
/* 返回数据 */
$result = [
'state' => 'SUCCESS',
'list' => $list,
'start' => $start,
'total' => count($files),
];
return $result;
}
/**
* 遍历获取目录下的指定类型的文件
* @param $path
* @param $allowFiles
* @param array $files
* @return array|null
*/
protected function getFiles($path, $allowFiles, &$files = [])
{
if (!is_dir($path)) return null;
if (in_array(basename($path), $this->ignoreDir)) return null;
if (substr($path, strlen($path) - 1) != '/') $path .= '/';
$handle = opendir($path);
//baseUrl用于兼容使用alias的二级目录部署方式
$baseUrl = Yii::$app->request->baseUrl;
while (false !== ($file = readdir($handle))) {
if ($file != '.' && $file != '..') {
$path2 = $path . $file;
if (is_dir($path2)) {
$this->getFiles($path2, $allowFiles, $files);
} else {
if ($this->action->id == 'list-image' && $this->thumbnail) {
$pat = "/\_thumbnail\.(" . $allowFiles . ")$/i";
} else {
$pat = "/\.(" . $allowFiles . ")$/i";
}
if (preg_match($pat, $file)) {
$files[] = [
'url' => $baseUrl . substr($path2, strlen($this->webroot)),
'mtime' => filemtime($path2)
];
}
}
}
}
return $files;
}
/**
* 最终显示结果,自动输出 JSONP 或者 JSON
* @param array $result
* @return array
*/
protected function show($result)
{
$callback = Yii::$app->request->get('callback', null);
if ($callback && is_string($callback)) {
Yii::$app->response->format = yii\web\Response::FORMAT_JSONP;
return [
'callback' => $callback,
'data' => $result
];
}
Yii::$app->response->format = yii\web\Response::FORMAT_JSON;
return $result;
}
}
+382
View File
@@ -0,0 +1,382 @@
<?php
/**
* User: taoqili
* Date: 12-7-18
* Time: 上午11: 32
* UEditor编辑器通用上传类
* ==============================
* 增加Yii相关设置
*/
namespace fmsoft\yii2-ueditor\ueditor;
use yii;
/**
* Class Uploader
* UEditor 通用上传类
* @todo 不再使用UEditor的这个upload类,将使用Yii封装的方法重写
* @package crazydb\ueditor
*/
class Uploader
{
private $fileField; //文件域名
private $file; //文件上传对象
private $config; //配置信息
private $oriName; //原始文件名
private $fileName; //新文件名
private $fullName; //完整文件名,即从当前配置目录开始的URL
private $filePath; //完整文件名,即从当前配置目录开始的URL
private $fileSize; //文件大小
private $fileType; //文件类型
private $stateInfo; //上传状态信息,
private $stateMap = array( //上传状态映射表,国际化用户需考虑此处数据的国际化
"SUCCESS", //上传成功标记,在UEditor中内不可改变,否则flash判断会出错
"文件大小超出 upload_max_filesize 限制",
"文件大小超出 MAX_FILE_SIZE 限制",
"文件未被完整上传",
"没有文件被上传",
"上传文件为空",
"ERROR_TMP_FILE" => "临时文件错误",
"ERROR_TMP_FILE_NOT_FOUND" => "找不到临时文件",
"ERROR_SIZE_EXCEED" => "文件大小超出网站限制",
"ERROR_TYPE_NOT_ALLOWED" => "文件类型不允许",
"ERROR_CREATE_DIR" => "目录创建失败",
"ERROR_DIR_NOT_WRITEABLE" => "目录没有写权限",
"ERROR_FILE_MOVE" => "文件保存时出错",
"ERROR_FILE_NOT_FOUND" => "找不到上传文件",
"ERROR_WRITE_CONTENT" => "写入文件内容错误",
"ERROR_UNKNOWN" => "未知错误",
"ERROR_DEAD_LINK" => "链接不可用",
"ERROR_HTTP_LINK" => "链接不是http链接",
"ERROR_HTTP_CONTENTTYPE" => "链接contentType不正确",
"INVALID_URL" => "非法 URL",
"INVALID_IP" => "非法 IP"
);
/**
* 构造函数
* @param string $fileField 表单名称
* @param array $config 配置项
* @param string $type 是否解析base64编码,可省略。若开启,则$fileField代表的是base64编码的字符串表单名
*/
public function __construct($fileField, $config, $type = "upload")
{
$this->fileField = $fileField;
$this->config = $config;
$this->type = $type;
if ($type == "remote") {
$this->saveRemote();
} else if($type == "base64") {
$this->upBase64();
} else {
$this->upFile();
}
}
/**
* 上传文件的主处理方法
* @return mixed
*/
private function upFile()
{
$file = $this->file = $_FILES[$this->fileField];
if (!$file) {
$this->stateInfo = $this->getStateInfo("ERROR_FILE_NOT_FOUND");
return;
}
if ($this->file['error']) {
$this->stateInfo = $this->getStateInfo($file['error']);
return;
} else if (!file_exists($file['tmp_name'])) {
$this->stateInfo = $this->getStateInfo("ERROR_TMP_FILE_NOT_FOUND");
return;
} else if (!is_uploaded_file($file['tmp_name'])) {
$this->stateInfo = $this->getStateInfo("ERROR_TMPFILE");
return;
}
$this->oriName = $file['name'];
$this->fileSize = $file['size'];
$this->fileType = $this->getFileExt();
$this->fullName = $this->getFullName();
$this->filePath = $this->getFilePath();
$this->fileName = $this->getFileName();
$dirname = dirname($this->filePath);
//检查文件大小是否超出限制
if (!$this->checkSize()) {
$this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED");
return;
}
//检查是否不允许的文件格式
if (!$this->checkType()) {
$this->stateInfo = $this->getStateInfo("ERROR_TYPE_NOT_ALLOWED");
return;
}
//创建目录失败
if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) {
$this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR");
return;
} else if (!is_writeable($dirname)) {
$this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE");
return;
}
//移动文件
if (!(move_uploaded_file($file["tmp_name"], $this->filePath) && file_exists($this->filePath))) { //移动失败
$this->stateInfo = $this->getStateInfo("ERROR_FILE_MOVE");
} else { //移动成功
$this->stateInfo = $this->stateMap[0];
}
}
/**
* 处理base64编码的图片上传
* @return mixed
*/
private function upBase64()
{
$base64Data = $_POST[$this->fileField];
$img = base64_decode($base64Data);
$this->oriName = $this->config['oriName'];
$this->fileSize = strlen($img);
$this->fileType = $this->getFileExt();
$this->fullName = $this->getFullName();
$this->filePath = $this->getFilePath();
$this->fileName = $this->getFileName();
$dirname = dirname($this->filePath);
//检查文件大小是否超出限制
if (!$this->checkSize()) {
$this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED");
return;
}
//创建目录失败
if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) {
$this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR");
return;
} else if (!is_writeable($dirname)) {
$this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE");
return;
}
//移动文件
if (!(file_put_contents($this->filePath, $img) && file_exists($this->filePath))) { //移动失败
$this->stateInfo = $this->getStateInfo("ERROR_WRITE_CONTENT");
} else { //移动成功
$this->stateInfo = $this->stateMap[0];
}
}
/**
* 拉取远程图片
* @return mixed
*/
private function saveRemote()
{
$imgUrl = htmlspecialchars($this->fileField);
$imgUrl = str_replace("&amp;", "&", $imgUrl);
//http开头验证
if (strpos($imgUrl, "http") !== 0) {
$this->stateInfo = $this->getStateInfo("ERROR_HTTP_LINK");
return;
}
preg_match('/(^https*:\/\/[^:\/]+)/', $imgUrl, $matches);
$host_with_protocol = count($matches) > 1 ? $matches[1] : '';
// 判断是否是合法 url
if (!filter_var($host_with_protocol, FILTER_VALIDATE_URL)) {
$this->stateInfo = $this->getStateInfo("INVALID_URL");
return;
}
preg_match('/^https*:\/\/(.+)/', $host_with_protocol, $matches);
$host_without_protocol = count($matches) > 1 ? $matches[1] : '';
// 此时提取出来的可能是 ip 也有可能是域名,先获取 ip
$ip = gethostbyname($host_without_protocol);
// 判断是否是私有 ip
if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)) {
$this->stateInfo = $this->getStateInfo("INVALID_IP");
return;
}
//获取请求头并检测死链
$heads = get_headers($imgUrl, 1);
if (!(stristr($heads[0], "200") && stristr($heads[0], "OK"))) {
$this->stateInfo = $this->getStateInfo("ERROR_DEAD_LINK");
return;
}
//格式验证(扩展名验证和Content-Type验证)
$fileType = strtolower(strrchr($imgUrl, '.'));
if (!in_array($fileType, $this->config['allowFiles']) || !isset($heads['Content-Type']) || !stristr($heads['Content-Type'], "image")) {
$this->stateInfo = $this->getStateInfo("ERROR_HTTP_CONTENTTYPE");
return;
}
//打开输出缓冲区并获取远程图片
ob_start();
$context = stream_context_create(
array('http' => array(
'follow_location' => false // don't follow redirects
))
);
readfile($imgUrl, false, $context);
$img = ob_get_contents();
ob_end_clean();
preg_match("/[\/]([^\/]*)[\.]?[^\.\/]*$/", $imgUrl, $m);
$this->oriName = $m ? $m[1]:"";
$this->fileSize = strlen($img);
$this->fileType = $this->getFileExt();
$this->fullName = $this->getFullName();
$this->filePath = $this->getFilePath();
$this->fileName = $this->getFileName();
$dirname = dirname($this->filePath);
//检查文件大小是否超出限制
if (!$this->checkSize()) {
$this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED");
return;
}
//创建目录失败
if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) {
$this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR");
return;
} else if (!is_writeable($dirname)) {
$this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE");
return;
}
//移动文件
if (!(file_put_contents($this->filePath, $img) && file_exists($this->filePath))) { //移动失败
$this->stateInfo = $this->getStateInfo("ERROR_WRITE_CONTENT");
} else { //移动成功
$this->stateInfo = $this->stateMap[0];
}
}
/**
* 上传错误检查
* @param $errCode
* @return string
*/
private function getStateInfo($errCode)
{
return !$this->stateMap[$errCode] ? $this->stateMap["ERROR_UNKNOWN"] : $this->stateMap[$errCode];
}
/**
* 获取文件扩展名
* @todo .tar.gz 扩展名
* @return string
*/
private function getFileExt()
{
return strtolower(strrchr($this->oriName, '.'));
}
/**
* 重命名文件
* @return string
*/
private function getFullName()
{
//替换日期事件
$t = time();
$d = explode('-', date("Y-y-m-d-H-i-s"));
$format = $this->config["pathFormat"];
$format = str_replace("{yyyy}", $d[0], $format);
$format = str_replace("{yy}", $d[1], $format);
$format = str_replace("{mm}", $d[2], $format);
$format = str_replace("{dd}", $d[3], $format);
$format = str_replace("{hh}", $d[4], $format);
$format = str_replace("{ii}", $d[5], $format);
$format = str_replace("{ss}", $d[6], $format);
$format = str_replace("{time}", $t, $format);
//过滤文件名的非法自负,并替换文件名
$oriName = substr($this->oriName, 0, strrpos($this->oriName, '.'));
$oriName = preg_replace("/[\|\?\"\<\>\/\*\\\\]+/", '', $oriName);
$format = str_replace("{filename}", $oriName, $format);
//替换随机字符串
$randNum = rand(1, 10000000000) . rand(1, 10000000000);
if (preg_match("/\{rand\:([\d]*)\}/i", $format, $matches)) {
$format = preg_replace("/\{rand\:[\d]*\}/i", substr($randNum, 0, $matches[1]), $format);
}
$ext = $this->getFileExt();
return $format . $ext;
}
/**
* 获取文件名
* @return string
*/
private function getFileName () {
return substr($this->filePath, strrpos($this->filePath, '/') + 1);
}
/**
* 获取文件完整路径
* 这里使用了Yii别名
* @return string
*/
private function getFilePath()
{
$fullname = $this->fullName;
$rootPath = Yii::getAlias('@webroot');
if (substr($fullname, 0, 1) != '/') {
$fullname = '/' . $fullname;
}
return $rootPath . $fullname;
}
/**
* 文件类型检测
* @return bool
*/
private function checkType()
{
return in_array($this->getFileExt(), $this->config["allowFiles"]);
}
/**
* 文件大小检测
* @return bool
*/
private function checkSize()
{
return $this->fileSize <= ($this->config["maxSize"]);
}
/**
* 获取当前上传成功文件的各项信息
* @return array
*/
public function getFileInfo()
{
return array(
"state" => $this->stateInfo,
"url" => $this->fullName,
"title" => $this->fileName,
"original" => $this->oriName,
"type" => $this->fileType,
"size" => $this->fileSize
);
}
}
+2
View File
@@ -0,0 +1,2 @@
#UEditor的php目录,请把config.json放到根目录下
php
+40
View File
@@ -0,0 +1,40 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<style type="text/css">
*{color: #838383;margin: 0;padding: 0}
html,body {font-size: 12px;overflow: hidden; }
.content{padding:5px 0 0 15px;}
input{width:210px;height:21px;line-height:21px;margin-left: 4px;}
</style>
</head>
<body>
<div class="content">
<span><var id="lang_input_anchorName"></var></span><input id="anchorName" value="" />
</div>
<script type="text/javascript" src="../internal.js"></script>
<script type="text/javascript">
var anchorInput = $G('anchorName'),
node = editor.selection.getRange().getClosedNode();
if(node && node.tagName == 'IMG' && (node = node.getAttribute('anchorname'))){
anchorInput.value = node;
}
anchorInput.onkeydown = function(evt){
evt = evt || window.event;
if(evt.keyCode == 13){
editor.execCommand('anchor', anchorInput.value);
dialog.close();
domUtils.preventDefault(evt)
}
};
dialog.onok = function (){
editor.execCommand('anchor', anchorInput.value);
dialog.close();
};
$focus(anchorInput);
</script>
</body>
</html>
@@ -0,0 +1,681 @@
@charset "utf-8";
/* dialog样式 */
.wrapper {
zoom: 1;
width: 630px;
*width: 626px;
height: 380px;
margin: 0 auto;
padding: 10px;
position: relative;
font-family: sans-serif;
}
/*tab样式框大小*/
.tabhead {
float:left;
}
.tabbody {
width: 100%;
height: 346px;
position: relative;
clear: both;
}
.tabbody .panel {
position: absolute;
width: 0;
height: 0;
background: #fff;
overflow: hidden;
display: none;
}
.tabbody .panel.focus {
width: 100%;
height: 346px;
display: block;
}
/* 上传附件 */
.tabbody #upload.panel {
width: 0;
height: 0;
overflow: hidden;
position: absolute !important;
clip: rect(1px, 1px, 1px, 1px);
background: #fff;
display: block;
}
.tabbody #upload.panel.focus {
width: 100%;
height: 346px;
display: block;
clip: auto;
}
#upload .queueList {
margin: 0;
width: 100%;
height: 100%;
position: absolute;
overflow: hidden;
}
#upload p {
margin: 0;
}
.element-invisible {
width: 0 !important;
height: 0 !important;
border: 0;
padding: 0;
margin: 0;
overflow: hidden;
position: absolute !important;
clip: rect(1px, 1px, 1px, 1px);
}
#upload .placeholder {
margin: 10px;
border: 2px dashed #e6e6e6;
*border: 0px dashed #e6e6e6;
height: 172px;
padding-top: 150px;
text-align: center;
background: url(./images/image.png) center 70px no-repeat;
color: #cccccc;
font-size: 18px;
position: relative;
top:0;
*top: 10px;
}
#upload .placeholder .webuploader-pick {
font-size: 18px;
background: #00b7ee;
border-radius: 3px;
line-height: 44px;
padding: 0 30px;
*width: 120px;
color: #fff;
display: inline-block;
margin: 0 auto 20px auto;
cursor: pointer;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
}
#upload .placeholder .webuploader-pick-hover {
background: #00a2d4;
}
#filePickerContainer {
text-align: center;
}
#upload .placeholder .flashTip {
color: #666666;
font-size: 12px;
position: absolute;
width: 100%;
text-align: center;
bottom: 20px;
}
#upload .placeholder .flashTip a {
color: #0785d1;
text-decoration: none;
}
#upload .placeholder .flashTip a:hover {
text-decoration: underline;
}
#upload .placeholder.webuploader-dnd-over {
border-color: #999999;
}
#upload .filelist {
list-style: none;
margin: 0;
padding: 0;
overflow-x: hidden;
overflow-y: auto;
position: relative;
height: 300px;
}
#upload .filelist:after {
content: '';
display: block;
width: 0;
height: 0;
overflow: hidden;
clear: both;
}
#upload .filelist li {
width: 113px;
height: 113px;
background: url(./images/bg.png);
text-align: center;
margin: 9px 0 0 9px;
*margin: 6px 0 0 6px;
position: relative;
display: block;
float: left;
overflow: hidden;
font-size: 12px;
}
#upload .filelist li p.log {
position: relative;
top: -45px;
}
#upload .filelist li p.title {
position: absolute;
top: 0;
left: 0;
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
top: 5px;
text-indent: 5px;
text-align: left;
}
#upload .filelist li p.progress {
position: absolute;
width: 100%;
bottom: 0;
left: 0;
height: 8px;
overflow: hidden;
z-index: 50;
margin: 0;
border-radius: 0;
background: none;
-webkit-box-shadow: 0 0 0;
}
#upload .filelist li p.progress span {
display: none;
overflow: hidden;
width: 0;
height: 100%;
background: #1483d8 url(./images/progress.png) repeat-x;
-webit-transition: width 200ms linear;
-moz-transition: width 200ms linear;
-o-transition: width 200ms linear;
-ms-transition: width 200ms linear;
transition: width 200ms linear;
-webkit-animation: progressmove 2s linear infinite;
-moz-animation: progressmove 2s linear infinite;
-o-animation: progressmove 2s linear infinite;
-ms-animation: progressmove 2s linear infinite;
animation: progressmove 2s linear infinite;
-webkit-transform: translateZ(0);
}
@-webkit-keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
@-moz-keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
@keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
#upload .filelist li p.imgWrap {
position: relative;
z-index: 2;
line-height: 113px;
vertical-align: middle;
overflow: hidden;
width: 113px;
height: 113px;
-webkit-transform-origin: 50% 50%;
-moz-transform-origin: 50% 50%;
-o-transform-origin: 50% 50%;
-ms-transform-origin: 50% 50%;
transform-origin: 50% 50%;
-webit-transition: 200ms ease-out;
-moz-transition: 200ms ease-out;
-o-transition: 200ms ease-out;
-ms-transition: 200ms ease-out;
transition: 200ms ease-out;
}
#upload .filelist li p.imgWrap.notimage {
margin-top: 0;
width: 111px;
height: 111px;
border: 1px #eeeeee solid;
}
#upload .filelist li p.imgWrap.notimage i.file-preview {
margin-top: 15px;
}
#upload .filelist li img {
width: 100%;
}
#upload .filelist li p.error {
background: #f43838;
color: #fff;
position: absolute;
bottom: 0;
left: 0;
height: 28px;
line-height: 28px;
width: 100%;
z-index: 100;
display:none;
}
#upload .filelist li .success {
display: block;
position: absolute;
left: 0;
bottom: 0;
height: 40px;
width: 100%;
z-index: 200;
background: url(./images/success.png) no-repeat right bottom;
background-image: url(./images/success.gif) \9;
}
#upload .filelist li.filePickerBlock {
width: 113px;
height: 113px;
background: url(./images/image.png) no-repeat center 12px;
border: 1px solid #eeeeee;
border-radius: 0;
}
#upload .filelist li.filePickerBlock div.webuploader-pick {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
opacity: 0;
background: none;
font-size: 0;
}
#upload .filelist div.file-panel {
position: absolute;
height: 0;
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0;
background: rgba(0, 0, 0, 0.5);
width: 100%;
top: 0;
left: 0;
overflow: hidden;
z-index: 300;
}
#upload .filelist div.file-panel span {
width: 24px;
height: 24px;
display: inline;
float: right;
text-indent: -9999px;
overflow: hidden;
background: url(./images/icons.png) no-repeat;
background: url(./images/icons.gif) no-repeat \9;
margin: 5px 1px 1px;
cursor: pointer;
-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#upload .filelist div.file-panel span.rotateLeft {
display:none;
background-position: 0 -24px;
}
#upload .filelist div.file-panel span.rotateLeft:hover {
background-position: 0 0;
}
#upload .filelist div.file-panel span.rotateRight {
display:none;
background-position: -24px -24px;
}
#upload .filelist div.file-panel span.rotateRight:hover {
background-position: -24px 0;
}
#upload .filelist div.file-panel span.cancel {
background-position: -48px -24px;
}
#upload .filelist div.file-panel span.cancel:hover {
background-position: -48px 0;
}
#upload .statusBar {
height: 45px;
border-bottom: 1px solid #dadada;
margin: 0 10px;
padding: 0;
line-height: 45px;
vertical-align: middle;
position: relative;
}
#upload .statusBar .progress {
border: 1px solid #1483d8;
width: 198px;
background: #fff;
height: 18px;
position: absolute;
top: 12px;
display: none;
text-align: center;
line-height: 18px;
color: #6dbfff;
margin: 0 10px 0 0;
}
#upload .statusBar .progress span.percentage {
width: 0;
height: 100%;
left: 0;
top: 0;
background: #1483d8;
position: absolute;
}
#upload .statusBar .progress span.text {
position: relative;
z-index: 10;
}
#upload .statusBar .info {
display: inline-block;
font-size: 14px;
color: #666666;
}
#upload .statusBar .btns {
position: absolute;
top: 7px;
right: 0;
line-height: 30px;
}
#filePickerBtn {
display: inline-block;
float: left;
}
#upload .statusBar .btns .webuploader-pick,
#upload .statusBar .btns .uploadBtn,
#upload .statusBar .btns .uploadBtn.state-uploading,
#upload .statusBar .btns .uploadBtn.state-paused {
background: #ffffff;
border: 1px solid #cfcfcf;
color: #565656;
padding: 0 18px;
display: inline-block;
border-radius: 3px;
margin-left: 10px;
cursor: pointer;
font-size: 14px;
float: left;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#upload .statusBar .btns .webuploader-pick-hover,
#upload .statusBar .btns .uploadBtn:hover,
#upload .statusBar .btns .uploadBtn.state-uploading:hover,
#upload .statusBar .btns .uploadBtn.state-paused:hover {
background: #f0f0f0;
}
#upload .statusBar .btns .uploadBtn,
#upload .statusBar .btns .uploadBtn.state-paused{
background: #00b7ee;
color: #fff;
border-color: transparent;
}
#upload .statusBar .btns .uploadBtn:hover,
#upload .statusBar .btns .uploadBtn.state-paused:hover{
background: #00a2d4;
}
#upload .statusBar .btns .uploadBtn.disabled {
pointer-events: none;
filter:alpha(opacity=60);
-moz-opacity:0.6;
-khtml-opacity: 0.6;
opacity: 0.6;
}
/* 图片管理样式 */
#online {
width: 100%;
height: 336px;
padding: 10px 0 0 0;
}
#online #fileList{
width: 100%;
height: 100%;
overflow-x: hidden;
overflow-y: auto;
position: relative;
}
#online ul {
display: block;
list-style: none;
margin: 0;
padding: 0;
}
#online li {
float: left;
display: block;
list-style: none;
padding: 0;
width: 113px;
height: 113px;
margin: 0 0 9px 9px;
*margin: 0 0 6px 6px;
background-color: #eee;
overflow: hidden;
cursor: pointer;
position: relative;
}
#online li.clearFloat {
float: none;
clear: both;
display: block;
width:0;
height:0;
margin: 0;
padding: 0;
}
#online li img {
cursor: pointer;
}
#online li div.file-wrapper {
cursor: pointer;
position: absolute;
display: block;
width: 111px;
height: 111px;
border: 1px solid #eee;
background: url("./images/bg.png") repeat;
}
#online li div span.file-title{
display: block;
padding: 0 3px;
margin: 3px 0 0 0;
font-size: 12px;
height: 13px;
color: #555555;
text-align: center;
width: 107px;
white-space: nowrap;
word-break: break-all;
overflow: hidden;
text-overflow: ellipsis;
}
#online li .icon {
cursor: pointer;
width: 113px;
height: 113px;
position: absolute;
top: 0;
left: 0;
z-index: 2;
border: 0;
background-repeat: no-repeat;
}
#online li .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
}
#online li.selected .icon {
background-image: url(images/success.png);
background-image: url(images/success.gif) \9;
background-position: 75px 75px;
}
#online li.selected .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
background-position: 72px 72px;
}
/* 在线文件的文件预览图标 */
i.file-preview {
display: block;
margin: 10px auto;
width: 70px;
height: 70px;
background-image: url("./images/file-icons.png");
background-image: url("./images/file-icons.gif") \9;
background-position: -140px center;
background-repeat: no-repeat;
}
i.file-preview.file-type-dir{
background-position: 0 center;
}
i.file-preview.file-type-file{
background-position: -140px center;
}
i.file-preview.file-type-filelist{
background-position: -210px center;
}
i.file-preview.file-type-zip,
i.file-preview.file-type-rar,
i.file-preview.file-type-7z,
i.file-preview.file-type-tar,
i.file-preview.file-type-gz,
i.file-preview.file-type-bz2{
background-position: -280px center;
}
i.file-preview.file-type-xls,
i.file-preview.file-type-xlsx{
background-position: -350px center;
}
i.file-preview.file-type-doc,
i.file-preview.file-type-docx{
background-position: -420px center;
}
i.file-preview.file-type-ppt,
i.file-preview.file-type-pptx{
background-position: -490px center;
}
i.file-preview.file-type-vsd{
background-position: -560px center;
}
i.file-preview.file-type-pdf{
background-position: -630px center;
}
i.file-preview.file-type-txt,
i.file-preview.file-type-md,
i.file-preview.file-type-json,
i.file-preview.file-type-htm,
i.file-preview.file-type-xml,
i.file-preview.file-type-html,
i.file-preview.file-type-js,
i.file-preview.file-type-css,
i.file-preview.file-type-php,
i.file-preview.file-type-jsp,
i.file-preview.file-type-asp{
background-position: -700px center;
}
i.file-preview.file-type-apk{
background-position: -770px center;
}
i.file-preview.file-type-exe{
background-position: -840px center;
}
i.file-preview.file-type-ipa{
background-position: -910px center;
}
i.file-preview.file-type-mp4,
i.file-preview.file-type-swf,
i.file-preview.file-type-mkv,
i.file-preview.file-type-avi,
i.file-preview.file-type-flv,
i.file-preview.file-type-mov,
i.file-preview.file-type-mpg,
i.file-preview.file-type-mpeg,
i.file-preview.file-type-ogv,
i.file-preview.file-type-webm,
i.file-preview.file-type-rm,
i.file-preview.file-type-rmvb{
background-position: -980px center;
}
i.file-preview.file-type-ogg,
i.file-preview.file-type-wav,
i.file-preview.file-type-wmv,
i.file-preview.file-type-mid,
i.file-preview.file-type-mp3{
background-position: -1050px center;
}
i.file-preview.file-type-jpg,
i.file-preview.file-type-jpeg,
i.file-preview.file-type-gif,
i.file-preview.file-type-bmp,
i.file-preview.file-type-png,
i.file-preview.file-type-psd{
background-position: -140px center;
}
@@ -0,0 +1,60 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>ueditor图片对话框</title>
<script type="text/javascript" src="../internal.js"></script>
<!-- jquery -->
<script type="text/javascript" src="../../third-party/jquery-1.10.2.min.js"></script>
<!-- webuploader -->
<script src="../../third-party/webuploader/webuploader.min.js"></script>
<link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css">
<!-- attachment dialog -->
<link rel="stylesheet" href="attachment.css" type="text/css" />
</head>
<body>
<div class="wrapper">
<div id="tabhead" class="tabhead">
<span class="tab focus" data-content-id="upload"><var id="lang_tab_upload"></var></span>
<span class="tab" data-content-id="online"><var id="lang_tab_online"></var></span>
</div>
<div id="tabbody" class="tabbody">
<!-- 上传图片 -->
<div id="upload" class="panel focus">
<div id="queueList" class="queueList">
<div class="statusBar element-invisible">
<div class="progress">
<span class="text">0%</span>
<span class="percentage"></span>
</div><div class="info"></div>
<div class="btns">
<div id="filePickerBtn"></div>
<div class="uploadBtn"><var id="lang_start_upload"></var></div>
</div>
</div>
<div id="dndArea" class="placeholder">
<div class="filePickerContainer">
<div id="filePickerReady"></div>
</div>
</div>
<ul class="filelist element-invisible">
<li id="filePickerBlock" class="filePickerBlock"></li>
</ul>
</div>
</div>
<!-- 在线图片 -->
<div id="online" class="panel">
<div id="fileList"><var id="lang_imgLoading"></var></div>
</div>
</div>
</div>
<script type="text/javascript" src="attachment.js"></script>
</body>
</html>
@@ -0,0 +1,754 @@
/**
* User: Jinqn
* Date: 14-04-08
* Time: 下午16:34
* 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片
*/
(function () {
var uploadFile,
onlineFile;
window.onload = function () {
initTabs();
initButtons();
};
/* 初始化tab标签 */
function initTabs() {
var tabs = $G('tabhead').children;
for (var i = 0; i < tabs.length; i++) {
domUtils.on(tabs[i], "click", function (e) {
var target = e.target || e.srcElement;
setTabFocus(target.getAttribute('data-content-id'));
});
}
setTabFocus('upload');
}
/* 初始化tabbody */
function setTabFocus(id) {
if(!id) return;
var i, bodyId, tabs = $G('tabhead').children;
for (i = 0; i < tabs.length; i++) {
bodyId = tabs[i].getAttribute('data-content-id')
if (bodyId == id) {
domUtils.addClass(tabs[i], 'focus');
domUtils.addClass($G(bodyId), 'focus');
} else {
domUtils.removeClasses(tabs[i], 'focus');
domUtils.removeClasses($G(bodyId), 'focus');
}
}
switch (id) {
case 'upload':
uploadFile = uploadFile || new UploadFile('queueList');
break;
case 'online':
onlineFile = onlineFile || new OnlineFile('fileList');
break;
}
}
/* 初始化onok事件 */
function initButtons() {
dialog.onok = function () {
var list = [], id, tabs = $G('tabhead').children;
for (var i = 0; i < tabs.length; i++) {
if (domUtils.hasClass(tabs[i], 'focus')) {
id = tabs[i].getAttribute('data-content-id');
break;
}
}
switch (id) {
case 'upload':
list = uploadFile.getInsertList();
var count = uploadFile.getQueueCount();
if (count) {
$('.info', '#queueList').html('<span style="color:red;">' + '还有2个未上传文件'.replace(/[\d]/, count) + '</span>');
return false;
}
break;
case 'online':
list = onlineFile.getInsertList();
break;
}
editor.execCommand('insertfile', list);
};
}
/* 上传附件 */
function UploadFile(target) {
this.$wrap = target.constructor == String ? $('#' + target) : $(target);
this.init();
}
UploadFile.prototype = {
init: function () {
this.fileList = [];
this.initContainer();
this.initUploader();
},
initContainer: function () {
this.$queue = this.$wrap.find('.filelist');
},
/* 初始化容器 */
initUploader: function () {
var _this = this,
$ = jQuery, // just in case. Make sure it's not an other libaray.
$wrap = _this.$wrap,
// 图片容器
$queue = $wrap.find('.filelist'),
// 状态栏,包括进度和控制按钮
$statusBar = $wrap.find('.statusBar'),
// 文件总体选择信息。
$info = $statusBar.find('.info'),
// 上传按钮
$upload = $wrap.find('.uploadBtn'),
// 上传按钮
$filePickerBtn = $wrap.find('.filePickerBtn'),
// 上传按钮
$filePickerBlock = $wrap.find('.filePickerBlock'),
// 没选择文件之前的内容。
$placeHolder = $wrap.find('.placeholder'),
// 总体进度条
$progress = $statusBar.find('.progress').hide(),
// 添加的文件数量
fileCount = 0,
// 添加的文件总大小
fileSize = 0,
// 优化retina, 在retina下这个值是2
ratio = window.devicePixelRatio || 1,
// 缩略图大小
thumbnailWidth = 113 * ratio,
thumbnailHeight = 113 * ratio,
// 可能有pedding, ready, uploading, confirm, done.
state = '',
// 所有文件的进度信息,key为file id
percentages = {},
supportTransition = (function () {
var s = document.createElement('p').style,
r = 'transition' in s ||
'WebkitTransition' in s ||
'MozTransition' in s ||
'msTransition' in s ||
'OTransition' in s;
s = null;
return r;
})(),
// WebUploader实例
uploader,
actionUrl = editor.getActionUrl(editor.getOpt('fileActionName')),
fileMaxSize = editor.getOpt('fileMaxSize'),
acceptExtensions = (editor.getOpt('fileAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, '');;
if (!WebUploader.Uploader.support()) {
$('#filePickerReady').after($('<div>').html(lang.errorNotSupport)).hide();
return;
} else if (!editor.getOpt('fileActionName')) {
$('#filePickerReady').after($('<div>').html(lang.errorLoadConfig)).hide();
return;
}
uploader = _this.uploader = WebUploader.create({
pick: {
id: '#filePickerReady',
label: lang.uploadSelectFile
},
swf: '../../third-party/webuploader/Uploader.swf',
server: actionUrl,
fileVal: editor.getOpt('fileFieldName'),
duplicate: true,
fileSingleSizeLimit: fileMaxSize,
compress: false
});
uploader.addButton({
id: '#filePickerBlock'
});
uploader.addButton({
id: '#filePickerBtn',
label: lang.uploadAddFile
});
setState('pedding');
// 当有文件添加进来时执行,负责view的创建
function addFile(file) {
var $li = $('<li id="' + file.id + '">' +
'<p class="title">' + file.name + '</p>' +
'<p class="imgWrap"></p>' +
'<p class="progress"><span></span></p>' +
'</li>'),
$btns = $('<div class="file-panel">' +
'<span class="cancel">' + lang.uploadDelete + '</span>' +
'<span class="rotateRight">' + lang.uploadTurnRight + '</span>' +
'<span class="rotateLeft">' + lang.uploadTurnLeft + '</span></div>').appendTo($li),
$prgress = $li.find('p.progress span'),
$wrap = $li.find('p.imgWrap'),
$info = $('<p class="error"></p>').hide().appendTo($li),
showError = function (code) {
switch (code) {
case 'exceed_size':
text = lang.errorExceedSize;
break;
case 'interrupt':
text = lang.errorInterrupt;
break;
case 'http':
text = lang.errorHttp;
break;
case 'not_allow_type':
text = lang.errorFileType;
break;
default:
text = lang.errorUploadRetry;
break;
}
$info.text(text).show();
};
if (file.getStatus() === 'invalid') {
showError(file.statusText);
} else {
$wrap.text(lang.uploadPreview);
if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|'+file.ext.toLowerCase()+'|') == -1) {
$wrap.empty().addClass('notimage').append('<i class="file-preview file-type-' + file.ext.toLowerCase() + '"></i>' +
'<span class="file-title" title="' + file.name + '">' + file.name + '</span>');
} else {
if (browser.ie && browser.version <= 7) {
$wrap.text(lang.uploadNoPreview);
} else {
uploader.makeThumb(file, function (error, src) {
if (error || !src) {
$wrap.text(lang.uploadNoPreview);
} else {
var $img = $('<img src="' + src + '">');
$wrap.empty().append($img);
$img.on('error', function () {
$wrap.text(lang.uploadNoPreview);
});
}
}, thumbnailWidth, thumbnailHeight);
}
}
percentages[ file.id ] = [ file.size, 0 ];
file.rotation = 0;
/* 检查文件格式 */
if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {
showError('not_allow_type');
uploader.removeFile(file);
}
}
file.on('statuschange', function (cur, prev) {
if (prev === 'progress') {
$prgress.hide().width(0);
} else if (prev === 'queued') {
$li.off('mouseenter mouseleave');
$btns.remove();
}
// 成功
if (cur === 'error' || cur === 'invalid') {
showError(file.statusText);
percentages[ file.id ][ 1 ] = 1;
} else if (cur === 'interrupt') {
showError('interrupt');
} else if (cur === 'queued') {
percentages[ file.id ][ 1 ] = 0;
} else if (cur === 'progress') {
$info.hide();
$prgress.css('display', 'block');
} else if (cur === 'complete') {
}
$li.removeClass('state-' + prev).addClass('state-' + cur);
});
$li.on('mouseenter', function () {
$btns.stop().animate({height: 30});
});
$li.on('mouseleave', function () {
$btns.stop().animate({height: 0});
});
$btns.on('click', 'span', function () {
var index = $(this).index(),
deg;
switch (index) {
case 0:
uploader.removeFile(file);
return;
case 1:
file.rotation += 90;
break;
case 2:
file.rotation -= 90;
break;
}
if (supportTransition) {
deg = 'rotate(' + file.rotation + 'deg)';
$wrap.css({
'-webkit-transform': deg,
'-mos-transform': deg,
'-o-transform': deg,
'transform': deg
});
} else {
$wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');
}
});
$li.insertBefore($filePickerBlock);
}
// 负责view的销毁
function removeFile(file) {
var $li = $('#' + file.id);
delete percentages[ file.id ];
updateTotalProgress();
$li.off().find('.file-panel').off().end().remove();
}
function updateTotalProgress() {
var loaded = 0,
total = 0,
spans = $progress.children(),
percent;
$.each(percentages, function (k, v) {
total += v[ 0 ];
loaded += v[ 0 ] * v[ 1 ];
});
percent = total ? loaded / total : 0;
spans.eq(0).text(Math.round(percent * 100) + '%');
spans.eq(1).css('width', Math.round(percent * 100) + '%');
updateStatus();
}
function setState(val, files) {
if (val != state) {
var stats = uploader.getStats();
$upload.removeClass('state-' + state);
$upload.addClass('state-' + val);
switch (val) {
/* 未选择文件 */
case 'pedding':
$queue.addClass('element-invisible');
$statusBar.addClass('element-invisible');
$placeHolder.removeClass('element-invisible');
$progress.hide(); $info.hide();
uploader.refresh();
break;
/* 可以开始上传 */
case 'ready':
$placeHolder.addClass('element-invisible');
$queue.removeClass('element-invisible');
$statusBar.removeClass('element-invisible');
$progress.hide(); $info.show();
$upload.text(lang.uploadStart);
uploader.refresh();
break;
/* 上传中 */
case 'uploading':
$progress.show(); $info.hide();
$upload.text(lang.uploadPause);
break;
/* 暂停上传 */
case 'paused':
$progress.show(); $info.hide();
$upload.text(lang.uploadContinue);
break;
case 'confirm':
$progress.show(); $info.hide();
$upload.text(lang.uploadStart);
stats = uploader.getStats();
if (stats.successNum && !stats.uploadFailNum) {
setState('finish');
return;
}
break;
case 'finish':
$progress.hide(); $info.show();
if (stats.uploadFailNum) {
$upload.text(lang.uploadRetry);
} else {
$upload.text(lang.uploadStart);
}
break;
}
state = val;
updateStatus();
}
if (!_this.getQueueCount()) {
$upload.addClass('disabled')
} else {
$upload.removeClass('disabled')
}
}
function updateStatus() {
var text = '', stats;
if (state === 'ready') {
text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));
} else if (state === 'confirm') {
stats = uploader.getStats();
if (stats.uploadFailNum) {
text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);
}
} else {
stats = uploader.getStats();
text = lang.updateStatusFinish.replace('_', fileCount).
replace('_KB', WebUploader.formatSize(fileSize)).
replace('_', stats.successNum);
if (stats.uploadFailNum) {
text += lang.updateStatusError.replace('_', stats.uploadFailNum);
}
}
$info.html(text);
}
uploader.on('fileQueued', function (file) {
fileCount++;
fileSize += file.size;
if (fileCount === 1) {
$placeHolder.addClass('element-invisible');
$statusBar.show();
}
addFile(file);
});
uploader.on('fileDequeued', function (file) {
fileCount--;
fileSize -= file.size;
removeFile(file);
updateTotalProgress();
});
uploader.on('filesQueued', function (file) {
if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {
setState('ready');
}
updateTotalProgress();
});
uploader.on('all', function (type, files) {
switch (type) {
case 'uploadFinished':
setState('confirm', files);
break;
case 'startUpload':
/* 添加额外的GET参数 */
var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params);
uploader.option('server', url);
setState('uploading', files);
break;
case 'stopUpload':
setState('paused', files);
break;
}
});
uploader.on('uploadBeforeSend', function (file, data, header) {
//这里可以通过data对象添加POST参数
header['X_Requested_With'] = 'XMLHttpRequest';
});
uploader.on('uploadProgress', function (file, percentage) {
var $li = $('#' + file.id),
$percent = $li.find('.progress span');
$percent.css('width', percentage * 100 + '%');
percentages[ file.id ][ 1 ] = percentage;
updateTotalProgress();
});
uploader.on('uploadSuccess', function (file, ret) {
var $file = $('#' + file.id);
try {
var responseText = (ret._raw || ret),
json = utils.str2json(responseText);
if (json.state == 'SUCCESS') {
_this.fileList.push(json);
$file.append('<span class="success"></span>');
} else {
$file.find('.error').text(json.state).show();
}
} catch (e) {
$file.find('.error').text(lang.errorServerUpload).show();
}
});
uploader.on('uploadError', function (file, code) {
});
uploader.on('error', function (code, file) {
if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') {
addFile(file);
}
});
uploader.on('uploadComplete', function (file, ret) {
});
$upload.on('click', function () {
if ($(this).hasClass('disabled')) {
return false;
}
if (state === 'ready') {
uploader.upload();
} else if (state === 'paused') {
uploader.upload();
} else if (state === 'uploading') {
uploader.stop();
}
});
$upload.addClass('state-' + state);
updateTotalProgress();
},
getQueueCount: function () {
var file, i, status, readyFile = 0, files = this.uploader.getFiles();
for (i = 0; file = files[i++]; ) {
status = file.getStatus();
if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++;
}
return readyFile;
},
getInsertList: function () {
var i, link, data, list = [],
prefix = editor.getOpt('fileUrlPrefix');
for (i = 0; i < this.fileList.length; i++) {
data = this.fileList[i];
link = data.url;
list.push({
title: data.original || link.substr(link.lastIndexOf('/') + 1),
url: prefix + link
});
}
return list;
}
};
/* 在线附件 */
function OnlineFile(target) {
this.container = utils.isString(target) ? document.getElementById(target) : target;
this.init();
}
OnlineFile.prototype = {
init: function () {
this.initContainer();
this.initEvents();
this.initData();
},
/* 初始化容器 */
initContainer: function () {
this.container.innerHTML = '';
this.list = document.createElement('ul');
this.clearFloat = document.createElement('li');
domUtils.addClass(this.list, 'list');
domUtils.addClass(this.clearFloat, 'clearFloat');
this.list.appendChild(this.clearFloat);
this.container.appendChild(this.list);
},
/* 初始化滚动事件,滚动到地步自动拉取数据 */
initEvents: function () {
var _this = this;
/* 滚动拉取图片 */
domUtils.on($G('fileList'), 'scroll', function(e){
var panel = this;
if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
_this.getFileData();
}
});
/* 选中图片 */
domUtils.on(this.list, 'click', function (e) {
var target = e.target || e.srcElement,
li = target.parentNode;
if (li.tagName.toLowerCase() == 'li') {
if (domUtils.hasClass(li, 'selected')) {
domUtils.removeClasses(li, 'selected');
} else {
domUtils.addClass(li, 'selected');
}
}
});
},
/* 初始化第一次的数据 */
initData: function () {
/* 拉取数据需要使用的值 */
this.state = 0;
this.listSize = editor.getOpt('fileManagerListSize');
this.listIndex = 0;
this.listEnd = false;
/* 第一次拉取数据 */
this.getFileData();
},
/* 向后台拉取图片列表数据 */
getFileData: function () {
var _this = this;
if(!_this.listEnd && !this.isLoadingData) {
this.isLoadingData = true;
ajax.request(editor.getActionUrl(editor.getOpt('fileManagerActionName')), {
timeout: 100000,
data: utils.extend({
start: this.listIndex,
size: this.listSize
}, editor.queryCommandValue('serverparam')),
method: 'get',
onsuccess: function (r) {
try {
var json = eval('(' + r.responseText + ')');
if (json.state == 'SUCCESS') {
_this.pushData(json.list);
_this.listIndex = parseInt(json.start) + parseInt(json.list.length);
if(_this.listIndex >= json.total) {
_this.listEnd = true;
}
_this.isLoadingData = false;
}
} catch (e) {
if(r.responseText.indexOf('ue_separate_ue') != -1) {
var list = r.responseText.split(r.responseText);
_this.pushData(list);
_this.listIndex = parseInt(list.length);
_this.listEnd = true;
_this.isLoadingData = false;
}
}
},
onerror: function () {
_this.isLoadingData = false;
}
});
}
},
/* 添加图片到列表界面上 */
pushData: function (list) {
var i, item, img, filetype, preview, icon, _this = this,
urlPrefix = editor.getOpt('fileManagerUrlPrefix');
for (i = 0; i < list.length; i++) {
if(list[i] && list[i].url) {
item = document.createElement('li');
icon = document.createElement('span');
filetype = list[i].url.substr(list[i].url.lastIndexOf('.') + 1);
if ( "png|jpg|jpeg|gif|bmp".indexOf(filetype) != -1 ) {
preview = document.createElement('img');
domUtils.on(preview, 'load', (function(image){
return function(){
_this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
};
})(preview));
preview.width = 113;
preview.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) );
} else {
var ic = document.createElement('i'),
textSpan = document.createElement('span');
textSpan.innerHTML = list[i].url.substr(list[i].url.lastIndexOf('/') + 1);
preview = document.createElement('div');
preview.appendChild(ic);
preview.appendChild(textSpan);
domUtils.addClass(preview, 'file-wrapper');
domUtils.addClass(textSpan, 'file-title');
domUtils.addClass(ic, 'file-type-' + filetype);
domUtils.addClass(ic, 'file-preview');
}
domUtils.addClass(icon, 'icon');
item.setAttribute('data-url', urlPrefix + list[i].url);
if (list[i].original) {
item.setAttribute('data-title', list[i].original);
}
item.appendChild(preview);
item.appendChild(icon);
this.list.insertBefore(item, this.clearFloat);
}
}
},
/* 改变图片大小 */
scale: function (img, w, h, type) {
var ow = img.width,
oh = img.height;
if (type == 'justify') {
if (ow >= oh) {
img.width = w;
img.height = h * oh / ow;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w * ow / oh;
img.height = h;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
} else {
if (ow >= oh) {
img.width = w * ow / oh;
img.height = h;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w;
img.height = h * oh / ow;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
}
},
getInsertList: function () {
var i, lis = this.list.children, list = [];
for (i = 0; i < lis.length; i++) {
if (domUtils.hasClass(lis[i], 'selected')) {
var url = lis[i].getAttribute('data-url');
var title = lis[i].getAttribute('data-title') || url.substr(url.lastIndexOf('/') + 1);
list.push({
title: title,
url: url
});
}
}
return list;
}
};
})();
Binary file not shown.

After

Width:  |  Height:  |  Size: 923 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 841 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1012 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 949 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 950 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 986 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1001 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 996 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1001 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1009 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1007 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 970 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1005 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 453 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1,94 @@
.wrapper{ width: 424px;margin: 10px auto; zoom:1;position: relative}
.tabbody{height:225px;}
.tabbody .panel { position: absolute;width:100%; height:100%;background: #fff; display: none;}
.tabbody .focus { display: block;}
body{font-size: 12px;color: #888;overflow: hidden;}
input,label{vertical-align:middle}
.clear{clear: both;}
.pl{padding-left: 18px;padding-left: 23px\9;}
#imageList {width: 420px;height: 215px;margin-top: 10px;overflow: hidden;overflow-y: auto;}
#imageList div {float: left;width: 100px;height: 95px;margin: 5px 10px;}
#imageList img {cursor: pointer;border: 2px solid white;}
.bgarea{margin: 10px;padding: 5px;height: 84%;border: 1px solid #A8A297;}
.content div{margin: 10px 0 10px 5px;}
.content .iptradio{margin: 0px 5px 5px 0px;}
.txt{width:280px;}
.wrapcolor{height: 19px;}
div.color{float: left;margin: 0;}
#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;margin: 0;float: left;}
div.alignment,#custom{margin-left: 23px;margin-left: 28px\9;}
#custom input{height: 15px;min-height: 15px;width:20px;}
#repeatType{width:100px;}
/* 图片管理样式 */
#imgManager {
width: 100%;
height: 225px;
}
#imgManager #imageList{
width: 100%;
overflow-x: hidden;
overflow-y: auto;
}
#imgManager ul {
display: block;
list-style: none;
margin: 0;
padding: 0;
}
#imgManager li {
float: left;
display: block;
list-style: none;
padding: 0;
width: 113px;
height: 113px;
margin: 9px 0 0 19px;
background-color: #eee;
overflow: hidden;
cursor: pointer;
position: relative;
}
#imgManager li.clearFloat {
float: none;
clear: both;
display: block;
width:0;
height:0;
margin: 0;
padding: 0;
}
#imgManager li img {
cursor: pointer;
}
#imgManager li .icon {
cursor: pointer;
width: 113px;
height: 113px;
position: absolute;
top: 0;
left: 0;
z-index: 2;
border: 0;
background-repeat: no-repeat;
}
#imgManager li .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
}
#imgManager li.selected .icon {
background-image: url(images/success.png);
background-position: 75px 75px;
}
#imgManager li.selected .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
background-position: 72px 72px;
}
@@ -0,0 +1,56 @@
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script type="text/javascript" src="../internal.js"></script>
<link rel="stylesheet" type="text/css" href="background.css">
</head>
<body>
<div id="bg_container" class="wrapper">
<div id="tabHeads" class="tabhead">
<span class="focus" data-content-id="normal"><var id="lang_background_normal"></var></span>
<span class="" data-content-id="imgManager"><var id="lang_background_local"></var></span>
</div>
<div id="tabBodys" class="tabbody">
<div id="normal" class="panel focus">
<fieldset class="bgarea">
<legend><var id="lang_background_set"></var></legend>
<div class="content">
<div>
<label><input id="nocolorRadio" class="iptradio" type="radio" name="t" value="none" checked="checked"><var id="lang_background_none"></var></label>
<label><input id="coloredRadio" class="iptradio" type="radio" name="t" value="color"><var id="lang_background_colored"></var></label>
</div>
<div class="wrapcolor pl">
<div class="color">
<var id="lang_background_color"></var>:
</div>
<div id="colorPicker"></div>
<div class="clear"></div>
</div>
<div class="wrapcolor pl">
<label><var id="lang_background_netimg"></var>:</label><input class="txt" type="text" id="url">
</div>
<div id="alignment" class="alignment">
<var id="lang_background_align"></var>:<select id="repeatType">
<option value="center"></option>
<option value="repeat-x"></option>
<option value="repeat-y"></option>
<option value="repeat"></option>
<option value="self"></option>
</select>
</div>
<div id="custom" >
<var id="lang_background_position"></var>:x:<input type="text" size="1" id="x" maxlength="4" value="0">px&nbsp;&nbsp;y:<input type="text" size="1" id="y" maxlength="4" value="0">px
</div>
</div>
</fieldset>
</div>
<div id="imgManager" class="panel">
<div id="imageList" style=""></div>
</div>
</div>
</div>
<script type="text/javascript" src="background.js"></script>
</body>
</html>
@@ -0,0 +1,376 @@
(function () {
var onlineImage,
backupStyle = editor.queryCommandValue('background');
window.onload = function () {
initTabs();
initColorSelector();
};
/* 初始化tab标签 */
function initTabs(){
var tabs = $G('tabHeads').children;
for (var i = 0; i < tabs.length; i++) {
domUtils.on(tabs[i], "click", function (e) {
var target = e.target || e.srcElement;
for (var j = 0; j < tabs.length; j++) {
if(tabs[j] == target){
tabs[j].className = "focus";
var contentId = tabs[j].getAttribute('data-content-id');
$G(contentId).style.display = "block";
if(contentId == 'imgManager') {
initImagePanel();
}
}else {
tabs[j].className = "";
$G(tabs[j].getAttribute('data-content-id')).style.display = "none";
}
}
});
}
}
/* 初始化颜色设置 */
function initColorSelector () {
var obj = editor.queryCommandValue('background');
if (obj) {
var color = obj['background-color'],
repeat = obj['background-repeat'] || 'repeat',
image = obj['background-image'] || '',
position = obj['background-position'] || 'center center',
pos = position.split(' '),
x = parseInt(pos[0]) || 0,
y = parseInt(pos[1]) || 0;
if(repeat == 'no-repeat' && (x || y)) repeat = 'self';
image = image.match(/url[\s]*\(([^\)]*)\)/);
image = image ? image[1]:'';
updateFormState('colored', color, image, repeat, x, y);
} else {
updateFormState();
}
var updateHandler = function () {
updateFormState();
updateBackground();
}
domUtils.on($G('nocolorRadio'), 'click', updateBackground);
domUtils.on($G('coloredRadio'), 'click', updateHandler);
domUtils.on($G('url'), 'keyup', function(){
if($G('url').value && $G('alignment').style.display == "none") {
utils.each($G('repeatType').children, function(item){
item.selected = ('repeat' == item.getAttribute('value') ? 'selected':false);
});
}
updateHandler();
});
domUtils.on($G('repeatType'), 'change', updateHandler);
domUtils.on($G('x'), 'keyup', updateBackground);
domUtils.on($G('y'), 'keyup', updateBackground);
initColorPicker();
}
/* 初始化颜色选择器 */
function initColorPicker() {
var me = editor,
cp = $G("colorPicker");
/* 生成颜色选择器ui对象 */
var popup = new UE.ui.Popup({
content: new UE.ui.ColorPicker({
noColorText: me.getLang("clearColor"),
editor: me,
onpickcolor: function (t, color) {
updateFormState('colored', color);
updateBackground();
UE.ui.Popup.postHide();
},
onpicknocolor: function (t, color) {
updateFormState('colored', 'transparent');
updateBackground();
UE.ui.Popup.postHide();
}
}),
editor: me,
onhide: function () {
}
});
/* 设置颜色选择器 */
domUtils.on(cp, "click", function () {
popup.showAnchor(this);
});
domUtils.on(document, 'mousedown', function (evt) {
var el = evt.target || evt.srcElement;
UE.ui.Popup.postHide(el);
});
domUtils.on(window, 'scroll', function () {
UE.ui.Popup.postHide();
});
}
/* 初始化在线图片列表 */
function initImagePanel() {
onlineImage = onlineImage || new OnlineImage('imageList');
}
/* 更新背景色设置面板 */
function updateFormState (radio, color, url, align, x, y) {
var nocolorRadio = $G('nocolorRadio'),
coloredRadio = $G('coloredRadio');
if(radio) {
nocolorRadio.checked = (radio == 'colored' ? false:'checked');
coloredRadio.checked = (radio == 'colored' ? 'checked':false);
}
if(color) {
domUtils.setStyle($G("colorPicker"), "background-color", color);
}
if(url && /^\//.test(url)) {
var a = document.createElement('a');
a.href = url;
browser.ie && (a.href = a.href);
url = browser.ie ? a.href:(a.protocol + '//' + a.host + a.pathname + a.search + a.hash);
}
if(url || url === '') {
$G('url').value = url;
}
if(align) {
utils.each($G('repeatType').children, function(item){
item.selected = (align == item.getAttribute('value') ? 'selected':false);
});
}
if(x || y) {
$G('x').value = parseInt(x) || 0;
$G('y').value = parseInt(y) || 0;
}
$G('alignment').style.display = coloredRadio.checked && $G('url').value ? '':'none';
$G('custom').style.display = coloredRadio.checked && $G('url').value && $G('repeatType').value == 'self' ? '':'none';
}
/* 更新背景颜色 */
function updateBackground () {
if ($G('coloredRadio').checked) {
var color = domUtils.getStyle($G("colorPicker"), "background-color"),
bgimg = $G("url").value,
align = $G("repeatType").value,
backgroundObj = {
"background-repeat": "no-repeat",
"background-position": "center center"
};
if (color) backgroundObj["background-color"] = color;
if (bgimg) backgroundObj["background-image"] = 'url(' + bgimg + ')';
if (align == 'self') {
backgroundObj["background-position"] = $G("x").value + "px " + $G("y").value + "px";
} else if (align == 'repeat-x' || align == 'repeat-y' || align == 'repeat') {
backgroundObj["background-repeat"] = align;
}
editor.execCommand('background', backgroundObj);
} else {
editor.execCommand('background', null);
}
}
/* 在线图片 */
function OnlineImage(target) {
this.container = utils.isString(target) ? document.getElementById(target) : target;
this.init();
}
OnlineImage.prototype = {
init: function () {
this.reset();
this.initEvents();
},
/* 初始化容器 */
initContainer: function () {
this.container.innerHTML = '';
this.list = document.createElement('ul');
this.clearFloat = document.createElement('li');
domUtils.addClass(this.list, 'list');
domUtils.addClass(this.clearFloat, 'clearFloat');
this.list.id = 'imageListUl';
this.list.appendChild(this.clearFloat);
this.container.appendChild(this.list);
},
/* 初始化滚动事件,滚动到地步自动拉取数据 */
initEvents: function () {
var _this = this;
/* 滚动拉取图片 */
domUtils.on($G('imageList'), 'scroll', function(e){
var panel = this;
if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
_this.getImageData();
}
});
/* 选中图片 */
domUtils.on(this.container, 'click', function (e) {
var target = e.target || e.srcElement,
li = target.parentNode,
nodes = $G('imageListUl').childNodes;
if (li.tagName.toLowerCase() == 'li') {
updateFormState('nocolor', null, '');
for (var i = 0, node; node = nodes[i++];) {
if (node == li && !domUtils.hasClass(node, 'selected')) {
domUtils.addClass(node, 'selected');
updateFormState('colored', null, li.firstChild.getAttribute("_src"), 'repeat');
} else {
domUtils.removeClasses(node, 'selected');
}
}
updateBackground();
}
});
},
/* 初始化第一次的数据 */
initData: function () {
/* 拉取数据需要使用的值 */
this.state = 0;
this.listSize = editor.getOpt('imageManagerListSize');
this.listIndex = 0;
this.listEnd = false;
/* 第一次拉取数据 */
this.getImageData();
},
/* 重置界面 */
reset: function() {
this.initContainer();
this.initData();
},
/* 向后台拉取图片列表数据 */
getImageData: function () {
var _this = this;
if(!_this.listEnd && !this.isLoadingData) {
this.isLoadingData = true;
var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')),
isJsonp = utils.isCrossDomainUrl(url);
ajax.request(url, {
'timeout': 100000,
'dataType': isJsonp ? 'jsonp':'',
'data': utils.extend({
start: this.listIndex,
size: this.listSize
}, editor.queryCommandValue('serverparam')),
'method': 'get',
'onsuccess': function (r) {
try {
var json = isJsonp ? r:eval('(' + r.responseText + ')');
if (json.state == 'SUCCESS') {
_this.pushData(json.list);
_this.listIndex = parseInt(json.start) + parseInt(json.list.length);
if(_this.listIndex >= json.total) {
_this.listEnd = true;
}
_this.isLoadingData = false;
}
} catch (e) {
if(r.responseText.indexOf('ue_separate_ue') != -1) {
var list = r.responseText.split(r.responseText);
_this.pushData(list);
_this.listIndex = parseInt(list.length);
_this.listEnd = true;
_this.isLoadingData = false;
}
}
},
'onerror': function () {
_this.isLoadingData = false;
}
});
}
},
/* 添加图片到列表界面上 */
pushData: function (list) {
var i, item, img, icon, _this = this,
urlPrefix = editor.getOpt('imageManagerUrlPrefix');
for (i = 0; i < list.length; i++) {
if(list[i] && list[i].url) {
item = document.createElement('li');
img = document.createElement('img');
icon = document.createElement('span');
domUtils.on(img, 'load', (function(image){
return function(){
_this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
}
})(img));
img.width = 113;
img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) );
img.setAttribute('_src', urlPrefix + list[i].url);
domUtils.addClass(icon, 'icon');
item.appendChild(img);
item.appendChild(icon);
this.list.insertBefore(item, this.clearFloat);
}
}
},
/* 改变图片大小 */
scale: function (img, w, h, type) {
var ow = img.width,
oh = img.height;
if (type == 'justify') {
if (ow >= oh) {
img.width = w;
img.height = h * oh / ow;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w * ow / oh;
img.height = h;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
} else {
if (ow >= oh) {
img.width = w * ow / oh;
img.height = h;
img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
} else {
img.width = w;
img.height = h * oh / ow;
img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
}
}
},
getInsertList: function () {
var i, lis = this.list.children, list = [], align = getAlign();
for (i = 0; i < lis.length; i++) {
if (domUtils.hasClass(lis[i], 'selected')) {
var img = lis[i].firstChild,
src = img.getAttribute('_src');
list.push({
src: src,
_src: src,
floatStyle: align
});
}
}
return list;
}
};
dialog.onok = function () {
updateBackground();
editor.fireEvent('saveScene');
};
dialog.oncancel = function () {
editor.execCommand('background', backupStyle);
};
})();
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1,65 @@
/*
* 图表配置文件
* */
//不同类型的配置
var typeConfig = [
{
chart: {
type: 'line'
},
plotOptions: {
line: {
dataLabels: {
enabled: false
},
enableMouseTracking: true
}
}
}, {
chart: {
type: 'line'
},
plotOptions: {
line: {
dataLabels: {
enabled: true
},
enableMouseTracking: false
}
}
}, {
chart: {
type: 'area'
}
}, {
chart: {
type: 'bar'
}
}, {
chart: {
type: 'column'
}
}, {
chart: {
plotBackgroundColor: null,
plotBorderWidth: null,
plotShadow: false
},
plotOptions: {
pie: {
allowPointSelect: true,
cursor: 'pointer',
dataLabels: {
enabled: true,
color: '#000000',
connectorColor: '#000000',
formatter: function() {
return '<b>'+ this.point.name +'</b>: '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %';
}
}
}
}
}
];
+165
View File
@@ -0,0 +1,165 @@
html, body {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow-x: hidden;
}
.main {
width: 100%;
overflow: hidden;
}
.table-view {
height: 100%;
float: left;
margin: 20px;
width: 40%;
}
.table-view .table-container {
width: 100%;
margin-bottom: 50px;
overflow: scroll;
}
.table-view th {
padding: 5px 10px;
background-color: #F7F7F7;
}
.table-view td {
width: 50px;
text-align: center;
padding:0;
}
.table-container input {
width: 40px;
padding: 5px;
border: none;
outline: none;
}
.table-view caption {
font-size: 18px;
text-align: left;
}
.charts-view {
/*margin-left: 49%!important;*/
width: 50%;
margin-left: 49%;
height: 400px;
}
.charts-container {
border-left: 1px solid #c3c3c3;
}
.charts-format fieldset {
padding-left: 20px;
margin-bottom: 50px;
}
.charts-format legend {
padding-left: 10px;
padding-right: 10px;
}
.format-item-container {
padding: 20px;
}
.format-item-container label {
display: block;
margin: 10px 0;
}
.charts-format .data-item {
border: 1px solid black;
outline: none;
padding: 2px 3px;
}
/* 图表类型 */
.charts-type {
margin-top: 50px;
height: 300px;
}
.scroll-view {
border: 1px solid #c3c3c3;
border-left: none;
border-right: none;
overflow: hidden;
}
.scroll-container {
margin: 20px;
width: 100%;
overflow: hidden;
}
.scroll-bed {
width: 10000px;
_margin-top: 20px;
-webkit-transition: margin-left .5s ease;
-moz-transition: margin-left .5s ease;
transition: margin-left .5s ease;
}
.view-box {
display: inline-block;
*display: inline;
*zoom: 1;
margin-right: 20px;
border: 2px solid white;
line-height: 0;
overflow: hidden;
cursor: pointer;
}
.view-box img {
border: 1px solid #cecece;
}
.view-box.selected {
border-color: #7274A7;
}
.button-container {
margin-bottom: 20px;
text-align: center;
}
.button-container a {
display: inline-block;
width: 100px;
height: 25px;
line-height: 25px;
border: 1px solid #c2ccd1;
margin-right: 30px;
text-decoration: none;
color: black;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
}
.button-container a:HOVER {
background: #fcfcfc;
}
.button-container a:ACTIVE {
border-top-color: #c2ccd1;
box-shadow:inset 0 5px 4px -4px rgba(49, 49, 64, 0.1);
}
.edui-charts-not-data {
height: 100px;
line-height: 100px;
text-align: center;
}
+89
View File
@@ -0,0 +1,89 @@
<!DOCTYPE html>
<html>
<head>
<title>chart</title>
<meta chartset="utf-8">
<link rel="stylesheet" type="text/css" href="charts.css">
<script type="text/javascript" src="../internal.js"></script>
</head>
<body>
<div class="main">
<div class="table-view">
<h3><var id="lang_data_source"></var></h3>
<div id="tableContainer" class="table-container"></div>
<h3><var id="lang_chart_format"></var></h3>
<form name="data-form">
<div class="charts-format">
<fieldset>
<legend><var id="lang_data_align"></var></legend>
<div class="format-item-container">
<label>
<input type="radio" class="format-ctrl not-pie-item" name="charts-format" value="1" checked="checked">
<var id="lang_chart_align_same"></var>
</label>
<label>
<input type="radio" class="format-ctrl not-pie-item" name="charts-format" value="-1">
<var id="lang_chart_align_reverse"></var>
</label>
<br>
</div>
</fieldset>
<fieldset>
<legend><var id="lang_chart_title"></var></legend>
<div class="format-item-container">
<label>
<var id="lang_chart_main_title"></var><input type="text" name="title" class="data-item">
</label>
<label>
<var id="lang_chart_sub_title"></var><input type="text" name="sub-title" class="data-item not-pie-item">
</label>
<label>
<var id="lang_chart_x_title"></var><input type="text" name="x-title" class="data-item not-pie-item">
</label>
<label>
<var id="lang_chart_y_title"></var><input type="text" name="y-title" class="data-item not-pie-item">
</label>
</div>
</fieldset>
<fieldset>
<legend><var id="lang_chart_tip"></var></legend>
<div class="format-item-container">
<label>
<var id="lang_cahrt_tip_prefix"></var>
<input type="text" id="tipInput" name="tip" class="data-item" disabled="disabled">
</label>
<p><var id="lang_cahrt_tip_description"></var></p>
</div>
</fieldset>
<fieldset>
<legend><var id="lang_chart_data_unit"></var></legend>
<div class="format-item-container">
<label><var id="lang_chart_data_unit_title"></var><input type="text" name="unit" class="data-item"></label>
<p><var id="lang_chart_data_unit_description"></var></p>
</div>
</fieldset>
</div>
</form>
</div>
<div class="charts-view">
<div id="chartsContainer" class="charts-container"></div>
<div id="chartsType" class="charts-type">
<h3><var id="lang_chart_type"></var></h3>
<div class="scroll-view">
<div class="scroll-container">
<div id="scrollBed" class="scroll-bed"></div>
</div>
<div id="buttonContainer" class="button-container">
<a href="#" data-title="prev"><var id="lang_prev_btn"></var></a>
<a href="#" data-title="next"><var id="lang_next_btn"></var></a>
</div>
</div>
</div>
</div>
</div>
<script src="../../third-party/jquery-1.10.2.min.js"></script>
<script src="../../third-party/highcharts/highcharts.js"></script>
<script src="chart.config.js"></script>
<script src="charts.js"></script>
</body>
</html>
+519
View File
@@ -0,0 +1,519 @@
/*
* 图片转换对话框脚本
**/
var tableData = [],
//编辑器页面table
editorTable = null,
chartsConfig = window.typeConfig,
resizeTimer = null,
//初始默认图表类型
currentChartType = 0;
window.onload = function () {
editorTable = domUtils.findParentByTagName( editor.selection.getRange().startContainer, 'table', true);
//未找到表格, 显示错误页面
if ( !editorTable ) {
document.body.innerHTML = "<div class='edui-charts-not-data'>未找到数据</div>";
return;
}
//初始化图表类型选择
initChartsTypeView();
renderTable( editorTable );
initEvent();
initUserConfig( editorTable.getAttribute( "data-chart" ) );
$( "#scrollBed .view-box:eq("+ currentChartType +")" ).trigger( "click" );
updateViewType( currentChartType );
dialog.addListener( "resize", function () {
if ( resizeTimer != null ) {
window.clearTimeout( resizeTimer );
}
resizeTimer = window.setTimeout( function () {
resizeTimer = null;
renderCharts();
}, 500 );
} );
};
function initChartsTypeView () {
var contents = [];
for ( var i = 0, len = chartsConfig.length; i<len; i++ ) {
contents.push( '<div class="view-box" data-chart-type="'+ i +'"><img width="300" src="images/charts'+ i +'.png"></div>' );
}
$( "#scrollBed" ).html( contents.join( "" ) );
}
//渲染table, 以便用户修改数据
function renderTable ( table ) {
var tableHtml = [];
//构造数据
for ( var i = 0, row; row = table.rows[ i ]; i++ ) {
tableData[ i ] = [];
tableHtml[ i ] = [];
for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) {
var value = getCellValue( cell );
if ( i > 0 && j > 0 ) {
value = +value;
}
if ( i === 0 || j === 0 ) {
tableHtml[ i ].push( '<th>'+ value +'</th>' );
} else {
tableHtml[ i ].push( '<td><input type="text" class="data-item" value="'+ value +'"></td>' );
}
tableData[ i ][ j ] = value;
}
tableHtml[ i ] = tableHtml[ i ].join( "" );
}
//draw 表格
$( "#tableContainer" ).html( '<table id="showTable" border="1"><tbody><tr>'+ tableHtml.join( "</tr><tr>" ) +'</tr></tbody></table>' );
}
/*
* 根据表格已有的图表属性初始化当前图表属性
*/
function initUserConfig ( config ) {
var parsedConfig = {};
if ( !config ) {
return;
}
config = config.split( ";" );
$.each( config, function ( index, item ) {
item = item.split( ":" );
parsedConfig[ item[ 0 ] ] = item[ 1 ];
} );
setUserConfig( parsedConfig );
}
function initEvent () {
var cacheValue = null,
//图表类型数
typeViewCount = chartsConfig.length- 1,
$chartsTypeViewBox = $( '#scrollBed .view-box' );
$( ".charts-format" ).delegate( ".format-ctrl", "change", function () {
renderCharts();
} )
$( ".table-view" ).delegate( ".data-item", "focus", function () {
cacheValue = this.value;
} ).delegate( ".data-item", "blur", function () {
if ( this.value !== cacheValue ) {
renderCharts();
}
cacheValue = null;
} );
$( "#buttonContainer" ).delegate( "a", "click", function (e) {
e.preventDefault();
if ( this.getAttribute( "data-title" ) === 'prev' ) {
if ( currentChartType > 0 ) {
currentChartType--;
updateViewType( currentChartType );
}
} else {
if ( currentChartType < typeViewCount ) {
currentChartType++;
updateViewType( currentChartType );
}
}
} );
//图表类型变化
$( '#scrollBed' ).delegate( ".view-box", "click", function (e) {
var index = $( this ).attr( "data-chart-type" );
$chartsTypeViewBox.removeClass( "selected" );
$( $chartsTypeViewBox[ index ] ).addClass( "selected" );
currentChartType = index | 0;
//饼图, 禁用部分配置
if ( currentChartType === chartsConfig.length - 1 ) {
disableNotPieConfig();
//启用完整配置
} else {
enableNotPieConfig();
}
renderCharts();
} );
}
function renderCharts () {
var data = collectData();
$('#chartsContainer').highcharts( $.extend( {}, chartsConfig[ currentChartType ], {
credits: {
enabled: false
},
exporting: {
enabled: false
},
title: {
text: data.title,
x: -20 //center
},
subtitle: {
text: data.subTitle,
x: -20
},
xAxis: {
title: {
text: data.xTitle
},
categories: data.categories
},
yAxis: {
title: {
text: data.yTitle
},
plotLines: [{
value: 0,
width: 1,
color: '#808080'
}]
},
tooltip: {
enabled: true,
valueSuffix: data.suffix
},
legend: {
layout: 'vertical',
align: 'right',
verticalAlign: 'middle',
borderWidth: 1
},
series: data.series
} ));
}
function updateViewType ( index ) {
$( "#scrollBed" ).css( 'marginLeft', -index*324+'px' );
}
function collectData () {
var form = document.forms[ 'data-form' ],
data = null;
if ( currentChartType !== chartsConfig.length - 1 ) {
data = getSeriesAndCategories();
$.extend( data, getUserConfig() );
//饼图数据格式
} else {
data = getSeriesForPieChart();
data.title = form[ 'title' ].value;
data.suffix = form[ 'unit' ].value;
}
return data;
}
/**
* 获取用户配置信息
*/
function getUserConfig () {
var form = document.forms[ 'data-form' ],
info = {
title: form[ 'title' ].value,
subTitle: form[ 'sub-title' ].value,
xTitle: form[ 'x-title' ].value,
yTitle: form[ 'y-title' ].value,
suffix: form[ 'unit' ].value,
//数据对齐方式
tableDataFormat: getTableDataFormat (),
//饼图提示文字
tip: $( "#tipInput" ).val()
};
return info;
}
function setUserConfig ( config ) {
var form = document.forms[ 'data-form' ];
config.title && ( form[ 'title' ].value = config.title );
config.subTitle && ( form[ 'sub-title' ].value = config.subTitle );
config.xTitle && ( form[ 'x-title' ].value = config.xTitle );
config.yTitle && ( form[ 'y-title' ].value = config.yTitle );
config.suffix && ( form[ 'unit' ].value = config.suffix );
config.dataFormat == "-1" && ( form[ 'charts-format' ][ 1 ].checked = true );
config.tip && ( form[ 'tip' ].value = config.tip );
currentChartType = config.chartType || 0;
}
function getSeriesAndCategories () {
var form = document.forms[ 'data-form' ],
series = [],
categories = [],
tmp = [],
tableData = getTableData();
//反转数据
if ( getTableDataFormat() === "-1" ) {
for ( var i = 0, len = tableData.length; i < len; i++ ) {
for ( var j = 0, jlen = tableData[ i ].length; j < jlen; j++ ) {
if ( !tmp[ j ] ) {
tmp[ j ] = [];
}
tmp[ j ][ i ] = tableData[ i ][ j ];
}
}
tableData = tmp;
}
categories = tableData[0].slice( 1 );
for ( var i = 1, data; data = tableData[ i ]; i++ ) {
series.push( {
name: data[ 0 ],
data: data.slice( 1 )
} );
}
return {
series: series,
categories: categories
};
}
/*
* 获取数据源数据对齐方式
*/
function getTableDataFormat () {
var form = document.forms[ 'data-form' ],
items = form['charts-format'];
return items[ 0 ].checked ? items[ 0 ].value : items[ 1 ].value;
}
/*
* 禁用非饼图类型的配置项
*/
function disableNotPieConfig() {
updateConfigItem( 'disable' );
}
/*
* 启用非饼图类型的配置项
*/
function enableNotPieConfig() {
updateConfigItem( 'enable' );
}
function updateConfigItem ( value ) {
var table = $( "#showTable" )[ 0 ],
isDisable = value === 'disable' ? true : false;
//table中的input处理
for ( var i = 2 , row; row = table.rows[ i ]; i++ ) {
for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {
$( "input", cell ).attr( "disabled", isDisable );
}
}
//其他项处理
$( "input.not-pie-item" ).attr( "disabled", isDisable );
$( "#tipInput" ).attr( "disabled", !isDisable )
}
/*
* 获取饼图数据
* 饼图的数据只取第一行的
**/
function getSeriesForPieChart () {
var series = {
type: 'pie',
name: $("#tipInput").val(),
data: []
},
tableData = getTableData();
for ( var j = 1, jlen = tableData[ 0 ].length; j < jlen; j++ ) {
var title = tableData[ 0 ][ j ],
val = tableData[ 1 ][ j ];
series.data.push( [ title, val ] );
}
return {
series: [ series ]
};
}
function getTableData () {
var table = document.getElementById( "showTable" ),
xCount = table.rows[0].cells.length - 1,
values = getTableInputValue();
for ( var i = 0, value; value = values[ i ]; i++ ) {
tableData[ Math.floor( i / xCount ) + 1 ][ i % xCount + 1 ] = values[ i ];
}
return tableData;
}
function getTableInputValue () {
var table = document.getElementById( "showTable" ),
inputs = table.getElementsByTagName( "input" ),
values = [];
for ( var i = 0, input; input = inputs[ i ]; i++ ) {
values.push( input.value | 0 );
}
return values;
}
function getCellValue ( cell ) {
var value = utils.trim( ( cell.innerText || cell.textContent || '' ) );
return value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\s+|\s+$/g, '' );
}
//dialog确认事件
dialog.onok = function () {
//收集信息
var form = document.forms[ 'data-form' ],
info = getUserConfig();
//添加图表类型
info.chartType = currentChartType;
//同步表格数据到编辑器
syncTableData();
//执行图表命令
editor.execCommand( 'charts', info );
};
/*
* 同步图表编辑视图的表格数据到编辑器里的原始表格
*/
function syncTableData () {
var tableData = getTableData();
for ( var i = 1, row; row = editorTable.rows[ i ]; i++ ) {
for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) {
cell.innerHTML = tableData[ i ] [ j ];
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

@@ -0,0 +1,43 @@
.jd img{
background:transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
}
.pp img{
background:transparent url(images/fface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:25px;height:25px;display:block;
}
.ldw img{
background:transparent url(images/wface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
}
.tsj img{
background:transparent url(images/tface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
}
.cat img{
background:transparent url(images/cface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
}
.bb img{
background:transparent url(images/bface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
}
.youa img{
background:transparent url(images/yface.gif?v=1.1) no-repeat scroll left top;
cursor:pointer;width:35px;height:35px;display:block;
}
.smileytable td {height: 37px;}
#tabPanel{margin-left:5px;overflow: hidden;}
#tabContent {float:left;background:#FFFFFF;}
#tabContent div{display: none;width:480px;overflow:hidden;}
#tabIconReview.show{left:17px;display:block;}
.menuFocus{background:#ACCD3C;}
.menuDefault{background:#FFFFFF;}
#tabIconReview{position:absolute;left:406px;left:398px \9;top:41px;z-index:65533;width:90px;height:76px;}
img.review{width:90px;height:76px;border:2px solid #9cb945;background:#FFFFFF;background-position:center;background-repeat:no-repeat;}
.wrapper .tabbody{position:relative;float:left;clear:both;padding:10px;width: 95%;}
.tabbody table{width: 100%;}
.tabbody td{border:1px solid #BAC498;}
.tabbody td span{display: block;zoom:1;padding:0 4px;}
@@ -0,0 +1,54 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="robots" content="noindex, nofollow"/>
<script type="text/javascript" src="../internal.js"></script>
<link rel="stylesheet" type="text/css" href="emotion.css">
</head>
<body>
<div id="tabPanel" class="wrapper">
<div id="tabHeads" class="tabhead">
<span><var id="lang_input_choice"></var></span>
<span><var id="lang_input_Tuzki"></var></span>
<span><var id="lang_input_lvdouwa"></var></span>
<span><var id="lang_input_BOBO"></var></span>
<span><var id="lang_input_babyCat"></var></span>
<span><var id="lang_input_bubble"></var></span>
<span><var id="lang_input_youa"></var></span>
</div>
<div id="tabBodys" class="tabbody">
<div id="tab0"></div>
<div id="tab1"></div>
<div id="tab2"></div>
<div id="tab3"></div>
<div id="tab4"></div>
<div id="tab5"></div>
<div id="tab6"></div>
</div>
</div>
<div id="tabIconReview">
<img id='faceReview' class='review' src="../../themes/default/images/spacer.gif"/>
</div>
<script type="text/javascript" src="emotion.js"></script>
<script type="text/javascript">
var emotion = {
tabNum:7, //切换面板数量
SmilmgName:{ tab0:['j_00', 84], tab1:['t_00', 40], tab2:['w_00', 52], tab3:['B_00', 63], tab4:['C_00', 20], tab5:['i_f', 50], tab6:['y_00', 40] }, //图片前缀名
imageFolders:{ tab0:'jx2/', tab1:'tsj/', tab2:'ldw/', tab3:'bobo/', tab4:'babycat/', tab5:'face/', tab6:'youa/'}, //图片对应文件夹路径
imageCss:{tab0:'jd', tab1:'tsj', tab2:'ldw', tab3:'bb', tab4:'cat', tab5:'pp', tab6:'youa'}, //图片css类名
imageCssOffset:{tab0:35, tab1:35, tab2:35, tab3:35, tab4:35, tab5:25, tab6:35}, //图片偏移
SmileyInfor:{
tab0:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '打酱油', '俯卧撑', '气愤', '?', '吻', '怒', '胜利', 'HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '微笑', '亲吻', '调皮', '惊恐', '耍酷', '发火', '害羞', '汗水', '大哭', '', '加油', '困', '你NB', '晕倒', '开心', '偷笑', '大哭', '滴汗', '叹气', '超赞', '??', '飞吻', '天使', '撒花', '生气', '被砸', '吓傻', '随意吐'],
tab1:['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '摊手', '睡觉', '瘫坐', '无聊', '星星闪', '旋转', '也不行', '郁闷', '正Music', '抓墙', '撞墙至死', '歪头', '戳眼', '飘过', '互相拍砖', '砍死你', '扔桌子', '少林寺', '什么?', '转头', '我爱牛奶', '我踢', '摇晃', '晕厥', '在笼子里', '震荡'],
tab2:['大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '我错了', 'money', '气愤', '挑逗', '吻', '怒', '胜利', '委屈', '受伤', '说啥呢?', '闭嘴', '不', '逗你玩儿', '飞吻', '眩晕', '魔法', '我来了', '睡了', '我打', '闭嘴', '打', '打晕了', '刷牙', '爆揍', '炸弹', '倒立', '刮胡子', '邪恶的笑', '不要不要', '爱恋中', '放大仔细看', '偷窥', '超高兴', '晕', '松口气', '我跑', '享受', '修养', '哭', '汗', '啊~', '热烈欢迎', '打酱油', '俯卧撑', '?'],
tab3:['HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '泪眼', '流泪', '生气', '吐舌', '喜欢', '旋转', '再见', '抓狂', '汗', '鄙视', '拜', '吐血', '嘘', '打人', '蹦跳', '变脸', '扯肉', '吃To', '吃花', '吹泡泡糖', '大变身', '飞天舞', '回眸', '可怜', '猛抽', '泡泡', '苹果', '亲', '', '骚舞', '烧香', '睡', '套娃娃', '捅捅', '舞倒', '西红柿', '爱慕', '摇', '摇摆', '杂耍', '招财', '被殴', '被球闷', '大惊', '理想', '欧打', '呕吐', '碎', '吐痰'],
tab4:['发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '顶', '幸运', '爱心', '躲', '送花', '选择'],
tab5:['微笑', '亲吻', '调皮', '惊讶', '耍酷', '发火', '害羞', '汗水', '大哭', '得意', '鄙视', '困', '夸奖', '晕倒', '疑问', '媒婆', '狂吐', '青蛙', '发愁', '亲吻', '', '爱心', '心碎', '玫瑰', '礼物', '哭', '奸笑', '可爱', '得意', '呲牙', '暴汗', '楚楚可怜', '困', '哭', '生气', '惊讶', '口水', '彩虹', '夜空', '太阳', '钱钱', '灯泡', '咖啡', '蛋糕', '音乐', '爱', '胜利', '赞', '鄙视', 'OK'],
tab6:['男兜', '女兜', '开心', '乖乖', '偷笑', '大笑', '抽泣', '大哭', '无奈', '滴汗', '叹气', '狂晕', '委屈', '超赞', '??', '疑问', '飞吻', '天使', '撒花', '生气', '被砸', '口水', '泪奔', '吓傻', '吐舌头', '点头', '随意吐', '旋转', '困困', '鄙视', '狂顶', '篮球', '再见', '欢迎光临', '恭喜发财', '稍等', '我在线', '恕不议价', '库房有货', '货在路上']
}
};
</script>
</body>
</html>
+186
View File
@@ -0,0 +1,186 @@
window.onload = function () {
editor.setOpt({
emotionLocalization:false
});
emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "http://img.baidu.com/hi/";
emotion.SmileyBox = createTabList( emotion.tabNum );
emotion.tabExist = createArr( emotion.tabNum );
initImgName();
initEvtHandler( "tabHeads" );
};
function initImgName() {
for ( var pro in emotion.SmilmgName ) {
var tempName = emotion.SmilmgName[pro],
tempBox = emotion.SmileyBox[pro],
tempStr = "";
if ( tempBox.length ) return;
for ( var i = 1; i <= tempName[1]; i++ ) {
tempStr = tempName[0];
if ( i < 10 ) tempStr = tempStr + '0';
tempStr = tempStr + i + '.gif';
tempBox.push( tempStr );
}
}
}
function initEvtHandler( conId ) {
var tabHeads = $G( conId );
for ( var i = 0, j = 0; i < tabHeads.childNodes.length; i++ ) {
var tabObj = tabHeads.childNodes[i];
if ( tabObj.nodeType == 1 ) {
domUtils.on( tabObj, "click", (function ( index ) {
return function () {
switchTab( index );
};
})( j ) );
j++;
}
}
switchTab( 0 );
$G( "tabIconReview" ).style.display = 'none';
}
function InsertSmiley( url, evt ) {
var obj = {
src:editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url
};
obj._src = obj.src;
editor.execCommand( 'insertimage', obj );
if ( !evt.ctrlKey ) {
dialog.popup.hide();
}
}
function switchTab( index ) {
autoHeight( index );
if ( emotion.tabExist[index] == 0 ) {
emotion.tabExist[index] = 1;
createTab( 'tab' + index );
}
//获取呈现元素句柄数组
var tabHeads = $G( "tabHeads" ).getElementsByTagName( "span" ),
tabBodys = $G( "tabBodys" ).getElementsByTagName( "div" ),
i = 0, L = tabHeads.length;
//隐藏所有呈现元素
for ( ; i < L; i++ ) {
tabHeads[i].className = "";
tabBodys[i].style.display = "none";
}
//显示对应呈现元素
tabHeads[index].className = "focus";
tabBodys[index].style.display = "block";
}
function autoHeight( index ) {
var iframe = dialog.getDom( "iframe" ),
parent = iframe.parentNode.parentNode;
switch ( index ) {
case 0:
iframe.style.height = "380px";
parent.style.height = "392px";
break;
case 1:
iframe.style.height = "220px";
parent.style.height = "232px";
break;
case 2:
iframe.style.height = "260px";
parent.style.height = "272px";
break;
case 3:
iframe.style.height = "300px";
parent.style.height = "312px";
break;
case 4:
iframe.style.height = "140px";
parent.style.height = "152px";
break;
case 5:
iframe.style.height = "260px";
parent.style.height = "272px";
break;
case 6:
iframe.style.height = "230px";
parent.style.height = "242px";
break;
default:
}
}
function createTab( tabName ) {
var faceVersion = "?v=1.1", //版本号
tab = $G( tabName ), //获取将要生成的Div句柄
imagePath = emotion.SmileyPath + emotion.imageFolders[tabName], //获取显示表情和预览表情的路径
positionLine = 11 / 2, //中间数
iWidth = iHeight = 35, //图片长宽
iColWidth = 3, //表格剩余空间的显示比例
tableCss = emotion.imageCss[tabName],
cssOffset = emotion.imageCssOffset[tabName],
textHTML = ['<table class="smileytable">'],
i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage,
sUrl, realUrl, posflag, offset, infor;
for ( ; i < imgNum; ) {
textHTML.push( '<tr>' );
for ( var j = 0; j < imgColNum; j++, i++ ) {
faceImage = emotion.SmileyBox[tabName][i];
if ( faceImage ) {
sUrl = imagePath + faceImage + faceVersion;
realUrl = imagePath + faceImage;
posflag = j < positionLine ? 0 : 1;
offset = cssOffset * i * (-1) - 1;
infor = emotion.SmileyInfor[tabName][i];
textHTML.push( '<td class="' + tableCss + '" border="1" width="' + iColWidth + '%" style="border-collapse:collapse;" align="center" bgcolor="transparent" onclick="InsertSmiley(\'' + realUrl.replace( /'/g, "\\'" ) + '\',event)" onmouseover="over(this,\'' + sUrl + '\',\'' + posflag + '\')" onmouseout="out(this)">' );
textHTML.push( '<span>' );
textHTML.push( '<img style="background-position:left ' + offset + 'px;" title="' + infor + '" src="' + emotion.SmileyPath + (editor.options.emotionLocalization ? '0.gif" width="' : 'default/0.gif" width="') + iWidth + '" height="' + iHeight + '"></img>' );
textHTML.push( '</span>' );
} else {
textHTML.push( '<td width="' + iColWidth + '%" bgcolor="#FFFFFF">' );
}
textHTML.push( '</td>' );
}
textHTML.push( '</tr>' );
}
textHTML.push( '</table>' );
textHTML = textHTML.join( "" );
tab.innerHTML = textHTML;
}
function over( td, srcPath, posFlag ) {
td.style.backgroundColor = "#ACCD3C";
$G( 'faceReview' ).style.backgroundImage = "url(" + srcPath + ")";
if ( posFlag == 1 ) $G( "tabIconReview" ).className = "show";
$G( "tabIconReview" ).style.display = 'block';
}
function out( td ) {
td.style.backgroundColor = "transparent";
var tabIconRevew = $G( "tabIconReview" );
tabIconRevew.className = "";
tabIconRevew.style.display = 'none';
}
function createTabList( tabNum ) {
var obj = {};
for ( var i = 0; i < tabNum; i++ ) {
obj["tab" + i] = [];
}
return obj;
}
function createArr( tabNum ) {
var arr = [];
for ( var i = 0; i < tabNum; i++ ) {
arr[i] = 0;
}
return arr;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 43 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

+89
View File
@@ -0,0 +1,89 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script type="text/javascript" src="../internal.js"></script>
<style type="text/css">
.content{width:530px; height: 350px;margin: 10px auto;}
.content table{width: 100%}
.content table td{vertical-align: middle;}
#address{width:220px;height:21px;background: #FFF;border:1px solid #d7d7d7; line-height: 21px;}
</style>
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
</head>
<body>
<div class="content">
<table>
<tr>
<td><label for="address"><var id="lang_input_address"></var></label></td>
<td><input id="address" type="text" /></td>
<td><a id="doSearch" href="javascript:void(0)" class="button"><var id="lang_input_search"></var></a></td>
</tr>
</table>
<div id="container" style="width: 100%; height: 340px;margin: 5px auto; border: 1px solid gray;"></div>
</div>
<script type="text/javascript">
domUtils.on(window,"load",function(){
var map = new google.maps.Map(document.getElementById('container'), {
zoom: 3,
streetViewControl: false,
scaleControl: true,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var imgcss;
var marker = new google.maps.Marker({
map: map,
draggable: true
});
function doSearch(){
var address = document.getElementById('address').value;
var geocoder = new google.maps.Geocoder();
geocoder.geocode( { 'address': address}, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var bounds = results[0].geometry.viewport;
map.fitBounds(bounds);
marker.setPosition(results[0].geometry.location);
marker.setTitle(address);
} else alert(lang.searchError);
});
}
$G('address').onkeydown = function (evt){
evt = evt || event;
if (evt.keyCode == 13) {
doSearch();
}
};
$G("doSearch").onclick = doSearch;
dialog.onok = function (){
var center = map.getCenter();
var point = marker.getPosition();
var url = "http://maps.googleapis.com/maps/api/staticmap?center=" + center.lat() + ',' + center.lng() + "&zoom=" + map.zoom + "&size=520x340&maptype=" + map.getMapTypeId() + "&markers=" + point.lat() + ',' + point.lng() + "&sensor=false";
editor.execCommand('inserthtml', '<img width="520" height="340" src="' + url + '"' + (imgcss ? ' style="' + imgcss + '"' :'') + '/>');
};
function getPars(str,par){
var reg = new RegExp(par+"=((\\d+|[.,])*)","g");
return reg.exec(str)[1];
}
var img = editor.selection.getRange().getClosedNode();
if(img && img.src.indexOf("http://maps.googleapis.com/maps/api/staticmap")!=-1){
var url = img.getAttribute("src");
var centers = getPars(url,"center").split(",");
point = new google.maps.LatLng(Number(centers[0]),Number(centers[1]));
map.setCenter(point);
map.setZoom(Number(getPars(url,"zoom")));
centers = getPars(url,"markers").split(",");
marker.setPosition(new google.maps.LatLng(Number(centers[0]),Number(centers[1])));
imgcss = img.style.cssText;
}else{
setTimeout(function(){
doSearch();
},30)
}
});
</script>
</body>
</html>
+7
View File
@@ -0,0 +1,7 @@
.wrapper{width: 370px;margin: 10px auto;zoom: 1;}
.tabbody{height: 360px;}
.tabbody .panel{width:100%;height: 360px;position: absolute;background: #fff;}
.tabbody .panel h1{font-size:26px;margin: 5px 0 0 5px;}
.tabbody .panel p{font-size:12px;margin: 5px 0 0 5px;}
.tabbody table{width:90%;line-height: 20px;margin: 5px 0 0 5px;;}
.tabbody table thead{font-weight: bold;line-height: 25px;}
+82
View File
@@ -0,0 +1,82 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>帮助</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<script type="text/javascript" src="../internal.js"></script>
<link rel="stylesheet" type="text/css" href="help.css">
</head>
<body>
<div class="wrapper" id="helptab">
<div id="tabHeads" class="tabhead">
<span class="focus" tabsrc="about"><var id="lang_input_about"></var></span>
<span tabsrc="shortcuts"><var id="lang_input_shortcuts"></var></span>
</div>
<div id="tabBodys" class="tabbody">
<div id="about" class="panel">
<h1>UEditor</h1>
<p id="version"></p>
<p><var id="lang_input_introduction"></var></p>
</div>
<div id="shortcuts" class="panel">
<table>
<thead>
<tr>
<td><var id="lang_Txt_shortcuts"></var></td>
<td><var id="lang_Txt_func"></var></td>
</tr>
</thead>
<tbody>
<tr>
<td>ctrl+b</td>
<td><var id="lang_Txt_bold"></var></td>
</tr>
<tr>
<td>ctrl+c</td>
<td><var id="lang_Txt_copy"></var></td>
</tr>
<tr>
<td>ctrl+x</td>
<td><var id="lang_Txt_cut"></var></td>
</tr>
<tr>
<td>ctrl+v</td>
<td><var id="lang_Txt_Paste"></var></td>
</tr>
<tr>
<td>ctrl+y</td>
<td><var id="lang_Txt_undo"></var></td>
</tr>
<tr>
<td>ctrl+z</td>
<td><var id="lang_Txt_redo"></var></td>
</tr>
<tr>
<td>ctrl+i</td>
<td><var id="lang_Txt_italic"></var></td>
</tr>
<tr>
<td>ctrl+u</td>
<td><var id="lang_Txt_underline"></var></td>
</tr>
<tr>
<td>ctrl+a</td>
<td><var id="lang_Txt_selectAll"></var></td>
</tr>
<tr>
<td>shift+enter</td>
<td><var id="lang_Txt_visualEnter"></var></td>
</tr>
<tr>
<td>alt+z</td>
<td><var id="lang_Txt_fullscreen"></var></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<script type="text/javascript" src="help.js"></script>
</body>
</html>
+56
View File
@@ -0,0 +1,56 @@
/**
* Created with JetBrains PhpStorm.
* User: xuheng
* Date: 12-9-26
* Time: 下午1:06
* To change this template use File | Settings | File Templates.
*/
/**
* tab点击处理事件
* @param tabHeads
* @param tabBodys
* @param obj
*/
function clickHandler( tabHeads,tabBodys,obj ) {
//head样式更改
for ( var k = 0, len = tabHeads.length; k < len; k++ ) {
tabHeads[k].className = "";
}
obj.className = "focus";
//body显隐
var tabSrc = obj.getAttribute( "tabSrc" );
for ( var j = 0, length = tabBodys.length; j < length; j++ ) {
var body = tabBodys[j],
id = body.getAttribute( "id" );
body.onclick = function(){
this.style.zoom = 1;
};
if ( id != tabSrc ) {
body.style.zIndex = 1;
} else {
body.style.zIndex = 200;
}
}
}
/**
* TAB切换
* @param tabParentId tab的父节点ID或者对象本身
*/
function switchTab( tabParentId ) {
var tabElements = $G( tabParentId ).children,
tabHeads = tabElements[0].children,
tabBodys = tabElements[1].children;
for ( var i = 0, length = tabHeads.length; i < length; i++ ) {
var head = tabHeads[i];
if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head );
head.onclick = function () {
clickHandler(tabHeads,tabBodys,this);
}
}
}
switchTab("helptab");
document.getElementById('version').innerHTML = parent.UE.version;
+894
View File
@@ -0,0 +1,894 @@
@charset "utf-8";
/* dialog样式 */
.wrapper {
zoom: 1;
width: 630px;
*width: 626px;
height: 380px;
margin: 0 auto;
padding: 10px;
position: relative;
font-family: sans-serif;
}
/*tab样式框大小*/
.tabhead {
float:left;
}
.tabbody {
width: 100%;
height: 346px;
position: relative;
clear: both;
}
.tabbody .panel {
position: absolute;
width: 0;
height: 0;
background: #fff;
overflow: hidden;
display: none;
}
.tabbody .panel.focus {
width: 100%;
height: 346px;
display: block;
}
/* 图片对齐方式 */
.alignBar{
float:right;
margin-top: 5px;
position: relative;
}
.alignBar .algnLabel{
float:left;
height: 20px;
line-height: 20px;
}
.alignBar #alignIcon{
zoom:1;
_display: inline;
display: inline-block;
position: relative;
}
.alignBar #alignIcon span{
float: left;
cursor: pointer;
display: block;
width: 19px;
height: 17px;
margin-right: 3px;
margin-left: 3px;
background-image: url(./images/alignicon.jpg);
}
.alignBar #alignIcon .none-align{
background-position: 0 -18px;
}
.alignBar #alignIcon .left-align{
background-position: -20px -18px;
}
.alignBar #alignIcon .right-align{
background-position: -40px -18px;
}
.alignBar #alignIcon .center-align{
background-position: -60px -18px;
}
.alignBar #alignIcon .none-align.focus{
background-position: 0 0;
}
.alignBar #alignIcon .left-align.focus{
background-position: -20px 0;
}
.alignBar #alignIcon .right-align.focus{
background-position: -40px 0;
}
.alignBar #alignIcon .center-align.focus{
background-position: -60px 0;
}
/* 远程图片样式 */
#remote {
z-index: 200;
}
#remote .top{
width: 100%;
margin-top: 25px;
}
#remote .left{
display: block;
float: left;
width: 300px;
height:10px;
}
#remote .right{
display: block;
float: right;
width: 300px;
height:10px;
}
#remote .row{
margin-left: 20px;
clear: both;
height: 40px;
}
#remote .row label{
text-align: center;
width: 50px;
zoom:1;
_display: inline;
display:inline-block;
vertical-align: middle;
}
#remote .row label.algnLabel{
float: left;
}
#remote input.text{
width: 150px;
padding: 3px 6px;
font-size: 14px;
line-height: 1.42857143;
color: #555;
background-color: #fff;
background-image: none;
border: 1px solid #ccc;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
}
#remote input.text:focus {
border-color: #66afe9;
outline: 0;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
}
#remote #url{
width: 500px;
margin-bottom: 2px;
}
#remote #width,
#remote #height{
width: 20px;
margin-left: 2px;
margin-right: 2px;
}
#remote #border,
#remote #vhSpace,
#remote #title{
width: 180px;
margin-right: 5px;
}
#remote #lock{
}
#remote #lockicon{
zoom: 1;
_display:inline;
display: inline-block;
width: 20px;
height: 20px;
background: url("../../themes/default/images/lock.gif") -13px -13px no-repeat;
vertical-align: middle;
}
#remote #preview{
clear: both;
width: 260px;
height: 240px;
z-index: 9999;
margin-top: 10px;
background-color: #eee;
overflow: hidden;
}
/* 上传图片 */
.tabbody #upload.panel {
width: 0;
height: 0;
overflow: hidden;
position: absolute !important;
clip: rect(1px, 1px, 1px, 1px);
background: #fff;
display: block;
}
.tabbody #upload.panel.focus {
width: 100%;
height: 346px;
display: block;
clip: auto;
}
#upload .queueList {
margin: 0;
width: 100%;
height: 100%;
position: absolute;
overflow: hidden;
}
#upload p {
margin: 0;
}
.element-invisible {
width: 0 !important;
height: 0 !important;
border: 0;
padding: 0;
margin: 0;
overflow: hidden;
position: absolute !important;
clip: rect(1px, 1px, 1px, 1px);
}
#upload .placeholder {
margin: 10px;
border: 2px dashed #e6e6e6;
*border: 0px dashed #e6e6e6;
height: 172px;
padding-top: 150px;
text-align: center;
background: url(./images/image.png) center 70px no-repeat;
color: #cccccc;
font-size: 18px;
position: relative;
top:0;
*top: 10px;
}
#upload .placeholder .webuploader-pick {
font-size: 18px;
background: #00b7ee;
border-radius: 3px;
line-height: 44px;
padding: 0 30px;
*width: 120px;
color: #fff;
display: inline-block;
margin: 0 auto 20px auto;
cursor: pointer;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
}
#upload .placeholder .webuploader-pick-hover {
background: #00a2d4;
}
#filePickerContainer {
text-align: center;
}
#upload .placeholder .flashTip {
color: #666666;
font-size: 12px;
position: absolute;
width: 100%;
text-align: center;
bottom: 20px;
}
#upload .placeholder .flashTip a {
color: #0785d1;
text-decoration: none;
}
#upload .placeholder .flashTip a:hover {
text-decoration: underline;
}
#upload .placeholder.webuploader-dnd-over {
border-color: #999999;
}
#upload .filelist {
list-style: none;
margin: 0;
padding: 0;
overflow-x: hidden;
overflow-y: auto;
position: relative;
height: 300px;
}
#upload .filelist:after {
content: '';
display: block;
width: 0;
height: 0;
overflow: hidden;
clear: both;
position: relative;
}
#upload .filelist li {
width: 113px;
height: 113px;
background: url(./images/bg.png);
text-align: center;
margin: 9px 0 0 9px;
*margin: 6px 0 0 6px;
position: relative;
display: block;
float: left;
overflow: hidden;
font-size: 12px;
}
#upload .filelist li p.log {
position: relative;
top: -45px;
}
#upload .filelist li p.title {
position: absolute;
top: 0;
left: 0;
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
top: 5px;
text-indent: 5px;
text-align: left;
}
#upload .filelist li p.progress {
position: absolute;
width: 100%;
bottom: 0;
left: 0;
height: 8px;
overflow: hidden;
z-index: 50;
margin: 0;
border-radius: 0;
background: none;
-webkit-box-shadow: 0 0 0;
}
#upload .filelist li p.progress span {
display: none;
overflow: hidden;
width: 0;
height: 100%;
background: #1483d8 url(./images/progress.png) repeat-x;
-webit-transition: width 200ms linear;
-moz-transition: width 200ms linear;
-o-transition: width 200ms linear;
-ms-transition: width 200ms linear;
transition: width 200ms linear;
-webkit-animation: progressmove 2s linear infinite;
-moz-animation: progressmove 2s linear infinite;
-o-animation: progressmove 2s linear infinite;
-ms-animation: progressmove 2s linear infinite;
animation: progressmove 2s linear infinite;
-webkit-transform: translateZ(0);
}
@-webkit-keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
@-moz-keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
@keyframes progressmove {
0% {
background-position: 0 0;
}
100% {
background-position: 17px 0;
}
}
#upload .filelist li p.imgWrap {
position: relative;
z-index: 2;
line-height: 113px;
vertical-align: middle;
overflow: hidden;
width: 113px;
height: 113px;
-webkit-transform-origin: 50% 50%;
-moz-transform-origin: 50% 50%;
-o-transform-origin: 50% 50%;
-ms-transform-origin: 50% 50%;
transform-origin: 50% 50%;
-webit-transition: 200ms ease-out;
-moz-transition: 200ms ease-out;
-o-transition: 200ms ease-out;
-ms-transition: 200ms ease-out;
transition: 200ms ease-out;
}
#upload .filelist li img {
width: 100%;
}
#upload .filelist li p.error {
background: #f43838;
color: #fff;
position: absolute;
bottom: 0;
left: 0;
height: 28px;
line-height: 28px;
width: 100%;
z-index: 100;
display:none;
}
#upload .filelist li .success {
display: block;
position: absolute;
left: 0;
bottom: 0;
height: 40px;
width: 100%;
z-index: 200;
background: url(./images/success.png) no-repeat right bottom;
background: url(./images/success.gif) no-repeat right bottom \9;
}
#upload .filelist li.filePickerBlock {
width: 113px;
height: 113px;
background: url(./images/image.png) no-repeat center 12px;
border: 1px solid #eeeeee;
border-radius: 0;
}
#upload .filelist li.filePickerBlock div.webuploader-pick {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
opacity: 0;
background: none;
font-size: 0;
}
#upload .filelist div.file-panel {
position: absolute;
height: 0;
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0;
background: rgba(0, 0, 0, 0.5);
width: 100%;
top: 0;
left: 0;
overflow: hidden;
z-index: 300;
}
#upload .filelist div.file-panel span {
width: 24px;
height: 24px;
display: inline;
float: right;
text-indent: -9999px;
overflow: hidden;
background: url(./images/icons.png) no-repeat;
background: url(./images/icons.gif) no-repeat \9;
margin: 5px 1px 1px;
cursor: pointer;
-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#upload .filelist div.file-panel span.rotateLeft {
display:none;
background-position: 0 -24px;
}
#upload .filelist div.file-panel span.rotateLeft:hover {
background-position: 0 0;
}
#upload .filelist div.file-panel span.rotateRight {
display:none;
background-position: -24px -24px;
}
#upload .filelist div.file-panel span.rotateRight:hover {
background-position: -24px 0;
}
#upload .filelist div.file-panel span.cancel {
background-position: -48px -24px;
}
#upload .filelist div.file-panel span.cancel:hover {
background-position: -48px 0;
}
#upload .statusBar {
height: 45px;
border-bottom: 1px solid #dadada;
margin: 0 10px;
padding: 0;
line-height: 45px;
vertical-align: middle;
position: relative;
}
#upload .statusBar .progress {
border: 1px solid #1483d8;
width: 198px;
background: #fff;
height: 18px;
position: absolute;
top: 12px;
display: none;
text-align: center;
line-height: 18px;
color: #6dbfff;
margin: 0 10px 0 0;
}
#upload .statusBar .progress span.percentage {
width: 0;
height: 100%;
left: 0;
top: 0;
background: #1483d8;
position: absolute;
}
#upload .statusBar .progress span.text {
position: relative;
z-index: 10;
}
#upload .statusBar .info {
display: inline-block;
font-size: 14px;
color: #666666;
}
#upload .statusBar .btns {
position: absolute;
top: 7px;
right: 0;
line-height: 30px;
}
#filePickerBtn {
display: inline-block;
float: left;
}
#upload .statusBar .btns .webuploader-pick,
#upload .statusBar .btns .uploadBtn,
#upload .statusBar .btns .uploadBtn.state-uploading,
#upload .statusBar .btns .uploadBtn.state-paused {
background: #ffffff;
border: 1px solid #cfcfcf;
color: #565656;
padding: 0 18px;
display: inline-block;
border-radius: 3px;
margin-left: 10px;
cursor: pointer;
font-size: 14px;
float: left;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#upload .statusBar .btns .webuploader-pick-hover,
#upload .statusBar .btns .uploadBtn:hover,
#upload .statusBar .btns .uploadBtn.state-uploading:hover,
#upload .statusBar .btns .uploadBtn.state-paused:hover {
background: #f0f0f0;
}
#upload .statusBar .btns .uploadBtn,
#upload .statusBar .btns .uploadBtn.state-paused{
background: #00b7ee;
color: #fff;
border-color: transparent;
}
#upload .statusBar .btns .uploadBtn:hover,
#upload .statusBar .btns .uploadBtn.state-paused:hover{
background: #00a2d4;
}
#upload .statusBar .btns .uploadBtn.disabled {
pointer-events: none;
filter:alpha(opacity=60);
-moz-opacity:0.6;
-khtml-opacity: 0.6;
opacity: 0.6;
}
/* 图片管理样式 */
#online {
width: 100%;
height: 336px;
padding: 10px 0 0 0;
}
#online #imageList{
width: 100%;
height: 100%;
overflow-x: hidden;
overflow-y: auto;
position: relative;
}
#online ul {
display: block;
list-style: none;
margin: 0;
padding: 0;
}
#online li {
float: left;
display: block;
list-style: none;
padding: 0;
width: 113px;
height: 113px;
margin: 0 0 9px 9px;
*margin: 0 0 6px 6px;
background-color: #eee;
overflow: hidden;
cursor: pointer;
position: relative;
}
#online li.clearFloat {
float: none;
clear: both;
display: block;
width:0;
height:0;
margin: 0;
padding: 0;
}
#online li img {
cursor: pointer;
}
#online li .icon {
cursor: pointer;
width: 113px;
height: 113px;
position: absolute;
top: 0;
left: 0;
z-index: 2;
border: 0;
background-repeat: no-repeat;
}
#online li .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
}
#online li.selected .icon {
background-image: url(images/success.png);
background-image: url(images/success.gif)\9;
background-position: 75px 75px;
}
#online li.selected .icon:hover {
width: 107px;
height: 107px;
border: 3px solid #1094fa;
background-position: 72px 72px;
}
/* 图片搜索样式 */
#search .searchBar {
width: 100%;
height: 30px;
margin: 10px 0 5px 0;
padding: 0;
}
#search input.text{
width: 150px;
padding: 3px 6px;
font-size: 14px;
line-height: 1.42857143;
color: #555;
background-color: #fff;
background-image: none;
border: 1px solid #ccc;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
}
#search input.text:focus {
border-color: #66afe9;
outline: 0;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
}
#search input.searchTxt {
margin-left:5px;
padding-left: 5px;
background: #FFF;
width: 300px;
*width: 260px;
height: 21px;
line-height: 21px;
float: left;
dislay: block;
}
#search .searchType {
width: 65px;
height: 28px;
padding:0;
line-height: 28px;
border: 1px solid #d7d7d7;
border-radius: 0;
vertical-align: top;
margin-left: 5px;
float: left;
dislay: block;
}
#search #searchBtn,
#search #searchReset {
display: inline-block;
margin-bottom: 0;
margin-right: 5px;
padding: 4px 10px;
font-weight: 400;
text-align: center;
vertical-align: middle;
cursor: pointer;
background-image: none;
border: 1px solid transparent;
white-space: nowrap;
font-size: 14px;
border-radius: 4px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
vertical-align: top;
float: right;
}
#search #searchBtn {
color: white;
border-color: #285e8e;
background-color: #3b97d7;
}
#search #searchReset {
color: #333;
border-color: #ccc;
background-color: #fff;
}
#search #searchBtn:hover {
background-color: #3276b1;
}
#search #searchReset:hover {
background-color: #eee;
}
#search .msg {
margin-left: 5px;
}
#search .searchList{
width: 100%;
height: 300px;
overflow: hidden;
clear: both;
}
#search .searchList ul{
margin:0;
padding:0;
list-style:none;
clear: both;
width: 100%;
height: 100%;
overflow-x: hidden;
overflow-y: auto;
zoom: 1;
position: relative;
}
#search .searchList li {
list-style:none;
float: left;
display: block;
width: 115px;
margin: 5px 10px 5px 20px;
*margin: 5px 10px 5px 15px;
padding:0;
font-size: 12px;
box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
-moz-box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
position: relative;
vertical-align: top;
text-align: center;
overflow: hidden;
cursor: pointer;
filter: alpha(Opacity=100);
-moz-opacity: 1;
opacity: 1;
border: 2px solid #eee;
}
#search .searchList li.selected {
filter: alpha(Opacity=40);
-moz-opacity: 0.4;
opacity: 0.4;
border: 2px solid #00a0e9;
}
#search .searchList li p {
background-color: #eee;
margin: 0;
padding: 0;
position: relative;
width:100%;
height:115px;
overflow: hidden;
}
#search .searchList li p img {
cursor: pointer;
border: 0;
}
#search .searchList li a {
color: #999;
border-top: 1px solid #F2F2F2;
background: #FAFAFA;
text-align: center;
display: block;
padding: 0 5px;
width: 105px;
height:32px;
line-height:32px;
white-space:nowrap;
text-overflow:ellipsis;
text-decoration: none;
overflow: hidden;
word-break: break-all;
}
#search .searchList a:hover {
text-decoration: underline;
color: #333;
}
#search .searchList .clearFloat{
clear: both;
}
+120
View File
@@ -0,0 +1,120 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>ueditor图片对话框</title>
<script type="text/javascript" src="../internal.js"></script>
<!-- jquery -->
<script type="text/javascript" src="../../third-party/jquery-1.10.2.min.js"></script>
<!-- webuploader -->
<script src="../../third-party/webuploader/webuploader.min.js"></script>
<link rel="stylesheet" type="text/css" href="../../third-party/webuploader/webuploader.css">
<!-- image dialog -->
<link rel="stylesheet" href="image.css" type="text/css" />
</head>
<body>
<div class="wrapper">
<div id="tabhead" class="tabhead">
<span class="tab" data-content-id="remote"><var id="lang_tab_remote"></var></span>
<span class="tab focus" data-content-id="upload"><var id="lang_tab_upload"></var></span>
<span class="tab" data-content-id="online"><var id="lang_tab_online"></var></span>
<span class="tab" data-content-id="search"><var id="lang_tab_search"></var></span>
</div>
<div class="alignBar">
<label class="algnLabel"><var id="lang_input_align"></var></label>
<span id="alignIcon">
<span id="noneAlign" class="none-align focus" data-align="none"></span>
<span id="leftAlign" class="left-align" data-align="left"></span>
<span id="rightAlign" class="right-align" data-align="right"></span>
<span id="centerAlign" class="center-align" data-align="center"></span>
</span>
<input id="align" name="align" type="hidden" value="none"/>
</div>
<div id="tabbody" class="tabbody">
<!-- 远程图片 -->
<div id="remote" class="panel">
<div class="top">
<div class="row">
<label for="url"><var id="lang_input_url"></var></label>
<span><input class="text" id="url" type="text"/></span>
</div>
</div>
<div class="left">
<div class="row">
<label><var id="lang_input_size"></var></label>
<span><var id="lang_input_width">&nbsp;&nbsp;</var><input class="text" type="text" id="width"/>px </span>
<span><var id="lang_input_height">&nbsp;&nbsp;</var><input class="text" type="text" id="height"/>px </span>
<span><input id="lock" type="checkbox" disabled="disabled"><span id="lockicon"></span></span>
</div>
<div class="row">
<label><var id="lang_input_border"></var></label>
<span><input class="text" type="text" id="border"/>px </span>
</div>
<div class="row">
<label><var id="lang_input_vhspace"></var></label>
<span><input class="text" type="text" id="vhSpace"/>px </span>
</div>
<div class="row">
<label><var id="lang_input_title"></var></label>
<span><input class="text" type="text" id="title"/></span>
</div>
</div>
<div class="right"><div id="preview"></div></div>
</div>
<!-- 上传图片 -->
<div id="upload" class="panel focus">
<div id="queueList" class="queueList">
<div class="statusBar element-invisible">
<div class="progress">
<span class="text">0%</span>
<span class="percentage"></span>
</div><div class="info"></div>
<div class="btns">
<div id="filePickerBtn"></div>
<div class="uploadBtn"><var id="lang_start_upload"></var></div>
</div>
</div>
<div id="dndArea" class="placeholder">
<div class="filePickerContainer">
<div id="filePickerReady"></div>
</div>
</div>
<ul class="filelist element-invisible">
<li id="filePickerBlock" class="filePickerBlock"></li>
</ul>
</div>
</div>
<!-- 在线图片 -->
<div id="online" class="panel">
<div id="imageList"><var id="lang_imgLoading"></var></div>
</div>
<!-- 搜索图片 -->
<div id="search" class="panel">
<div class="searchBar">
<input id="searchTxt" class="searchTxt text" type="text" />
<select id="searchType" class="searchType">
<option value="&s=4&z=0"></option>
<option value="&s=1&z=19"></option>
<option value="&s=2&z=0"></option>
<option value="&s=3&z=0"></option>
</select>
<input id="searchReset" type="button" />
<input id="searchBtn" type="button" />
</div>
<div id="searchList" class="searchList"><ul id="searchListUl"></ul></div>
</div>
</div>
</div>
<script type="text/javascript" src="image.js"></script>
</body>
</html>
File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 453 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1,98 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<script type="text/javascript" src="../internal.js"></script>
<style type="text/css">
.warp {width: 320px;height: 153px;margin-left:5px;padding: 20px 0 0 15px;position: relative;}
#url {width: 290px; margin-bottom: 2px; margin-left: -6px; margin-left: -2px\9;*margin-left:0;_margin-left:0; }
.format span{display: inline-block; width: 58px;text-align: center; zoom:1;}
table td{padding:5px 0;}
#align{width: 65px;height: 23px;line-height: 22px;}
</style>
</head>
<body>
<div class="warp">
<table width="300" cellpadding="0" cellspacing="0">
<tr>
<td colspan="2" class="format">
<span><var id="lang_input_address"></var></span>
<input style="width:200px" id="url" type="text" value=""/>
</td>
</tr>
<tr>
<td colspan="2" class="format"><span><var id="lang_input_width"></var></span><input style="width:200px" type="text" id="width"/> px</td>
</tr>
<tr>
<td colspan="2" class="format"><span><var id="lang_input_height"></var></span><input style="width:200px" type="text" id="height"/> px</td>
</tr>
<tr>
<td><span><var id="lang_input_isScroll"></var></span><input type="checkbox" id="scroll"/> </td>
<td><span><var id="lang_input_frameborder"></var></span><input type="checkbox" id="frameborder"/> </td>
</tr>
<tr>
<td colspan="2"><span><var id="lang_input_alignMode"></var></span>
<select id="align">
<option value=""></option>
<option value="left"></option>
<option value="right"></option>
</select>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
var iframe = editor._iframe;
if(iframe){
$G("url").value = iframe.getAttribute("src")||"";
$G("width").value = iframe.getAttribute("width")||iframe.style.width.replace("px","")||"";
$G("height").value = iframe.getAttribute("height") || iframe.style.height.replace("px","") ||"";
$G("scroll").checked = (iframe.getAttribute("scrolling") == "yes") ? true : false;
$G("frameborder").checked = (iframe.getAttribute("frameborder") == "1") ? true : false;
$G("align").value = iframe.align ? iframe.align : "";
}
function queding(){
var url = $G("url").value.replace(/^\s*|\s*$/ig,""),
width = $G("width").value,
height = $G("height").value,
scroll = $G("scroll"),
frameborder = $G("frameborder"),
float = $G("align").value,
newIframe = editor.document.createElement("iframe"),
div;
if(!url){
alert(lang.enterAddress);
return false;
}
newIframe.setAttribute("src",/http:\/\/|https:\/\//ig.test(url) ? url : "http://"+url);
/^[1-9]+[.]?\d*$/g.test( width ) ? newIframe.setAttribute("width",width) : "";
/^[1-9]+[.]?\d*$/g.test( height ) ? newIframe.setAttribute("height",height) : "";
scroll.checked ? newIframe.setAttribute("scrolling","yes") : newIframe.setAttribute("scrolling","no");
frameborder.checked ? newIframe.setAttribute("frameborder","1",0) : newIframe.setAttribute("frameborder","0",0);
float ? newIframe.setAttribute("align",float) : newIframe.setAttribute("align","");
if(iframe){
iframe.parentNode.insertBefore(newIframe,iframe);
domUtils.remove(iframe);
}else{
div = editor.document.createElement("div");
div.appendChild(newIframe);
editor.execCommand("inserthtml",div.innerHTML);
}
editor._iframe = null;
dialog.close();
}
dialog.onok = queding;
$G("url").onkeydown = function(evt){
evt = evt || event;
if(evt.keyCode == 13){
queding();
}
};
$focus($G( "url" ));
</script>
</body>
</html>
+81
View File
@@ -0,0 +1,81 @@
(function () {
var parent = window.parent;
//dialog对象
dialog = parent.$EDITORUI[window.frameElement.id.replace( /_iframe$/, '' )];
//当前打开dialog的编辑器实例
editor = dialog.editor;
UE = parent.UE;
domUtils = UE.dom.domUtils;
utils = UE.utils;
browser = UE.browser;
ajax = UE.ajax;
$G = function ( id ) {
return document.getElementById( id )
};
//focus元素
$focus = function ( node ) {
setTimeout( function () {
if ( browser.ie ) {
var r = node.createTextRange();
r.collapse( false );
r.select();
} else {
node.focus()
}
}, 0 )
};
utils.loadFile(document,{
href:editor.options.themePath + editor.options.theme + "/dialogbase.css?cache="+Math.random(),
tag:"link",
type:"text/css",
rel:"stylesheet"
});
lang = editor.getLang(dialog.className.split( "-" )[2]);
if(lang){
domUtils.on(window,'load',function () {
var langImgPath = editor.options.langPath + editor.options.lang + "/images/";
//针对静态资源
for ( var i in lang["static"] ) {
var dom = $G( i );
if(!dom) continue;
var tagName = dom.tagName,
content = lang["static"][i];
if(content.src){
//clone
content = utils.extend({},content,false);
content.src = langImgPath + content.src;
}
if(content.style){
content = utils.extend({},content,false);
content.style = content.style.replace(/url\s*\(/g,"url(" + langImgPath)
}
switch ( tagName.toLowerCase() ) {
case "var":
dom.parentNode.replaceChild( document.createTextNode( content ), dom );
break;
case "select":
var ops = dom.options;
for ( var j = 0, oj; oj = ops[j]; ) {
oj.innerHTML = content.options[j++];
}
for ( var p in content ) {
p != "options" && dom.setAttribute( p, content[p] );
}
break;
default :
domUtils.setAttributes( dom, content);
}
}
} );
}
})();
+126
View File
@@ -0,0 +1,126 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script type="text/javascript" src="../internal.js"></script>
<style type="text/css">
*{margin:0;padding:0;color: #838383;}
table{font-size: 12px;margin: 10px;line-height: 30px}
.txt{width:300px;height:21px;line-height:21px;border:1px solid #d7d7d7;}
</style>
</head>
<body>
<table>
<tr>
<td><label for="text"> <var id="lang_input_text"></var></label></td>
<td><input class="txt" id="text" type="text" disabled="true"/></td>
</tr>
<tr>
<td><label for="href"> <var id="lang_input_url"></var></label></td>
<td><input class="txt" id="href" type="text" /></td>
</tr>
<tr>
<td><label for="title"> <var id="lang_input_title"></var></label></td>
<td><input class="txt" id="title" type="text"/></td>
</tr>
<tr>
<td colspan="2">
<label for="target"><var id="lang_input_target"></var></label>
<input id="target" type="checkbox"/>
</td>
</tr>
<tr>
<td colspan="2" id="msg"></td>
</tr>
</table>
<script type="text/javascript">
var range = editor.selection.getRange(),
link = range.collapsed ? editor.queryCommandValue( "link" ) : editor.selection.getStart(),
url,
text = $G('text'),
rangeLink = domUtils.findParentByTagName(range.getCommonAncestor(),'a',true),
orgText;
link = domUtils.findParentByTagName( link, "a", true );
if(link){
url = utils.html(link.getAttribute( '_href' ) || link.getAttribute( 'href', 2 ));
if(rangeLink === link && !link.getElementsByTagName('img').length){
text.removeAttribute('disabled');
orgText = text.value = link[browser.ie ? 'innerText':'textContent'];
}else{
text.setAttribute('disabled','true');
text.value = lang.validLink;
}
}else{
if(range.collapsed){
text.removeAttribute('disabled');
text.value = '';
}else{
text.setAttribute('disabled','true');
text.value = lang.validLink;
}
}
$G("title").value = url ? link.title : "";
$G("href").value = url ? url: '';
$G("target").checked = url && link.target == "_blank" ? true : false;
$focus($G("href"));
function handleDialogOk(){
var href =$G('href').value.replace(/^\s+|\s+$/g, '');
if(href){
if(!hrefStartWith(href,["http","/","ftp://",'#'])) {
href = "http://" + href;
}
var obj = {
'href' : href,
'target' : $G("target").checked ? "_blank" : '_self',
'title' : $G("title").value.replace(/^\s+|\s+$/g, ''),
'_href':href
};
//修改链接内容的情况太特殊了,所以先做到这里了
//todo:情况多的时候,做到command里
if(orgText && text.value != orgText){
link[browser.ie ? 'innerText' : 'textContent'] = obj.textValue = text.value;
range.selectNode(link).select()
}
if(range.collapsed){
obj.textValue = text.value;
}
editor.execCommand('link',utils.clearEmptyAttrs(obj) );
dialog.close();
}
}
dialog.onok = handleDialogOk;
$G('href').onkeydown = $G('title').onkeydown = function(evt){
evt = evt || window.event;
if (evt.keyCode == 13) {
handleDialogOk();
return false;
}
};
$G('href').onblur = function(){
if(!hrefStartWith(this.value,["http","/","ftp://",'#'])){
$G("msg").innerHTML = "<span style='color: red'>"+lang.httpPrompt+"</span>";
}else{
$G("msg").innerHTML = "";
}
};
function hrefStartWith(href,arr){
href = href.replace(/^\s+|\s+$/g, '');
for(var i=0,ai;ai=arr[i++];){
if(href.indexOf(ai)==0){
return true;
}
}
return false;
}
</script>
</body>
</html>
+135
View File
@@ -0,0 +1,135 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script type="text/javascript" src="../internal.js"></script>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=1.1&services=true"></script>
<style type="text/css">
.content{width:530px; height: 350px;margin: 10px auto;}
.content table{width: 100%}
.content table td{vertical-align: middle;}
#city,#address{height:21px;background: #FFF;border:1px solid #d7d7d7; line-height: 21px;}
#city{width:60px}
#address{width:130px}
#is_dynamic_label span{vertical-align:middle;margin: 3px 0px 3px 3px;}
#is_dynamic_label input{vertical-align:middle;margin: 3px 3px 3px 50px;}
</style>
</head>
<body>
<div class="content">
<table>
<tr>
<td><var id="lang_city"></var>:</td>
<td><input id="city" type="text" /></td>
<td><var id="lang_address"></var>:</td>
<td><input id="address" type="text" value="" /></td>
<td><a href="javascript:doSearch()" class="button"><var id="lang_search"></var></a></td>
<td><label id="is_dynamic_label" for="is_dynamic"><input id="is_dynamic" type="checkbox" name="is_dynamic" /><span><var id="lang_dynamicmap"></var></span></label></td>
</tr>
</table>
<div style="width:100%;height:340px;margin:5px auto;border:1px solid gray" id="container"></div>
</div>
<script type="text/javascript">
var map = new BMap.Map("container"),marker,point,styleStr;
map.enableScrollWheelZoom();
map.enableContinuousZoom();
function doSearch(){
if (!document.getElementById('city').value) {
alert(lang.cityMsg);
return;
}
var search = new BMap.LocalSearch(document.getElementById('city').value, {
onSearchComplete: function (results){
if (results && results.getNumPois()) {
var points = [];
for (var i=0; i<results.getCurrentNumPois(); i++) {
points.push(results.getPoi(i).point);
}
if (points.length > 1) {
map.setViewport(points);
} else {
map.centerAndZoom(points[0], 13);
}
point = map.getCenter();
marker.setPoint(point);
} else {
alert(lang.errorMsg);
}
}
});
search.search(document.getElementById('address').value || document.getElementById('city').value);
}
//获得参数
function getPars(str,par){
var reg = new RegExp(par+"=((\\d+|[.,])*)","g");
return reg.exec(str)[1];
}
function init(){
var mapNode = editor.selection.getRange().getClosedNode(),
isMapImg = mapNode && /api[.]map[.]baidu[.]com/ig.test(mapNode.getAttribute("src")),
isMapIframe = mapNode && domUtils.hasClass(mapNode, 'ueditor_baidumap');
if(isMapImg || isMapIframe){
var url, centerPos, markerPos;
if(isMapIframe) {
url = decodeURIComponent(mapNode.getAttribute("src"));
$G('is_dynamic').checked = true;
styleStr = mapNode.style.cssText;
} else {
url = mapNode.getAttribute("src");
styleStr = mapNode.style.cssText;
}
centerPos = getPars(url,"center").split(",");
markerPos = getPars(url, "markers").split(",");
point = new BMap.Point(Number(centerPos[0]),Number(centerPos[1]));
marker = new BMap.Marker(new BMap.Point(Number(markerPos[0]), Number(markerPos[1])));
map.addControl(new BMap.NavigationControl());
map.centerAndZoom(point, Number(getPars(url,"zoom")));
}else{
point = new BMap.Point(116.404, 39.915); // 创建点坐标
marker = new BMap.Marker(point);
map.addControl(new BMap.NavigationControl());
map.centerAndZoom(point, 10); // 初始化地图,设置中心点坐标和地图级别。
}
marker.enableDragging();
map.addOverlay(marker);
}
init();
document.getElementById('address').onkeydown = function (evt){
evt = evt || event;
if (evt.keyCode == 13) {
doSearch();
}
};
dialog.onok = function (){
var center = map.getCenter();
var zoom = map.zoomLevel;
var size = map.getSize();
var mapWidth = size.width;
var mapHeight = size.height;
var point = marker.getPoint();
if($G('is_dynamic').checked) {
var URL = editor.options.UEDITOR_HOME_URL,
url = [URL + (/\/$/.test(URL) ? '':'/') + "dialogs/map/show.html" +
'#center=' + center.lng + ',' + center.lat,
'&zoom=' + zoom,
'&width=' + mapWidth,
'&height=' + mapHeight,
'&markers=' + point.lng + ',' + point.lat,
'&markerStyles=' + 'l,A'].join('');
editor.execCommand('inserthtml', '<iframe class="ueditor_baidumap" src="' + url + '"' + (styleStr ? ' style="' + styleStr + '"' :'') + ' frameborder="0" width="' + (mapWidth+4) + '" height="' + (mapHeight+4) + '"></iframe>');
} else {
var url = "http://api.map.baidu.com/staticimage?center=" + center.lng + ',' + center.lat +
"&zoom=" + zoom + "&width=" + size.width + '&height=' + size.height + "&markers=" + point.lng + ',' + point.lat;
editor.execCommand('inserthtml', '<img width="'+ size.width +'"height="'+ size.height +'" src="' + url + '"' + (styleStr ? ' style="' + styleStr + '"' :'') + '/>');
}
};
document.getElementById("address").focus();
</script>
</body>
</html>
+118
View File
@@ -0,0 +1,118 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8"/>
<meta name="keywords" content="百度地图,百度地图API,百度地图自定义工具,百度地图所见即所得工具"/>
<meta name="description" content="百度地图API自定义地图,帮助用户在可视化操作下生成百度地图"/>
<title>百度地图API自定义地图</title>
<!--引用百度地图API-->
<style type="text/css">
html, body {
margin: 0;
padding: 0;
overflow: hidden;
}
</style>
<script type="text/javascript" src="http://api.map.baidu.com/api?key=&v=1.1&services=true"></script>
</head>
<body onload="initMap();">
<!--百度地图容器-->
<div style="width:697px;height:550px;border:#ccc solid 1px;" id="dituContent"></div>
</body>
<script type="text/javascript">
function getParam(name) {
return location.href.match(new RegExp('[?#&]' + name + '=([^?#&]+)', 'i')) ? RegExp.$1 : '';
}
var map, marker;
var centerParam = getParam('center');
var zoomParam = getParam('zoom');
var widthParam = getParam('width');
var heightParam = getParam('height');
var markersParam = getParam('markers');
var markerStylesParam = getParam('markerStyles');
//创建和初始化地图函数:
function initMap() {
// [FF]切换模式后报错
if (!window.BMap) {
return;
}
var dituContent = document.getElementById('dituContent');
dituContent.style.width = widthParam + 'px';
dituContent.style.height = heightParam + 'px';
createMap();//创建地图
setMapEvent();//设置地图事件
addMapControl();//向地图添加控件
// 创建标注
var markersArr = markersParam.split(',');
var point = new BMap.Point(markersArr[0], markersArr[1]);
marker = new BMap.Marker(point);
marker.enableDragging();
map.addOverlay(marker); // 将标注添加到地图中
if(parent.editor && parent.document.body.contentEditable=="true") { //在编辑状态下
setMapListener();//地图改变修改外层的iframe标签src属性
}
}
//创建地图函数:
function createMap() {
map = new BMap.Map("dituContent");//在百度地图容器中创建一个地图
var centerArr = centerParam.split(',');
var point = new BMap.Point(parseFloat(centerArr[0]), parseFloat(centerArr[1]));//定义一个中心点坐标
map.centerAndZoom(point, parseInt(zoomParam));//设定地图的中心点和坐标并将地图显示在地图容器中
}
//地图事件设置函数:
function setMapEvent() {
map.enableDragging();//启用地图拖拽事件,默认启用(可不写)
map.enableScrollWheelZoom();//启用地图滚轮放大缩小
map.enableDoubleClickZoom();//启用鼠标双击放大,默认启用(可不写)
map.enableKeyboard();//启用键盘上下左右键移动地图
}
//地图控件添加函数:
function addMapControl() {
//向地图中添加缩放控件
var ctrl_nav = new BMap.NavigationControl({anchor: BMAP_ANCHOR_TOP_LEFT, type: BMAP_NAVIGATION_CONTROL_LARGE});
map.addControl(ctrl_nav);
//向地图中添加缩略图控件
var ctrl_ove = new BMap.OverviewMapControl({anchor: BMAP_ANCHOR_BOTTOM_RIGHT, isOpen: 1});
map.addControl(ctrl_ove);
//向地图中添加比例尺控件
var ctrl_sca = new BMap.ScaleControl({anchor: BMAP_ANCHOR_BOTTOM_LEFT});
map.addControl(ctrl_sca);
}
function setMapListener() {
var editor = parent.editor, containerIframe,
iframes = parent.document.getElementsByTagName('iframe');
for (var key in iframes) {
if (iframes[key].contentWindow == window) {
containerIframe = iframes[key];
break;
}
}
if (containerIframe) {
map.addEventListener('moveend', mapListenerHandler);
map.addEventListener('zoomend', mapListenerHandler);
marker.addEventListener('dragend', mapListenerHandler);
}
function mapListenerHandler() {
var zoom = map.getZoom(),
center = map.getCenter(),
marker = window.marker.getPoint();
containerIframe.src = containerIframe.src.
replace(new RegExp('([?#&])center=([^?#&]+)', 'i'), '$1center=' + center.lng + ',' + center.lat).
replace(new RegExp('([?#&])markers=([^?#&]+)', 'i'), '$1markers=' + marker.lng + ',' + marker.lat).
replace(new RegExp('([?#&])zoom=([^?#&]+)', 'i'), '$1zoom=' + zoom);
editor.fireEvent('saveScene');
}
}
</script>
</html>
+30
View File
@@ -0,0 +1,30 @@
.wrapper{margin: 5px 10px;}
.searchBar{height:30px;padding:7px 0 3px;text-align:center;}
.searchBtn{font-size:13px;height:24px;}
.resultBar{width:460px;margin:5px auto;border: 1px solid #CCC;border-radius: 5px;box-shadow: 2px 2px 5px #D3D6DA;overflow: hidden;}
.listPanel{overflow: hidden;}
.panelon{display:block;}
.paneloff{display:none}
.page{width:220px;margin:20px auto;overflow: hidden;}
.pageon{float:right;width:24px;line-height:24px;height:24px;margin-right: 5px;background: none;border: none;color: #000;font-weight: bold;text-align:center}
.pageoff{float:right;width:24px;line-height:24px;height:24px;cursor:pointer;background-color: #fff;
border: 1px solid #E7ECF0;color: #2D64B3;margin-right: 5px;text-decoration: none;text-align:center;}
.m-box{width:460px;}
.m-m{float: left;line-height: 20px;height: 20px;}
.m-h{height:24px;line-height:24px;padding-left: 46px;background-color:#FAFAFA;border-bottom: 1px solid #DAD8D8;font-weight: bold;font-size: 12px;color: #333;}
.m-l{float:left;width:40px; }
.m-t{float:left;width:140px;}
.m-s{float:left;width:110px;}
.m-z{float:left;width:100px;}
.m-try-t{float: left;width: 60px;;}
.m-try{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/try_music.gif') no-repeat ;}
.m-trying{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/stop_music.gif') no-repeat ;}
.loading{width:95px;height:7px;font-size:7px;margin:60px auto;background:url(http://static.tieba.baidu.com/tb/editor/images/loading.gif) no-repeat}
.empty{width:300px;height:40px;padding:2px;margin:50px auto;line-height:40px; color:#006699;text-align:center;}
+32
View File
@@ -0,0 +1,32 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>插入音乐</title>
<script type="text/javascript" src="../internal.js"></script>
<link rel="stylesheet" type="text/css" href="music.css">
</head>
<body>
<div class="wrapper">
<div class="searchBar">
<input id="J_searchName" type="text"/>
<input type="button" class="searchBtn" id="J_searchBtn">
</div>
<div class="resultBar" id="J_resultBar">
<div class="loading" style="display:none"></div>
<div class="empty"><var id="lang_input_tips"></var></div>
</div>
<div id="J_preview"></div>
</div>
<script type="text/javascript" src="music.js"></script>
<script type="text/javascript">
var music = new Music;
dialog.onok = function () {
music.exec();
};
dialog.oncancel = function () {
$G('J_preview').innerHTML = "";
};
</script>
</body>
</html>
+192
View File
@@ -0,0 +1,192 @@
function Music() {
this.init();
}
(function () {
var pages = [],
panels = [],
selectedItem = null;
Music.prototype = {
total:70,
pageSize:10,
dataUrl:"http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.common",
playerUrl:"http://box.baidu.com/widget/flash/bdspacesong.swf",
init:function () {
var me = this;
domUtils.on($G("J_searchName"), "keyup", function (event) {
var e = window.event || event;
if (e.keyCode == 13) {
me.dosearch();
}
});
domUtils.on($G("J_searchBtn"), "click", function () {
me.dosearch();
});
},
callback:function (data) {
var me = this;
me.data = data.song_list;
setTimeout(function () {
$G('J_resultBar').innerHTML = me._renderTemplate(data.song_list);
}, 300);
},
dosearch:function () {
var me = this;
selectedItem = null;
var key = $G('J_searchName').value;
if (utils.trim(key) == "")return false;
key = encodeURIComponent(key);
me._sent(key);
},
doselect:function (i) {
var me = this;
if (typeof i == 'object') {
selectedItem = i;
} else if (typeof i == 'number') {
selectedItem = me.data[i];
}
},
onpageclick:function (id) {
var me = this;
for (var i = 0; i < pages.length; i++) {
$G(pages[i]).className = 'pageoff';
$G(panels[i]).className = 'paneloff';
}
$G('page' + id).className = 'pageon';
$G('panel' + id).className = 'panelon';
},
listenTest:function (elem) {
var me = this,
view = $G('J_preview'),
is_play_action = (elem.className == 'm-try'),
old_trying = me._getTryingElem();
if (old_trying) {
old_trying.className = 'm-try';
view.innerHTML = '';
}
if (is_play_action) {
elem.className = 'm-trying';
view.innerHTML = me._buildMusicHtml(me._getUrl(true));
}
},
_sent:function (param) {
var me = this;
$G('J_resultBar').innerHTML = '<div class="loading"></div>';
utils.loadFile(document, {
src:me.dataUrl + '&query=' + param + '&page_size=' + me.total + '&callback=music.callback&.r=' + Math.random(),
tag:"script",
type:"text/javascript",
defer:"defer"
});
},
_removeHtml:function (str) {
var reg = /<\s*\/?\s*[^>]*\s*>/gi;
return str.replace(reg, "");
},
_getUrl:function (isTryListen) {
var me = this;
var param = 'from=tiebasongwidget&url=&name=' + encodeURIComponent(me._removeHtml(selectedItem.title)) + '&artist='
+ encodeURIComponent(me._removeHtml(selectedItem.author)) + '&extra='
+ encodeURIComponent(me._removeHtml(selectedItem.album_title))
+ '&autoPlay='+isTryListen+'' + '&loop=true';
return me.playerUrl + "?" + param;
},
_getTryingElem:function () {
var s = $G('J_listPanel').getElementsByTagName('span');
for (var i = 0; i < s.length; i++) {
if (s[i].className == 'm-trying')
return s[i];
}
return null;
},
_buildMusicHtml:function (playerUrl) {
var html = '<embed class="BDE_try_Music" allowfullscreen="false" pluginspage="http://www.macromedia.com/go/getflashplayer"';
html += ' src="' + playerUrl + '"';
html += ' width="1" height="1" style="position:absolute;left:-2000px;"';
html += ' type="application/x-shockwave-flash" wmode="transparent" play="true" loop="false"';
html += ' menu="false" allowscriptaccess="never" scale="noborder">';
return html;
},
_byteLength:function (str) {
return str.replace(/[^\u0000-\u007f]/g, "\u0061\u0061").length;
},
_getMaxText:function (s) {
var me = this;
s = me._removeHtml(s);
if (me._byteLength(s) > 12)
return s.substring(0, 5) + '...';
if (!s) s = "&nbsp;";
return s;
},
_rebuildData:function (data) {
var me = this,
newData = [],
d = me.pageSize,
itembox;
for (var i = 0; i < data.length; i++) {
if ((i + d) % d == 0) {
itembox = [];
newData.push(itembox)
}
itembox.push(data[i]);
}
return newData;
},
_renderTemplate:function (data) {
var me = this;
if (data.length == 0)return '<div class="empty">' + lang.emptyTxt + '</div>';
data = me._rebuildData(data);
var s = [], p = [], t = [];
s.push('<div id="J_listPanel" class="listPanel">');
p.push('<div class="page">');
for (var i = 0, tmpList; tmpList = data[i++];) {
panels.push('panel' + i);
pages.push('page' + i);
if (i == 1) {
s.push('<div id="panel' + i + '" class="panelon">');
if (data.length != 1) {
t.push('<div id="page' + i + '" onclick="music.onpageclick(' + i + ')" class="pageon">' + (i ) + '</div>');
}
} else {
s.push('<div id="panel' + i + '" class="paneloff">');
t.push('<div id="page' + i + '" onclick="music.onpageclick(' + i + ')" class="pageoff">' + (i ) + '</div>');
}
s.push('<div class="m-box">');
s.push('<div class="m-h"><span class="m-t">' + lang.chapter + '</span><span class="m-s">' + lang.singer
+ '</span><span class="m-z">' + lang.special + '</span><span class="m-try-t">' + lang.listenTest + '</span></div>');
for (var j = 0, tmpObj; tmpObj = tmpList[j++];) {
s.push('<label for="radio-' + i + '-' + j + '" class="m-m">');
s.push('<input type="radio" id="radio-' + i + '-' + j + '" name="musicId" class="m-l" onclick="music.doselect(' + (me.pageSize * (i-1) + (j-1)) + ')"/>');
s.push('<span class="m-t">' + me._getMaxText(tmpObj.title) + '</span>');
s.push('<span class="m-s">' + me._getMaxText(tmpObj.author) + '</span>');
s.push('<span class="m-z">' + me._getMaxText(tmpObj.album_title) + '</span>');
s.push('<span class="m-try" onclick="music.doselect(' + (me.pageSize * (i-1) + (j-1)) + ');music.listenTest(this)"></span>');
s.push('</label>');
}
s.push('</div>');
s.push('</div>');
}
t.reverse();
p.push(t.join(''));
s.push('</div>');
p.push('</div>');
return s.join('') + p.join('');
},
exec:function () {
var me = this;
if (selectedItem == null) return;
$G('J_preview').innerHTML = "";
editor.execCommand('music', {
url:me._getUrl(false),
width:400,
height:95
});
}
};
})();
@@ -0,0 +1,40 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style>
html,body{
height:100%;
width:100%;
padding:0;
margin:0;
}
#preview{
width:100%;
height:100%;
padding:0;
margin:0;
}
#preview *{font-family:sans-serif;font-size:16px;}
</style>
<script type="text/javascript" src="../internal.js"></script>
<script src="../../ueditor.parse.js"></script>
<title></title>
</head>
<body class="view">
<div id="preview" style="margin:8px">
</div>
</body>
<script>
document.getElementById('preview').innerHTML = editor.getContent();
uParse('#preview',{
rootPath : '../../',
chartContainerHeight:500
})
dialog.oncancel = function(){
document.getElementById('preview').innerHTML = '';
}
</script>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 628 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 608 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 516 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 657 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 B

Some files were not shown because too many files have changed in this diff Show More