Файл: sys/inc/functions/ds-plugins.php
Строк: 237
<?php
/**
* Возвращает путь до папки с плагином
* @return string
*/
function ds_plugin_directory_path($type) {
if (is_dir(PATH_PLUGINS . DIRECTORY_SEPARATOR . $type)) {
return PATH_PLUGINS . DIRECTORY_SEPARATOR . $type;
}
}
/**
* Возвращает массив с плагинами
* @return array
*/
function ds_plugins()
{
if ($plugins = ds_get('ds_plugins')) {
return $plugins;
}
$json = get_option('ds_plugins');
if ($json) {
$plugins = json_decode($json, 1);
}
return is_array($plugins) ? $plugins : array();
}
/**
* Функция активирует плагин
* @return bolean
*/
function ds_plugin_activate($plug)
{
$plugins = ds_plugins();
$plugin_path = ds_plugin_directory_path($plug) . '/' . $plug . '.php';
if (!defined('plugin_' . $plug . '_loaded') && is_file($plugin_path)) {
require $plugin_path;
}
do_event('ds_plugin_pre_activation', $plug);
do_event('ds_plugin_' . $plug . '_pre_activation', $plug);
if (isset($plugins[$plug]) && $plugins[$plug]['active'] != '1') {
$plugins[$plug]['active'] = '1';
update_option('ds_plugins', json_encode($plugins), 'plugins');
do_event('ds_plugin_activation', $plug);
do_event('ds_plugin_' . $plug . '_activation', $plug);
return true;
}
return false;
}
/**
* Функция деактивирует плагин
* @return bolean
*/
function ds_plugin_deactivate($plug)
{
do_event('ds_plugin_pre_deactivation', $plug);
do_event('ds_plugin_' . $plug . '_pre_deactivation', $plug);
$plugins = ds_plugins();
if (isset($plugins[$plug])) {
$plugins[$plug]['active'] = '0';
update_option('ds_plugins', json_encode($plugins), 'plugins');
do_event('ds_plugin_deactivation', $plug);
do_event('ds_plugin_' . $plug . '_deactivation', $plug);
return true;
}
return false;
}
/**
* Функция добавляет плагин в список плагинов
* @return bolean
*/
function ds_plugin_add($plug, $info)
{
$plugins = ds_plugins();
if (!isset($plugins[$plug])) {
$plugins[$plug] = $info;
$plugins[$plug]['active'] = '0';
update_option('ds_plugins', json_encode($plugins), 'plugins');
return true;
}
return false;
}
/**
* Функция удаляет плагин из системы
* @return bolean
*/
function ds_plugin_remove($plug)
{
$plugins = ds_plugins();
do_event('ds_plugin_remove', $plug);
if (isset($plugins[$plug])) {
if (is_file(ds_plugin_directory_path($plug) . '/uninstall.php')) {
require ds_plugin_directory_path($plug) . '/uninstall.php';
}
do_event('ds_plugin_' . $plug . '_remove', $plug);
if (is_dir(PATH_PLUGINS . '/' . $plug)) {
delete_dir(PATH_PLUGINS . '/' . $plug);
}
unset($plugins[$plug]);
update_option('ds_plugins', json_encode($plugins), 'plugins');
return true;
}
return false;
}
/**
* Проверка активен ли плагин
* @return bolean
*/
function is_plugin_active($plug)
{
$plugins = ds_plugins();
if (!empty($plugins[$plug]) && $plugins[$plug]['active'] == '1') {
return true;
}
return false;
}
/**
* Проверка на наличие плагина
* @return bolean
*/
function plugin_exists($plug)
{
$plugins = ds_plugins();
if (isset($plugins[$plug])) {
return true;
}
return false;
}
/**
* Устанавливает плагин из репозитория CMS-Social
* @return bolean
*/
function ds_plugin_install($plug)
{
if (plugin_exists($plug)) {
add_error(__('Плагин уже существует'));
}
$plugin = json_decode(get_http_content('https://cms-social.ru/api/v1/plugins/info', array(
'slug' => $plug,
)), true);
if (!$plugin) {
add_error(__('Не удалось получить информацию о плагине'));
}
if (is_errors()) return false;
$sess_id = md5(time());
$tmpFile = PATH_CACHE.'/'.$sess_id.'.zip';
$pluginData = get_http_content($plugin['download']);
if (!$pluginData || !file_put_contents($tmpFile, $pluginData)) {
add_error(__('Не удалось загрузить плагин'));
}
if (is_file($tmpFile) && ds_plugin_zip_install($tmpFile)) {
return true;
}
return false;
}
/**
* Устанавливает плагин из Zip архива
* @return bolean
*/
function ds_plugin_upload($file_path)
{
$sess_id = md5(time());
if (!class_exists('ZipArchive')) {
add_error(__('У вас не установлена библиотека 'zip' для работы с архивами'));
}
if (!is_dir(PATH_CACHE)) {
@mkdir(PATH_CACHE, 0777);
@chmod(PATH_CACHE, 0777);
}
if (!is_file(PATH_PLUGINS . '/index.php')) {
file_put_contents(PATH_PLUGINS . '/index.php', "<?php nn// Index Of");
}
$tmpFile = PATH_CACHE.'/'.$sess_id.'.zip';
if (!copy($file_path, $tmpFile)) {
add_error(__('Не удалось загрузить плагин'));
}
if (is_file($tmpFile)) {
return ds_plugin_zip_install($tmpFile);
}
}
function ds_plugin_zip_install($zip_path)
{
$sess_id = md5($zip_path); ;
if (is_file($zip_path)) {
if (!is_errors()) {
$zip = new ZipArchive();
$zip->open($zip_path, ZipArchive::CREATE);
$zip->extractTo(PATH_CACHE.'/' . $sess_id);
$zip->close();
unlink($zip_path);
$files_list = ds_readdir_files_list(PATH_CACHE.'/' . $sess_id);
$dires_list = ds_readdir_dir_list(PATH_CACHE.'/' . $sess_id);
if (!isset($dires_list[0])) {
add_error('Подходящих плагинов не найдено');
} else {
preg_match('/([A-z0-9_-]+)/?$/m', $dires_list[0], $matches);
if (isset($matches[1])) {
$plugin_id = $matches[1];
}
if (!isset($plugin_id) || !is_file(PATH_CACHE.'/' . $sess_id . '/' . $plugin_id . '/' . $plugin_id . '.php')) {
add_error(__('Подходящих плагинов не найдено'));
}
}
if (isset($plugin_id) && is_dir(PATH_PLUGINS . '/' . $plugin_id)) {
add_error(__('Такой плагин уже установлен'));
}
if (!is_errors()) {
if (rename(PATH_CACHE.'/' . $sess_id . '/' . $plugin_id, PATH_PLUGINS . '/' . $plugin_id)) {
delete_dir(PATH_CACHE.'/' . $sess_id);
$plugins = new Plugins();
$info = $plugins->getPluginInfo(PATH_PLUGINS . '/' . $plugin_id, $plugin_id);
$info['active'] = 0;
do_event('ds_plugin_installed', $plugin_id);
return true;
} else {
add_error(__('Не удалось установить плагин'));
}
}
}
}
if (is_errors()) {
if (is_dir(PATH_CACHE.'/' . $sess_id)) {
delete_dir(PATH_CACHE.'/' . $sess_id);
}
if (is_file($zip_path)) {
unlink($zip_path);
}
}
return false;
}