18 'configfile' =>
'/install/config.php',
19 'configvar' =>
'aConfig',
20 'configvarindex' =>
'home_dir',
21 'folder' =>
'modules/',
22 'subfolder' =>
'{configvar}',
25 'configfile' =>
'/install/config.php',
26 'configvar' =>
'aConfig',
27 'configvarindex' =>
'home_dir',
28 'folder' =>
'modules/',
29 'subfolder' =>
'{configvar}',
32 'configfile' =>
'/scripts/ChTemplName.php',
33 'configvar' =>
'sTemplName',
34 'folder' =>
'templates/',
35 'subfolder' =>
'{packagerootfolder}',
41 parent::__construct();
43 $this->_sDefVersion =
'0.0.0';
44 $this->_aCheckPathes = array();
49 'form_attrs' => array(
50 'id' =>
'module_upload_form',
53 'enctype' =>
'multipart/form-data',
57 'type' =>
'block_header',
58 'caption' =>
_t(
'_adm_txt_modules_package_to_upload'),
63 'caption' =>
_t($sPackageTitleKey),
72 'type' =>
'block_header',
73 'caption' =>
_t(
'_adm_txt_modules_ftp_access'),
78 'caption' =>
_t(
'_adm_txt_modules_host'),
84 'caption' =>
_t(
'_adm_txt_modules_login'),
90 'caption' =>
_t(
'_Password'),
91 'value' =>
getParam(
'sys_ftp_password')
96 'caption' =>
_t(
'_adm_txt_modules_path_to_cheetah'),
97 'value' => !($sPath =
getParam(
'sys_ftp_dir')) ?
'public_html/' : $sPath
99 'submit_upload' => array(
101 'name' =>
'submit_upload',
102 'value' =>
_t(
'_adm_box_cpt_upload'),
108 unset(
$aForm[
'inputs'][
'update']);
116 return $GLOBALS[
'oAdmTemplate']->parseHtmlByName(
'modules_uploader.html', array(
132 if(in_array(
$aModule[
'path'], $this->_aCheckPathes)) {
142 'update' => $sUpdate,
148 'modules-uninstall' => array(
'type' =>
'submit',
'name' =>
'modules-uninstall',
'value' =>
_t(
'_adm_btn_modules_uninstall'),
'onclick' =>
'onclick="javascript: return ' .
CH_WSB_ADM_MM_JS_NAME .
'.onSubmitUninstall(this);"'),
149 'modules-recompile-languages' =>
_t(
'_adm_btn_modules_recompile_languages')
152 $oZ =
new ChWsbAlerts(
'system',
'admin_modules_buttons', 0, 0, array(
153 'place' =>
'installed',
154 'buttons' => &$aButtons,
158 $sContent =
$GLOBALS[
'oAdmTemplate']->parseHtmlByName(
'modules_list.html', array(
159 'type' =>
'installed',
160 'ch_repeat:items' => !
empty($aItems) ? $aItems :
MsgBox(
_t(
'_Empty')),
171 $GLOBALS[
'oAdmTemplate']->addJsTranslation(array(
'_adm_txt_modules_data_will_be_lost'));
180 $aInstalled = array();
184 $aNotInstalled = array();
185 $sPath = CH_DIRECTORY_PATH_ROOT .
'modules/';
186 if($rHandleVendor = opendir($sPath)) {
188 while(($sVendor = readdir($rHandleVendor)) !==
false) {
189 if(substr($sVendor, 0, 1) ==
'.' || !is_dir($sPath . $sVendor))
continue;
191 if($rHandleModule = opendir($sPath . $sVendor)) {
192 while((
$sModule = readdir($rHandleModule)) !==
false) {
193 if(!is_dir($sPath . $sVendor .
'/' .
$sModule) || substr(
$sModule, 0, 1) ==
'.' || in_array($sVendor .
'/' .
$sModule .
'/', $aInstalled))
196 $sConfigPath = $sPath . $sVendor .
'/' .
$sModule .
'/install/config.php';
197 if(!file_exists($sConfigPath))
continue;
199 include($sConfigPath);
200 $aNotInstalled[
$aConfig[
'title']] = array(
208 closedir($rHandleModule);
211 closedir($rHandleVendor);
213 ksort($aNotInstalled);
217 'modules-install' =>
_t(
'_adm_btn_modules_install'),
218 'modules-delete' =>
_t(
'_adm_btn_modules_delete')
221 $oZ =
new ChWsbAlerts(
'system',
'admin_modules_buttons', 0, 0, array(
222 'place' =>
'uninstalled',
223 'buttons' => &$aButtons,
232 return $sResult .
$GLOBALS[
'oAdmTemplate']->parseHtmlByName(
'modules_list.html', array(
233 'type' =>
'not-installed',
234 'ch_repeat:items' => !
empty($aNotInstalled) ? array_values($aNotInstalled) :
MsgBox(
_t(
'_Empty')),
235 'controls' => $sControls
241 $sPath = CH_DIRECTORY_PATH_ROOT .
'modules/';
242 if($rHandleVendor = opendir($sPath)) {
243 while(($sVendor = readdir($rHandleVendor)) !==
false) {
244 if(substr($sVendor, 0, 1) ==
'.' || !is_dir($sPath . $sVendor))
247 if($rHandleModule = opendir($sPath . $sVendor .
'/')) {
248 while((
$sModule = readdir($rHandleModule)) !==
false) {
249 if(!is_dir($sPath . $sVendor .
'/' .
$sModule) || substr(
$sModule, 0, 1) ==
'.')
252 if($rHandleUpdate = @opendir($sPath . $sVendor .
'/' .
$sModule .
'/updates/')) {
253 while(($sUpdate = readdir($rHandleUpdate)) !==
false) {
254 if(!is_dir($sPath . $sVendor .
'/' .
$sModule .
'/updates/' . $sUpdate) || substr($sUpdate, 0, 1) ==
'.')
257 $sConfigPath = $sPath . $sVendor .
'/' .
$sModule .
'/updates/' . $sUpdate .
'/install/config.php';
258 if(!file_exists($sConfigPath))
261 include($sConfigPath);
263 $aUpdates[
$sName] = array(
271 closedir($rHandleUpdate);
274 closedir($rHandleModule);
277 closedir($rHandleVendor);
283 'updates-install' =>
_t(
'_adm_btn_modules_install'),
284 'updates-delete' =>
_t(
'_adm_btn_modules_delete')
291 return $sResult .
$GLOBALS[
'oAdmTemplate']->parseHtmlByName(
'modules_list.html', array(
293 'ch_repeat:items' => !
empty($aUpdates) ? array_values($aUpdates) :
MsgBox(
_t(
'_Empty')),
294 'controls' => $sControls
301 $this->_aCheckPathes = is_array($aPathes) ? $aPathes : array();
320 $sAbsolutePath = CH_DIRECTORY_PATH_ROOT .
"tmp/" .
$sName .
'.zip';
321 $sPackageRootFolder =
false;
323 if (!class_exists(
'ZipArchive'))
324 $sErrMsg =
'_adm_txt_modules_zip_not_available';
326 if (!$sErrMsg && $this->
_isArchive($aFile[
'type']) && move_uploaded_file($aFile[
'tmp_name'], $sAbsolutePath)) {
330 $oZip =
new ZipArchive();
331 if ($oZip->open($sAbsolutePath) !==
TRUE)
332 $sErrMsg =
'_adm_txt_modules_cannot_unzip_package';
335 $sPackageRootFolder = $oZip->numFiles > 0 ? $oZip->getNameIndex(0) :
false;
337 if (file_exists(CH_DIRECTORY_PATH_ROOT .
'tmp/' . $sPackageRootFolder))
338 ch_rrmdir(CH_DIRECTORY_PATH_ROOT .
'tmp/' . $sPackageRootFolder);
340 if ($sPackageRootFolder && !$oZip->extractTo(CH_DIRECTORY_PATH_ROOT .
'tmp/'))
341 $sErrMsg =
'_adm_txt_modules_cannot_unzip_package';
348 if (!$sErrMsg && $sPackageRootFolder) {
352 if (!$oFtp->connect())
353 $sErrMsg =
'_adm_txt_modules_cannot_connect_to_ftp';
355 if (!$sErrMsg && !$oFtp->isCheetah())
356 $sErrMsg =
'_adm_txt_modules_destination_not_valid';
359 $sConfigPath = CH_DIRECTORY_PATH_ROOT .
"tmp/" . $sPackageRootFolder . $this->_aTypesConfig[
$sType][
'configfile'];
360 if (file_exists($sConfigPath)) {
361 include($sConfigPath);
362 $sConfigVar = !
empty($this->_aTypesConfig[
$sType][
'configvarindex']) ? ${$this->_aTypesConfig[
$sType][
'configvar']}[$this->_aTypesConfig[
$sType][
'configvarindex']] : ${$this->_aTypesConfig[
$sType][
'configvar']};
363 $sSubfolder = $this->_aTypesConfig[
$sType][
'subfolder'];
364 $sSubfolder = str_replace(
'{configvar}', $sConfigVar, $sSubfolder);
365 $sSubfolder = str_replace(
'{packagerootfolder}', $sPackageRootFolder, $sSubfolder);
366 if (!$oFtp->copy(CH_DIRECTORY_PATH_ROOT .
"tmp/" . $sPackageRootFolder .
'/', $this->_aTypesConfig[
$sType][
'folder'] . $sSubfolder))
367 $sErrMsg =
'_adm_txt_modules_ftp_copy_failed';
369 $sErrMsg =
'_adm_txt_modules_wrong_package_format';
374 $sErrMsg =
'_adm_txt_modules_cannot_unzip_package';
378 ch_rrmdir(CH_DIRECTORY_PATH_ROOT .
'tmp/' . $sPackageRootFolder);
379 unlink($sAbsolutePath);
382 $sErrMsg =
'_adm_txt_modules_cannot_upload_package';
385 return $sErrMsg ? $sErrMsg :
'_adm_txt_modules_success_upload';
389 return $this->
_perform($aDirectories,
'install');
393 return $this->
_perform($aDirectories,
'uninstall');
397 return $this->
_perform($aDirectories,
'recompile');
401 return $this->
_perform($aDirectories,
'update');
405 $sFtpHost =
getParam(
'sys_ftp_host');
407 $sFtpHost = $_SERVER[
'HTTP_HOST'];
410 if (!$oFtp->connect())
411 return '_adm_txt_modules_cannot_connect_to_ftp';
413 $sDir = $this->_aTypesConfig[
$sType][
'folder'];
414 foreach ($aDirectories
as $sDirectory)
415 if (!$oFtp->delete($sDir . $sDirectory))
416 return '_adm_txt_modules_cannot_remove_package';
418 return '_adm_txt_modules_success_delete';
436 $sTmpPath = CH_DIRECTORY_PATH_ROOT .
'tmp/';
437 $sFilePath = $sTmpPath .
$sName;
438 if (!$rHandler = fopen($sFilePath,
'w'))
439 return _t(
'_adm_txt_modules_cannot_download_package');
441 if (!fwrite($rHandler, $sData))
442 return _t(
'_adm_txt_modules_cannot_write_package');
447 if(!class_exists(
'ZipArchive'))
448 return _t(
'_adm_txt_modules_zip_not_available');
450 $oZip =
new ZipArchive();
451 if($oZip->open($sFilePath) !==
true)
452 return _t(
'_adm_txt_modules_cannot_unzip_package');
454 $sPackageRootFolder = $oZip->numFiles > 0 ? $oZip->getNameIndex(0) :
false;
455 if($sPackageRootFolder && file_exists($sTmpPath . $sPackageRootFolder))
456 ch_rrmdir($sTmpPath . $sPackageRootFolder);
458 if($sPackageRootFolder && !$oZip->extractTo($sTmpPath))
459 return _t(
'_adm_txt_modules_cannot_unzip_package');
465 $sLogin =
getParam(
'sys_ftp_login');
469 return _t(
'_adm_txt_modules_no_ftp_info');
474 if(!$oFtp->connect())
475 return _t(
'_adm_txt_modules_cannot_connect_to_ftp');
477 if(!$oFtp->isCheetah())
478 return _t(
'_adm_txt_modules_destination_not_valid');
480 $sConfigPath = $sTmpPath . $sPackageRootFolder .
'/install/config.php';
481 if(!file_exists($sConfigPath))
482 return _t(
'_adm_txt_modules_wrong_package_format');
484 include($sConfigPath);
486 return _t(
'_adm_txt_modules_ftp_copy_failed');
501 'domain' => $_SERVER[
'HTTP_HOST']
504 $aValues = $aIndexes = array();
505 $rParser = xml_parser_create(
'UTF-8');
506 xml_parse_into_struct($rParser, $sData, $aValues, $aIndexes);
507 xml_parser_free($rParser);
510 if(isset($aIndexes[
'VERSION']))
511 $aInfo[
'version'] = $aValues[$aIndexes[
'VERSION'][0]][
'value'];
512 if(isset($aIndexes[
'LINK']))
513 $aInfo[
'link'] = $aValues[$aIndexes[
'LINK'][0]][
'value'];
514 if(isset($aIndexes[
'PACKAGE']))
515 $aInfo[
'package'] = $aValues[$aIndexes[
'PACKAGE'][0]][
'value'];
524 return $GLOBALS[
'oAdmTemplate']->parseHtmlByName(
'modules_update.html', array(
525 'ch_if:show_available' => array(
526 'condition' => $bAvailable,
528 'text' =>
_t(
'_adm_txt_modules_update_text',
empty(
$aInfo[
'version']) ?
'' :
$aInfo[
'version']),
529 'ch_if:show_update_view' => array(
535 'ch_if:show_update_download' => array(
544 'ch_if:show_latest' => array(
545 'condition' => !$bAvailable,
550 function _perform($aDirectories, $sOperation, $aParams = array())
552 $sConfigFile =
'install/config.php';
553 $sInstallerFile =
'install/installer.php';
554 $sInstallerClass = $sOperation ==
'update' ?
'Updater' :
'Installer';
557 foreach($aDirectories
as $sDirectory) {
558 $sPathConfig = CH_DIRECTORY_PATH_MODULES . $sDirectory . $sConfigFile;
559 $sPathInstaller = CH_DIRECTORY_PATH_MODULES . $sDirectory . $sInstallerFile;
560 if(file_exists($sPathConfig) && file_exists($sPathInstaller)) {
561 include($sPathConfig);
562 require_once($sPathInstaller);
564 $sClassName =
$aConfig[
'class_prefix'] . $sInstallerClass;
565 $oInstaller =
new $sClassName(
$aConfig);
566 $aResult = $oInstaller->$sOperation($aParams);
576 'operation_title' =>
_t(
'_adm_txt_modules_process_operation_failed', $sOperation, $sDirectory),
581 'operation_title' =>
$aResult[
'operation_title'],
582 'ch_if:operation_result_success' => array(
586 'ch_if:operation_result_failed' => array(
594 return $GLOBALS[
'oAdmTemplate']->parseHtmlByName(
'modules_results.html', array(
595 'ch_repeat:planks' => $aPlanks
602 case 'application/zip':
603 case 'application/x-zip-compressed':