Пример #1
0
 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));
 }
Пример #2
0
 /**
  * Экшен для настройки БД:
  *
  * @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]]);
 }
Пример #3
0
    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'));
        }
    }