под катом код и пояснения в коментах, что куда вставлять
Код PHP:
<?php
###########################################################################
# патч: реализовано установку компонентов из админ панели #
# тип патча: дополнение функционала #
# автор: alter.ego (он же xxor), e-mail: xxor@ukr.net icq: 464669413 #
###########################################################################
//////////////////////////////////////////////
# файл: core/cms.php
# добавить:
#
public function removeСomponent($component_id) {
$inDB = cmsDatabase::getInstance();
//если компонент не был установлен, выходим
if (!$component_id) { return false; }
//удаляем плагин из базы
$query = "SELECT * FROM `cms_components` WHERE id=".$component_id;
$result = $inDB->fetch_assoc($inDB->query($query));
$delete_query = "DELETE FROM cms_components WHERE id=".$component_id;
$inDB->query($delete_query);
////////////////////////////
/*
** пересмотреть и пофиксить
** суть - вынуть запись о доступе к компонентам и катнуть оттуда имя удаляемого
*/
$query = "SELECT access FROM `cms_user_groups` WHERE is_admin=1";
$access = $inDB->fetch_assoc($inDB->query($query));
$access = explode(',',$access['access']);
foreach($access as $item){
if($item != 'admin/com_'.$result['link']){
$new_access .= trim($item).', ';
}
}
$delete_query = "UPDATE cms_user_groups SET access='".$new_access."' WHERE is_admin=1";
$inDB->query($delete_query);
////////////////////////////
//компонент успешно удален
return true;
}
public function getNewComponents() {
$inDB = cmsDatabase::getInstance();
$new_components = array();
$all_components = $this->getComponentsDirs();
if (!$all_components) { return false; }
foreach($all_components as $component){
$installed = $inDB->rows_count('cms_components', "link='{$component}'", 1);
if (!$installed){
$new_components[] = $component;
}
}
if (!$new_components) { return false; }
return $new_components;
}
public function getComponentsDirs() {
$dir = PATH . '/components';
$pdir = opendir($dir);
$components = array();
while ($nextfile = readdir($pdir)){
if (
($nextfile != '.') &&
($nextfile != '..') &&
is_dir($dir.'/'.$nextfile)
) {
$components[$nextfile] = $nextfile;
}
}
if (!sizeof($components)){ return false; }
return $components;
}
public function loadComponent($component) {
$component_file = PATH.'/components/'.$component.'/model.php';
if (file_exists($component_file)){
include_once($component_file);
$component = 'cms_model_'.$component;
$component_obj = new $component();
return $component_obj;
}
return false;
}
//////////////////////////////////////////////
# файл: admin/applets/components.php
# раскоментировать:
$toolmenu = array();
$toolmenu[0]['icon'] = 'install.gif';
$toolmenu[0]['title'] = 'Установить компонент';
$toolmenu[0]['link'] = '?view=install&do=component';
cpToolMenu($toolmenu);
# после строки №87 добавить:
$actions[1]['title'] = 'Удалить';
$actions[1]['icon'] = 'delete.gif';
$actions[1]['confirm'] = 'Удалить компонент из системы?';
$actions[1]['link'] = '?view=install&do=remove_component&id=%id%';
//////////////////////////////////////////////
# файл: admin/applets/install.php
# убрать:
if ($do != 'plugin' && $do != 'install_plugin' && $do != 'upgrade_plugin' && $do != 'finish_plugin' && $do != 'remove_plugin'){
echo '<p><b>В текущей версии системы установка указанных расширений не доступна.</b></p>';
echo '<p>Обратитесь на <a href="http://www.instantcms.ru">официальный сайт</a>.</p>';
echo '<p><a href="javascript:window.history.go(-1);">Назад</a></p>';
return;
}
# добавить:
function componentsList($new_components, $action_name, $action){
$inCore = cmsCore::getInstance();
echo '<table cellpadding="3" cellspacing="0" border="0" style="margin-left:40px">';
foreach($new_components as $component){
$component_obj = $inCore->loadComponent($component);
if ($action == 'install_component') { $version = $component_obj->info['version']; }
if($component_obj->info['title']!=''){
echo '<tr>';
echo '<td width="16"><img src="/admin/images/icons/hmenu/plugins.png" /></td>';
echo '<td><a style="font-weight:bold;font-size:14px" title="'.$action_name.' '.$component_obj->info['title'].'" href="index.php?view=install&do='.$action.'&id='.$component.'">'.$component_obj->info['title'].'</a> v'.$component_obj->info['version'].'</td>';
echo '<tr>';
echo '<tr>';
echo '<td width="16"> </td>';
echo '<td>
<div style="margin-bottom:6px;">'.$component_obj->info['description'].'</div>
<div style="color:gray"><strong>Автор:</strong> '.$component_obj->info['author'].'</div>
<div style="color:gray"><strong>Папка:</strong> /components/'.$component_obj->info['component'].'</div>
</td>';
echo '<tr>';
}
}
echo '</table>';
return;
}
# в тело функции applet_install() добавить:
if ($do == 'component'){
cpAddPathway('Установка компонет', 'index.php?view=install&do=component');
$new_components = $inCore->getNewComponents();
echo '<h3>Установка компонет</h3>';
if (!$new_components){
echo '<p>В системе не найдены компонеты, которые еще не установлены.</p>';
echo '<p><a href="javascript:window.history.go(-1);">Вернуться назад</a></p>';
return;
}
if ($new_components){
echo '<p><strong>Найдены компонеты, доступные для установки:</strong></p>';
componentsList($new_components, 'Установить', 'install_component');
}
}
if ($do == 'install_component'){
cpAddPathway('Установка компонент', 'index.php?view=install&do=component');
$error = '';
$component_id = $inCore->request('id', 'str', '');
if(!$component_id){
$inCore->redirectBack();
}
$component = $inCore->loadComponent($component_id);
if (!$component) { $error = 'Не удалось загрузить файл компонента.'; }
if (!$error && $component->install()) {
$query = "SELECT MAX(id) FROM `cms_components` LIMIT 1";
$last_id = $inDB->fetch_assoc($inDB->query($query));
$new_id = $last_id['MAX(id)']+1;
$install_query = "INSERT INTO cms_components (id, title, link, config, internal, author) VALUES (".$new_id.",'".$component->info['title']."','".$component->info['component']."','',1,'".$component->info['author']."')";
$inDB->query($install_query);
$query = "SELECT access FROM `cms_user_groups` WHERE is_admin=1";
$last_access = $inDB->fetch_assoc($inDB->query($query));
$new_access = $last_access['access'].', admin/com_'.$component->info['component'];
$install_query = "UPDATE cms_user_groups SET access='".$new_access."' WHERE is_admin=1";
$inDB->query($install_query);
echo 'SSS';
$inCore->redirect('/admin/index.php?view=install&do=finish_component&id='.$component_id.'&task=install');
}
if ($error){
echo '<p style="color:red">'.$error.'</p>';
}
echo '<p><a href="index.php?view=install&do=component">Назад</a></p>';
}
if ($do == 'remove_component'){
$component_id = $inCore->request('id', 'str', '');
if(!$component_id){
$inCore->redirectBack();
}
$inCore->removeСomponent($component_id);
$inCore->redirect('/admin/index.php?view=install&do=finish_component&id='.$component_id.'&task=remove');
}
if ($do == 'finish_component'){
$component_id = $inCore->request('id', 'str', '');
$task = $inCore->request('task', 'str', 'install');
$inCore->redirect('/admin/index.php?view=components&installed='.$component_id.'&task='.$task);
}
?>