完善打印相关功能
去掉无用的前端文件 修改版权描述
@@ -1,15 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Stimulsoft Reports.PHP</title>
|
||||
</head>
|
||||
<body>
|
||||
Stimulsoft Reports.PHP (JS version) - How to Activate
|
||||
<hr><br>
|
||||
|
||||
The Trial version of the product does not contain any restrictions, except for the Trial watermark on the report pages.<br><br>
|
||||
|
||||
To activate the product, it is enough to copy the 'license.key' file to the 'stimulsoft' subfolder of this project (in the same place, where is the 'license.php' file is located). The license will be loaded automatically. You can add some conditions in the 'license.php' script to load the license file, if it required for security.
|
||||
<br><br>
|
||||
|
||||
<a href="index.php">Back</a>
|
||||
</body>
|
||||
@@ -1,63 +0,0 @@
|
||||
<?php
|
||||
require_once 'stimulsoft/helper.php';
|
||||
?>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>Stimulsoft Reports.PHP - JS Designer</title>
|
||||
|
||||
<!-- Office2013 style -->
|
||||
<link href="css/stimulsoft.viewer.office2013.whiteblue.css" rel="stylesheet">
|
||||
<link href="css/stimulsoft.designer.office2013.whiteblue.css" rel="stylesheet">
|
||||
|
||||
<!-- Stimulsoft Reports.JS -->
|
||||
<script src="scripts/stimulsoft.reports.js" type="text/javascript"></script>
|
||||
<script src="scripts/stimulsoft.viewer.js" type="text/javascript"></script>
|
||||
<script src="scripts/stimulsoft.designer.js" type="text/javascript"></script>
|
||||
|
||||
<?php
|
||||
$options = StiHelper::createOptions();
|
||||
$options->handler = "handler.php";
|
||||
$options->timeout = 30;
|
||||
StiHelper::initialize($options);
|
||||
?>
|
||||
<script type="text/javascript">
|
||||
//Stimulsoft.Base.StiLicense.loadFromFile("stimulsoft/license.php");
|
||||
|
||||
var options = new Stimulsoft.Designer.StiDesignerOptions();
|
||||
options.appearance.fullScreenMode = true;
|
||||
options.toolbar.showSendEmailButton = true;
|
||||
options.appearance.showLocalization = false;
|
||||
options.appearance.zoom = 130;
|
||||
|
||||
Stimulsoft.Base.Localization.StiLocalization.addLocalizationFile("localization/zh-CHS.xml", false, "Chinese (Simplified)");
|
||||
Stimulsoft.Base.Localization.StiLocalization.cultureName = "Chinese (Simplified)";
|
||||
|
||||
var designer = new Stimulsoft.Designer.StiDesigner(options, "StiDesigner", false);
|
||||
|
||||
// Process SQL data source
|
||||
designer.onBeginProcessData = function (event, callback) {
|
||||
<?php StiHelper::createHandler(); ?>
|
||||
}
|
||||
|
||||
// Save report template on the server side
|
||||
designer.onSaveReport = function (event) {
|
||||
<?php StiHelper::createHandler(); ?>
|
||||
}
|
||||
|
||||
// Load and design report
|
||||
var report = new Stimulsoft.Report.StiReport();
|
||||
report.loadFile("reports/SimpleList.mrt");
|
||||
designer.report = report;
|
||||
|
||||
function onLoad() {
|
||||
designer.renderHtml("designerContent");
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body onload="onLoad();">
|
||||
<div id="designerContent"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,94 +0,0 @@
|
||||
<?php
|
||||
require_once 'stimulsoft/helper.php';
|
||||
|
||||
error_reporting(0);
|
||||
|
||||
// Please configure the security level as you required.
|
||||
// By default is to allow any requests from any domains.
|
||||
header("Access-Control-Allow-Origin: *");
|
||||
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Engaged-Auth-Token");
|
||||
|
||||
$handler = new StiHandler();
|
||||
$handler->registerErrorHandlers();
|
||||
|
||||
$handler->onBeginProcessData = function ($event) {
|
||||
// Current database type: 'XML', 'JSON', 'MySQL', 'MS SQL', 'PostgreSQL', 'Firebird', 'Oracle'
|
||||
$database = $event->database;
|
||||
// Current connection name
|
||||
$connection = $event->connection;
|
||||
// Current data source name
|
||||
$dataSource = $event->dataSource;
|
||||
// Connection string for the current data source
|
||||
$connectionString = $event->connectionString;
|
||||
// SQL query string for the current data source
|
||||
$queryString = $event->queryString;
|
||||
|
||||
// You can change the connection string
|
||||
//if ($connection == "MyConnectionName")
|
||||
// $event->connectionString = "Server=localhost;Database=test;Port=3306;";
|
||||
|
||||
// You can change the SQL query
|
||||
//if ($dataSource == "MyDataSource")
|
||||
// $event->queryString = "SELECT * FROM MyTable";
|
||||
|
||||
// You can replace the SQL query parameters with the required values
|
||||
// For example: SELECT * FROM {Variable1} WHERE Id={Variable2}
|
||||
// If the report contains a variable with this name, its value will be used instead of the specified value
|
||||
//$event->parameters["Variable1"] = "TableName";
|
||||
//$event->parameters["Variable2"] = 10;
|
||||
|
||||
return StiResult::success();
|
||||
//return StiResult::error("Message for some connection error.");
|
||||
};
|
||||
|
||||
$handler->onPrintReport = function ($event) {
|
||||
return StiResult::success();
|
||||
};
|
||||
|
||||
$handler->onBeginExportReport = function ($event) {
|
||||
$settings = $event->settings;
|
||||
$format = $event->format;
|
||||
return StiResult::success();
|
||||
};
|
||||
|
||||
$handler->onEndExportReport = function ($event) {
|
||||
$format = $event->format; // Export format
|
||||
$data = $event->data; // Base64 export data
|
||||
$fileName = $event->fileName; // Report file name
|
||||
|
||||
file_put_contents('reports/'.$fileName.'.'.strtolower($format), base64_decode($data));
|
||||
|
||||
//return StiResult::success();
|
||||
return StiResult::success("Export OK. Message from server side.");
|
||||
//return StiResult::error("Export ERROR. Message from server side.");
|
||||
};
|
||||
|
||||
$handler->onEmailReport = function ($event) {
|
||||
$event->settings->from = "******@gmail.com";
|
||||
$event->settings->host = "smtp.gmail.com";
|
||||
$event->settings->login = "******";
|
||||
$event->settings->password = "******";
|
||||
};
|
||||
|
||||
$handler->onDesignReport = function ($event) {
|
||||
return StiResult::success();
|
||||
};
|
||||
|
||||
$handler->onCreateReport = function ($event) {
|
||||
$fileName = $event->fileName;
|
||||
return StiResult::success();
|
||||
};
|
||||
|
||||
$handler->onSaveReport = function ($event) {
|
||||
$report = $event->report; // Report object
|
||||
$reportJson = $event->reportJson; // Report JSON
|
||||
$fileName = $event->fileName; // Report file name
|
||||
file_put_contents('reports/'.$fileName.".mrt", $reportJson);
|
||||
return StiResult::success("保存成功:".$fileName);
|
||||
};
|
||||
|
||||
$handler->onSaveAsReport = function ($event) {
|
||||
return StiResult::success();
|
||||
};
|
||||
|
||||
$handler->process();
|
||||
@@ -1,19 +0,0 @@
|
||||
<?php
|
||||
require_once 'stimulsoft/helper.php';
|
||||
?>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>Stimulsoft Reports.PHP</title>
|
||||
</head>
|
||||
<body>
|
||||
Stimulsoft Reports.PHP (JS version) - Quick Start Demo
|
||||
<hr><br>
|
||||
<a href="viewer.php">Open Report Viewer page</a><br>
|
||||
<a href="designer.php">Open Report Designer page</a><br><br>
|
||||
<a href="activate.php">How to Activate</a><br>
|
||||
<a href="https://www.stimulsoft.com/en/documentation">Documentation</a><br>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,45 +0,0 @@
|
||||
<?php
|
||||
require_once 'stimulsoft/helper.php';
|
||||
?>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>Stimulsoft Reports.PHP - Render & Export</title>
|
||||
|
||||
<!-- Stimulsoft Reports.JS -->
|
||||
<script src="scripts/stimulsoft.reports.js" type="text/javascript"></script>
|
||||
|
||||
<?php
|
||||
$options = StiHelper::createOptions();
|
||||
$options->handler = "handler.php";
|
||||
$options->timeout = 30;
|
||||
StiHelper::initialize($options);
|
||||
?>
|
||||
<script type="text/javascript">
|
||||
function onLoad() {
|
||||
// Load and show report
|
||||
var report = new Stimulsoft.Report.StiReport();
|
||||
report.loadFile("reports/SimpleList.mrt");
|
||||
|
||||
// Process SQL data source
|
||||
report.onBeginProcessData = function (event, callback) {
|
||||
<?php StiHelper::createHandler(); ?>
|
||||
}
|
||||
|
||||
report.renderAsync(function() {
|
||||
var pdfData = report.exportDocument(Stimulsoft.Report.StiExportFormat.Pdf);
|
||||
|
||||
// Get report file name
|
||||
var fileName = String.isNullOrEmpty(report.reportAlias) ? report.reportName : report.reportAlias;
|
||||
// Save data to file
|
||||
Stimulsoft.System.StiObject.saveAs(pdfData, fileName + ".pdf", "application/pdf");
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body onload="onLoad();">
|
||||
Render & Export
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,181 +0,0 @@
|
||||
<?php
|
||||
class StiMsSqlAdapter {
|
||||
private $connectionString = null;
|
||||
private $connectionInfo = null;
|
||||
private $link = null;
|
||||
private $isMicrosoftDriver = false;
|
||||
|
||||
private function getLastErrorResult() {
|
||||
$error = null;
|
||||
if ($this->isMicrosoftDriver) {
|
||||
if (($errors = sqlsrv_errors()) != null) {
|
||||
$error = $errors[count($errors) - 1];
|
||||
return StiResult::error("[".$error['code']."] ".$error['message']);
|
||||
}
|
||||
}
|
||||
else $error = mssql_get_last_message();
|
||||
|
||||
if ($error) return StiResult::error($error);
|
||||
return StiResult::error("Unknown");
|
||||
}
|
||||
|
||||
private function connect() {
|
||||
if ($this->isMicrosoftDriver) {
|
||||
if (!function_exists("sqlsrv_connect")) return StiResult::error("MS SQL driver not found. Please configure your PHP server to work with MS SQL.");
|
||||
$this->link = sqlsrv_connect(
|
||||
$this->connectionInfo->host,
|
||||
array(
|
||||
"UID" => $this->connectionInfo->userId,
|
||||
"PWD" => $this->connectionInfo->password,
|
||||
"Database" => $this->connectionInfo->database,
|
||||
"LoginTimeout" => 10,
|
||||
"ReturnDatesAsStrings" => true,
|
||||
"CharacterSet" => $this->connectionInfo->charset
|
||||
));
|
||||
if (!$this->link) return $this->getLastErrorResult();
|
||||
}
|
||||
else {
|
||||
$this->link = mssql_connect($this->connectionInfo->host, $this->connectionInfo->userId, $this->connectionInfo->password);
|
||||
if (!$this->link) return $this->getLastErrorResult();
|
||||
$db = mssql_select_db($this->connectionInfo->database, $this->link);
|
||||
mssql_close($this->link);
|
||||
if (!$db) return $this->getLastErrorResult();
|
||||
}
|
||||
|
||||
return StiResult::success();
|
||||
}
|
||||
|
||||
private function disconnect() {
|
||||
if (!$this->link) return;
|
||||
$this->isMicrosoftDriver ? sqlsrv_close($this->link) : mssql_close($this->link);
|
||||
}
|
||||
|
||||
public function parse($connectionString) {
|
||||
$info = new stdClass();
|
||||
$info->host = "";
|
||||
$info->database = "";
|
||||
$info->userId = "";
|
||||
$info->password = "";
|
||||
$info->charset = "UTF-8";
|
||||
|
||||
$parameters = explode(";", $connectionString);
|
||||
foreach($parameters as $parameter) {
|
||||
if (strpos($parameter, "=") < 1) continue;
|
||||
|
||||
$spos = strpos($parameter, "=");
|
||||
$name = strtolower(trim(substr($parameter, 0, $spos)));
|
||||
$value = trim(substr($parameter, $spos + 1));
|
||||
|
||||
switch ($name) {
|
||||
case "server":
|
||||
case "data source":
|
||||
$info->host = $value;
|
||||
break;
|
||||
|
||||
case "database":
|
||||
case "initial catalog":
|
||||
$info->database = $value;
|
||||
break;
|
||||
|
||||
case "uid":
|
||||
case "user":
|
||||
case "user id":
|
||||
$info->userId = $value;
|
||||
break;
|
||||
|
||||
case "pwd":
|
||||
case "password":
|
||||
$info->password = $value;
|
||||
break;
|
||||
|
||||
case "charset":
|
||||
$info->charset = $value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$this->connectionString = $connectionString;
|
||||
$this->connectionInfo = $info;
|
||||
}
|
||||
|
||||
private function parseType($meta) {
|
||||
switch ($meta["Type"]) {
|
||||
// integer
|
||||
case -6:
|
||||
case -5:
|
||||
case 4:
|
||||
case 5:
|
||||
return 'int';
|
||||
|
||||
// number (decimal)
|
||||
case 2:
|
||||
case 3:
|
||||
case 6:
|
||||
case 7:
|
||||
return 'number';
|
||||
|
||||
// datetime
|
||||
case -155:
|
||||
case -154:
|
||||
case -2:
|
||||
case 91:
|
||||
case 93:
|
||||
return 'datetime';
|
||||
|
||||
// string
|
||||
case -152:
|
||||
case -10:
|
||||
case -9:
|
||||
case -8:
|
||||
case -1:
|
||||
case 1:
|
||||
case 12:
|
||||
return 'string';
|
||||
}
|
||||
|
||||
// base64 array for unknown
|
||||
return 'array';
|
||||
}
|
||||
|
||||
public function test() {
|
||||
$result = $this->connect();
|
||||
if ($result->success) $this->disconnect();
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function execute($queryString) {
|
||||
$result = $this->connect();
|
||||
if ($result->success) {
|
||||
$query = $this->isMicrosoftDriver ? sqlsrv_query($this->link, $queryString) : mssql_query($queryString, $this->link);
|
||||
if (!$query) return $this->getLastErrorResult();
|
||||
|
||||
$result->types = array();
|
||||
$result->columns = array();
|
||||
$result->rows = array();
|
||||
|
||||
if ($this->isMicrosoftDriver) {
|
||||
foreach (sqlsrv_field_metadata($query) as $meta) {
|
||||
$result->columns[] = $meta["Name"];
|
||||
$result->types[] = $this->parseType($meta);
|
||||
}
|
||||
}
|
||||
|
||||
$isColumnsEmpty = count($result->columns) == 0;
|
||||
while ($rowItem = $this->isMicrosoftDriver ? sqlsrv_fetch_array($query, SQLSRV_FETCH_ASSOC) : mssql_fetch_assoc($query)) {
|
||||
$row = array();
|
||||
foreach ($rowItem as $key => $value) {
|
||||
if ($isColumnsEmpty && count($result->columns) < count($rowItem)) $result->columns[] = $key;
|
||||
$row[] = $value;
|
||||
}
|
||||
$result->rows[] = $row;
|
||||
}
|
||||
$this->disconnect();
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
function __construct() {
|
||||
$this->isMicrosoftDriver = !function_exists("mssql_connect");
|
||||
}
|
||||
}
|
||||
@@ -1,161 +0,0 @@
|
||||
<?php
|
||||
class StiMySqlAdapter {
|
||||
private $connectionString = null;
|
||||
private $connectionInfo = null;
|
||||
private $link = null;
|
||||
|
||||
private function getLastErrorResult() {
|
||||
if ($this->link->errno == 0) return StiResult::error("Unknown");
|
||||
return StiResult::error("[".$this->link->errno."] ".$this->link->error);
|
||||
}
|
||||
|
||||
private function connect() {
|
||||
$this->link = new mysqli($this->connectionInfo->host, $this->connectionInfo->userId, $this->connectionInfo->password, $this->connectionInfo->database, $this->connectionInfo->port);
|
||||
if ($this->link->connect_error) return StiResult::error("[".$this->link->connect_errno."] ".$this->link->connect_error);
|
||||
if (!$this->link->set_charset($this->connectionInfo->charset)) return $this->getLastErrorResult();
|
||||
return StiResult::success();
|
||||
}
|
||||
|
||||
private function disconnect() {
|
||||
if (!$this->link) return;
|
||||
$this->link->close();
|
||||
}
|
||||
|
||||
public function parse($connectionString) {
|
||||
$info = new stdClass();
|
||||
$info->host = "";
|
||||
$info->port = 3306;
|
||||
$info->database = "";
|
||||
$info->userId = "";
|
||||
$info->password = "";
|
||||
$info->charset = "utf8";
|
||||
|
||||
$parameters = explode(";", $connectionString);
|
||||
foreach($parameters as $parameter)
|
||||
{
|
||||
if (strpos($parameter, "=") < 1) continue;
|
||||
|
||||
$spos = strpos($parameter, "=");
|
||||
$name = strtolower(trim(substr($parameter, 0, $spos)));
|
||||
$value = trim(substr($parameter, $spos + 1));
|
||||
|
||||
switch ($name)
|
||||
{
|
||||
case "server":
|
||||
case "host":
|
||||
case "location":
|
||||
$info->host = $value;
|
||||
break;
|
||||
|
||||
case "port":
|
||||
$info->port = $value;
|
||||
break;
|
||||
|
||||
case "database":
|
||||
case "data source":
|
||||
$info->database = $value;
|
||||
break;
|
||||
|
||||
case "uid":
|
||||
case "user":
|
||||
case "username":
|
||||
case "userid":
|
||||
case "user id":
|
||||
$info->userId = $value;
|
||||
break;
|
||||
|
||||
case "pwd":
|
||||
case "password":
|
||||
$info->password = $value;
|
||||
break;
|
||||
|
||||
case "charset":
|
||||
$info->charset = $value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$this->connectionString = $connectionString;
|
||||
$this->connectionInfo = $info;
|
||||
}
|
||||
|
||||
private function parseType($meta) {
|
||||
switch ($meta->type) {
|
||||
// integer
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
case 8:
|
||||
case 9:
|
||||
return 'int';
|
||||
|
||||
// number (decimal)
|
||||
case 4:
|
||||
case 5:
|
||||
case 16:
|
||||
case 246:
|
||||
return 'number';
|
||||
|
||||
// datetime
|
||||
case 7:
|
||||
case 10:
|
||||
case 11:
|
||||
case 12:
|
||||
case 13:
|
||||
return 'datetime';
|
||||
|
||||
// array, string
|
||||
case 249:
|
||||
case 250:
|
||||
case 251:
|
||||
case 252:
|
||||
case 253:
|
||||
case 254:
|
||||
if ($meta->flags & 128) return 'array';
|
||||
return 'string';
|
||||
}
|
||||
|
||||
// base64 array for unknown
|
||||
return 'array';
|
||||
}
|
||||
|
||||
public function test() {
|
||||
$result = $this->connect();
|
||||
if ($result->success) $this->disconnect();
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function execute($queryString) {
|
||||
$result = $this->connect();
|
||||
if ($result->success) {
|
||||
$query = $this->link->query($queryString);
|
||||
if (!$query) return $this->getLastErrorResult();
|
||||
|
||||
$result->types = array();
|
||||
$result->columns = array();
|
||||
$result->rows = array();
|
||||
|
||||
while ($meta = $query->fetch_field()) {
|
||||
$result->columns[] = $meta->name;
|
||||
$result->types[] = $this->parseType($meta);
|
||||
}
|
||||
|
||||
if ($query->num_rows > 0) {
|
||||
$isColumnsEmpty = count($result->columns) == 0;
|
||||
while ($rowItem = $query->fetch_assoc()) {
|
||||
$row = array();
|
||||
foreach ($rowItem as $key => $value) {
|
||||
if ($isColumnsEmpty && count($result->columns) < count($rowItem)) $result->columns[] = $key;
|
||||
$type = $result->types[count($row)];
|
||||
$row[] = ($type == 'array') ? base64_encode($value) : $value;
|
||||
}
|
||||
$result->rows[] = $row;
|
||||
}
|
||||
}
|
||||
|
||||
$this->disconnect();
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
@@ -1,225 +0,0 @@
|
||||
<?php
|
||||
|
||||
class StiConnectionInfo {
|
||||
public $host = "";
|
||||
public $port = "";
|
||||
public $database = "";
|
||||
public $userId = "";
|
||||
public $password = "";
|
||||
public $charset = "";
|
||||
public $dsn = "";
|
||||
public $privilege = "";
|
||||
public $dataPath = "";
|
||||
public $schemaPath = "";
|
||||
}
|
||||
|
||||
class StiSender {
|
||||
const Viewer = "Viewer";
|
||||
const Designer = "Designer";
|
||||
}
|
||||
|
||||
class StiDatabaseType {
|
||||
const XML = "XML";
|
||||
const JSON = "JSON";
|
||||
const MySQL = "MySQL";
|
||||
const MSSQL = "MS SQL";
|
||||
const PostgreSQL = "PostgreSQL";
|
||||
const Firebird = "Firebird";
|
||||
const Oracle = "Oracle";
|
||||
}
|
||||
|
||||
class StiEventType {
|
||||
const ExecuteQuery = "ExecuteQuery";
|
||||
const BeginProcessData = "BeginProcessData";
|
||||
//const EndProcessData = "EndProcessData";
|
||||
const CreateReport = "CreateReport";
|
||||
const OpenReport = "OpenReport";
|
||||
const SaveReport = "SaveReport";
|
||||
const SaveAsReport = "SaveAsReport";
|
||||
const PrintReport = "PrintReport";
|
||||
const BeginExportReport = "BeginExportReport";
|
||||
const EndExportReport = "EndExportReport";
|
||||
const EmailReport = "EmailReport";
|
||||
const DesignReport = "DesignReport";
|
||||
}
|
||||
|
||||
class StiExportFormat {
|
||||
const Html = "Html";
|
||||
const Html5 = "Html5";
|
||||
const Pdf = "Pdf";
|
||||
const Excel2007 = "Excel2007";
|
||||
const Word2007 = "Word2007";
|
||||
const Csv = "Csv";
|
||||
}
|
||||
|
||||
class StiRequest {
|
||||
public $sender = null;
|
||||
public $event = null;
|
||||
public $connectionString = null;
|
||||
public $queryString = null;
|
||||
public $database = null;
|
||||
public $report = null;
|
||||
public $data = null;
|
||||
public $fileName = null;
|
||||
public $format = null;
|
||||
public $settings = null;
|
||||
|
||||
public function parse() {
|
||||
$data = file_get_contents("php://input");
|
||||
|
||||
$obj = json_decode($data);
|
||||
if ($obj == null) return StiResult::error("JSON parser error");
|
||||
|
||||
if (isset($obj->sender)) $this->sender = $obj->sender;
|
||||
if (isset($obj->command)) $this->event = $obj->command;
|
||||
if (isset($obj->event)) $this->event = $obj->event;
|
||||
if (isset($obj->connectionString)) $this->connectionString = $obj->connectionString;
|
||||
if (isset($obj->queryString)) $this->queryString = $obj->queryString;
|
||||
if (isset($obj->database)) $this->database = $obj->database;
|
||||
if (isset($obj->dataSource)) $this->dataSource = $obj->dataSource;
|
||||
if (isset($obj->connection)) $this->connection = $obj->connection;
|
||||
if (isset($obj->data)) $this->data = $obj->data;
|
||||
if (isset($obj->fileName)) $this->fileName = $obj->fileName;
|
||||
if (isset($obj->format)) $this->format = $obj->format;
|
||||
if (isset($obj->settings)) $this->settings = $obj->settings;
|
||||
if (isset($obj->report)) {
|
||||
$this->report = $obj->report;
|
||||
if (defined('JSON_UNESCAPED_SLASHES')) $this->reportJson = json_encode($this->report, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
|
||||
else {
|
||||
// for PHP 5.3
|
||||
$this->reportJson = str_replace('\/', '/', json_encode($this->report));
|
||||
$this->reportJson = preg_replace_callback('/\\\\u(\w{4})/', function ($matches) {
|
||||
return html_entity_decode('&#x' . $matches[1] . ';', ENT_COMPAT, 'UTF-8');
|
||||
}, $this->reportJson);
|
||||
}
|
||||
}
|
||||
|
||||
return StiResult::success(null, $this);
|
||||
}
|
||||
}
|
||||
|
||||
class StiResponse {
|
||||
public static function json($result, $exit = true) {
|
||||
unset($result->object);
|
||||
if (defined('JSON_UNESCAPED_SLASHES')) echo json_encode($result, JSON_UNESCAPED_SLASHES);
|
||||
else echo json_encode($result);
|
||||
if ($exit) exit;
|
||||
}
|
||||
}
|
||||
|
||||
class StiResult {
|
||||
public $success = true;
|
||||
public $notice = null;
|
||||
public $object = null;
|
||||
|
||||
public static function success($notice = null, $object = null) {
|
||||
$result = new StiResult();
|
||||
$result->success = true;
|
||||
$result->notice = $notice;
|
||||
$result->object = $object;
|
||||
return $result;
|
||||
}
|
||||
|
||||
public static function error($notice = null) {
|
||||
$result = new StiResult();
|
||||
$result->success = false;
|
||||
$result->notice = $notice;
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
class StiEmailSettings {
|
||||
/** Email address of the sender */
|
||||
public $from = null;
|
||||
|
||||
/** Name and surname of the sender */
|
||||
public $name = "John Smith";
|
||||
|
||||
/** Email address of the recipient */
|
||||
public $to = null;
|
||||
|
||||
/** Email Subject */
|
||||
public $subject = null;
|
||||
|
||||
/** Text of the Email */
|
||||
public $message = null;
|
||||
|
||||
/** Attached file name */
|
||||
public $attachmentName = null;
|
||||
|
||||
/** Charset for the message */
|
||||
public $charset = "UTF-8";
|
||||
|
||||
/** Address of the SMTP server */
|
||||
public $host = null;
|
||||
|
||||
/** Port of the SMTP server */
|
||||
public $port = 465;
|
||||
|
||||
/** The secure connection prefix - ssl or tls */
|
||||
public $secure = "ssl";
|
||||
|
||||
/** Login (Username or Email) */
|
||||
public $login = null;
|
||||
|
||||
/** Password */
|
||||
public $password = null;
|
||||
}
|
||||
|
||||
class StiDatabaseEventArgs {
|
||||
public $sender = null;
|
||||
public $database = null;
|
||||
public $connectionInfo = null;
|
||||
public $queryString = null;
|
||||
|
||||
function __construct($sender, $database, $connectionInfo, $queryString = null) {
|
||||
$this->sender = $sender;
|
||||
$this->database = $database;
|
||||
$this->connectionInfo = $connectionInfo;
|
||||
$this->queryString = $queryString;
|
||||
}
|
||||
}
|
||||
|
||||
class StiReportEventArgs {
|
||||
public $sender = null;
|
||||
public $report = null;
|
||||
|
||||
function __construct($sender, $report = null) {
|
||||
$this->sender = $sender;
|
||||
$this->report = $report;
|
||||
}
|
||||
}
|
||||
|
||||
class StiExportReportEventArgs {
|
||||
public $sender = null;
|
||||
public $settings = null;
|
||||
public $format = null;
|
||||
public $fileName = null;
|
||||
public $data = null;
|
||||
|
||||
function __construct($settings, $format, $fileName, $data = null) {
|
||||
$this->settings = $settings;
|
||||
$this->format = $format;
|
||||
$this->fileName = $fileName;
|
||||
$this->data = $data;
|
||||
}
|
||||
}
|
||||
|
||||
class StiSaveReportEventArgs {
|
||||
public $sender = null;
|
||||
public $report = null;
|
||||
public $fileName = null;
|
||||
|
||||
function __construct($report, $fileName) {
|
||||
$this->report = $report;
|
||||
$this->fileName = $fileName;
|
||||
}
|
||||
}
|
||||
|
||||
class StiDesignReportEventArgs {
|
||||
public $fileName = null;
|
||||
|
||||
function __construct($fileName) {
|
||||
$this->fileName = $fileName;
|
||||
}
|
||||
}
|
||||
@@ -1,443 +0,0 @@
|
||||
<?php
|
||||
require_once 'classes.php';
|
||||
require_once 'adapters/mysql.php';
|
||||
require_once 'adapters/mssql.php';
|
||||
|
||||
function stiErrorHandler($errNo, $errStr, $errFile, $errLine) {
|
||||
$result = StiResult::error("[".$errNo."] ".$errStr." (".$errFile.", Line ".$errLine.")");
|
||||
StiResponse::json($result);
|
||||
}
|
||||
|
||||
function stiShutdownFunction() {
|
||||
$err = error_get_last();
|
||||
if ($err != null && (($err["type"] & E_COMPILE_ERROR) || ($err["type"] & E_ERROR) || ($err["type"] & E_CORE_ERROR) || ($err["type"] & E_RECOVERABLE_ERROR))) {
|
||||
$result = StiResult::error("[".$err["type"]."] ".$err["message"]." (".$err["file"].", Line ".$err["line"].")");
|
||||
StiResponse::json($result);
|
||||
}
|
||||
}
|
||||
|
||||
class StiHandler {
|
||||
|
||||
private function checkEventResult($event, $args) {
|
||||
if (isset($event)) $result = $event($args);
|
||||
if (!isset($result)) $result = StiResult::success();
|
||||
if ($result === true) return StiResult::success();
|
||||
if ($result === false) return StiResult::error();
|
||||
if (gettype($result) == "string") return StiResult::error($result);
|
||||
if (isset($args)) $result->object = $args;
|
||||
return $result;
|
||||
}
|
||||
|
||||
private function getQueryParameters($query) {
|
||||
$result = array();
|
||||
while (strpos($query, "{") !== false) {
|
||||
$query = substr($query, strpos($query, "{") + 1);
|
||||
$parameterName = substr($query, 0, strpos($query, "}"));
|
||||
$result[$parameterName] = null;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
private function applyQueryParameters($query, $values) {
|
||||
$result = "";
|
||||
while (strpos($query, "{") !== false) {
|
||||
$result .= substr($query, 0, strpos($query, "{"));
|
||||
$query = substr($query, strpos($query, "{") + 1);
|
||||
$parameterName = substr($query, 0, strpos($query, "}"));
|
||||
if (isset($values) && isset($values[$parameterName]) && !is_null($values[$parameterName])) $result .= strval($values[$parameterName]);
|
||||
else $result .= "{".$parameterName."}";
|
||||
$query = substr($query, strpos($query, "}") + 1);
|
||||
}
|
||||
|
||||
return $result.$query;
|
||||
}
|
||||
|
||||
//--- Events
|
||||
|
||||
public $onBeginProcessData = null;
|
||||
private function invokeBeginProcessData($request) {
|
||||
$args = new stdClass();
|
||||
$args->sender = $request->sender;
|
||||
$args->database = $request->database;
|
||||
$args->connectionString = isset($request->connectionString) ? base64_decode(str_rot13($request->connectionString)) : null;
|
||||
$args->queryString = isset($request->queryString) ? base64_decode(str_rot13($request->queryString)) : null;
|
||||
$args->dataSource = isset($request->dataSource) ? $request->dataSource : null;
|
||||
$args->connection = isset($request->connection) ? $request->connection : null;
|
||||
if (isset($request->queryString)) $args->parameters = $this->getQueryParameters($request->queryString);
|
||||
|
||||
$result = $this->checkEventResult($this->onBeginProcessData, $args);
|
||||
if (isset($result->object->queryString) && isset($args->parameters)) $result->object->queryString = $this->applyQueryParameters($result->object->queryString, $args->parameters);
|
||||
return $result;
|
||||
}
|
||||
|
||||
public $onEndProcessData = null;
|
||||
private function invokeEndProcessData($request, $result) {
|
||||
$args = new stdClass();
|
||||
$args->sender = $request->sender;
|
||||
$args->result = $result;
|
||||
return $this->checkEventResult($this->onEndProcessData, $args);
|
||||
}
|
||||
|
||||
public $onCreateReport = null;
|
||||
private function invokeCreateReport($request) {
|
||||
$args = new stdClass();
|
||||
$args->sender = $request->sender;
|
||||
return $this->checkEventResult($this->onCreateReport, $args);
|
||||
}
|
||||
|
||||
public $onOpenReport = null;
|
||||
private function invokeOpenReport($request) {
|
||||
$args = new stdClass();
|
||||
$args->sender = $request->sender;
|
||||
return $this->checkEventResult($this->onOpenReport, $args);
|
||||
}
|
||||
|
||||
public $onSaveReport = null;
|
||||
private function invokeSaveReport($request) {
|
||||
$args = new stdClass();
|
||||
$args->sender = $request->sender;
|
||||
$args->report = $request->report;
|
||||
$args->reportJson = $request->reportJson;
|
||||
$args->fileName = $request->fileName;
|
||||
return $this->checkEventResult($this->onSaveReport, $args);
|
||||
}
|
||||
|
||||
public $onSaveAsReport = null;
|
||||
private function invokeSaveAsReport($request) {
|
||||
$args = new stdClass();
|
||||
$args->sender = $request->sender;
|
||||
$args->report = $request->report;
|
||||
$args->reportJson = $request->reportJson;
|
||||
$args->fileName = $request->fileName;
|
||||
return $this->checkEventResult($this->onSaveAsReport, $args);
|
||||
}
|
||||
|
||||
public $onPrintReport = null;
|
||||
private function invokePrintReport($request) {
|
||||
$args = new stdClass();
|
||||
$args->sender = $request->sender;
|
||||
$args->fileName = $request->fileName;
|
||||
return $this->checkEventResult($this->onPrintReport, $args);
|
||||
}
|
||||
|
||||
public $onBeginExportReport = null;
|
||||
private function invokeBeginExportReport($request) {
|
||||
$args = new stdClass();
|
||||
$args->sender = $request->sender;
|
||||
$args->settings = $request->settings;
|
||||
$args->format = $request->format;
|
||||
$args->fileName = $request->fileName;
|
||||
return $this->checkEventResult($this->onBeginExportReport, $args);
|
||||
}
|
||||
|
||||
public $onEndExportReport = null;
|
||||
private function invokeEndExportReport($request) {
|
||||
$args = new stdClass();
|
||||
$args->sender = $request->sender;
|
||||
$args->format = $request->format;
|
||||
$args->fileName = $request->fileName;
|
||||
$args->data = $request->data;
|
||||
return $this->checkEventResult($this->onEndExportReport, $args);
|
||||
}
|
||||
|
||||
public $onEmailReport = null;
|
||||
private function invokeEmailReport($request) {
|
||||
$settings = new StiEmailSettings();
|
||||
$settings->to = $request->settings->email;
|
||||
$settings->subject = $request->settings->subject;
|
||||
$settings->message = $request->settings->message;
|
||||
$settings->attachmentName = $request->fileName.'.'.$this->getFileExtension($request->format);
|
||||
|
||||
$args = new stdClass();
|
||||
$args->sender = $request->sender;
|
||||
$args->settings = $settings;
|
||||
$args->format = $request->format;
|
||||
$args->fileName = $request->fileName;
|
||||
$args->data = base64_decode($request->data);
|
||||
|
||||
$result = $this->checkEventResult($this->onEmailReport, $args);
|
||||
if (!$result->success) return $result;
|
||||
|
||||
$guid = substr(md5(uniqid().mt_rand()), 0, 12);
|
||||
if (!file_exists('tmp')) mkdir('tmp');
|
||||
file_put_contents('tmp/'.$guid.'.'.$args->fileName, $args->data);
|
||||
|
||||
// Detect auth mode
|
||||
$auth = $settings->host != null && $settings->login != null && $settings->password != null;
|
||||
|
||||
$mail = substr(PHP_VERSION, 0, 1) == '5' ? new PHPMailer(true) : new PHPMailer\PHPMailer\PHPMailer(true);
|
||||
if ($auth) $mail->IsSMTP();
|
||||
try {
|
||||
$mail->CharSet = $settings->charset;
|
||||
$mail->IsHTML(false);
|
||||
$mail->From = $settings->from;
|
||||
$mail->FromName = $settings->name;
|
||||
|
||||
// Add Emails list
|
||||
$emails = preg_split('/,|;/', $settings->to);
|
||||
foreach ($emails as $settings->to) {
|
||||
$mail->AddAddress(trim($settings->to));
|
||||
}
|
||||
|
||||
// Fill email fields
|
||||
$mail->Subject = htmlspecialchars($settings->subject);
|
||||
$mail->Body = $settings->message;
|
||||
$mail->AddAttachment('tmp/'.$guid.'.'.$args->fileName, $settings->attachmentName);
|
||||
|
||||
// Fill auth fields
|
||||
if ($auth) {
|
||||
$mail->Host = $settings->host;
|
||||
$mail->Port = $settings->port;
|
||||
$mail->SMTPAuth = true;
|
||||
$mail->SMTPSecure = $settings->secure;
|
||||
$mail->Username = $settings->login;
|
||||
$mail->Password = $settings->password;
|
||||
}
|
||||
|
||||
$mail->Send();
|
||||
}
|
||||
catch (phpmailerException $e) {
|
||||
$error = strip_tags($e->errorMessage());
|
||||
return StiResult::error($error);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
$error = strip_tags($e->getMessage());
|
||||
}
|
||||
|
||||
unlink('tmp/'.$guid.'.'.$args->fileName);
|
||||
|
||||
if (isset($error)) return StiResult::error($error);
|
||||
return $result;
|
||||
}
|
||||
|
||||
public $onDesignReport = null;
|
||||
private function invokeDesignReport($request) {
|
||||
$args = new stdClass();
|
||||
$args->sender = $request->sender;
|
||||
$args->fileName = $request->fileName;
|
||||
return $this->checkEventResult($this->onDesignReport, $args);
|
||||
}
|
||||
|
||||
//--- Methods
|
||||
|
||||
public function registerErrorHandlers() {
|
||||
set_error_handler("stiErrorHandler");
|
||||
register_shutdown_function("stiShutdownFunction");
|
||||
}
|
||||
|
||||
public function process($response = true) {
|
||||
$result = $this->innerProcess();
|
||||
if ($response) StiResponse::json($result);
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
//--- Private methods
|
||||
|
||||
private function createConnection($args) {
|
||||
switch ($args->database) {
|
||||
case StiDatabaseType::MySQL: $connection = new StiMySqlAdapter(); break;
|
||||
case StiDatabaseType::MSSQL: $connection = new StiMsSqlAdapter(); break;
|
||||
case StiDatabaseType::Firebird: $connection = new StiFirebirdAdapter(); break;
|
||||
case StiDatabaseType::PostgreSQL: $connection = new StiPostgreSqlAdapter(); break;
|
||||
case StiDatabaseType::Oracle: $connection = new StiOracleAdapter(); break;
|
||||
}
|
||||
|
||||
if (isset($connection)) {
|
||||
$connection->parse($args->connectionString);
|
||||
return StiResult::success(null, $connection);
|
||||
}
|
||||
|
||||
return StiResult::error("Unknown database type [".$args->database."]");
|
||||
}
|
||||
|
||||
private function innerProcess() {
|
||||
$request = new StiRequest();
|
||||
$result = $request->parse();
|
||||
if ($result->success) {
|
||||
switch ($request->event) {
|
||||
case StiEventType::BeginProcessData:
|
||||
case StiEventType::ExecuteQuery:
|
||||
$result = $this->invokeBeginProcessData($request);
|
||||
if (!$result->success) return $result;
|
||||
$queryString = $result->object->queryString;
|
||||
$result = $this->createConnection($result->object);
|
||||
if (!$result->success) return $result;
|
||||
$connection = $result->object;
|
||||
if (isset($queryString)) $result = $connection->execute($queryString);
|
||||
else $result = $connection->test();
|
||||
$result = $this->invokeEndProcessData($request, $result);
|
||||
if (!$result->success) return $result;
|
||||
if (isset($result->object) && isset($result->object->result)) return $result->object->result;
|
||||
return $result;
|
||||
|
||||
case StiEventType::CreateReport:
|
||||
return $this->invokeCreateReport($request);
|
||||
|
||||
case StiEventType::OpenReport:
|
||||
return $this->invokeOpenReport($request);
|
||||
|
||||
case StiEventType::SaveReport:
|
||||
return $this->invokeSaveReport($request);
|
||||
|
||||
case StiEventType::SaveAsReport:
|
||||
return $this->invokeSaveReport($request);
|
||||
|
||||
case StiEventType::PrintReport:
|
||||
return $this->invokePrintReport($request);
|
||||
|
||||
case StiEventType::BeginExportReport:
|
||||
return $this->invokeBeginExportReport($request);
|
||||
|
||||
case StiEventType::EndExportReport:
|
||||
return $this->invokeEndExportReport($request);
|
||||
|
||||
case StiEventType::EmailReport:
|
||||
return $this->invokeEmailReport($request);
|
||||
|
||||
case StiEventType::DesignReport;
|
||||
return $this->invokeDesignReport($request);
|
||||
}
|
||||
|
||||
$result = StiResult::error("Unknown event [".$request->event."]");
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
private function getFileExtension($format) {
|
||||
switch ($format) {
|
||||
case StiExportFormat::Html:
|
||||
case StiExportFormat::Html5:
|
||||
return "html";
|
||||
|
||||
case StiExportFormat::Pdf:
|
||||
return "pdf";
|
||||
|
||||
case StiExportFormat::Excel2007:
|
||||
return "xlsx";
|
||||
|
||||
case StiExportFormat::Word2007:
|
||||
return "docx";
|
||||
|
||||
case StiExportFormat::Csv:
|
||||
return "csv";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//---------- Helper ----------//
|
||||
|
||||
|
||||
class StiHelper {
|
||||
public static function createOptions() {
|
||||
$options = new stdClasS();
|
||||
$options->handler = "handler.php";
|
||||
$options->timeout = 30;
|
||||
|
||||
return $options;
|
||||
}
|
||||
|
||||
public static function initialize($options) {
|
||||
if (!isset($options)) $options = StiHelper::createOptions();
|
||||
?>
|
||||
<script type="text/javascript">
|
||||
StiHelper.prototype.process = function (args, callback) {
|
||||
if (args) {
|
||||
if (args.event == 'BeginProcessData') {
|
||||
args.preventDefault = true;
|
||||
if (args.database == 'XML' || args.database == 'JSON' || args.database == 'Excel')
|
||||
return callback(null);
|
||||
if (args.database == 'Data from DataSet, DataTables')
|
||||
return callback(args);
|
||||
}
|
||||
var command = {};
|
||||
for (var p in args) {
|
||||
if (p == 'report' && args.report != null) command.report = JSON.parse(args.report.saveToJsonString());
|
||||
else if (p == 'settings' && args.settings != null) command.settings = args.settings;
|
||||
else if (p == 'data') command.data = Stimulsoft.System.Convert.toBase64String(args.data);
|
||||
else if (p == 'connectionString' || p == 'queryString') command[p] = jsHelper.getStringValue(args[p]);
|
||||
else command[p] = args[p];
|
||||
}
|
||||
|
||||
var isNullOrEmpty = function (value) {
|
||||
return value == null || value === '' || value === undefined;
|
||||
}
|
||||
var json = JSON.stringify(command);
|
||||
if (!callback) callback = function (message) {
|
||||
if (Stimulsoft.System.StiError.errorMessageForm && !isNullOrEmpty(message)) {
|
||||
var obj = JSON.parse(message);
|
||||
if (!obj.success || !isNullOrEmpty(obj.notice)) {
|
||||
var message = isNullOrEmpty(obj.notice) ? 'There was some error' : obj.notice;
|
||||
Stimulsoft.System.StiError.errorMessageForm.show(message, obj.success);
|
||||
}
|
||||
}
|
||||
}
|
||||
jsHelper.send(json, callback);
|
||||
}
|
||||
}
|
||||
|
||||
StiHelper.prototype.send = function (json, callback) {
|
||||
try {
|
||||
var request = new XMLHttpRequest();
|
||||
request.open('post', this.url, true);
|
||||
request.setRequestHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
|
||||
request.setRequestHeader('Cache-Control', 'max-age=0');
|
||||
request.setRequestHeader('Pragma', 'no-cache');
|
||||
request.timeout = this.timeout * 1000;
|
||||
request.onload = function () {
|
||||
if (request.status == 200) {
|
||||
var responseText = request.responseText;
|
||||
request.abort();
|
||||
callback(responseText);
|
||||
}
|
||||
else {
|
||||
Stimulsoft.System.StiError.showError('[' + request.status + '] ' + request.statusText, false);
|
||||
}
|
||||
};
|
||||
request.onerror = function (e) {
|
||||
var errorMessage = 'Connect to remote error: [' + request.status + '] ' + request.statusText;
|
||||
Stimulsoft.System.StiError.showError(errorMessage, false);
|
||||
};
|
||||
request.send(json);
|
||||
}
|
||||
catch (e) {
|
||||
var errorMessage = 'Connect to remote error: ' + e.message;
|
||||
Stimulsoft.System.StiError.showError(errorMessage, false);
|
||||
request.abort();
|
||||
}
|
||||
};
|
||||
|
||||
StiHelper.prototype.getStringValue = function (value) {
|
||||
return Stimulsoft.System.Convert.toBase64String(value).replace(/[a-zA-Z]/g, function (c) {
|
||||
return String.fromCharCode((c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);
|
||||
});
|
||||
};
|
||||
|
||||
StiHelper.prototype.getUrlVars = function (json, callback) {
|
||||
var vars = {};
|
||||
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,
|
||||
function (m, key, value) {
|
||||
vars[key] = decodeURI(value);
|
||||
});
|
||||
return vars;
|
||||
}
|
||||
|
||||
function StiHelper(url, timeout) {
|
||||
this.url = url;
|
||||
this.timeout = timeout;
|
||||
}
|
||||
|
||||
jsHelper = new StiHelper('<?php echo $options->handler; ?>', <?php echo $options->timeout; ?>);
|
||||
</script>
|
||||
<?php
|
||||
}
|
||||
|
||||
public static function createHandler() {
|
||||
?>jsHelper.process(arguments[0], arguments[1]);
|
||||
<?php
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
6vJhGtLLLz2GNviWmUTrhSqnOItdDwjBylQzQcAOiHlrzAZzmWmSnQQ4gKFiZ4LJpJv//QjFVXxcHAVbzZfXjyOGPmj/m+BEjr2Z14dWeqLFNGF74GELbTTKs2+Le/9cDIWdGNnOpEK2aGdYllauMPLQsiScC521JIEYSdOspiRHSLcegksxfNedJjyIjGlfI2YrddBRWGiO+uWOHE5oz9hLG8VPBSRo60KmgkscM5X+7+aQ+6vzKKOC2XB+e6BMQC5qNVBUblfGQR2EjNLZKmSJtvek7IbG/OK+XP0j2bwicyJUGC0pyLHqctr3BpcO/gA5LoVfuwqYG3klL//owBkObPPhJV1HD6XsHL0GDryssJFaDCQIyXMrOn7hNQNkEIyx+AJDNgf5XfxPgEgFsRhYCPYq7ccutg2by8duOxbF3xH0gL/uAQN275COXJBV3W62DSLM+o8azChG+Z7y0dF9f4whZ/SKD4DwNPUWK7osEPVwl5BY+0lkdqd67fatlrlc0QU/ZX9f5QcTKfl5ljuNc+kcqxmd9NND6Xzrw9gFsFqIWqqVo++DdoAZFStXMkOp/nTNBQMRA100k3vi2SbbiHq/gVimrQecUhWG0qU5zcemtVGDMs1ruXsoHX8pYX/rMJHH09qCWllVyBykkTLourYEig9g5fhKDYRV05aC0cWsbxR2nj9TH3SLmG4P2Px7uJsq6iOsnIHWuBMwk8oF7xPEugjw+x8lkjVVoV8WWBSdjIxGh4LviZXBEJm9FTJzYcnEHMZRh0uVE1g8crC+TfRVii7dcdZzeQklzyNY+0Q1/hRaIUs+mNPRiqG6YqEv3f+yG4ncxzkCWZDvXPox87y61jbg6Dg73X1RAwwvbIXuJVANbaDOefUELPmpz4SIpHx8zpLSmn1H1u0PolbsimLigcGw2bJQeuU++OBU74vJJde3JdoO6IOfmUJkoxprdszyknLm+zWgnC+jjaCtEZZuOIJqyuVPoqHRiFkqNjbddkvGMmj/4+2D6BdYQot9sEOW7iCgV4SvZ/efC0NlRX+Z+6PODwKJiO+Sen5aAlsJcL2jIUSAjgyS+7im7XTGlYKuRL59EQjA5HArO1ikJ0P/2pk4u91z2J8GRvTPu5BZUI9M0BLGLAVCFMte4JQCOr+f785RgjerSNCSgN4Mfa5+jDQAKTAVAO5tqT/SBEm0M5U1EylQ/fbseKt+dQ1/VzqlQ9SH14jtI0J97ACqk9SBt9xpTgBnJrBSTnnY21l2zWS7/2k5U9LPDJn0Lm32ueoDRFaM4JeK1HoSi2HvOYy1V1hU5pCe893QsBE/HOVp4UWu9lfiEWunHEEdPZOUPgc131KwJrM4K3DYiBbXl442TgbNLfz5IBnAw1NVabMXXyx2LOi6x35xw1YLMRYNWYE9QpocBhoFQtStd2OUZ5CqvxhXf+VaLK3hmm1GvlqpUK6LIDd3eyuQK4f0E7+zVSBaV6eSDI9YJC42Ee+Br8AByGYLRaFISpDculGt2nqwFL6cwltv1Xy11frJR2KqbR8sd6dI0V69XnwBziRzJq1SyAZd9bzClYSpA3ZYPN9ghdaHA+GZak0IYMokWLi6oYquOCRoy8f0sEQM2Uhw2x/E9tgyNoLZhDhrk805/VCsThI5fHn0YWVnmQZTrGkOwnoqLw3VHb7akUmNnjMlk/tD59bR2lgD+fnNuNsBYDDjJpg+fKmgf9araTPEIpuuanp53e6xodRYKIj4o4+39DrPK10eR4CDfSh5UShvnCZz+V0FAkIkoM92U1JTU59P4M4pzc8PswmS1rGTRaZMUrTYrjeGCHC9Hl0CTIR1/rQAx8iIcC3yVNCeiTJAmKMCl830O4GpEfduNHQgDrlsJC4q6RA7J2kUzW2WQvKFKH3bRH1hOc6LZK4DmwMGzXMKDKOxK0dzld2/ImRN6DbPacV/4d0HK06qBOFEgUJqXhMpV1JjsXVvmx/m2LCRgkD5vPEwcuiWtWde7tISLCEg6hjAV9+Hx6zOWpozg7aZMtikT+43uWakRkU/H+ITIGhqxuQhkZkmIddWrjD5lJtdUOSa0FWu969EDp4XB8dmUKSwyrkgOHZu6DutFW5ArtqhNejthWt/sV1FkSbvdd26zn1fSO4pDa4pDmcSo+l/4DChZbEyICc7IQrPjVuRUlVGuAVksZTBX+VYIip8LsJSFLHo7Dnn4QT3qDNIh8aAcY3fnHhph4G5ekbvGOw3+m1qqs8t0m89vdK7k8nJTw==
|
||||
@@ -1,10 +0,0 @@
|
||||
<?php
|
||||
|
||||
// You can check the user authorization to send a license key only if the result is positive.
|
||||
|
||||
if (file_exists("license.key")) {
|
||||
$license = file_get_contents("license.key");
|
||||
echo $license;
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,72 +0,0 @@
|
||||
<?php
|
||||
require_once 'stimulsoft/helper.php';
|
||||
?>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<title>Stimulsoft Reports.PHP - JS Viewer</title>
|
||||
|
||||
<!-- Office2013 style -->
|
||||
<link href="css/stimulsoft.viewer.office2013.whiteblue.css" rel="stylesheet">
|
||||
|
||||
<!-- Stimulsoft Reports.JS -->
|
||||
<script src="scripts/stimulsoft.reports.js" type="text/javascript"></script>
|
||||
<!-- Stimulsoft JS Viewer -->
|
||||
<script src="scripts/stimulsoft.viewer.js" type="text/javascript"></script>
|
||||
|
||||
<?php
|
||||
$options = StiHelper::createOptions();
|
||||
$options->handler = "handler.php";
|
||||
$options->timeout = 30;
|
||||
StiHelper::initialize($options);
|
||||
?>
|
||||
<script type="text/javascript">
|
||||
//Stimulsoft.Base.StiLicense.loadFromFile("stimulsoft/license.php");
|
||||
|
||||
var options = new Stimulsoft.Viewer.StiViewerOptions();
|
||||
options.appearance.fullScreenMode = true;
|
||||
options.toolbar.showSendEmailButton = true;
|
||||
|
||||
Stimulsoft.Base.Localization.StiLocalization.addLocalizationFile("localization/zh-CHS.xml", false, "Chinese (Simplified)");
|
||||
Stimulsoft.Base.Localization.StiLocalization.cultureName = "Chinese (Simplified)";
|
||||
|
||||
var viewer = new Stimulsoft.Viewer.StiViewer(options, "StiViewer", false);
|
||||
|
||||
// Process SQL data source
|
||||
viewer.onBeginProcessData = function (event, callback) {
|
||||
<?php StiHelper::createHandler(); ?>
|
||||
}
|
||||
|
||||
// Manage export settings on the server side
|
||||
viewer.onBeginExportReport = function (args) {
|
||||
<?php //StiHelper::createHandler(); ?>
|
||||
//args.fileName = "MyReportName";
|
||||
}
|
||||
|
||||
// Process exported report file on the server side
|
||||
/*viewer.onEndExportReport = function (event) {
|
||||
event.preventDefault = true; // Prevent client default event handler (save the exported report as a file)
|
||||
<?php StiHelper::createHandler(); ?>
|
||||
}*/
|
||||
|
||||
// Send exported report to Email
|
||||
viewer.onEmailReport = function (event) {
|
||||
<?php StiHelper::createHandler(); ?>
|
||||
}
|
||||
|
||||
// Load and show report
|
||||
var report = new Stimulsoft.Report.StiReport();
|
||||
report.loadFile("reports/SimpleList.mrt");
|
||||
viewer.report = report;
|
||||
|
||||
function onLoad() {
|
||||
viewer.renderHtml("viewerContent");
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body onload="onLoad();">
|
||||
<div id="viewerContent"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,297 +0,0 @@
|
||||
/**
|
||||
* Created by jf on 2015/9/11.
|
||||
* Modified by bear on 2016/9/7.
|
||||
*/
|
||||
$(function () {
|
||||
var pageManager = {
|
||||
$container: $('#container'),
|
||||
_pageStack: [],
|
||||
_configs: [],
|
||||
_pageAppend: function(){},
|
||||
_defaultPage: null,
|
||||
_pageIndex: 1,
|
||||
setDefault: function (defaultPage) {
|
||||
this._defaultPage = this._find('name', defaultPage);
|
||||
return this;
|
||||
},
|
||||
setPageAppend: function (pageAppend) {
|
||||
this._pageAppend = pageAppend;
|
||||
return this;
|
||||
},
|
||||
init: function () {
|
||||
var self = this;
|
||||
|
||||
$(window).on('hashchange', function () {
|
||||
var state = history.state || {};
|
||||
var url = location.hash.indexOf('#') === 0 ? location.hash : '#';
|
||||
var page = self._find('url', url) || self._defaultPage;
|
||||
if (state._pageIndex <= self._pageIndex || self._findInStack(url)) {
|
||||
self._back(page);
|
||||
} else {
|
||||
self._go(page);
|
||||
}
|
||||
});
|
||||
|
||||
if (history.state && history.state._pageIndex) {
|
||||
this._pageIndex = history.state._pageIndex;
|
||||
}
|
||||
|
||||
this._pageIndex--;
|
||||
|
||||
var url = location.hash.indexOf('#') === 0 ? location.hash : '#';
|
||||
var page = self._find('url', url) || self._defaultPage;
|
||||
this._go(page);
|
||||
return this;
|
||||
},
|
||||
push: function (config) {
|
||||
this._configs.push(config);
|
||||
return this;
|
||||
},
|
||||
go: function (to) {
|
||||
var config = this._find('name', to);
|
||||
if (!config) {
|
||||
return;
|
||||
}
|
||||
location.hash = config.url;
|
||||
},
|
||||
_go: function (config) {
|
||||
this._pageIndex ++;
|
||||
|
||||
history.replaceState && history.replaceState({_pageIndex: this._pageIndex}, '', location.href);
|
||||
|
||||
var html = $(config.template).html();
|
||||
var $html = $(html).addClass('slideIn').addClass(config.name);
|
||||
$html.on('animationend webkitAnimationEnd', function(){
|
||||
$html.removeClass('slideIn').addClass('js_show');
|
||||
});
|
||||
this.$container.append($html);
|
||||
this._pageAppend.call(this, $html);
|
||||
this._pageStack.push({
|
||||
config: config,
|
||||
dom: $html
|
||||
});
|
||||
|
||||
if (!config.isBind) {
|
||||
this._bind(config);
|
||||
}
|
||||
|
||||
return this;
|
||||
},
|
||||
back: function () {
|
||||
history.back();
|
||||
},
|
||||
_back: function (config) {
|
||||
this._pageIndex --;
|
||||
|
||||
var stack = this._pageStack.pop();
|
||||
if (!stack) {
|
||||
return;
|
||||
}
|
||||
|
||||
var url = location.hash.indexOf('#') === 0 ? location.hash : '#';
|
||||
var found = this._findInStack(url);
|
||||
if (!found) {
|
||||
var html = $(config.template).html();
|
||||
var $html = $(html).addClass('js_show').addClass(config.name);
|
||||
$html.insertBefore(stack.dom);
|
||||
|
||||
if (!config.isBind) {
|
||||
this._bind(config);
|
||||
}
|
||||
|
||||
this._pageStack.push({
|
||||
config: config,
|
||||
dom: $html
|
||||
});
|
||||
}
|
||||
|
||||
stack.dom.addClass('slideOut').on('animationend webkitAnimationEnd', function () {
|
||||
stack.dom.remove();
|
||||
});
|
||||
|
||||
return this;
|
||||
},
|
||||
_findInStack: function (url) {
|
||||
var found = null;
|
||||
for(var i = 0, len = this._pageStack.length; i < len; i++){
|
||||
var stack = this._pageStack[i];
|
||||
if (stack.config.url === url) {
|
||||
found = stack;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return found;
|
||||
},
|
||||
_find: function (key, value) {
|
||||
var page = null;
|
||||
for (var i = 0, len = this._configs.length; i < len; i++) {
|
||||
if (this._configs[i][key] === value) {
|
||||
page = this._configs[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
return page;
|
||||
},
|
||||
_bind: function (page) {
|
||||
var events = page.events || {};
|
||||
for (var t in events) {
|
||||
for (var type in events[t]) {
|
||||
this.$container.on(type, t, events[t][type]);
|
||||
}
|
||||
}
|
||||
page.isBind = true;
|
||||
}
|
||||
};
|
||||
|
||||
function fastClick(){
|
||||
var supportTouch = function(){
|
||||
try {
|
||||
document.createEvent("TouchEvent");
|
||||
return true;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}();
|
||||
var _old$On = $.fn.on;
|
||||
|
||||
$.fn.on = function(){
|
||||
if(/click/.test(arguments[0]) && typeof arguments[1] == 'function' && supportTouch){ // 只扩展支持touch的当前元素的click事件
|
||||
var touchStartY, callback = arguments[1];
|
||||
_old$On.apply(this, ['touchstart', function(e){
|
||||
touchStartY = e.changedTouches[0].clientY;
|
||||
}]);
|
||||
_old$On.apply(this, ['touchend', function(e){
|
||||
if (Math.abs(e.changedTouches[0].clientY - touchStartY) > 10) return;
|
||||
|
||||
e.preventDefault();
|
||||
callback.apply(this, [e]);
|
||||
}]);
|
||||
}else{
|
||||
_old$On.apply(this, arguments);
|
||||
}
|
||||
return this;
|
||||
};
|
||||
}
|
||||
function preload(){
|
||||
$(window).on("load", function(){
|
||||
var imgList = [
|
||||
"./images/layers/content.png",
|
||||
"./images/layers/navigation.png",
|
||||
"./images/layers/popout.png",
|
||||
"./images/layers/transparent.gif"
|
||||
];
|
||||
for (var i = 0, len = imgList.length; i < len; ++i) {
|
||||
new Image().src = imgList[i];
|
||||
}
|
||||
});
|
||||
}
|
||||
function androidInputBugFix(){
|
||||
// .container 设置了 overflow 属性, 导致 Android 手机下输入框获取焦点时, 输入法挡住输入框的 bug
|
||||
// 相关 issue: https://github.com/weui/weui/issues/15
|
||||
// 解决方法:
|
||||
// 0. .container 去掉 overflow 属性, 但此 demo 下会引发别的问题
|
||||
// 1. 参考 http://stackoverflow.com/questions/23757345/android-does-not-correctly-scroll-on-input-focus-if-not-body-element
|
||||
// Android 手机下, input 或 textarea 元素聚焦时, 主动滚一把
|
||||
if (/Android/gi.test(navigator.userAgent)) {
|
||||
window.addEventListener('resize', function () {
|
||||
if (document.activeElement.tagName == 'INPUT' || document.activeElement.tagName == 'TEXTAREA') {
|
||||
window.setTimeout(function () {
|
||||
document.activeElement.scrollIntoViewIfNeeded();
|
||||
}, 0);
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
function setJSAPI(){
|
||||
var option = {
|
||||
title: 'WeUI, 为微信 Web 服务量身设计',
|
||||
desc: 'WeUI, 为微信 Web 服务量身设计',
|
||||
link: "https://weui.io",
|
||||
imgUrl: 'https://mmbiz.qpic.cn/mmemoticon/ajNVdqHZLLA16apETUPXh9Q5GLpSic7lGuiaic0jqMt4UY8P4KHSBpEWgM7uMlbxxnVR7596b3NPjUfwg7cFbfCtA/0'
|
||||
};
|
||||
|
||||
$.getJSON('https://weui.io/api/sign?url=' + encodeURIComponent(location.href.split('#')[0]), function (res) {
|
||||
wx.config({
|
||||
beta: true,
|
||||
debug: false,
|
||||
appId: res.appid,
|
||||
timestamp: res.timestamp,
|
||||
nonceStr: res.nonceStr,
|
||||
signature: res.signature,
|
||||
jsApiList: [
|
||||
'onMenuShareTimeline',
|
||||
'onMenuShareAppMessage',
|
||||
'onMenuShareQQ',
|
||||
'onMenuShareWeibo',
|
||||
'onMenuShareQZone',
|
||||
// 'setNavigationBarColor',
|
||||
'setBounceBackground'
|
||||
]
|
||||
});
|
||||
wx.ready(function () {
|
||||
/*
|
||||
wx.invoke('setNavigationBarColor', {
|
||||
color: '#F8F8F8'
|
||||
});
|
||||
*/
|
||||
wx.invoke('setBounceBackground', {
|
||||
'backgroundColor': '#F8F8F8',
|
||||
'footerBounceColor' : '#F8F8F8'
|
||||
});
|
||||
wx.onMenuShareTimeline(option);
|
||||
wx.onMenuShareQQ(option);
|
||||
wx.onMenuShareAppMessage({
|
||||
title: 'WeUI',
|
||||
desc: '为微信 Web 服务量身设计',
|
||||
link: location.href,
|
||||
imgUrl: 'https://mmbiz.qpic.cn/mmemoticon/ajNVdqHZLLA16apETUPXh9Q5GLpSic7lGuiaic0jqMt4UY8P4KHSBpEWgM7uMlbxxnVR7596b3NPjUfwg7cFbfCtA/0'
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
function setPageManager(){
|
||||
var pages = {}, tpls = $('script[type="text/html"]');
|
||||
var winH = $(window).height();
|
||||
|
||||
for (var i = 0, len = tpls.length; i < len; ++i) {
|
||||
var tpl = tpls[i], name = tpl.id.replace(/tpl_/, '');
|
||||
pages[name] = {
|
||||
name: name,
|
||||
url: '#' + name,
|
||||
template: '#' + tpl.id
|
||||
};
|
||||
}
|
||||
pages.home.url = '#';
|
||||
|
||||
for (var page in pages) {
|
||||
pageManager.push(pages[page]);
|
||||
}
|
||||
pageManager
|
||||
.setPageAppend(function($html){
|
||||
var $foot = $html.find('.page__ft');
|
||||
if($foot.length < 1) return;
|
||||
|
||||
if($foot.position().top + $foot.height() < winH){
|
||||
$foot.addClass('j_bottom');
|
||||
}else{
|
||||
$foot.removeClass('j_bottom');
|
||||
}
|
||||
})
|
||||
.setDefault('home')
|
||||
.init();
|
||||
}
|
||||
|
||||
function init(){
|
||||
preload();
|
||||
fastClick();
|
||||
androidInputBugFix();
|
||||
setJSAPI();
|
||||
setPageManager();
|
||||
|
||||
window.pageManager = pageManager;
|
||||
window.home = function(){
|
||||
location.hash = '';
|
||||
};
|
||||
}
|
||||
init();
|
||||
});
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 748 B |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 425 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 196 B |
|
Before Width: | Height: | Size: 838 B |
|
Before Width: | Height: | Size: 924 B |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 200 B |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 357 B |
|
Before Width: | Height: | Size: 924 B |
|
Before Width: | Height: | Size: 579 B |
|
Before Width: | Height: | Size: 669 B |
|
Before Width: | Height: | Size: 548 B |
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 495 B |
|
Before Width: | Height: | Size: 521 B |
|
Before Width: | Height: | Size: 701 B |
|
Before Width: | Height: | Size: 388 B |
|
Before Width: | Height: | Size: 388 B |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 84 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 816 B |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 111 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 392 B |
|
Before Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 196 KiB |
|
Before Width: | Height: | Size: 99 KiB |
|
Before Width: | Height: | Size: 100 KiB |