2009-11-08 02:23:51 +02:00
< ? php
/*-------------------------------------------------------
*
* LiveStreet Engine Social Networking
* Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
* Official site : www . livestreet . ru
* Contact e - mail : rus . engine @ gmail . com
*
* GNU General Public License , version 2 :
* http :// www . gnu . org / licenses / old - licenses / gpl - 2.0 . html
*
---------------------------------------------------------
*/
error_reporting ( E_ALL );
2009-12-07 20:45:49 +02:00
set_time_limit ( 0 );
2010-07-07 18:01:22 +03:00
define ( 'LS_VERSION' , '0.4.2' );
2009-11-08 02:23:51 +02:00
class Install {
/**
* Название первого шага ( используется , если другое не указано )
*
* @ var string
*/
const INSTALL_DEFAULT_STEP = 'Start' ;
/**
* Ключ сессии для хранения название следующего шага
*
* @ var string
*/
const SESSSION_KEY_STEP_NAME = 'livestreet_install_step' ;
2009-11-09 03:52:30 +02:00
/**
* Название файла локальной конфигурации
*
* @ var string
*/
2009-11-09 19:29:22 +02:00
const LOCAL_CONFIG_FILE_NAME = 'config.local.php' ;
2009-11-10 15:26:40 +02:00
/**
* Передача этого ключа как параметра , указавает функции извлечения параметра
* запросить значение переменной сначала из сессии , в случае не нахождения нужного
* ключа - установить значение по умолчанию .
*
* Используется в фукнциях Assign (), GetRequest () .
*
* @ see $this -> Assign ()
* @ see $this -> GetRequest ()
* @ var string
*/
const GET_VAR_FROM_SESSION = 'get' ;
/**
* Передача этого ключа как параметра , указавает функции предварительно сохранить
* переменную в сессию с одноименным ключем .
*
* Используется в фукнциях Assign (), GetRequest () .
*
* @ see $this -> Assign ()
* @ see $this -> GetRequest ()
* @ var string
*/
const SET_VAR_IN_SESSION = 'set' ;
2009-11-08 02:23:51 +02:00
/**
* Массив разрешенных шагов инсталяции
*
* @ var array
*/
2009-11-16 05:54:29 +02:00
var $aSteps = array ( 0 => 'Start' , 1 => 'Db' , 2 => 'Admin' , 3 => 'End' , 4 => 'Extend' , 5 => 'Finish' );
2009-12-07 21:46:46 +02:00
/**
* Шаги в обычном режиме инсталляции
*
* @ var array
*/
var $aSimpleModeSteps = array ( 'Start' , 'Db' , 'Admin' , 'End' );
/**
* Количество шагов , которые необходимо указывать в инсталляционных параметрах
*
* @ var int
*/
var $iStepCount = null ;
2009-11-08 02:23:51 +02:00
/**
* Массив сообщений для пользователя
*
* @ var array
*/
2009-11-12 01:35:17 +02:00
var $aMessages = array ();
2009-11-08 02:23:51 +02:00
/**
* Директория с шаблонами
*
* @ var string
*/
2009-11-12 01:35:17 +02:00
var $sTemplatesDir = 'templates' ;
2009-11-15 00:51:23 +02:00
/**
* Директория с языковыми файлами инсталлятора
*
* @ var string
*/
var $sLangInstallDir = 'language' ;
2009-11-08 02:23:51 +02:00
/**
* Массив с переменными шаблонизатора
*
* @ var array
*/
2009-11-12 01:35:17 +02:00
var $aTemplateVars = array (
2009-11-08 02:23:51 +02:00
'___CONTENT___' => '' ,
'___FORM_ACTION___' => '' ,
'___NEXT_STEP_DISABLED___' => '' ,
'___NEXT_STEP_DISPLAY___' => 'block' ,
2009-11-11 22:03:44 +02:00
'___PREV_STEP_DISABLED___' => '' ,
'___PREV_STEP_DISPLAY___' => 'block' ,
2009-11-08 02:23:51 +02:00
'___SYSTEM_MESSAGES___' => '' ,
2009-12-07 21:46:46 +02:00
'___INSTALL_VERSION___' => LS_VERSION ,
2009-11-08 02:23:51 +02:00
);
/**
* Описание требований для успешной инсталяции
*
* @ var array
*/
2009-11-12 01:35:17 +02:00
var $aValidEnv = array (
2009-11-08 02:23:51 +02:00
'safe_mode' => array ( '0' , 'off' , '' ),
'register_globals' => array ( '0' , 'off' , '' ),
'allow_url_fopen' => array ( '1' , 'on' ),
'UTF8_support' => '1' ,
'http_input' => array ( '' , 'pass' ),
'http_output' => array ( '0' , 'pass' ),
'func_overload' => array ( '0' , '4' , 'no overload' ),
);
2009-11-09 01:35:11 +02:00
/**
* Директория , в которой хранятся конфиг - файлы
*
* @ var string
*/
2009-11-12 01:35:17 +02:00
var $sConfigDir = " " ;
2009-11-12 00:57:00 +02:00
/**
2009-11-15 00:51:23 +02:00
* Директория хранения скинов сайта
2009-11-12 00:57:00 +02:00
*
* @ var string
*/
2009-11-12 01:35:17 +02:00
var $sSkinDir = " " ;
2009-11-12 00:57:00 +02:00
/**
2009-11-15 00:51:23 +02:00
* Директория хранения языковых файлов движка
2009-11-12 00:57:00 +02:00
*
* @ var string
*/
2009-11-12 01:35:17 +02:00
var $sLangDir = " " ;
2009-11-15 00:51:23 +02:00
/**
* Текущий язык инсталлятора
*
* @ var string
*/
var $sLangCurrent = '' ;
/**
* Язык инсталлятора , который будет использован по умолчанию
*
* @ var string
*/
var $sLangDefault = 'russian' ;
/**
* Языковые текстовки
*
* @ var array
*/
var $aLang = array ();
2009-11-09 01:35:11 +02:00
/**
* Инициализация основных настроек
*
*/
2009-11-12 01:35:17 +02:00
function __construct () {
2009-11-09 01:35:11 +02:00
$this -> sConfigDir = dirname ( __FILE__ ) . '/../config' ;
2009-11-12 00:57:00 +02:00
$this -> sSkinDir = dirname ( __FILE__ ) . '/../templates/skin' ;
$this -> sLangDir = dirname ( __FILE__ ) . '/../templates/language' ;
2009-11-15 00:51:23 +02:00
/**
* Загружаем языковые файлы
*/
$this -> LoadLanguageFile ( $this -> sLangDefault );
if ( $sLang = $this -> GetRequest ( 'lang' )) {
$this -> sLangCurrent = $sLang ;
if ( $this -> sLangCurrent != $this -> sLangDefault ) $this -> LoadLanguageFile ( $this -> sLangCurrent );
}
2009-11-16 05:01:01 +02:00
/**
* Передаем языковые тикеты во вьювер
*/
foreach ( $this -> aLang as $sKey => $sItem ) {
$this -> Assign ( " lang_ { $sKey } " , $sItem );
}
2009-11-15 00:51:23 +02:00
}
/**
* Подгружает указанный языковой файл и записывает поверх существующего языкового массива
*
* @ access protected
* @ param string $sLang
*/
function LoadLanguageFile ( $sLang ) {
$sFilePath = $this -> sLangInstallDir . '/' . $sLang . '.php' ;
if ( ! file_exists ( $sFilePath )) return false ;
$aLang = include ( $sFilePath );
$this -> aLang = array_merge ( $this -> aLang , $aLang );
}
/**
* Возвращает языковую текстовку
*
* @ param string $sKey
* @ param array $aParams
* @ return string
*/
function Lang ( $sKey , $aParams = array ()) {
2009-11-16 05:54:29 +02:00
if ( ! array_key_exists ( $sKey , $this -> aLang ))
2009-11-15 00:51:23 +02:00
return 'Unknown language key' ;
$sValue = $this -> aLang [ $sKey ];
if ( count ( $aParams ) == 0 ) return $sValue ;
foreach ( $aParams as $k => $v ) {
$sValue = str_replace ( " %% { $k } %% " , $v , $sValue );
}
return $sValue ;
2009-11-09 01:35:11 +02:00
}
2009-11-08 02:23:51 +02:00
/**
* Вытягивает переменную из сессии
*
* @ param string $sKey
* @ return mixed
*/
2009-11-12 01:35:17 +02:00
function GetSessionVar ( $sKey , $mDefault = null ) {
2009-11-08 02:23:51 +02:00
return array_key_exists ( $sKey , $_SESSION ) ? unserialize ( $_SESSION [ $sKey ]) : $mDefault ;
}
/**
* Вкладывает переменную в сессию
*
* @ param string $sKey
* @ param mixed $mVar
* @ return bool
*/
2009-11-12 01:35:17 +02:00
function SetSessionVar ( $sKey , $mVar ) {
2009-11-08 02:23:51 +02:00
$_SESSION [ $sKey ] = serialize ( $mVar );
return true ;
}
/**
* Уничтожает переменную в сессии
*
* @ param string $sKey
* @ return bool
*/
2009-11-12 01:35:17 +02:00
function DestroySessionVar ( $sKey ) {
2009-11-08 02:23:51 +02:00
if ( ! array_key_exists ( $sKey , $_SESSION )) return false ;
unset ( $_SESSION [ $sKey ]);
return true ;
}
/**
* Выполняет рендеринг указанного шаблона
*
* @ param string $sTemplateName
* @ return string
*/
2009-11-12 01:35:17 +02:00
function Fetch ( $sTemplateName ) {
2009-11-08 02:23:51 +02:00
if ( ! file_exists ( $this -> sTemplatesDir . '/' . $sTemplateName )) return false ;
$sTemplate = file_get_contents ( $this -> sTemplatesDir . '/' . $sTemplateName );
2009-11-12 00:57:00 +02:00
return $this -> FetchString ( $sTemplate );
}
/**
* Выполняет рендеринг строки
*
* @ param string $sTempString
* @ return string
*/
2009-11-12 01:35:17 +02:00
function FetchString ( $sTempString ) {
2009-11-12 00:57:00 +02:00
return str_replace ( array_keys ( $this -> aTemplateVars ), array_values ( $this -> aTemplateVars ), $sTempString );
2009-11-08 02:23:51 +02:00
}
/**
2009-11-10 01:17:55 +02:00
* Добавляет переменную для отображение в шаблоне .
*
* Если параметр $sFromSession установлен в значение GET ,
* то переменная сначала будет запрошена из сессии .
*
* Если параметр $sFromSession установлен в значение SET ,
* то переменная сначала вложена в сессию с одноименным ключем .
2009-11-08 02:23:51 +02:00
*
* @ param string $sName
* @ param string $sValue
2009-11-10 01:17:55 +02:00
* @ param string $sGetFromSession
2009-11-08 02:23:51 +02:00
*/
2009-11-12 01:35:17 +02:00
function Assign ( $sName , $sValue , $sFromSession = null ) {
2009-11-10 15:26:40 +02:00
if ( $sFromSession == self :: GET_VAR_FROM_SESSION ) $sValue = $this -> GetSessionVar ( $sName , $sValue );
if ( $sFromSession == self :: SET_VAR_IN_SESSION ) $this -> SetSessionVar ( $sName , $sValue );
2009-11-10 01:17:55 +02:00
2009-11-08 02:23:51 +02:00
$this -> aTemplateVars [ '___' . strtoupper ( $sName ) . '___' ] = $sValue ;
}
/**
* Выполняет рендер layout ` а ( двухуровневый )
*
* @ param string $sTemplate
* @ return null
*/
2009-11-12 01:35:17 +02:00
function Layout ( $sTemplate ) {
2009-11-08 02:23:51 +02:00
if ( ! $sLayoutContent = $this -> Fetch ( $sTemplate )) {
return false ;
}
/**
* Рендерим сообщения по списку
*/
if ( count ( $this -> aMessages )) {
2009-11-10 01:17:55 +02:00
/**
* Уникализируем содержимое списка сообщений
*/
$aMessages = array ();
foreach ( $this -> aMessages as & $sMessage ) {
2009-11-11 22:03:44 +02:00
if ( array_key_exists ( 'type' , $sMessage ) and array_key_exists ( 'text' , $sMessage )) {
$aMessages [ $sMessage [ 'type' ]][ md5 ( serialize ( $sMessage ))] = " <b> " . ucfirst ( $sMessage [ 'type' ]) . " </b>: " . $sMessage [ 'text' ];
}
2009-11-10 01:17:55 +02:00
unset ( $sMessage );
}
$this -> aMessages = $aMessages ;
2009-11-08 02:23:51 +02:00
$sMessageContent = " " ;
2009-11-11 22:03:44 +02:00
foreach ( $this -> aMessages as $sType => $aMessageTexts ) {
$this -> Assign ( 'message_style_class' , $sType );
$this -> Assign ( 'message_content' , implode ( '<br />' , $aMessageTexts ));
2009-11-08 02:23:51 +02:00
$sMessageContent .= $this -> Fetch ( 'message.tpl' );
}
$this -> Assign ( 'system_messages' , $sMessageContent );
}
$this -> Assign ( 'content' , $sLayoutContent );
print $this -> Fetch ( 'layout.tpl' );
}
2009-11-09 19:29:22 +02:00
2009-11-08 02:23:51 +02:00
/**
2009-11-09 19:29:22 +02:00
* Сохранить данные в конфиг - файл
*
* @ param string $sName
* @ param string $sVar
* @ param string $sPath
2009-11-08 02:23:51 +02:00
* @ return bool
*/
2009-11-12 01:35:17 +02:00
function SaveConfig ( $sName , $sVar , $sPath ) {
2009-11-10 01:17:55 +02:00
if ( ! file_exists ( $sPath )) {
2009-11-15 00:51:23 +02:00
$this -> aMessages [] = array ( 'type' => 'error' , 'text' => $this -> Lang ( 'config_file_not_exists' , array ( 'path' => $sPath )));
2009-11-10 01:17:55 +02:00
return false ;
}
if ( ! is_writeable ( $sPath )) {
2009-11-15 00:51:23 +02:00
$this -> aMessages [] = array ( 'type' => 'error' , 'text' => $this -> Lang ( 'config_file_not_writable' , array ( 'path' => $sPath )));
2009-11-10 01:17:55 +02:00
return false ;
}
2009-11-08 02:23:51 +02:00
2009-11-09 19:29:22 +02:00
$sConfig = file_get_contents ( $sPath );
$sName = '$config[\'' . implode ( '\'][\'' , explode ( '.' , $sName )) . '\']' ;
$sVar = $this -> ConvertToString ( $sVar );
/**
* Если переменная уже определена в конфиге ,
* то меняем значение .
*/
if ( substr_count ( $sConfig , $sName )) {
2010-03-30 23:19:57 +03:00
$sConfig = preg_replace ( " ~ " . preg_quote ( $sName ) . " .+;~Ui " , $sName . ' = ' . $sVar . ';' , $sConfig );
2009-11-08 02:23:51 +02:00
} else {
2010-03-30 23:19:57 +03:00
$sConfig = str_replace ( 'return $config;' , $sName . ' = ' . $sVar . ';' . PHP_EOL . 'return $config;' , $sConfig );
2009-11-08 02:23:51 +02:00
}
2009-11-09 19:29:22 +02:00
file_put_contents ( $sPath , $sConfig );
return true ;
}
/**
* Преобразует переменную в формат для записи в текстовый файл
*
* @ param mixed $mVar
* @ return string
*/
2009-11-12 01:35:17 +02:00
function ConvertToString ( $mVar ) {
2009-11-09 19:29:22 +02:00
switch ( true ) {
case is_string ( $mVar ) :
2010-03-30 23:19:57 +03:00
return " ' " . addslashes ( $mVar ) . " ' " ;
2009-11-09 19:29:22 +02:00
case is_bool ( $mVar ) :
2009-11-14 09:33:37 +02:00
return ( $mVar ) ? " true " : " false " ;
2009-11-09 19:29:22 +02:00
case is_array ( $mVar ) :
$sArrayString = " " ;
foreach ( $mVar as $sKey => $sValue ) {
$sArrayString .= " ' { $sKey } '=> " . $this -> ConvertToString ( $sValue ) . " , " ;
}
return " array( " . $sArrayString . " ) " ;
default :
case is_numeric ( $mVar ) :
2009-11-14 09:33:37 +02:00
return " ' " . ( string ) $mVar . " ' " ;
2009-11-08 02:23:51 +02:00
}
2009-11-09 19:29:22 +02:00
}
/**
* Получает значение переданных параметров
*
* @ param string $sName
* @ param mixed $default
* @ return mixed
*/
2009-11-12 01:35:17 +02:00
function GetRequest ( $sName , $default = null , $bSession = null ) {
2009-11-10 15:26:40 +02:00
if ( array_key_exists ( $sName , $_REQUEST )) {
$sResult = ( is_string ( $_REQUEST [ $sName ]))
? trim ( stripslashes ( $_REQUEST [ $sName ]))
: $_REQUEST [ $sName ];
} else {
$sResult = ( $bSession == self :: GET_VAR_FROM_SESSION )
? $this -> GetSessionVar ( $sName , $default )
: $default ;
2009-11-09 19:29:22 +02:00
}
2009-11-10 15:26:40 +02:00
/**
* При необходимости сохраняем в сессию
*/
if ( $bSession == self :: SET_VAR_IN_SESSION ) $this -> SetSessionVar ( $sName , $sResult );
return $sResult ;
2009-11-09 19:29:22 +02:00
}
/**
* Функция отвечающая за проверку входных параметров
* и передающая управление на фукнцию текущего шага
*
* @ call $this -> Step { __Name__ }
*/
2009-12-14 02:32:16 +02:00
function Run ( $sStepName = null ) {
if ( is_null ( $sStepName )){
$sStepName = $this -> GetSessionVar ( self :: SESSSION_KEY_STEP_NAME , self :: INSTALL_DEFAULT_STEP );
} else {
$this -> SetSessionVar ( self :: SESSSION_KEY_STEP_NAME , $sStepName );
}
2009-11-16 05:54:29 +02:00
if ( ! in_array ( $sStepName , $this -> aSteps )) die ( 'Unknown step' );
2009-11-08 02:23:51 +02:00
2009-11-09 19:29:22 +02:00
$iKey = array_search ( $sStepName , $this -> aSteps );
2009-11-10 01:17:55 +02:00
/**
* Если была нажата кнопка " Назад " , перемещаемся на шаг назад
*/
if ( $this -> GetRequest ( 'install_step_prev' ) && $iKey != 0 ) {
$sStepName = $this -> aSteps [ -- $iKey ];
$this -> SetSessionVar ( self :: SESSSION_KEY_STEP_NAME , $sStepName );
}
2009-12-14 02:32:16 +02:00
$this -> Assign ( 'next_step_display' , ( $iKey == count ( $this -> aSteps ) - 1 ) ? 'none' : 'block' );
$this -> Assign ( 'prev_step_display' , ( $iKey == 0 ) ? 'none' : 'block' );
2009-12-07 21:46:46 +02:00
/**
* Если шаг отновиться к simple mode , то корректируем количество шагов
*/
if ( in_array ( $sStepName , $this -> aSimpleModeSteps ))
$this -> SetStepCount ( count ( $this -> aSimpleModeSteps ));
2009-11-10 15:26:40 +02:00
/**
* Передаем во вьевер данные для формирование таймлайна шагов
*/
$this -> Assign ( 'install_step_number' , $iKey + 1 );
2009-12-07 21:46:46 +02:00
$this -> Assign ( 'install_step_count' , is_null ( $this -> iStepCount ) ? count ( $this -> aSteps ) : $this -> iStepCount );
2009-11-09 19:29:22 +02:00
/**
* Пердаем управление на метод текущего шага
*/
$sFunctionName = 'Step' . $sStepName ;
if ( @ method_exists ( $this , $sFunctionName )) {
$this -> $sFunctionName ();
2009-11-08 02:23:51 +02:00
} else {
2009-11-09 19:29:22 +02:00
$sFunctionName = 'Step' . self :: INSTALL_DEFAULT_STEP ;
$this -> SetSessionVar ( self :: SESSSION_KEY_STEP_NAME , self :: INSTALL_DEFAULT_STEP );
$this -> $sFunctionName ();
2009-11-08 02:23:51 +02:00
}
}
2009-11-16 05:54:29 +02:00
/**
* Сохраняет данные о текущем шаге и передает их во вьювер
*
* @ access protected
* @ return bool
*/
function SetStep ( $sStepName ) {
if ( ! $sStepName or ! in_array ( $sStepName , $this -> aSteps )) return null ;
$this -> Assign ( 'install_step_number' , array_search ( $sStepName , $this -> aSteps ) + 1 );
}
2009-12-07 21:46:46 +02:00
/**
* Устанавливает количество шагов для отображения в шаблонах
*
* @ param int $iStepCount
*/
function SetStepCount ( $iStepCount ) {
$this -> iStepCount = $iStepCount ;
}
2009-11-08 02:23:51 +02:00
/**
* Первый шаг инсталяции .
* Валидация окружения .
*/
2009-11-12 01:35:17 +02:00
function StepStart () {
2009-11-08 02:23:51 +02:00
if ( ! $this -> ValidateEnviroment ()) {
$this -> Assign ( 'next_step_disabled' , 'disabled' );
} else {
2009-11-12 18:46:27 +02:00
/**
* Прописываем в конфигурацию абсолютные пути
*/
$this -> SavePath ();
2009-12-14 02:32:16 +02:00
if ( $this -> GetRequest ( 'install_step_next' )) {
return $this -> Run ( 'Db' );
}
2009-11-08 02:23:51 +02:00
}
2009-11-16 05:54:29 +02:00
$this -> SetStep ( 'Start' );
2009-11-08 02:23:51 +02:00
$this -> Layout ( 'steps/start.tpl' );
}
2009-11-09 03:52:30 +02:00
/**
* Запрос данных соединения с базой данных .
* Запись полученных данных в лог .
*/
2009-11-12 01:35:17 +02:00
function StepDb () {
2009-11-10 01:17:55 +02:00
if ( ! $this -> GetRequest ( 'install_db_params' )) {
/**
* Получаем данные из сессии ( если они туда были вложены на предыдущих итерациях шага )
*/
2009-12-14 02:32:16 +02:00
$this -> Assign ( 'install_db_server' , 'localhost' , self :: GET_VAR_FROM_SESSION );
$this -> Assign ( 'install_db_port' , '3306' , self :: GET_VAR_FROM_SESSION );
$this -> Assign ( 'install_db_name' , 'social' , self :: GET_VAR_FROM_SESSION );
$this -> Assign ( 'install_db_user' , 'root' , self :: GET_VAR_FROM_SESSION );
$this -> Assign ( 'install_db_password' , '' , self :: GET_VAR_FROM_SESSION );
$this -> Assign ( 'install_db_create_check' , '' , self :: GET_VAR_FROM_SESSION );
$this -> Assign ( 'install_db_prefix' , 'prefix_' , self :: GET_VAR_FROM_SESSION );
$this -> Assign ( 'install_db_engine' , 'InnoDB' , self :: GET_VAR_FROM_SESSION );
$this -> Assign ( 'install_db_engine_innodb' , '' , self :: GET_VAR_FROM_SESSION );
$this -> Assign ( 'install_db_engine_myisam' , '' , self :: GET_VAR_FROM_SESSION );
2009-11-08 02:23:51 +02:00
$this -> Layout ( 'steps/db.tpl' );
return true ;
}
/**
* Если переданны данные формы , проверяем их на валидность
*/
$aParams [ 'server' ] = $this -> GetRequest ( 'install_db_server' , '' );
$aParams [ 'port' ] = $this -> GetRequest ( 'install_db_port' , '' );
$aParams [ 'name' ] = $this -> GetRequest ( 'install_db_name' , '' );
$aParams [ 'user' ] = $this -> GetRequest ( 'install_db_user' , '' );
$aParams [ 'password' ] = $this -> GetRequest ( 'install_db_password' , '' );
$aParams [ 'create' ] = $this -> GetRequest ( 'install_db_create' , 0 );
2009-11-17 03:42:20 +02:00
$aParams [ 'convert' ] = $this -> GetRequest ( 'install_db_convert' , 0 );
2009-11-08 02:23:51 +02:00
$aParams [ 'prefix' ] = $this -> GetRequest ( 'install_db_prefix' , 'prefix_' );
2009-11-12 18:46:27 +02:00
$aParams [ 'engine' ] = $this -> GetRequest ( 'install_db_engine' , 'InnoDB' );
2009-11-08 02:23:51 +02:00
2009-11-10 15:26:40 +02:00
$this -> Assign ( 'install_db_server' , $aParams [ 'server' ], self :: SET_VAR_IN_SESSION );
$this -> Assign ( 'install_db_port' , $aParams [ 'port' ], self :: SET_VAR_IN_SESSION );
$this -> Assign ( 'install_db_name' , $aParams [ 'name' ], self :: SET_VAR_IN_SESSION );
$this -> Assign ( 'install_db_user' , $aParams [ 'user' ], self :: SET_VAR_IN_SESSION );
$this -> Assign ( 'install_db_password' , $aParams [ 'password' ], self :: SET_VAR_IN_SESSION );
$this -> Assign ( 'install_db_create_check' , (( $aParams [ 'create' ]) ? 'checked="checked"' : '' ), self :: SET_VAR_IN_SESSION );
2009-11-17 03:42:20 +02:00
$this -> Assign ( 'install_db_convert_check' , (( $aParams [ 'convert' ]) ? 'checked="checked"' : '' ), self :: SET_VAR_IN_SESSION );
2009-11-10 15:26:40 +02:00
$this -> Assign ( 'install_db_prefix' , $aParams [ 'prefix' ], self :: SET_VAR_IN_SESSION );
2009-11-12 18:46:27 +02:00
$this -> Assign ( 'install_db_engine' , $aParams [ 'engine' ], self :: SET_VAR_IN_SESSION );
/**
* Передаем данные о выделенном пункте в списке tables engine
*/
$this -> Assign ( 'install_db_engine_innodb' , ( $aParams [ 'engine' ] == 'InnoDB' ) ? 'selected="selected"' : '' , self :: SET_VAR_IN_SESSION );
$this -> Assign ( 'install_db_engine_myisam' , ( $aParams [ 'engine' ] == 'MyISAM' ) ? 'selected="selected"' : '' , self :: SET_VAR_IN_SESSION );
2009-11-08 02:23:51 +02:00
if ( $oDb = $this -> ValidateDBConnection ( $aParams )) {
$bSelect = $this -> SelectDatabase ( $aParams [ 'name' ], $aParams [ 'create' ]);
/**
* Если не удалось выбрать базу данных , возвращаем ошибку
*/
if ( ! $bSelect ) {
2009-11-15 00:51:23 +02:00
$this -> aMessages [] = array ( 'type' => 'error' , 'text' => $this -> Lang ( 'error_db_invalid' ));
2009-11-08 02:23:51 +02:00
$this -> Layout ( 'steps/db.tpl' );
return false ;
}
2009-11-30 21:31:28 +02:00
2009-11-09 01:35:11 +02:00
/**
* Сохраняем в config . local . php настройки соединения
*/
2009-11-09 03:52:30 +02:00
$sLocalConfigFile = $this -> sConfigDir . '/' . self :: LOCAL_CONFIG_FILE_NAME ;
2009-11-09 01:35:11 +02:00
if ( ! file_exists ( $sLocalConfigFile )) {
2009-11-15 00:51:23 +02:00
$this -> aMessages [] = array ( 'type' => 'error' , 'text' => $this -> Lang ( 'error_local_config_invalid' ));
2009-11-09 01:35:11 +02:00
$this -> Layout ( 'steps/db.tpl' );
return false ;
}
2009-11-09 03:52:30 +02:00
@ chmod ( $sLocalConfigFile , 0777 );
2009-11-09 19:29:22 +02:00
$this -> SaveConfig ( 'db.params.host' , $aParams [ 'server' ], $sLocalConfigFile );
$this -> SaveConfig ( 'db.params.port' , $aParams [ 'port' ], $sLocalConfigFile );
$this -> SaveConfig ( 'db.params.user' , $aParams [ 'user' ], $sLocalConfigFile );
$this -> SaveConfig ( 'db.params.pass' , $aParams [ 'password' ], $sLocalConfigFile );
2009-11-26 03:11:08 +02:00
$this -> SaveConfig ( 'db.params.dbname' , $aParams [ 'name' ], $sLocalConfigFile );
2009-11-09 19:29:22 +02:00
$this -> SaveConfig ( 'db.table.prefix' , $aParams [ 'prefix' ], $sLocalConfigFile );
2009-11-30 21:31:28 +02:00
if ( $aParams [ 'engine' ] == 'InnoDB' ) {
/**
* Проверяем поддержку InnoDB в MySQL
*/
2010-01-06 12:18:21 +02:00
$aParams [ 'engine' ] = 'MyISAM' ;
if ( $aRes = @ mysql_query ( 'SHOW ENGINES' )) {
while ( $aRow = mysql_fetch_assoc ( $aRes )) {
if ( $aRow [ 'Engine' ] == 'InnoDB' and in_array ( $aRow [ 'Support' ], array ( 'DEFAULT' , 'YES' ))) {
$aParams [ 'engine' ] = 'InnoDB' ;
}
}
2009-11-30 21:31:28 +02:00
}
}
2009-11-12 18:46:27 +02:00
$this -> SaveConfig ( 'db.tables.engine' , $aParams [ 'engine' ], $sLocalConfigFile );
2009-11-09 03:52:30 +02:00
/**
* Сохраняем данные в сессию
*/
$this -> SetSessionVar ( 'INSTALL_DATABASE_PARAMS' , $aParams );
2009-11-08 02:23:51 +02:00
/**
2009-12-14 02:32:16 +02:00
* Проверяем была ли проведена установка базы в течении сеанса .
2009-11-08 02:23:51 +02:00
* Открываем . sql файл и добавляем в базу недостающие таблицы
*/
2009-12-14 02:32:16 +02:00
if ( $this -> GetSessionVar ( 'INSTALL_DATABASE_DONE' , '' ) != md5 ( serialize ( array ( $aParams [ 'server' ], $aParams [ 'name' ])))){
if ( ! $aParams [ 'convert' ]) {
2010-04-04 15:41:42 +03:00
$aRes = $this -> CreateTables ( 'sql.sql' , $aParams );
if ( $aRes ) {
list ( $bResult , $aErrors ) = array_values ( $aRes );
if ( ! $bResult ) {
foreach ( $aErrors as $sError ) $this -> aMessages [] = array ( 'type' => 'error' , 'text' => $sError );
$this -> Layout ( 'steps/db.tpl' );
return false ;
}
} else {
return $this -> StepAdmin ();
2009-12-14 02:32:16 +02:00
}
} else {
/**
* Если указана конвертация старой базы данных
*/
list ( $bResult , $aErrors ) = array_values ( $this -> ConvertDatabase ( 'convert.sql' , $aParams ));
if ( ! $bResult ) {
foreach ( $aErrors as $sError ) $this -> aMessages [] = array ( 'type' => 'error' , 'text' => $sError );
$this -> Layout ( 'steps/db.tpl' );
return false ;
}
2009-11-17 03:42:20 +02:00
}
2009-11-09 03:54:04 +02:00
}
2009-12-14 02:32:16 +02:00
/**
* Сохраняем в сессии информацию о том , что преобразование базы данных уже было выполнено .
* При этом сохраняем хеш сервера и названия базы данных , для последующего сравнения .
*/
$this -> SetSessionVar ( 'INSTALL_DATABASE_DONE' , md5 ( serialize ( array ( $aParams [ 'server' ], $aParams [ 'name' ]))));
2009-11-09 03:52:30 +02:00
/**
* Передаем управление на следующий шаг
*/
2009-11-15 00:51:23 +02:00
$this -> aMessages [] = array ( 'type' => 'notice' , 'text' => $this -> Lang ( 'ok_db_created' ));
2009-11-09 03:52:30 +02:00
return $this -> StepAdmin ();
2009-11-08 02:23:51 +02:00
} else {
2009-11-16 05:54:29 +02:00
$this -> SetStep ( 'Db' );
2009-11-08 02:23:51 +02:00
$this -> Layout ( 'steps/db.tpl' );
return false ;
}
}
2009-11-09 03:52:30 +02:00
/**
* Запрос данных администратора и сохранение их в базе данных
*
*/
2009-11-12 01:35:17 +02:00
function StepAdmin () {
2009-11-09 03:52:30 +02:00
$this -> SetSessionVar ( self :: SESSSION_KEY_STEP_NAME , 'Admin' );
2009-11-16 05:54:29 +02:00
$this -> SetStep ( 'Admin' );
2009-11-10 15:26:40 +02:00
/**
* Передаем данные из запроса во вьювер , сохраняя значение в сессии
*/
$this -> Assign ( 'install_admin_login' , $this -> GetRequest ( 'install_admin_login' , 'admin' , self :: GET_VAR_FROM_SESSION ), self :: SET_VAR_IN_SESSION );
$this -> Assign ( 'install_admin_mail' , $this -> GetRequest ( 'install_admin_mail' , 'admin@admin.adm' , self :: GET_VAR_FROM_SESSION ), self :: SET_VAR_IN_SESSION );
2009-11-09 03:52:30 +02:00
/**
* Если данные формы не были отправлены , передаем значения по умолчанию
*/
if ( ! $this -> GetRequest ( 'install_admin_params' , false )) {
return $this -> Layout ( 'steps/admin.tpl' );
}
/**
* Проверяем валидность введенных данных
*/
list ( $bResult , $aErrors ) = $this -> ValidateAdminFields ();
if ( ! $bResult ) {
foreach ( $aErrors as $sError ) $this -> aMessages [] = array ( 'type' => 'error' , 'text' => $sError );
$this -> Layout ( 'steps/admin.tpl' );
return false ;
}
/**
* Подключаемся к базе данных и сохраняем новые данные администратора
*/
$aParams = $this -> GetSessionVar ( 'INSTALL_DATABASE_PARAMS' );
if ( ! $this -> ValidateDBConnection ( $aParams )) {
2009-11-15 00:51:23 +02:00
$this -> aMessages [] = array ( 'type' => 'error' , 'text' => $this -> Lang ( 'error_db_connection_invalid' ));
2009-11-09 03:52:30 +02:00
$this -> Layout ( 'steps/admin.tpl' );
2009-12-14 02:32:16 +02:00
return false ;
2009-11-09 03:52:30 +02:00
}
$this -> SelectDatabase ( $aParams [ 'name' ]);
$bUpdated = $this -> UpdateDBUser (
$this -> GetRequest ( 'install_admin_login' ),
2009-11-30 21:31:28 +02:00
$this -> GetRequest ( 'install_admin_pass' ),
2009-11-09 03:52:30 +02:00
$this -> GetRequest ( 'install_admin_mail' ),
$aParams [ 'prefix' ]
);
if ( ! $bUpdated ) {
2009-11-15 00:51:23 +02:00
$this -> aMessages [] = array ( 'type' => 'error' , 'text' => $this -> Lang ( 'error_db_saved' ) . '<br />' . mysql_error ());
2009-11-09 03:52:30 +02:00
$this -> Layout ( 'steps/admin.tpl' );
2009-11-10 15:26:40 +02:00
return false ;
2009-11-09 03:52:30 +02:00
}
2009-12-14 02:32:16 +02:00
/**
* Обновляем данные о пользовательском блоге
*/
$this -> UpdateUserBlog ( " Blog by " . $this -> GetRequest ( 'install_admin_login' ), $aParams [ 'prefix' ]);
2009-11-09 03:52:30 +02:00
/**
* Передаем управление на следующий шаг
*/
return $this -> StepEnd ();
}
2009-11-09 19:29:22 +02:00
/**
* Завершающий этап . Переход в расширенный режим
*/
2009-11-12 01:35:17 +02:00
function StepEnd () {
2009-11-16 05:54:29 +02:00
$this -> SetStep ( 'End' );
2009-11-09 03:52:30 +02:00
$this -> Assign ( 'next_step_display' , 'none' );
$this -> SetSessionVar ( self :: SESSSION_KEY_STEP_NAME , 'End' );
2009-11-09 19:29:22 +02:00
/**
* Если пользователь выбрал расширенный режим , переводим на новый шаг
*/
return ( $this -> GetRequest ( 'install_step_extend' ))
? $this -> StepExtend ()
: $this -> Layout ( 'steps/end.tpl' );
}
/**
* Расширенный режим ввода дополнительных настроек .
*/
2009-11-12 01:35:17 +02:00
function StepExtend () {
2009-11-09 19:29:22 +02:00
/**
* Выводим на экран кнопку @ Next
*/
$this -> Assign ( 'next_step_display' , 'block' );
/**
* Сохраняем в сессию название текущего шага
*/
$this -> SetSessionVar ( self :: SESSSION_KEY_STEP_NAME , 'Extend' );
2009-11-16 05:54:29 +02:00
$this -> SetStep ( 'Extend' );
2009-11-09 19:29:22 +02:00
/**
* Получаем значения запрашиваемых данных либо устанавливаем принятые по умолчанию
*/
2009-11-10 15:26:40 +02:00
$aParams [ 'install_view_name' ] = $this -> GetRequest ( 'install_view_name' , 'LiveStreet - бесплатный движок социальной сети' , self :: GET_VAR_FROM_SESSION );
$aParams [ 'install_view_description' ] = $this -> GetRequest ( 'install_view_description' , 'LiveStreet - официальный сайт бесплатного движка социальной сети' , self :: GET_VAR_FROM_SESSION );
$aParams [ 'install_view_keywords' ] = $this -> GetRequest ( 'install_view_keywords' , 'движок, livestreet, блоги, социальная сеть, бесплатный, php' , self :: GET_VAR_FROM_SESSION );
$aParams [ 'install_view_skin' ] = $this -> GetRequest ( 'install_view_skin' , 'new' , self :: GET_VAR_FROM_SESSION );
2009-11-09 19:29:22 +02:00
2009-12-07 21:46:46 +02:00
$aParams [ 'install_mail_sender' ] = $this -> GetRequest ( 'install_mail_sender' , $this -> GetSessionVar ( 'install_admin_mail' , 'rus.engine@gmail.com' ), self :: GET_VAR_FROM_SESSION );
2009-11-10 15:26:40 +02:00
$aParams [ 'install_mail_name' ] = $this -> GetRequest ( 'install_mail_name' , 'Почтовик LiveStreet' , self :: GET_VAR_FROM_SESSION );
2009-11-09 03:52:30 +02:00
2009-11-10 15:26:40 +02:00
$aParams [ 'install_general_close' ] = ( bool ) $this -> GetRequest ( 'install_general_close' , false , self :: GET_VAR_FROM_SESSION );
$aParams [ 'install_general_invite' ] = ( bool ) $this -> GetRequest ( 'install_general_invite' , false , self :: GET_VAR_FROM_SESSION );
$aParams [ 'install_general_active' ] = ( bool ) $this -> GetRequest ( 'install_general_active' , false , self :: GET_VAR_FROM_SESSION );
2009-11-09 19:29:22 +02:00
2009-11-10 15:26:40 +02:00
$aParams [ 'install_lang_current' ] = $this -> GetRequest ( 'install_lang_current' , 'russian' , self :: GET_VAR_FROM_SESSION );
$aParams [ 'install_lang_default' ] = $this -> GetRequest ( 'install_lang_default' , 'russian' , self :: GET_VAR_FROM_SESSION );
2009-11-09 19:29:22 +02:00
/**
* Передаем параметры во Viewer
*/
foreach ( $aParams as $sName => $sParam ) {
/**
* Если передано булево значение , значит это чек - бокс
*/
if ( ! is_bool ( $sParam )) {
$this -> Assign ( $sName , trim ( $sParam ));
} else {
$this -> Assign ( $sName . '_check' ,( $sParam ) ? 'checked' : '' );
}
}
2009-11-12 00:57:00 +02:00
/**
* Передаем во вьевер список доступных языков
*/
$aLangs = $this -> GetLangList ();
$sLangOptions = " " ;
foreach ( $aLangs as $sLang ) {
$this -> Assign ( 'language_array_item' , $sLang );
$this -> Assign ( 'language_array_item_selected' , ( $aParams [ 'install_lang_current' ] == $sLang ) ? 'selected="selected"' : '' );
$sLangOptions .= $this -> FetchString ( " <option value='___LANGUAGE_ARRAY_ITEM___' ___LANGUAGE_ARRAY_ITEM_SELECTED___>___LANGUAGE_ARRAY_ITEM___</option> " );
}
$this -> Assign ( 'install_lang_options' , $sLangOptions );
/**
* Передаем во вьевер список доступных языков для дефолтного определения
*/
$sLangOptions = " " ;
foreach ( $aLangs as $sLang ) {
$this -> Assign ( 'language_array_item' , $sLang );
$this -> Assign ( 'language_array_item_selected' , ( $aParams [ 'install_lang_default' ] == $sLang ) ? 'selected="selected"' : '' );
$sLangOptions .= $this -> FetchString ( " <option value='___LANGUAGE_ARRAY_ITEM___' ___LANGUAGE_ARRAY_ITEM_SELECTED___>___LANGUAGE_ARRAY_ITEM___</option> " );
}
$this -> Assign ( 'install_lang_default_options' , $sLangOptions );
/**
* Передаем во вьевер список доступных скинов
*/
$aSkins = $this -> GetSkinList ();
$sSkinOptions = " " ;
foreach ( $aSkins as $sSkin ) {
$this -> Assign ( 'skin_array_item' , $sSkin );
$this -> Assign ( 'skin_array_item_selected' , ( $aParams [ 'install_view_skin' ] == $sSkin ) ? 'selected="selected"' : '' );
$sSkinOptions .= $this -> FetchString ( " <option value='___SKIN_ARRAY_ITEM___' ___SKIN_ARRAY_ITEM_SELECTED___>___SKIN_ARRAY_ITEM___</option> " );
}
$this -> Assign ( 'install_view_skin_options' , $sSkinOptions );
2009-11-09 19:29:22 +02:00
/**
* Если были переданные данные формы , то обрабатываем добавление
*/
if ( $this -> GetRequest ( 'install_extend_params' )) {
$bOk = true ;
$sLocalConfigFile = $this -> sConfigDir . '/' . self :: LOCAL_CONFIG_FILE_NAME ;
/**
* Название сайта
*/
if ( $aParams [ 'install_view_name' ] && strlen ( $aParams [ 'install_view_name' ]) > 2 ){
2009-11-10 15:26:40 +02:00
if ( $this -> SaveConfig ( 'view.name' , $aParams [ 'install_view_name' ], $sLocalConfigFile ))
$this -> SetSessionVar ( 'install_view_name' , $aParams [ 'install_view_name' ]);
2009-11-09 19:29:22 +02:00
} else {
$bOk = false ;
2009-11-15 00:51:23 +02:00
$this -> aMessages [] = array ( 'type' => 'error' , 'text' => $this -> Lang ( 'site_name_invalid' ));
2009-11-09 19:29:22 +02:00
}
/**
* Описание сайта
*/
if ( $aParams [ 'install_view_description' ]){
2009-11-10 15:26:40 +02:00
if ( $this -> SaveConfig ( 'view.description' , $aParams [ 'install_view_description' ], $sLocalConfigFile ))
$this -> SetSessionVar ( 'install_view_description' , $aParams [ 'install_view_description' ]);
2009-11-09 19:29:22 +02:00
} else {
$bOk = false ;
2009-11-15 00:51:23 +02:00
$this -> aMessages [] = array ( 'type' => 'error' , 'text' => $this -> Lang ( 'site_description_invalid' ));
2009-11-09 19:29:22 +02:00
}
/**
* Ключевые слова
*/
if ( $aParams [ 'install_view_keywords' ] && strlen ( $aParams [ 'install_view_keywords' ]) > 2 ){
2009-11-10 15:26:40 +02:00
if ( $this -> SaveConfig ( 'view.keywords' , $aParams [ 'install_view_keywords' ], $sLocalConfigFile ))
$this -> SetSessionVar ( 'install_view_keywords' , $aParams [ 'install_view_keywords' ]);
2009-11-09 19:29:22 +02:00
} else {
$bOk = false ;
2009-11-15 00:51:23 +02:00
$this -> aMessages [] = array ( 'type' => 'error' , 'text' => $this -> Lang ( 'site_keywords_invalid' ));
2009-11-09 19:29:22 +02:00
}
/**
* Название шаблона оформления
*/
if ( $aParams [ 'install_view_skin' ] && strlen ( $aParams [ 'install_view_skin' ]) > 1 ){
2009-11-10 15:26:40 +02:00
if ( $this -> SaveConfig ( 'view.skin' , $aParams [ 'install_view_skin' ], $sLocalConfigFile ))
$this -> SetSessionVar ( 'install_view_skin' , $aParams [ 'install_view_skin' ]);
2009-11-09 19:29:22 +02:00
} else {
$bOk = false ;
2009-11-15 00:51:23 +02:00
$this -> aMessages [] = array ( 'type' => 'error' , 'text' => 'skin_name_invalid' );
2009-11-09 19:29:22 +02:00
}
/**
* E - mail , с которого отправляются уведомления
*/
if ( $aParams [ 'install_mail_sender' ] && strlen ( $aParams [ 'install_mail_sender' ]) > 5 ){
2009-11-10 15:26:40 +02:00
if ( $this -> SaveConfig ( 'sys.mail.from_email' , $aParams [ 'install_mail_sender' ], $sLocalConfigFile ))
$this -> SetSessionVar ( 'install_mail_sender' , $aParams [ 'install_mail_sender' ]);
2009-11-09 19:29:22 +02:00
} else {
$bOk = false ;
2009-11-15 00:51:23 +02:00
$this -> aMessages [] = array ( 'type' => 'error' , 'text' => $this -> Lang ( 'mail_sender_invalid' ));
2009-11-09 19:29:22 +02:00
}
/**
* Имя , от которого отправляются уведомления
*/
if ( $aParams [ 'install_mail_name' ] && strlen ( $aParams [ 'install_mail_name' ]) > 1 ){
2009-11-10 15:26:40 +02:00
if ( $this -> SaveConfig ( 'sys.mail.from_name' , $aParams [ 'install_mail_name' ], $sLocalConfigFile ))
$this -> SetSessionVar ( 'install_mail_name' , $aParams [ 'install_mail_name' ]);
2009-11-09 19:29:22 +02:00
} else {
$bOk = false ;
2009-11-15 00:51:23 +02:00
$this -> aMessages [] = array ( 'type' => 'error' , 'text' => $this -> Lang ( 'mail_name_invalid' ));
2009-11-09 19:29:22 +02:00
}
/**
* Использовать закрытый режим работы сайта
*/
2009-11-10 15:26:40 +02:00
if ( $this -> SaveConfig ( 'general.close' , $aParams [ 'install_general_close' ], $sLocalConfigFile ))
$this -> SetSessionVar ( 'install_general_close' , $aParams [ 'install_general_close' ]);
2009-11-09 19:29:22 +02:00
/**
* Использовать активацию при регистрации
*/
2009-11-10 15:26:40 +02:00
if ( $this -> SaveConfig ( 'general.reg.activation' , $aParams [ 'install_general_active' ], $sLocalConfigFile ))
$this -> SetSessionVar ( 'install_general_active' , $aParams [ 'install_general_active' ]);
2009-11-09 19:29:22 +02:00
/**
* Использоватьт режим регистрации по приглашению
*/
2009-11-10 15:26:40 +02:00
if ( $this -> SaveConfig ( 'general.reg.invite' , $aParams [ 'install_general_invite' ], $sLocalConfigFile ))
$this -> SetSessionVar ( 'install_general_invite' , $aParams [ 'install_general_invite' ]);
2009-11-09 19:29:22 +02:00
/**
* Текущий язык
*/
if ( $aParams [ 'install_lang_current' ] && strlen ( $aParams [ 'install_lang_current' ]) > 1 ){
2009-12-14 02:32:16 +02:00
if ( $this -> SaveConfig ( 'lang.current' , $aParams [ 'install_lang_current' ], $sLocalConfigFile )) {
2009-11-10 15:26:40 +02:00
$this -> SetSessionVar ( 'install_lang_current' , $aParams [ 'install_lang_current' ]);
2009-12-14 02:32:16 +02:00
/**
* Если выбран русский язык , то перезаписываем название блога
*/
if ( $aParams [ 'install_lang_current' ] == 'russian' ){
$aDbParams = $this -> GetSessionVar ( 'INSTALL_DATABASE_PARAMS' );
$oDb = $this -> ValidateDBConnection ( $aDbParams );
if ( $oDb and $this -> SelectDatabase ( $aDbParams [ 'name' ])) $this -> UpdateUserBlog ( " Блог им. " . $this -> GetSessionVar ( 'install_admin_login' ), $aDbParams [ 'prefix' ]);
}
}
2009-11-09 19:29:22 +02:00
} else {
$bOk = false ;
2009-11-15 00:51:23 +02:00
$this -> aMessages [] = array ( 'type' => 'error' , 'text' => $this -> Lang ( 'lang_current_invalid' ));
2009-11-09 19:29:22 +02:00
}
/**
* Язык , который будет использоваться по умолчанию
*/
if ( $aParams [ 'install_lang_default' ] && strlen ( $aParams [ 'install_lang_default' ]) > 1 ){
2009-11-10 15:26:40 +02:00
if ( $this -> SaveConfig ( 'lang.default' , $aParams [ 'install_lang_default' ], $sLocalConfigFile ))
$this -> SetSessionVar ( 'install_lang_default' , $aParams [ 'install_lang_default' ]);
2009-11-09 19:29:22 +02:00
} else {
$bOk = false ;
2009-11-15 00:51:23 +02:00
$this -> aMessages [] = array ( 'type' => 'error' , 'text' => $this -> Lang ( 'lang_default_invalid' ));
2009-11-09 19:29:22 +02:00
}
}
2009-11-16 05:54:29 +02:00
return ( $this -> GetRequest ( 'install_step_next' ))
? $this -> StepFinish ()
: $this -> Layout ( 'steps/extend.tpl' );
2009-11-09 03:52:30 +02:00
}
2009-11-16 05:54:29 +02:00
/**
* Окончание работы инсталлятора . Предупреждение о необходимости удаления .
*/
function StepFinish () {
$this -> SetStep ( 'Finish' );
$this -> Assign ( 'next_step_display' , 'none' );
$this -> SetSessionVar ( self :: SESSSION_KEY_STEP_NAME , 'Finish' );
$this -> Layout ( 'steps/finish.tpl' );
2009-12-14 02:32:16 +02:00
}
2009-11-09 19:29:22 +02:00
/**
* Проверяем возможность инсталяции
*
* @ return bool
*/
2009-11-12 01:35:17 +02:00
function ValidateEnviroment () {
2009-11-09 19:29:22 +02:00
$bOk = true ;
2010-06-04 23:57:35 +03:00
if ( ! version_compare ( PHP_VERSION , '5.1.2' , '>=' )) {
2009-11-09 19:29:22 +02:00
$bOk = false ;
2009-11-15 00:51:23 +02:00
$this -> Assign ( 'validate_php_version' , '<span style="color:red;">' . $this -> Lang ( 'no' ) . '</span>' );
2009-11-09 19:29:22 +02:00
} else {
2009-11-15 00:51:23 +02:00
$this -> Assign ( 'validate_php_version' , '<span style="color:green;">' . $this -> Lang ( 'yes' ) . '</span>' );
2009-11-09 19:29:22 +02:00
}
2009-11-12 01:23:53 +02:00
if ( ! in_array ( strtolower ( @ ini_get ( 'safe_mode' )), $this -> aValidEnv [ 'safe_mode' ])) {
2009-11-09 19:29:22 +02:00
$bOk = false ;
2009-11-15 00:51:23 +02:00
$this -> Assign ( 'validate_safe_mode' , '<span style="color:red;">' . $this -> Lang ( 'no' ) . '</span>' );
2009-11-09 19:29:22 +02:00
} else {
2009-11-15 00:51:23 +02:00
$this -> Assign ( 'validate_safe_mode' , '<span style="color:green;">' . $this -> Lang ( 'yes' ) . '</span>' );
2009-11-09 19:29:22 +02:00
}
2009-11-14 09:21:19 +02:00
if ( @ preg_match ( '//u' , '' ) != $this -> aValidEnv [ 'UTF8_support' ]) {
$bOk = false ;
2009-11-15 00:51:23 +02:00
$this -> Assign ( 'validate_utf8' , '<span style="color:red;">' . $this -> Lang ( 'no' ) . '</span>' );
2009-11-14 09:21:19 +02:00
} else {
2009-11-15 00:51:23 +02:00
$this -> Assign ( 'validate_utf8' , '<span style="color:green;">' . $this -> Lang ( 'yes' ) . '</span>' );
2009-11-14 09:21:19 +02:00
}
2009-11-09 19:29:22 +02:00
if ( @ extension_loaded ( 'mbstring' )){
2010-07-07 12:17:06 +03:00
$this -> Assign ( 'validate_mbstring' , '<span style="color:green;">' . $this -> Lang ( 'yes' ) . '</span>' );
2009-11-10 01:17:55 +02:00
} else {
$bOk = false ;
2009-11-15 00:51:23 +02:00
$this -> Assign ( 'validate_mbstring' , '<span style="color:red;">' . $this -> Lang ( 'no' ) . '</span>' );
2009-11-09 19:29:22 +02:00
}
2010-04-25 13:33:57 +03:00
if ( @ extension_loaded ( 'SimpleXML' )){
$this -> Assign ( 'validate_simplexml' , '<span style="color:green;">' . $this -> Lang ( 'yes' ) . '</span>' );
} else {
$bOk = false ;
$this -> Assign ( 'validate_simplexml' , '<span style="color:red;">' . $this -> Lang ( 'no' ) . '</span>' );
}
2009-11-12 01:23:53 +02:00
$sLocalConfigPath = $this -> sConfigDir . '/config.local.php' ;
2010-04-25 13:21:15 +03:00
if ( ! file_exists ( $sLocalConfigPath ) or ! is_writeable ( $sLocalConfigPath )) {
// пытаемся создать файл локального конфига
@ copy ( $this -> sConfigDir . '/config.local.php.dist' , $sLocalConfigPath );
}
2009-11-12 01:23:53 +02:00
if ( ! file_exists ( $sLocalConfigPath ) or ! is_writeable ( $sLocalConfigPath )) {
$bOk = false ;
2009-11-15 00:51:23 +02:00
$this -> Assign ( 'validate_local_config' , '<span style="color:red;">' . $this -> Lang ( 'no' ) . '</span>' );
2009-11-12 01:23:53 +02:00
} else {
2009-11-15 00:51:23 +02:00
$this -> Assign ( 'validate_local_config' , '<span style="color:green;">' . $this -> Lang ( 'yes' ) . '</span>' );
2009-11-12 01:23:53 +02:00
}
2009-11-22 21:00:29 +02:00
/**
* Проверяем доступность и достаточность прав у директории
2010-01-09 01:56:40 +02:00
* для сохранения файлового кеша , / logs , / uploads , / templates / compiled , / plugins
2009-11-22 21:00:29 +02:00
*/
$sTempDir = dirname ( dirname ( __FILE__ )) . '/tmp' ;
if ( ! is_dir ( $sTempDir ) or ! is_writable ( $sTempDir )) {
$bOk = false ;
$this -> Assign ( 'validate_local_temp' , '<span style="color:red;">' . $this -> Lang ( 'no' ) . '</span>' );
} else {
$this -> Assign ( 'validate_local_temp' , '<span style="color:green;">' . $this -> Lang ( 'yes' ) . '</span>' );
}
2009-11-30 21:31:28 +02:00
$sLogsDir = dirname ( dirname ( __FILE__ )) . '/logs' ;
if ( ! is_dir ( $sLogsDir ) or ! is_writable ( $sLogsDir )) {
$bOk = false ;
$this -> Assign ( 'validate_local_logs' , '<span style="color:red;">' . $this -> Lang ( 'no' ) . '</span>' );
} else {
$this -> Assign ( 'validate_local_logs' , '<span style="color:green;">' . $this -> Lang ( 'yes' ) . '</span>' );
}
$sUploadsDir = dirname ( dirname ( __FILE__ )) . '/uploads' ;
if ( ! is_dir ( $sUploadsDir ) or ! is_writable ( $sUploadsDir )) {
$bOk = false ;
$this -> Assign ( 'validate_local_uploads' , '<span style="color:red;">' . $this -> Lang ( 'no' ) . '</span>' );
} else {
$this -> Assign ( 'validate_local_uploads' , '<span style="color:green;">' . $this -> Lang ( 'yes' ) . '</span>' );
}
$sTemplatesDir = dirname ( dirname ( __FILE__ )) . '/templates/compiled' ;
if ( ! is_dir ( $sTemplatesDir ) or ! is_writable ( $sTemplatesDir )) {
$bOk = false ;
2009-12-07 20:45:49 +02:00
$this -> Assign ( 'validate_local_templates' , '<span style="color:red;">' . $this -> Lang ( 'no' ) . '</span>' );
2009-11-30 21:31:28 +02:00
} else {
$this -> Assign ( 'validate_local_templates' , '<span style="color:green;">' . $this -> Lang ( 'yes' ) . '</span>' );
}
2009-12-01 18:43:50 +02:00
$sTemplatesCacheDir = dirname ( dirname ( __FILE__ )) . '/templates/cache' ;
if ( ! is_dir ( $sTemplatesCacheDir ) or ! is_writable ( $sTemplatesCacheDir )) {
$bOk = false ;
2009-12-07 20:45:49 +02:00
$this -> Assign ( 'validate_local_templates_cache' , '<span style="color:red;">' . $this -> Lang ( 'no' ) . '</span>' );
2009-12-01 18:43:50 +02:00
} else {
$this -> Assign ( 'validate_local_templates_cache' , '<span style="color:green;">' . $this -> Lang ( 'yes' ) . '</span>' );
}
2010-01-09 01:56:40 +02:00
$sPluginsDir = dirname ( dirname ( __FILE__ )) . '/plugins' ;
if ( ! is_dir ( $sPluginsDir ) or ! is_writable ( $sPluginsDir )) {
$bOk = false ;
$this -> Assign ( 'validate_local_plugins' , '<span style="color:red;">' . $this -> Lang ( 'no' ) . '</span>' );
} else {
$this -> Assign ( 'validate_local_plugins' , '<span style="color:green;">' . $this -> Lang ( 'yes' ) . '</span>' );
}
2009-11-09 19:29:22 +02:00
return $bOk ;
}
2009-11-08 02:23:51 +02:00
/**
* Проверяет соединение с базой данных
*
* @ param array $aParams
* @ return mixed
*/
2009-11-12 01:35:17 +02:00
function ValidateDBConnection ( $aParams ) {
2010-02-18 09:54:40 +02:00
$oDb = @ mysql_connect ( $aParams [ 'server' ] . ':' . $aParams [ 'port' ], $aParams [ 'user' ], $aParams [ 'password' ]);
2009-11-08 02:23:51 +02:00
if ( $oDb ) {
2009-11-12 18:46:27 +02:00
/**
* Валидация версии MySQL сервера
*/
if ( ! version_compare ( mysql_get_server_info (), '5.0.0' , '>' )) {
2010-06-04 22:00:55 +03:00
$this -> aMessages [] = array ( 'type' => 'error' , 'text' => $this -> Lang ( 'valid_mysql_server' ));
2009-11-12 18:46:27 +02:00
return false ;
}
2009-11-08 02:23:51 +02:00
mysql_query ( 'set names utf8' );
return $oDb ;
}
2009-12-09 01:05:14 +02:00
2009-11-15 00:51:23 +02:00
$this -> aMessages [] = array ( 'type' => 'error' , 'text' => $this -> Lang ( 'error_db_connection_invalid' ));
2009-11-08 02:23:51 +02:00
return null ;
}
/**
* Выбрать базу данных ( либо создать в случае необходимости ) .
*
* @ param string $sName
* @ param bool $bCreate
* @ return bool
*/
2009-11-12 01:35:17 +02:00
function SelectDatabase ( $sName , $bCreate = false ) {
2009-11-08 02:23:51 +02:00
if ( @ mysql_select_db ( $sName )) return true ;
if ( $bCreate ){
@ mysql_query ( " CREATE DATABASE $sName " );
return @ mysql_select_db ( $sName );
}
return false ;
}
/**
* Добавляет в базу данных необходимые таблицы
*
* @ param string $sFilePath
* @ return array
*/
2009-11-12 18:46:27 +02:00
function CreateTables ( $sFilePath , $aParams ) {
2009-11-09 01:35:11 +02:00
$sFileQuery = @ file_get_contents ( $sFilePath );
2009-11-15 00:51:23 +02:00
if ( ! $sFileQuery ) return array ( 'result' => false , 'errors' => array ( $this -> Lang ( " config_file_not_exists " , array ( 'path' => $sFilePath ))));
2009-11-09 01:35:11 +02:00
2009-11-12 18:46:27 +02:00
if ( isset ( $aParams [ 'prefix' ])) $sFileQuery = str_replace ( 'prefix_' , $aParams [ 'prefix' ], $sFileQuery );
2009-11-08 02:23:51 +02:00
$aQuery = explode ( ';' , $sFileQuery );
/**
* Массив для с б о р а ошибок
*/
$aErrors = array ();
2009-11-10 16:49:32 +02:00
/**
* Смотрим , какие таблицы существуют в базе данных
*/
$aDbTables = array ();
$aResult = @ mysql_query ( " SHOW TABLES " );
if ( ! $aResult ){
2009-11-15 00:51:23 +02:00
return array ( 'result' => false , 'errors' => array ( $this -> Lang ( 'error_db_no_data' )));
2009-11-10 16:49:32 +02:00
}
while ( $aRow = mysql_fetch_array ( $aResult , MYSQL_NUM )){
$aDbTables [] = $aRow [ 0 ];
}
2010-04-04 15:41:42 +03:00
/**
* Если среди таблиц БД уже есть таблица prefix_topic , то выполнять SQL - дамп не нужно
*/
if ( in_array ( $aParams [ 'prefix' ] . 'topic' , $aDbTables )) {
return false ;
}
2009-11-08 02:23:51 +02:00
/**
* Выполняем запросы по очереди
*/
foreach ( $aQuery as $sQuery ){
$sQuery = trim ( $sQuery );
2009-11-12 18:46:27 +02:00
/**
* Заменяем движек , если таковой указан в запросе
*/
if ( isset ( $aParams [ 'engine' ])) $sQuery = str_ireplace ( 'ENGINE=InnoDB' , " ENGINE= { $aParams [ 'engine' ] } " , $sQuery );
2009-11-10 16:49:32 +02:00
if ( $sQuery != '' and ! $this -> IsUseDbTable ( $sQuery , $aDbTables )) {
2009-11-08 02:23:51 +02:00
$bResult = mysql_query ( $sQuery );
if ( ! $bResult ) $aErrors [] = mysql_error ();
}
}
if ( count ( $aErrors ) == 0 ) {
return array ( 'result' => true , 'errors' => null );
}
return array ( 'result' => false , 'errors' => $aErrors );
}
2009-12-09 01:05:14 +02:00
/**
* Проверяем , нуждается ли база в конвертации или нет
*
* @ param array $aParams
* @ return bool
*/
function ValidateConvertDatabase ( $aParams ) {
/**
* Проверяем , нуждается ли база в конвертации или нет
* Смотрим , какие таблицы существуют в базе данных
*/
$aDbTables = array ();
$aResult = @ mysql_query ( " SHOW TABLES " );
if ( ! $aResult ){
return array ( 'result' => false , 'errors' => array ( $this -> Lang ( 'error_db_no_data' )));
}
while ( $aRow = mysql_fetch_array ( $aResult , MYSQL_NUM )){
$aDbTables [] = $aRow [ 0 ];
}
/**
* Смотрим на наличие в базе таблицы prefix_comment
*/
return ! in_array ( $aParams [ 'prefix' ] . 'comment' , $aDbTables );
}
2009-11-17 03:42:20 +02:00
/**
* Конвертирует базу данных версии 0.3 . 1 в базу данных версии 0.4
*
* @ return bool
*/
2009-12-09 01:05:14 +02:00
function ConvertDatabase ( $sFilePath , $aParams ) {
if ( ! $this -> ValidateConvertDatabase ( $aParams )) {
return array ( 'result' => true , 'errors' => array ( $this -> Lang ( " error_database_converted_already " )));
}
2009-11-17 03:42:20 +02:00
$sFileQuery = @ file_get_contents ( $sFilePath );
if ( ! $sFileQuery ) return array ( 'result' => false , 'errors' => array ( $this -> Lang ( " config_file_not_exists " , array ( 'path' => $sFilePath ))));
if ( isset ( $aParams [ 'prefix' ])) $sFileQuery = str_replace ( 'prefix_' , $aParams [ 'prefix' ], $sFileQuery );
$aQuery = explode ( ';' , $sFileQuery );
/**
* Массив для с б о р а ошибок
*/
$aErrors = array ();
/**
* Выполняем запросы по очереди
*/
foreach ( $aQuery as $sQuery ){
$sQuery = trim ( $sQuery );
/**
* Заменяем движек , если таковой указан в запросе
*/
if ( isset ( $aParams [ 'engine' ])) $sQuery = str_ireplace ( 'ENGINE=InnoDB' , " ENGINE= { $aParams [ 'engine' ] } " , $sQuery );
if ( $sQuery != '' ) {
$bResult = mysql_query ( $sQuery );
if ( ! $bResult ) $aErrors [] = mysql_error ();
}
}
2010-01-06 18:08:23 +02:00
/**
* Обновляем пути до аватаров и фото у юзеров
*/
$sTable = $aParams [ 'prefix' ] . 'user' ;
if ( $aResults = mysql_query ( " SELECT * FROM { $sTable } " )){
while ( $aRow = mysql_fetch_assoc ( $aResults )) {
if ( $aRow [ 'user_profile_avatar' ] == 0 ) {
$sSqlUpdate = " UPDATE { $sTable } SET user_profile_avatar = NULL WHERE user_id= { $aRow [ 'user_id' ] } " ;
} else {
$sAvatarPath = $this -> GetPathRootWeb () . '/uploads/images/' . $aRow [ 'user_id' ] . '/avatar_100x100.' . $aRow [ 'user_profile_avatar_type' ];
$sAvatarPath = mysql_escape_string ( $sAvatarPath );
$sSqlUpdate = " UPDATE { $sTable } SET user_profile_avatar = ' { $sAvatarPath } ' WHERE user_id= { $aRow [ 'user_id' ] } " ;
}
if ( ! mysql_query ( $sSqlUpdate )) $aErrors [] = mysql_error ();
if ( $aRow [ 'user_profile_foto' ]) {
$sAvatarPath = $this -> GetPathRootWeb () . $aRow [ 'user_profile_foto' ];
$sAvatarPath = mysql_escape_string ( $sAvatarPath );
$sSqlUpdate = " UPDATE { $sTable } SET user_profile_foto = ' { $sAvatarPath } ' WHERE user_id= { $aRow [ 'user_id' ] } " ;
if ( ! mysql_query ( $sSqlUpdate )) $aErrors [] = mysql_error ();
}
}
}
/**
* Удаляем поле user_profile_avatar_type
*/
if ( ! mysql_query ( " ALTER TABLE ` { $sTable } ` DROP `user_profile_avatar_type`; " )) $aErrors [] = mysql_error ();
/**
* Обновляем пути до аватаров у блогов
*/
$sTable = $aParams [ 'prefix' ] . 'blog' ;
if ( $aResults = mysql_query ( " SELECT * FROM { $sTable } " )){
while ( $aRow = mysql_fetch_assoc ( $aResults )) {
if ( $aRow [ 'blog_avatar' ] == 0 ) {
$sSqlUpdate = " UPDATE { $sTable } SET blog_avatar = NULL WHERE blog_id= { $aRow [ 'blog_id' ] } " ;
} else {
$sAvatarPath = $this -> GetPathRootWeb () . '/uploads/images/' . $aRow [ 'user_owner_id' ] . '/avatar_blog_' . $aRow [ 'blog_url' ] . '_48x48.' . $aRow [ 'blog_avatar_type' ];
$sAvatarPath = mysql_escape_string ( $sAvatarPath );
$sSqlUpdate = " UPDATE { $sTable } SET blog_avatar = ' { $sAvatarPath } ' WHERE blog_id= { $aRow [ 'blog_id' ] } " ;
}
if ( ! mysql_query ( $sSqlUpdate )) $aErrors [] = mysql_error ();
}
2010-01-09 01:56:40 +02:00
}
2010-01-06 18:08:23 +02:00
/**
* Удаляем поле blog_avatar_type
*/
if ( ! mysql_query ( " ALTER TABLE ` { $sTable } ` DROP `blog_avatar_type`; " )) $aErrors [] = mysql_error ();
2009-11-17 03:42:20 +02:00
/**
* Переводим в одну таблицу vote ` ы
*/
$aVoteTables = array (
$aParams [ 'prefix' ] . 'blog_vote' => 'blog' ,
$aParams [ 'prefix' ] . 'user_vote' => 'user' ,
$aParams [ 'prefix' ] . 'topic_comment_vote' => 'comment'
);
foreach ( $aVoteTables as $sTable => $sTarget ) {
$sVoteSelect = " SELECT * FROM { $sTable } WHERE 1 " ;
if ( ! $aResults = mysql_query ( $sVoteSelect )){
2009-12-08 19:59:51 +02:00
$aErrors [] = $this -> Lang ( 'error_table_select' , array ( 'table' => $sTable ));
2009-11-17 03:42:20 +02:00
continue ;
}
/**
* Переносим в новую таблицу с указанием target ` а
*/
while ( $aRow = mysql_fetch_array ( $aResults , MYSQL_ASSOC )) {
$sQuery = " INSERT INTO ` { $aParams [ 'prefix' ] } vote`
2010-02-14 11:32:38 +02:00
SET
target_id = '{$aRow[$sTarget.' _id ']}' ,
target_type = '{$sTarget}' ,
user_voter_id = '{$aRow[' user_voter_id ']}' ,
vote_direction = '".(($aRow[' vote_delta ']>=0)?1:-1)."' ,
vote_value = '{$aRow[' vote_delta ']}' ,
vote_date = '".date("Y-m-d H:i:s")."' " ;
2009-11-17 03:42:20 +02:00
if ( ! mysql_query ( $sQuery )) $aErrors [] = mysql_error ();
}
2009-11-18 00:07:13 +02:00
mysql_free_result ( $aResults );
2009-11-17 03:42:20 +02:00
}
/**
* Переводим в одну таблицу комментарии
*/
2009-11-18 00:07:13 +02:00
$sCommentIdMaxQuery = " SELECT MAX( comment_id ) AS max_id FROM { $aParams [ 'prefix' ] } comment " ;
2009-11-17 03:42:20 +02:00
/**
2009-11-18 00:07:13 +02:00
* Получаем максимальный идентификатор комментариев к топикам
*/
if ( ! $aResults = mysql_query ( $sCommentIdMaxQuery ) ){
2009-12-08 19:59:51 +02:00
$aErrors [] = $this -> Lang ( 'error_table_select' , array ( 'table' => 'comments' ));
2009-11-18 00:07:13 +02:00
} else {
$aRow = mysql_fetch_row ( $aResults );
$iMaxId = $aRow [ 0 ] + 1 ;
$sTalkCommentSelect = " SELECT * FROM { $aParams [ 'prefix' ] } talk_comment " ;
if ( ! $aResults = mysql_query ( $sTalkCommentSelect )){
2009-12-08 19:59:51 +02:00
$aErrors [] = $this -> Lang ( 'error_table_select' , array ( 'table' => 'talk_comment' ));
2009-11-18 00:07:13 +02:00
} else {
$iAutoIncrement = $iMaxId ;
while ( $aRow = mysql_fetch_array ( $aResults , MYSQL_ASSOC )) {
$aRow [ 'talk_comment_id' ] += $iMaxId ;
/**
* Выбираем максимальный айдишник
*/
$iAutoIncrement = ( $aRow [ 'talk_comment_id' ] > $iAutoIncrement )
? $aRow [ 'talk_comment_id' ]
: $iAutoIncrement ;
$aRow [ 'talk_comment_pid' ] = is_int ( $aRow [ 'talk_comment_pid' ]) ? $aRow [ 'talk_comment_id' ] + $iMaxId : " NULL " ;
$sQuery = " INSERT INTO ` { $aParams [ 'prefix' ] } comment`
2010-02-14 11:32:38 +02:00
SET
comment_id = '{$aRow[' talk_comment_id ']}' ,
comment_pid = { $aRow [ 'talk_comment_pid' ]},
target_id = '{$aRow[' talk_id ']}' ,
target_type = 'talk' ,
target_parent_id = '0' ,
user_id = '{$aRow[' user_id ']}' ,
comment_text = '".mysql_real_escape_string($aRow[' talk_comment_text '])."' ,
comment_text_hash = '".md5($aRow[' talk_comment_text '])."' ,
comment_date = '{$aRow[' talk_comment_date ']}' ,
comment_user_ip = '{$aRow[' talk_comment_user_ip ']}' ,
comment_rating = '0' ,
comment_count_vote = '0' ,
comment_delete = '0' ,
comment_publish = '1' " ;
2009-11-18 00:07:13 +02:00
if ( ! mysql_query ( $sQuery )) $aErrors [] = mysql_error ();
}
$iAutoIncrement ++ ;
/**
* Устанавливаем в таблице новое значение авто инкремента
*/
@ mysql_query ( " ALTER { $aParams [ 'prefix' ] } comment AUTO_INCREMENT= { $iAutoIncrement } " );
mysql_free_result ( $aResults );
}
}
2010-02-06 15:09:48 +02:00
/**
* Обновляем количество комментариев к письмам
*/
$sTalkSql = " SELECT talk_id FROM { $aParams [ 'prefix' ] } talk " ;
if ( $aResults = mysql_query ( $sTalkSql )){
while ( $aRow = mysql_fetch_assoc ( $aResults )) {
$sTalkCountSql = " SELECT count(comment_id) as c FROM { $aParams [ 'prefix' ] } comment WHERE `target_id`= { $aRow [ 'talk_id' ] } AND `target_type`='talk' " ;
if ( $aResultsCount = mysql_query ( $sTalkCountSql ) and $aRowCount = mysql_fetch_assoc ( $aResultsCount )){
mysql_query ( " UPDATE { $aParams [ 'prefix' ] } talk SET talk_count_comment = { $aRowCount [ 'c' ] } WHERE talk_id = { $aRow [ 'talk_id' ] } " );
}
}
}
2009-11-20 16:46:24 +02:00
/**
* Для каждого комментария к топику указываем соответствующий ему идентификатор блога
*/
$sParentUpdateQuery = "
UPDATE `{$aParams['prefix']}comment`
SET `target_parent_id` =
( SELECT blog_id FROM `{$aParams['prefix']}topic` as t WHERE t . topic_id = target_id )
WHERE `target_type` = 'topic'
" ;
if ( ! mysql_query ( $sParentUpdateQuery ))
$aErrors [] = mysql_error ();
2009-11-18 00:07:13 +02:00
/**
* Выбираем пары взаимной дружбы и заносим в базу данынх
*/
$sFriendsQuery = " SELECT * FROM { $aParams [ 'prefix' ] } friend " ;
/**
* Получаем максимальный идентификатор комментариев к топикам
*/
if ( ! $aResults = mysql_query ( $sFriendsQuery ) ){
$aErrors [] = $this -> Lang ( 'error_freind_table_select' );
} else {
/**
* Архив для хранения индексов " не использованых " строк таблицы
*/
$aFriends = array ();
2009-11-17 03:42:20 +02:00
while ( $aRow = mysql_fetch_array ( $aResults , MYSQL_ASSOC )) {
2009-11-18 00:07:13 +02:00
/**
* Если имеется запись с френдами , стоящими в обратном порядке ,
* то вторую запись удаляем , первую приводим к нормальным статусам
*/
$sRevIndex = $aRow [ 'user_to' ] . '_' . $aRow [ 'user_from' ];
$iPosition = array_search ( $sRevIndex , $aFriends );
if ( $iPosition !== false ) {
/**
* Обновляем статусы
*/
if ( ! mysql_query ( " UPDATE { $aParams [ 'prefix' ] } friend SET status_from=1, status_to=2 WHERE user_from=' { $aRow [ 'user_to' ] } ' AND user_to=' { $aRow [ 'user_from' ] } ' " ))
$aErrors [] = mysql_error ();
/**
* Удаляем дубль - строку
*/
if ( ! mysql_query ( " DELETE FROM { $aParams [ 'prefix' ] } friend WHERE user_from=' { $aRow [ 'user_from' ] } ' AND user_to=' { $aRow [ 'user_to' ] } ' " ))
$aErrors [] = mysql_error ();
/**
* Удаляем значение из списка индексов
*/
unset ( $aFriends [ $iPosition ]);
} else {
$aFriends [] = $aRow [ 'user_from' ] . '_' . $aRow [ 'user_to' ];
}
}
/**
* Если остались индексы , удаляем соответствующие им строки
*/
if ( count ( $aFriends ) > 0 ) {
foreach ( $aFriends as $sIndex ) {
list ( $sFrom , $sTo ) = explode ( '_' , $sIndex , 2 );
if ( ! mysql_query ( " DELETE FROM { $aParams [ 'prefix' ] } friend WHERE user_from=' { $sFrom } ' AND user_to=' { $sTo } ' " ))
$aErrors [] = mysql_error ();
}
}
mysql_free_result ( $aResults );
2009-11-17 03:42:20 +02:00
}
2009-11-18 00:07:13 +02:00
2010-03-06 17:21:46 +02:00
/**
* Конвертируем пользователей блогов в роли
*/
$sTable = $aParams [ 'prefix' ] . 'blog_user' ;
mysql_query ( " UPDATE { $sTable } SET user_role = 1 WHERE is_moderator = 0 AND is_administrator = 0 " );
mysql_query ( " UPDATE { $sTable } SET user_role = 2 WHERE is_moderator = 1 " );
mysql_query ( " UPDATE { $sTable } SET user_role = 4 WHERE is_administrator = 1 " );
/**
* Удаляем старые поля
*/
if ( ! mysql_query ( " ALTER TABLE ` { $sTable } ` DROP `is_moderator`, DROP `is_administrator`; " )) $aErrors [] = mysql_error ();
2009-11-17 03:42:20 +02:00
if ( count ( $aErrors ) == 0 ) {
return array ( 'result' => true , 'errors' => null );
}
return array ( 'result' => false , 'errors' => $aErrors );
}
2009-11-09 03:52:30 +02:00
/**
* Валидирует данные администратора
*
* @ return bool ;
*/
2009-11-12 01:35:17 +02:00
function ValidateAdminFields () {
2009-11-09 03:52:30 +02:00
$bOk = true ;
$aErrors = array ();
2010-04-25 13:21:15 +03:00
if ( ! $sLogin = $this -> GetRequest ( 'install_admin_login' , false ) or ! preg_match ( " /^[ \ da-z \ _ \ -] { 3,30} $ /i " , $sLogin )) {
2009-11-09 03:52:30 +02:00
$bOk = false ;
2009-11-15 00:51:23 +02:00
$aErrors [] = $this -> Lang ( 'admin_login_invalid' );
2009-11-09 03:52:30 +02:00
}
2010-04-25 13:21:15 +03:00
if ( ! $sMail = $this -> GetRequest ( 'install_admin_mail' , false ) or ! preg_match ( " /^[ \ da-z \ _ \ - \ . \ +]+@[ \ da-z_ \ - \ .]+ \ .[a-z] { 2,5} $ /i " , $sMail )) {
2009-11-09 03:52:30 +02:00
$bOk = false ;
2009-11-15 00:51:23 +02:00
$aErrors [] = $this -> Lang ( 'admin_mail_invalid' );
2009-11-09 03:52:30 +02:00
}
if ( ! $sPass = $this -> GetRequest ( 'install_admin_pass' , false ) or strlen ( $sPass ) < 3 ) {
$bOk = false ;
2009-11-15 00:51:23 +02:00
$aErrors [] = $this -> Lang ( 'admin_password_invalid' );
2009-11-09 03:52:30 +02:00
}
if ( $this -> GetRequest ( 'install_admin_repass' , '' ) != $this -> GetRequest ( 'install_admin_pass' , '' )) {
$bOk = false ;
2009-11-15 00:51:23 +02:00
$aErrors [] = $this -> Lang ( 'admin_repassword_invalid' );
2009-11-09 03:52:30 +02:00
}
return array ( $bOk , $aErrors );
}
/**
* Сохраняет данные о б администраторе в базу данных
*
* @ param string $sLogin
* @ param string $sPassword
* @ param string $sMail
* @ param string $sPrefix
* @ return bool
*/
2009-11-12 01:35:17 +02:00
function UpdateDBUser ( $sLogin , $sPassword , $sMail , $sPrefix = " prefix_ " ) {
2009-11-09 03:52:30 +02:00
$sQuery = "
UPDATE `{$sPrefix}user`
SET
`user_login` = '{$sLogin}' ,
`user_mail` = '{$sMail}' ,
`user_password` = md5 ( '{$sPassword}' )
WHERE `user_id` = 1 " ;
2009-11-30 21:31:28 +02:00
2009-11-09 03:52:30 +02:00
return mysql_query ( $sQuery );
}
2009-12-14 02:32:16 +02:00
/**
* Перезаписывает название блога в базе данных
*
* @ param string $sBlogName
* @ param string [ $sPrefix = " prefix_ "
* @ return bool
*/
function UpdateUserBlog ( $sBlogName , $sPrefix = " prefix_ " ) {
$sQuery = "
UPDATE `{$sPrefix}blog`
SET
`blog_title` = '".mysql_real_escape_string($sBlogName)."'
WHERE `blog_id` = 1 " ;
2010-01-09 01:56:40 +02:00
return mysql_query ( $sQuery );
2009-12-14 02:32:16 +02:00
}
2009-11-10 16:49:32 +02:00
/**
* Проверяет , использует ли mysql запрос , одну из указанных в массиве таблиц
*
* @ param sring $sQuery
* @ param array $aTables
* @ return bool
*/
2009-11-12 01:35:17 +02:00
function IsUseDbTable ( $sQuery , $aTables ) {
2009-11-10 16:49:32 +02:00
foreach ( $aTables as $sTable ){
if ( substr_count ( $sQuery , " ` { $sTable } ` " )) return true ;
}
return false ;
}
2009-11-12 00:57:00 +02:00
/**
* Отдает список доступных шаблонов
*
* @ return array
*/
2009-11-12 01:35:17 +02:00
function GetSkinList () {
2009-11-12 00:57:00 +02:00
/**
* Получаем список каталогов
*/
$aDir = glob ( $this -> sSkinDir . '/*' , GLOB_ONLYDIR );
if ( ! is_array ( $aDir )) return array ();
return array_map ( create_function ( '$sDir' , 'return basename($sDir);' ), $aDir );
}
/**
* Отдает список доступных языков
*
* @ return array
*/
2009-11-12 01:35:17 +02:00
function GetLangList () {
2009-11-12 00:57:00 +02:00
/**
* Получаем список каталогов
*/
$aDir = glob ( $this -> sLangDir . '/*.php' );
if ( ! is_array ( $aDir )) return array ();
return array_map ( create_function ( '$sDir' , 'return basename($sDir,".php");' ), $aDir );
}
2009-11-12 18:46:27 +02:00
/**
* Сохраняет в конфигурации абсолютные пути
*
* @ access protected
* @ return null
*/
function SavePath () {
$sLocalConfigFile = $this -> sConfigDir . '/' . self :: LOCAL_CONFIG_FILE_NAME ;
2010-01-06 18:08:23 +02:00
$this -> SaveConfig ( 'path.root.web' , $this -> GetPathRootWeb (), $sLocalConfigFile );
2010-03-14 16:35:09 +02:00
$this -> SaveConfig ( 'path.root.server' , $this -> GetPathRootServer (), $sLocalConfigFile );
$aDirs = array ();
$sDirs = trim ( str_replace ( 'http://' . $_SERVER [ 'HTTP_HOST' ], '' , $this -> GetPathRootWeb ()), '/' );
if ( $sDirs != '' ) {
$aDirs = explode ( '/' , $sDirs );
}
$this -> SaveConfig ( 'path.offset_request_url' , count ( $aDirs ), $sLocalConfigFile );
2010-01-06 18:08:23 +02:00
}
function GetPathRootWeb () {
2010-03-06 13:36:11 +02:00
return rtrim ( 'http://' . $_SERVER [ 'HTTP_HOST' ], '/' ) . str_replace ( '/install/index.php' , '' , $_SERVER [ 'PHP_SELF' ]);
2010-01-06 18:08:23 +02:00
}
function GetPathRootServer () {
2010-03-06 13:36:11 +02:00
return rtrim ( dirname ( dirname ( __FILE__ )), '/' );
2009-11-12 18:46:27 +02:00
}
2009-11-08 02:23:51 +02:00
}
session_start ();
$oInstaller = new Install ;
$oInstaller -> Run ();
?>