diff --git a/install/core/Language.php b/install/core/Language.php
index 8db1655272..e26e9dab3b 100644
--- a/install/core/Language.php
+++ b/install/core/Language.php
@@ -1,55 +1,98 @@
-systemHelper = new SystemHelper();
- }
-
- protected function getSystemHelper()
- {
- return $this->systemHelper;
- }
-
- public function get($language)
- {
- if (empty($language)) {
- $language = $this->defaultLanguage;
- }
-
- $langFileName = 'install/core/i18n/'.$language.'/install.json';
- if (!file_exists($langFileName)) {
- $langFileName = 'install/core/i18n/'.$this->defaultLanguage.'/install.json';
- }
-
- $i18n = file_get_contents($langFileName);
- $i18n = json_decode($i18n, true);
-
- $this->afterRetrieve($i18n);
-
- return $i18n;
- }
-
- /**
- * After retrieve actions
- *
- * @param array $i18n
- * @return array $i18n
- */
- protected function afterRetrieve(array &$i18n)
- {
- /** Get rewrite rules */
- $serverType = $this->getSystemHelper()->getServerType();
- $rewriteRules = $this->getSystemHelper()->getRewriteRules();
- $i18n['options']['modRewriteHelp'][$serverType] = str_replace('{0}', $rewriteRules, $i18n['options']['modRewriteHelp'][$serverType]);
- }
-
-
-}
+systemHelper = new SystemHelper();
+ }
+
+ protected function getSystemHelper()
+ {
+ return $this->systemHelper;
+ }
+
+ public function get($language)
+ {
+ if (isset($this->data[$language])) {
+ return $this->data[$language];
+ }
+
+ if (empty($language)) {
+ $language = $this->defaultLanguage;
+ }
+
+ $langFileName = 'install/core/i18n/'.$language.'/install.json';
+ if (!file_exists($langFileName)) {
+ $langFileName = 'install/core/i18n/'.$this->defaultLanguage.'/install.json';
+ }
+
+ $i18n = $this->getLangData($langFileName);
+
+ if ($language != $this->defaultLanguage) {
+ $i18n = $this->mergeWithDefaults($i18n);
+ }
+
+ $this->afterRetrieve($i18n);
+
+ $this->data[$language] = $i18n;
+
+ return $this->data[$language];
+ }
+
+ /**
+ * Merge current language with default one
+ *
+ * @param array $data
+ * @return array
+ */
+ protected function mergeWithDefaults($data)
+ {
+ $defaultLangFile = 'install/core/i18n/'.$this->defaultLanguage.'/install.json';
+ $defaultData = $this->getLangData($defaultLangFile);
+
+ foreach ($data as $categoryName => &$labels) {
+ foreach ($defaultData[$categoryName] as $defaultLabelName => $defaultLabel) {
+ if (!isset($labels[$defaultLabelName])) {
+ $labels[$defaultLabelName] = $defaultLabel;
+ }
+ }
+ }
+
+ $data = array_merge($defaultData, $data);
+
+ return $data;
+ }
+
+ protected function getLangData($filePath)
+ {
+ $data = file_get_contents($filePath);
+ $data = json_decode($data, true);
+
+ return $data;
+ }
+
+ /**
+ * After retrieve actions
+ *
+ * @param array $i18n
+ * @return array $i18n
+ */
+ protected function afterRetrieve(array &$i18n)
+ {
+ /** Get rewrite rules */
+ $serverType = $this->getSystemHelper()->getServerType();
+ $rewriteRules = $this->getSystemHelper()->getRewriteRules();
+ $i18n['options']['modRewriteHelp'][$serverType] = str_replace('{0}', $rewriteRules, $i18n['options']['modRewriteHelp'][$serverType]);
+ }
+
+
+}
diff --git a/install/core/SystemHelper.php b/install/core/SystemHelper.php
index a2d2581c80..c39dcf6277 100644
--- a/install/core/SystemHelper.php
+++ b/install/core/SystemHelper.php
@@ -24,18 +24,9 @@
class SystemHelper extends \Espo\Core\Utils\System
{
- protected $requirements = array(
- 'phpVersion' => '5.4',
- 'MySQLVersion' => '5.1',
+ protected $requirements;
- 'exts' => array(
- 'json',
- 'mcrypt',
- 'pdo_mysql',
- ),
- );
-
- protected $apiPath = '/api/v1';
+ protected $apiPath;
protected $modRewriteUrl = '/Metadata';
@@ -43,6 +34,13 @@ class SystemHelper extends \Espo\Core\Utils\System
protected $combineOperator = '&&';
+ public function __construct()
+ {
+ $config = include('config.php');
+
+ $this->requirements = $config['requirements'];
+ $this->apiPath = $config['apiPath'];
+ }
public function initWritable()
{
@@ -66,10 +64,10 @@ class SystemHelper extends \Espo\Core\Utils\System
$result['errors']['phpVersion'] = $this->requirements['phpVersion'];
$result['success'] = false;
}
- if (!empty($this->requirements['exts'])) {
- foreach ($this->requirements['exts'] as $extName) {
+ if (!empty($this->requirements['phpRequires'])) {
+ foreach ($this->requirements['phpRequires'] as $extName) {
if (!extension_loaded($extName)) {
- $result['errors']['exts'][] = $extName;
+ $result['errors']['phpRequires'][] = $extName;
$result['success'] = false;
}
}
@@ -79,9 +77,52 @@ class SystemHelper extends \Espo\Core\Utils\System
return $result;
}
- protected function getMySQLVersion($pdoConnection)
+ public function getRecommendationList($type = 'php', $data = null)
{
- $sth = $pdoConnection->prepare("SHOW VARIABLES LIKE 'version'");
+ $list = array();
+
+ if ($type == 'mysql') {
+ $pdoConn = $this->getPdoConnection($data['dbHostName'], $data['dbPort'], $data['dbUserName'], $data['dbUserPass'], $data['dbName']);
+ }
+
+ $currentVersion = ($type == 'php') ? PHP_VERSION : $this->getMysqlSetting('version', $pdoConn);
+ $list[$type . 'Version'] = array(
+ 'current' => $currentVersion,
+ 'required' => $this->requirements[$type . 'Version'],
+ 'acceptable' => true,
+ );
+
+ $recommendations = array_merge($this->requirements[$type . 'Requires'], $this->requirements[$type . 'Recommendations']);
+
+ foreach ($recommendations as $name => $requiredValue) {
+
+ $isExtension = false;
+
+ if (is_int($name)) {
+ $name = $requiredValue;
+ $acceptable = extension_loaded($name);
+ $currentValue = $acceptable ? 'On' : 'Off';
+ $isExtension = true;
+
+ } else {
+ $currentValue = ($type == 'php') ? ini_get($name) : $this->getMysqlSetting($name, $pdoConn);
+ $acceptable = ( isset($currentValue) && $this->convertToBytes($currentValue) >= $this->convertToBytes($requiredValue) ) ? true : false;
+ }
+
+ $list[$name] = array(
+ 'current' => $currentValue,
+ 'required' => $requiredValue,
+ 'acceptable' => $acceptable,
+ 'isExtension' => $isExtension,
+ );
+ }
+
+ return $list;
+ }
+
+ protected function getMysqlSetting($name, \PDO $pdoConnection)
+ {
+ $sth = $pdoConnection->prepare("SHOW VARIABLES LIKE '" . $name . "'");
$sth->execute();
$res = $sth->fetch(PDO::FETCH_NUM);
@@ -90,68 +131,75 @@ class SystemHelper extends \Espo\Core\Utils\System
return $version;
}
- public function checkDbConnection($hostName, $port, $dbUserName, $dbUserPass, $dbName, $dbDriver = 'pdo_mysql', $isCreateDatabase = true)
+ public function checkDbConnection($hostName, $port, $dbUserName, $dbUserPass, $dbName, $isCreateDatabase = true)
{
$result['success'] = true;
- switch ($dbDriver) {
- case 'mysqli':
- $mysqli = (empty($port)) ? new mysqli($hostName, $dbUserName, $dbUserPass, $dbName) : new mysqli($hostName, $dbUserName, $dbUserPass, $dbName, $port);
- if (!$mysqli->connect_errno) {
- $mysqli->close();
- }
- else {
- $result['errors']['dbConnect']['errorCode'] = $mysqli->connect_errno;
- $result['errors']['dbConnect']['errorMsg'] = $mysqli->connect_error;
- $result['success'] = false;
- }
- break;
+ $dbh = $this->getPdoConnection($hostName, $port, $dbUserName, $dbUserPass, $dbName);
- case 'pdo_mysql':
- try {
- $dsn = "mysql:host={$hostName};" . ((!empty($port)) ? "port={$port};" : '') . "dbname={$dbName}";
- $dbh = new PDO($dsn, $dbUserName, $dbUserPass);
- } catch (PDOException $e) {
-
- $result['errors']['dbConnect']['errorCode'] = $e->getCode();
- $result['errors']['dbConnect']['errorMsg'] = $e->getMessage();
- $result['success'] = false;
- }
-
- /** Check MySQL Version */
- if ($result['success']) {
- $currentMySQLVersion = $this->getMySQLVersion($dbh);
- if (isset($currentMySQLVersion) && version_compare($currentMySQLVersion, $this->requirements['MySQLVersion']) == -1) {
- $result['errors']['MySQLVersion'] = $this->requirements['MySQLVersion'];
- $result['success'] = false;
- }
- }
-
- /** try to create a database */
- if ($isCreateDatabase && !$result['success'] && $result['errors']['dbConnect']['errorCode'] == '1049')
- {
- $dsn = "mysql:host={$hostName};" . ((!empty($port)) ? "port={$port}" : '');
- $pdo = new PDO($dsn, $dbUserName, $dbUserPass);
-
- $isCreated = true;
- try {
- $pdo->query("CREATE DATABASE IF NOT EXISTS `$dbName`");
- } catch (PDOException $e) {
- $isCreated = false;
- }
-
- if ($isCreated) {
- return $this->checkDbConnection($hostName, $port, $dbUserName, $dbUserPass, $dbName, $dbDriver, false);
- }
- }
- /** END: try to create a database */
-
- break;
+ if ($dbh instanceof \PDOException) {
+ $result['errors']['dbConnect']['errorCode'] = $dbh->getCode();
+ $result['errors']['dbConnect']['errorMsg'] = $dbh->getMessage();
+ $result['success'] = false;
}
+ /** Check MySQL settings */
+ if ($result['success']) {
+ $currentMysqlVersion = $this->getMysqlSetting('version', $dbh);
+ if (isset($currentMysqlVersion) && version_compare($currentMysqlVersion, $this->requirements['mysqlVersion']) == -1) {
+ $result['errors']['mysqlVersion'] = $this->requirements['mysqlVersion'];
+ $result['success'] = false;
+ }
+
+ /** Check required MySQL settings */
+ foreach ($this->requirements['mysqlRequires'] as $name => $requiredValue) {
+ $currentValue = $this->getMysqlSetting($name, $dbh);
+ $acceptable = ( isset($currentValue) && $this->convertToBytes($currentValue) >= $this->convertToBytes($requiredValue) ) ? true : false;
+ if (!$acceptable) {
+ $result['errors']['mysqlSetting'] = array(
+ 'errorCode' => 'mysqlSettingError',
+ 'name' => $name,
+ 'value' => $requiredValue,
+ );
+ $result['success'] = false;
+ }
+ }
+ }
+
+ /** try to create a database */
+ if ($isCreateDatabase && !$result['success'] && $result['errors']['dbConnect']['errorCode'] == '1049')
+ {
+ $dsn = "mysql:host={$hostName};" . ((!empty($port)) ? "port={$port}" : '');
+ $pdo = new PDO($dsn, $dbUserName, $dbUserPass);
+
+ $isCreated = true;
+ try {
+ $pdo->query("CREATE DATABASE IF NOT EXISTS `$dbName`");
+ } catch (PDOException $e) {
+ $isCreated = false;
+ }
+
+ if ($isCreated) {
+ return $this->checkDbConnection($hostName, $port, $dbUserName, $dbUserPass, $dbName, false);
+ }
+ }
+ /** END: try to create a database */
+
return $result;
}
+ public function getPdoConnection($hostName, $port, $dbUserName, $dbUserPass, $dbName)
+ {
+ try {
+ $dsn = "mysql:host={$hostName};" . ((!empty($port)) ? "port={$port};" : '') . "dbname={$dbName}";
+ $dbh = new PDO($dsn, $dbUserName, $dbUserPass);
+ } catch (PDOException $e) {
+ return $e;
+ }
+
+ return $dbh;
+ }
+
public function getBaseUrl()
{
$pageUrl = ($_SERVER["HTTPS"] == 'on') ? 'https://' : 'http://';
@@ -313,4 +361,22 @@ class SystemHelper extends \Espo\Core\Utils\System
return '';
}
+ public function convertToBytes($value)
+ {
+ $value = trim($value);
+ $last = strtoupper(substr($value, -1));
+
+ switch ( $last )
+ {
+ case 'G':
+ $value = (int) $value * 1024;
+ case 'M':
+ $value = (int) $value * 1024;
+ case 'K':
+ $value = (int) $value * 1024;
+ }
+
+ return $value;
+ }
+
}
diff --git a/install/core/actions/settingsTest.php b/install/core/actions/settingsTest.php
index c3eae65f0f..6bf8e6bc0d 100644
--- a/install/core/actions/settingsTest.php
+++ b/install/core/actions/settingsTest.php
@@ -40,9 +40,8 @@ if ($result['success'] && !empty($_REQUEST['dbName']) && !empty($_REQUEST['hostN
list($hostName, $port) = explode(':', trim($_REQUEST['hostName']));
$dbUserName = trim($_REQUEST['dbUserName']);
$dbUserPass = trim($_REQUEST['dbUserPass']);
- $dbDriver = (!empty($_REQUEST['dbDriver']))? $_REQUEST['dbDriver'] : 'pdo_mysql';
- $res = $systemHelper->checkDbConnection($hostName, $port, $dbUserName, $dbUserPass, $dbName, $dbDriver);
+ $res = $systemHelper->checkDbConnection($hostName, $port, $dbUserName, $dbUserPass, $dbName);
$result['success'] &= $res['success'];
if (!empty($res['errors'])) {
$result['errors'] = array_merge($result['errors'], $res['errors']);
diff --git a/install/core/actions/setupConfirmation.php b/install/core/actions/setupConfirmation.php
new file mode 100644
index 0000000000..fa9b28d3bf
--- /dev/null
+++ b/install/core/actions/setupConfirmation.php
@@ -0,0 +1,48 @@
+getRecommendationList();
+$smarty->assign('phpConfig', $phpConfig);
+
+$installData = $_SESSION['install'];
+list($host, $port) = explode(':', $installData['hostName']);
+
+$dbConfig = array(
+ 'dbHostName' => $host,
+ 'dbPort' => $port,
+ 'dbName' => $installData['dbName'],
+ 'dbUserName' => $installData['dbUserName'],
+ 'dbUserPass' => $installData['dbUserPass'],
+);
+$mysqlConfig = $systemHelper->getRecommendationList('mysql', $dbConfig);
+
+$dbConfig['dbHostName'] = $installData['hostName'];
+unset($dbConfig['dbPort'], $dbConfig['dbUserPass']);
+
+foreach ($dbConfig as $name => $value) {
+ $mysqlConfig[$name] = array(
+ 'current' => $value,
+ 'acceptable' => true,
+ );
+}
+
+$smarty->assign('mysqlConfig', $mysqlConfig);
\ No newline at end of file
diff --git a/install/core/config.php b/install/core/config.php
new file mode 100644
index 0000000000..93085ad175
--- /dev/null
+++ b/install/core/config.php
@@ -0,0 +1,40 @@
+ '/api/v1',
+
+ 'requirements' => array(
+ 'phpVersion' => '5.4',
+
+ 'phpRequires' => array(
+ 'JSON',
+ 'mcrypt',
+ 'pdo_mysql',
+ ),
+
+ 'phpRecommendations' => array(
+ 'GD',
+ 'IMAP',
+ 'max_execution_time' => 180,
+ 'max_input_time' => 180,
+ 'memory_limit' => '256M',
+ 'post_max_size' => '20M',
+ 'upload_max_filesize' => '20M',
+ ),
+
+ 'mysqlVersion' => '5.1',
+ 'mysqlRequires' => array(
+
+ ),
+
+ 'mysqlRecommendations' => array(
+
+ ),
+ ),
+
+ 'blog' => 'http://blog.espocrm.com',
+ 'twitter' => 'https://twitter.com/espocrm',
+ 'forum' => 'http://forum.espocrm.com',
+
+);
\ No newline at end of file
diff --git a/install/core/i18n/de_DE/install.json b/install/core/i18n/de_DE/install.json
index a7d6d4ada6..b65ee88ed9 100644
--- a/install/core/i18n/de_DE/install.json
+++ b/install/core/i18n/de_DE/install.json
@@ -12,7 +12,7 @@
"Step5 page title": "SMTP Einstellungen für ausgehende E-Mails",
"Errors page title": "Fehler",
"Finish page title": "Die Installation ist abgeschlossen",
- "Congratulation! Welcome to EspoCRM!": "Gratulation! EspoCRM wurde erfolgreich installiert.",
+ "Congratulation! Welcome to EspoCRM": "Gratulation! EspoCRM wurde erfolgreich installiert.",
"Installation Guide": "Installationshandbuch",
"admin": "admin",
"localhost": "localhost",
@@ -27,7 +27,12 @@
"Re-check": "Überprüfung wiederholen",
"Version": "Version",
"Test settings": "Verbindung überprüfen",
- "Database Settings Description": "Geben Sie die Verbindungsinformationen für Ihre MySQL Datebank ein (Hostname, Benutzername und Passwort). Sie können den Serverport z.B. so definieren: localhost:3306"
+ "Database Settings Description": "Geben Sie die Verbindungsinformationen für Ihre MySQL Datebank ein (Hostname, Benutzername und Passwort). Sie können den Serverport z.B. so definieren: localhost:3306",
+ "phpVersion": "PHP version",
+ "mysqlVersion": "MySQL version",
+ "dbHostName": "Host Name",
+ "dbName": "Datenbank Name",
+ "dbUserName": "Datenbank Benutzername"
},
"fields": {
"Choose your language": "Wählen Sie Ihre Sprache",
diff --git a/install/core/i18n/en_US/install.json b/install/core/i18n/en_US/install.json
index 2f7a8543c8..5e9553e5b6 100644
--- a/install/core/i18n/en_US/install.json
+++ b/install/core/i18n/en_US/install.json
@@ -12,7 +12,8 @@
"Step5 page title": "SMTP settings for outgoing emails",
"Errors page title": "Errors",
"Finish page title": "Installation is complete",
- "Congratulation! Welcome to EspoCRM!": "Congratulation! EspoCRM has been successfully installed.",
+ "Congratulation! Welcome to EspoCRM": "Congratulation! EspoCRM has been successfully installed.",
+ "More Information": "For more information,
please visit our blog: {BLOG}
follow us on twitter: {TWITTER}
If you have any suggestions or questions, please ask on the forum:
{FORUM}",
"Installation Guide": "Installation Guide",
"admin": "admin",
"localhost": "localhost",
@@ -27,7 +28,18 @@
"Re-check": "Re-check",
"Version": "Version",
"Test settings": "Test Connection",
- "Database Settings Description": "Enter your MySQL database connection information (hostname, username and password). You can specify the server port for hostname like localhost:3306."
+ "Database Settings Description": "Enter your MySQL database connection information (hostname, username and password). You can specify the server port for hostname like localhost:3306.",
+ "Install": "Install",
+ "SetupConfirmation page title": "Recommended Settings",
+ "PHP Configuration": "Recommended PHP settings",
+ "MySQL Configuration": "MySQL Configuration",
+ "Configuration Instructions": "Configuration Instructions",
+ "phpVersion": "PHP version",
+ "mysqlVersion": "MySQL version",
+ "dbHostName": "Host Name",
+ "dbName": "Database Name",
+ "dbUserName": "Database User Name",
+ "OK": "OK"
},
"fields": {
"Choose your language": "Choose your language",
@@ -78,7 +90,7 @@
"createUser error": "createUser error",
"checkAjaxPermission error": "checkAjaxPermission error",
"Ajax failed": "Ajax failed",
- "Cannot create user": "Cannot create user",
+ "Cannot create user": "Cannot create a user",
"Permission denied": "Permission denied",
"permissionInstruction": "
Run this in Terminal
\"{C}\"",
"operationNotPermitted" : "Operation not permitted? Try this: