2014-07-28 09:23:41 +03:00
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
class InstallCore {
|
|
|
|
|
|
|
|
|
|
const COOKIE_NAME='install_data';
|
|
|
|
|
|
|
|
|
|
static public $aGroups=array();
|
2014-07-30 08:32:30 +03:00
|
|
|
|
static public $aGroupsParams=array();
|
2014-07-28 09:23:41 +03:00
|
|
|
|
static public $oLayout=null;
|
|
|
|
|
static public $aLangMsg=array();
|
|
|
|
|
static public $aStoredData=array();
|
|
|
|
|
|
|
|
|
|
public function __construct($aGroups) {
|
|
|
|
|
if (!$aGroups) {
|
|
|
|
|
throw new Exception('Empty groups');
|
|
|
|
|
}
|
2014-07-30 08:32:30 +03:00
|
|
|
|
|
|
|
|
|
$this->defineGroups($aGroups);
|
2014-07-28 09:23:41 +03:00
|
|
|
|
$this->loadLang();
|
|
|
|
|
$this->loadStoredData();
|
|
|
|
|
self::$oLayout=new InstallTemplate('layout.tpl.php');
|
|
|
|
|
}
|
|
|
|
|
|
2014-07-30 08:32:30 +03:00
|
|
|
|
protected function defineGroups($aGroups) {
|
|
|
|
|
$aGroupsResult=array();
|
|
|
|
|
$aParamsResult=array();
|
|
|
|
|
foreach($aGroups as $sGroup=>$aSteps) {
|
|
|
|
|
foreach($aSteps as $sStep=>$aParams) {
|
|
|
|
|
if (is_int($sStep)) {
|
|
|
|
|
$sStep=$aParams;
|
|
|
|
|
$aParams=array();
|
|
|
|
|
}
|
|
|
|
|
$aParamsResult[$sGroup][$sStep]=$aParams;
|
|
|
|
|
$aGroupsResult[$sGroup][]=$sStep;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
self::$aGroups=$aGroupsResult;
|
|
|
|
|
self::$aGroupsParams=$aParamsResult;
|
|
|
|
|
}
|
|
|
|
|
|
2014-07-28 09:23:41 +03:00
|
|
|
|
/**
|
|
|
|
|
* Запускает процесс инсталляции
|
|
|
|
|
*/
|
|
|
|
|
public function run() {
|
|
|
|
|
if (self::getRequest('reset')) {
|
|
|
|
|
self::$aStoredData=array();
|
|
|
|
|
self::saveStoredData();
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Получаем текущую группу
|
|
|
|
|
*/
|
2014-08-23 17:19:45 +03:00
|
|
|
|
$sGroup=self::getRequestStr('group');
|
2014-07-28 09:23:41 +03:00
|
|
|
|
if ($sGroup) {
|
|
|
|
|
return $this->runGroup($sGroup);
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Если группа не определена и она только одна - запускаем
|
|
|
|
|
*/
|
|
|
|
|
if (!$sGroup and count(self::$aGroups)==1) {
|
|
|
|
|
$aGroupNames=array_keys(self::$aGroups);
|
|
|
|
|
return $this->runGroup(array_shift($aGroupNames));
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Показываем страницу выбора группы
|
|
|
|
|
*/
|
|
|
|
|
self::setPreviousStepHide();
|
|
|
|
|
self::setNextStepHide();
|
|
|
|
|
self::setInstallResetHide();
|
|
|
|
|
self::render('index.tpl.php',array('groups'=>array_keys(self::$aGroups)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function runGroup($sGroup) {
|
|
|
|
|
if (!isset(self::$aGroups[$sGroup])) {
|
|
|
|
|
return self::renderError('Not found group');
|
|
|
|
|
}
|
|
|
|
|
$aGroup=self::$aGroups[$sGroup];
|
|
|
|
|
/**
|
|
|
|
|
* Определяем текущий шаг
|
|
|
|
|
* Смотрим его в куках, если там нет, то используем первый
|
|
|
|
|
* Шаг сквозной для всех групп, поэтому при установке у одной группы - у других он сбрасывается на первый
|
|
|
|
|
*/
|
|
|
|
|
$sCurrentStep=self::getStoredData('step');
|
|
|
|
|
if (!$sCurrentStep or !in_array($sCurrentStep,$aGroup)) {
|
|
|
|
|
if (!$sFirst=array_shift($aGroup)) {
|
|
|
|
|
return self::renderError('Not found steps');
|
|
|
|
|
}
|
|
|
|
|
$sCurrentStep=$sFirst;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$sNextStep=self::getNextStep($sGroup,$sCurrentStep);
|
|
|
|
|
$sPrevousStep=self::getPreviousStep($sGroup,$sCurrentStep);
|
|
|
|
|
if (!$sPrevousStep) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
if (!$sNextStep) {
|
|
|
|
|
self::setNextStepHide();
|
|
|
|
|
}
|
|
|
|
|
if (isset($_POST['action_previous'])) {
|
|
|
|
|
if ($sPrevousStep) {
|
|
|
|
|
InstallCore::setStoredData('step',$sPrevousStep);
|
|
|
|
|
InstallCore::location($sGroup);
|
|
|
|
|
} elseif (count(self::$aGroups)>1) {
|
|
|
|
|
/**
|
|
|
|
|
* Перенаправлям на страницу выбора группы
|
|
|
|
|
*/
|
|
|
|
|
self::location();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return $this->runStep($sCurrentStep,$sGroup);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function runStep($sStep,$sGroup) {
|
|
|
|
|
$sClass='InstallStep'.ucfirst($sStep);
|
|
|
|
|
if (!class_exists($sClass)) {
|
|
|
|
|
return self::renderError('Not found step '.$sStep);
|
|
|
|
|
}
|
2014-07-30 08:32:30 +03:00
|
|
|
|
$aParams=isset(self::$aGroupsParams[$sGroup][$sStep]) ? self::$aGroupsParams[$sGroup][$sStep] : array();
|
|
|
|
|
$oStep=new $sClass($sGroup,$aParams);
|
2014-07-28 09:23:41 +03:00
|
|
|
|
if (isset($_POST['action_next'])) {
|
|
|
|
|
/**
|
|
|
|
|
* Сначала обрабатываем шаг
|
|
|
|
|
*/
|
|
|
|
|
$oStep->_process();
|
|
|
|
|
}
|
|
|
|
|
$oStep->_show();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected function loadLang() {
|
|
|
|
|
$sLang='ru';
|
|
|
|
|
$sFilePath=INSTALL_DIR.DIRECTORY_SEPARATOR.'frontend'.DIRECTORY_SEPARATOR.'i18n'.DIRECTORY_SEPARATOR.$sLang.'.php';
|
|
|
|
|
if (file_exists($sFilePath)) {
|
|
|
|
|
self::$aLangMsg=require($sFilePath);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected function loadStoredData() {
|
2014-09-16 13:28:30 +03:00
|
|
|
|
$aData=isset($_COOKIE[self::COOKIE_NAME]) ? $_COOKIE[self::COOKIE_NAME] : '';
|
|
|
|
|
if (get_magic_quotes_gpc()) {
|
|
|
|
|
$this->stripslashes($aData);
|
|
|
|
|
}
|
|
|
|
|
self::$aStoredData=$aData ? @unserialize($aData) : array();
|
2014-07-28 09:23:41 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static public function saveStoredData() {
|
|
|
|
|
$sData=serialize(self::$aStoredData);
|
|
|
|
|
setcookie(self::COOKIE_NAME,$sData,time()+60*60*24);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static public function getStoredData($sName,$mDefault=null) {
|
|
|
|
|
return isset(self::$aStoredData[$sName]) ? self::$aStoredData[$sName] : $mDefault;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static public function setStoredData($sName,$mValue) {
|
|
|
|
|
self::$aStoredData[$sName]=$mValue;
|
|
|
|
|
self::saveStoredData();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static public function getDataFilePath($sFile) {
|
|
|
|
|
return dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR.'data'.DIRECTORY_SEPARATOR.$sFile;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static public function renderError($sMsg,$sTitle=null) {
|
|
|
|
|
self::render('error.tpl.php',array('msg'=>$sMsg,'title'=>$sTitle));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static public function render($sTemplate,$aVars=array()) {
|
|
|
|
|
|
|
|
|
|
if (is_object($sTemplate)) {
|
|
|
|
|
$oTemplate=$sTemplate;
|
|
|
|
|
self::$oLayout->assign($aVars);
|
|
|
|
|
} else {
|
|
|
|
|
$oTemplate=new InstallTemplate($sTemplate,$aVars);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$oTemplate->setParent(self::$oLayout);
|
|
|
|
|
$sContent=$oTemplate->render();
|
|
|
|
|
self::$oLayout->assign('content',$sContent);
|
|
|
|
|
|
|
|
|
|
echo(self::$oLayout->render());
|
|
|
|
|
exit();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static public function assign($mName,$mValue=null) {
|
|
|
|
|
self::$oLayout->assign($mName,$mValue);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static public function getRequest($sName,$mDefault=null) {
|
|
|
|
|
$sName=str_replace('.','_',$sName);
|
|
|
|
|
return isset($_REQUEST[$sName]) ? $_REQUEST[$sName] : $mDefault;
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-23 17:19:45 +03:00
|
|
|
|
static public function getRequestStr($sName,$mDefault=null) {
|
|
|
|
|
$sVal=self::getRequest($sName,$mDefault);
|
|
|
|
|
return is_scalar($sVal) ? (string)$sVal : '';
|
|
|
|
|
}
|
|
|
|
|
|
2014-07-28 09:23:41 +03:00
|
|
|
|
static public function getLang($sName) {
|
|
|
|
|
if (strpos($sName, '.')) {
|
|
|
|
|
$sLang = self::$aLangMsg;
|
|
|
|
|
$aKeys = explode('.', $sName);
|
|
|
|
|
foreach ($aKeys as $k) {
|
|
|
|
|
if (isset($sLang[$k])) {
|
|
|
|
|
$sLang = $sLang[$k];
|
|
|
|
|
} else {
|
|
|
|
|
return $sName;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (isset(self::$aLangMsg[$sName])) {
|
|
|
|
|
$sLang=self::$aLangMsg[$sName];
|
|
|
|
|
} else {
|
|
|
|
|
return $sName;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return $sLang;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static public function getNextStep($sGroup,$sStep=null) {
|
|
|
|
|
$aGroups=self::$aGroups;
|
|
|
|
|
if (isset($aGroups[$sGroup])) {
|
|
|
|
|
if (is_null($sStep)) {
|
|
|
|
|
return array_shift($aGroups[$sGroup]);
|
|
|
|
|
} else {
|
|
|
|
|
if (false!==($iPos=array_search($sStep,$aGroups[$sGroup]))) {
|
|
|
|
|
$aNext=array_slice($aGroups[$sGroup],$iPos+1,1);
|
|
|
|
|
$sNext=current($aNext);
|
|
|
|
|
return $sNext!==false ? $sNext : null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static public function getPreviousStep($sGroup,$sStep=null) {
|
|
|
|
|
$aGroups=self::$aGroups;
|
|
|
|
|
if (isset($aGroups[$sGroup])) {
|
|
|
|
|
if (is_null($sStep)) {
|
|
|
|
|
return array_shift($aGroups[$sGroup]);
|
|
|
|
|
} else {
|
|
|
|
|
if ($iPos=array_search($sStep,$aGroups[$sGroup])) {
|
|
|
|
|
$aPrev=array_slice($aGroups[$sGroup],$iPos-1,1);
|
|
|
|
|
$sPrev=current($aPrev);
|
|
|
|
|
return $sPrev!==false ? $sPrev : null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static public function location($sGroup='') {
|
|
|
|
|
header('Location: ./'.($sGroup ? '?group='.$sGroup : ''));
|
|
|
|
|
exit;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static public function setInstallResetHide($bHide=true) {
|
|
|
|
|
self::$oLayout->assign('install_reset_hide',$bHide);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static public function setNextStepHide($bHide=true) {
|
|
|
|
|
self::$oLayout->assign('next_step_hide',$bHide);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static public function setNextStepDisable($bDisable=true) {
|
|
|
|
|
self::$oLayout->assign('next_step_disable',$bDisable);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static public function setPreviousStepHide($bHide=true) {
|
|
|
|
|
self::$oLayout->assign('previous_step_hide',$bHide);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static public function setPreviousStepDisable($bDisable=true) {
|
|
|
|
|
self::$oLayout->assign('previous_step_disable',$bDisable);
|
|
|
|
|
}
|
2014-09-16 13:28:30 +03:00
|
|
|
|
|
|
|
|
|
protected function stripslashes(&$data) {
|
|
|
|
|
if (is_array($data)) {
|
|
|
|
|
foreach ($data as $sKey => $value) {
|
|
|
|
|
if (is_array($value)) {
|
|
|
|
|
$this->stripslashes($data[$sKey]);
|
|
|
|
|
} else {
|
|
|
|
|
$data[$sKey]=stripslashes($value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
$data=stripslashes($data);
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-07-28 09:23:41 +03:00
|
|
|
|
}
|