public function actionInstall() { if (Yii::app()->db->username) { throw new CHttpException(404, 'Система уже установлена'); } // Список требований $minPhp = '5.3'; $testFunc = array('chmod', 'mkdir', 'copy'); $disFunc = explode(',', ini_get('disable_functions')); $testExt = array('pdo', 'pdo_mysql', 'gd', 'mbstring', 'ctype'); $confFile = __DIR__ . '/../../include/db.config.inc.php'; $assetDir = __DIR__ . '/../../assets'; $runtimeDir = __DIR__ . '/../runtime'; // Проверка подключения к БД if (Yii::app()->request->isAjaxRequest) { $form = new InstallForm('test'); $form->attributes = $_POST['InstallForm']; $conn = $form->testConnect(); if ($conn !== TRUE) { Yii::app()->end('<span class="text-error">' . $conn . '</span>'); } Yii::app()->end('<span class="text-success">Соединение установлено</span>'); } $error = array(); // Проверка требований if (version_compare(PHP_VERSION, $minPhp, '<')) { $error[] = 'Вы используете PHP версию ниже рекомендуемой'; } foreach ($testFunc as $func) { if (!function_exists($func) || in_array($func, $disFunc)) { $error[] = "Недоступна функция {$func}"; } } foreach ($testExt as $ext) { if (!extension_loaded($ext)) { $error[] = "Недоступно расширение {$ext}"; } } if (!is_writable($confFile)) { if (!chmod($confFile, 0666)) { $error[] = 'Недостаточно прав для записи в конфиг'; } } if (!is_writable($assetDir)) { if (!chmod($assetDir, 0777)) { exit('Недостаточно прав для записи в папку /assets'); } } if (!is_writable($runtimeDir)) { if (!chmod($runtimeDir, 0777)) { exit('Недостаточно прав для записи в папку /protected/runtime'); } } $form = new InstallForm(); $success = FALSE; // ПОСТ? Ошибок нет? Устанавливаем! if (!count($error) && Yii::app()->request->isPostRequest) { $form->attributes = $_POST['InstallForm']; if ($form->validate()) { $res = $form->installDB(); if ($res !== TRUE) { $form->addError('', $res); } else { $success = TRUE; } } } $this->render('install', array('form' => $form, 'error' => $error, 'success' => $success)); }
/** * Экшен для настройки БД: * * @return nothing **/ public function actionDbsettings() { $this->_markFinished('requirements'); $dbConfFile = Yii::app()->basePath . '/config/' . 'db.php'; $form = new InstallForm('dbSettings'); if (isset($this->session['InstallForm']['dbSettings'])) { $form->setAttributes($this->session['InstallForm']['dbSettings']); if ($form->validate() && $this->session['InstallForm']['dbSettingsStep'] === true) { $this->session['InstallForm'] = array_merge($this->session['InstallForm'], ['dbSettings' => $form->attributes, 'dbSettingsStep' => false, 'dbSettingsFile' => true]); $this->_setSession(); $this->_markFinished('dbsettings'); $this->redirect(['/install/default/modulesinstall']); } } if (Yii::app()->getRequest()->getIsPostRequest() && isset($_POST['InstallForm'])) { $form->setAttributes($_POST['InstallForm']); if ($form->validate()) { $socket = $form->socket == '' ? '' : 'unix_socket=' . $form->socket . ';'; $port = $form->port == '' ? '' : 'port=' . $form->port . ';'; $dbName = empty($form->createDb) ? 'dbname=' . $form->dbName : ''; $dbTypes = $form->getDbTypes(); $dbType = isset($dbTypes[$form->dbType]) ? $dbTypes[$form->dbType] : $dbTypes[InstallForm::DB_MYSQL]; $socket = $form->socket == '' ? '' : 'unix_socket=' . $form->socket . ';'; $port = $form->port == '' ? '' : 'port=' . $form->port . ';'; $connectionString = "{$dbType}:host={$form->host};{$port}{$socket}{$dbName}"; try { $connection = new CDbConnection($connectionString, $form->dbUser, $form->dbPassword); } catch (Exception $e) { $form->addError('', Yii::t('InstallModule.install', 'Couldn\'t connect to DB with these params!') . '<br />' . $connectionString . '<br />' . $e->getMessage()); Yii::log($e->__toString(), CLogger::LEVEL_ERROR); Yii::log($e->getTraceAsString(), CLogger::LEVEL_ERROR); } if ($form->createDb) { try { $sql = 'CREATE DATABASE ' . ($connection->schema instanceof CMysqlSchema ? ' `' . $form->dbName . '` CHARACTER SET=utf8' : $form->dbName); $connection->createCommand($sql)->execute(); $connectionString .= 'dbname=' . $form->dbName; } catch (Exception $e) { $form->addError('', Yii::t('InstallModule.install', 'Failed to create the database!') . '<br />' . $connectionString . '<br />' . $e->getMessage()); Yii::log($e->__toString(), CLogger::LEVEL_ERROR); Yii::log($e->getTraceAsString(), CLogger::LEVEL_ERROR); } } $connection->connectionString = $connectionString; try { $connection->username = $form->dbUser; $connection->password = $form->dbPassword; $connection->emulatePrepare = true; $connection->charset = 'utf8'; if (!$form->hasErrors()) { $connection->tablePrefix = $form->tablePrefix; Yii::app()->setComponent('db', $connection); $dbParams = ['class' => 'CDbConnection', 'connectionString' => $connectionString, 'username' => $form->dbUser, 'password' => $form->dbPassword, 'emulatePrepare' => true, 'charset' => 'utf8', 'enableParamLogging' => "{debug}", 'enableProfiling' => "{debug}", 'schemaCachingDuration' => 108000, 'tablePrefix' => $form->tablePrefix, 'pdoClass' => 'yupe\\extensions\\NestedPDO']; $dbConfString = "<?php\n return " . str_replace("'{debug}'", "defined('YII_DEBUG') && YII_DEBUG ? true : 0", var_export($dbParams, true)) . ";\n"; $fh = fopen($dbConfFile, 'w+'); if (!$fh) { $form->addError('', Yii::t('InstallModule.install', "Can not open file '{file}' in write mode!", ['{file}' => $dbConfFile])); } else { if (fwrite($fh, $dbConfString) && fclose($fh)) { $this->session['InstallForm'] = array_merge($this->session['InstallForm'], ['dbSettings' => $form->attributes, 'dbSettingsStep' => true, 'dbSettingsFile' => true]); $this->_setSession(); $this->redirect(['/install/default/dbsettings']); } else { $form->addError('', Yii::t('InstallModule.install', "There was an error writing to file '{file}'!", ['{file}' => $dbConfFile])); } } } } catch (Exception $e) { $form->addError('', Yii::t('InstallModule.install', 'Couldn\'t connect to DB!') . '<br />' . $connectionString . '<br />' . $e->getMessage()); Yii::log($e->__toString(), CLogger::LEVEL_ERROR); Yii::log($e->getTraceAsString(), CLogger::LEVEL_ERROR); } } } $result = false; if (file_exists($dbConfFile) && is_writable($dbConfFile)) { $result = true; } $this->render('_view', ['data' => ['model' => $form, 'result' => $result, 'file' => $dbConfFile]]); }
public function actionInstall() { global $CONFIG; // Путь к файлу конфигурации для его изменения $this->layout = "/install-layout"; $db_error = false; $model = new InstallForm; if (Yii::app()->params['installed'] !== "yes") { if (!is_writable($CONFIG)) { $model->addError("site_name", "Файл " . $CONFIG . " должен быть доступен для записи"); } if (!is_writable(Yii::getPathOfAlias('application.config.settings') . ".php")) { $model->addError("site_name", "Файл " .Yii::getPathOfAlias('application.config.settings') . ".php" . " должен быть доступен для записи"); } if (!is_writable(Yii::getPathOfAlias('application.runtime'))) { $model->addError("site_name", "папка " .Yii::getPathOfAlias('application.runtime') . " должена быть доступена для записи"); } if (!is_writable(Yii::app()->basePath . "/../assets")) { $model->addError("site_name", "папка /assets должена быть доступена для записи"); } if (isset($_POST['InstallForm'])) { $model->attributes = $_POST['InstallForm']; // данные Mysql $server = trim(stripslashes($_POST['InstallForm']['mysql_server'])); $username = trim(stripslashes($_POST['InstallForm']['mysql_login'])); $password = trim(stripslashes($_POST['InstallForm']['mysql_password'])); $db_name = trim(stripslashes($_POST['InstallForm']['mysql_db_name'])); // данные пользователя if (!$model->validate() or $model->userpass !== $model->userpass2) { $model->addError('userpass2', "Пароли не совпадают"); } if (!$model->errors) { $db_con = mysqli_connect($server, $username, $password) or $db_error = mysqli_error(); mysqli_select_db($db_con, $db_name) or $db_error = mysqli_error($db_con); } if (!$db_error and ! $model->errors) { $config_data = require $CONFIG; $dump_file = file_get_contents(Yii::getPathOfAlias('application.data.install') . '.sql'); // Сохранение данных о пользователе $dump_file.=" INSERT INTO `users` (`username`, `password`, `email`, `activkey`, `superuser`, `status`) VALUES " . "('" . $model->username . "', '" . UserModule::encrypting($model->userpass) . "', " . "'" . $model->useremail . "', '" . UserModule::encrypting(microtime() . $model->userpass) . "'," . " 1, 1);"; mysqli_multi_query($db_con, $dump_file) or $db_error = mysqli_error($db_con); if (!$db_error) { // Заполнение конфигурации $config_data['components']['db'] = array( 'connectionString' => 'mysql:host=' . $server . ';dbname=' . $db_name, 'emulatePrepare' => true, 'username' => $username, 'password' => $password, 'charset' => 'utf8', 'tablePrefix' => '', ); $config_data['name'] = trim(stripslashes($_POST['InstallForm']['site_name'])); $config_data['params'] = "require"; $config_array_str = var_export($config_data, true); $config_array_str = str_replace("'params' => 'require',", "'params' => require 'settings.php',", $config_array_str); //Сохранение конфигурации file_put_contents($CONFIG, "<? return " . $config_array_str . " ?>"); // Сохранение настроек $settings = new ConfigForm(Yii::getPathOfAlias('application.config.settings') . ".php"); $settings->updateParam('adminEmail', $model->useremail); $settings->updateParam('installed', 'yes'); $settings->saveToFile(); $this->redirect(array('site/index')); } } } $this->render('install', array('model' => $model, 'db_error' => $db_error)); } else { $this->redirect(array('site/index')); } }