Удаление модуля очистки кэша

This commit is contained in:
Konstantin
2026-05-30 13:47:55 +03:00
parent f6197986f2
commit 0e8a0f3b0c
4 changed files with 0 additions and 707 deletions
@@ -1,537 +0,0 @@
<?php
class ControllerExtensionModuleOc3xStorageCleaner extends Controller {
private $error = array();
private $maintenance = 0;
public function index() {
$this->load->language('extension/module/oc3x_storage_cleaner');
$this->document->setTitle($this->language->get('page_title'));
$this->load->model('setting/setting');
if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
$this->model_setting_setting->editSetting('oc3x_storage_cleaner', $this->request->post);
$this->session->data['success'] = $this->language->get('text_success');
$this->response->redirect($this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=module', true));
}
$data['heading_title'] = $this->language->get('heading_title');
$data['tab_settings'] = $this->language->get('tab_settings');
$data['tab_help'] = $this->language->get('tab_help');
$data['text_edit'] = $this->language->get('text_edit');
$data['text_documentation'] = $this->language->get('text_documentation');
$data['text_developer'] = $this->language->get('text_developer');
$data['text_enabled'] = $this->language->get('text_enabled');
$data['text_disabled'] = $this->language->get('text_disabled');
$data['entry_status'] = $this->language->get('entry_status');
$data['entry_size'] = $this->language->get('entry_size');
$data['button_save'] = $this->language->get('button_save');
$data['button_cancel'] = $this->language->get('button_cancel');
if (isset($this->error['warning'])) {
$data['error_warning'] = $this->error['warning'];
} else {
$data['error_warning'] = '';
}
$data['breadcrumbs'] = array();
$data['breadcrumbs'][] = array(
'text' => $this->language->get('text_home'),
'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true)
);
$data['breadcrumbs'][] = array(
'text' => $this->language->get('text_extension'),
'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'], true)
);
$data['breadcrumbs'][] = array(
'text' => $this->language->get('page_title'),
'href' => $this->url->link('extension/module/oc3x_storage_cleaner', 'user_token=' . $this->session->data['user_token'], true)
);
$data['action'] = $this->url->link('extension/module/oc3x_storage_cleaner', 'user_token=' . $this->session->data['user_token'], true);
$data['cancel'] = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'], true);
if (isset($this->request->post['oc3x_storage_cleaner_status'])) {
$data['oc3x_storage_cleaner_status'] = $this->request->post['oc3x_storage_cleaner_status'];
} else {
$data['oc3x_storage_cleaner_status'] = $this->config->get('oc3x_storage_cleaner_status');
}
if (isset($this->request->post['oc3x_storage_cleaner_size'])) {
$data['oc3x_storage_cleaner_size'] = $this->request->post['oc3x_storage_cleaner_size'];
} else {
$data['oc3x_storage_cleaner_size'] = $this->config->get('oc3x_storage_cleaner_size');
}
$data['header'] = $this->load->controller('common/header');
$data['column_left'] = $this->load->controller('common/column_left');
$data['footer'] = $this->load->controller('common/footer');
$this->response->setOutput($this->load->view('extension/module/oc3x_storage_cleaner', $data));
}
public function clearCache() {
$this->load->language('extension/module/oc3x_storage_cleaner');
$json = array();
if (!$this->validateWidget() || empty($this->request->post['key'])) {
$json['error'] = $this->language->get('error_permission');
} else {
$key = $this->request->post['key'];
if ($key == 'system') {
$dir = DIR_CACHE;
} elseif ($key == 'modification') {
// Just before files are deleted, if config settings say maintenance mode is off then turn it on
$this->maintenance = $this->config->get('config_maintenance');
$this->load->model('setting/setting');
$this->model_setting_setting->editSettingValue('config', 'config_maintenance', true);
$dir = DIR_MODIFICATION;
} elseif ($key == 'image') {
$dir = DIR_IMAGE . 'cache/';
} else {
$dir = false;
}
if ($dir) {
$files = array();
// Make path into an array
$path = array($dir . '*');
// While the path array is still populated keep looping through
while (count($path) != 0) {
$next = array_shift($path);
foreach (glob($next) as $file) {
// If directory add to path array
if (is_dir($file)) {
$path[] = $file . '/*';
}
// Add the file to the files to be deleted array
$files[] = $file;
}
}
// Reverse sort the file array
rsort($files);
// Clear all files
foreach ($files as $file) {
if ($file != $dir . 'index.html' && $file != $dir . '.htaccess') {
// If file just delete
if (is_file($file)) {
unlink($file);
// If directory use the remove directory function
} elseif (is_dir($file)) {
rmdir($file);
}
}
}
if ($key == 'modification') {
$this->refreshModification();
}
$this->load->model('extension/module/oc3x_storage_cleaner');
if ($this->config->get('oc3x_storage_cleaner_size')) {
$json['size'] = $this->model_extension_module_oc3x_storage_cleaner->getSize();
}
$json['success'] = $this->language->get('text_success_clear');
}
}
$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode($json));
}
public function clearLog() {
$this->load->language('extension/module/oc3x_storage_cleaner');
$json = array();
if (!$this->validateWidget() || empty($this->request->post['key'])) {
$json['error'] = $this->language->get('error_permission');
} else {
$key = $this->request->post['key'];
if ($key == 'error') {
$file = DIR_LOGS . $this->config->get('config_error_filename');
} elseif ($key == 'modification') {
$file = DIR_LOGS . 'ocmod.log';
} else {
$file = false;
}
if ($file) {
$handle = fopen($file, 'w+');
fclose($handle);
$this->load->model('extension/module/oc3x_storage_cleaner');
if ($this->config->get('oc3x_storage_cleaner_size')) {
$json['size'] = $this->model_extension_module_oc3x_storage_cleaner->getSize();
}
$json['success'] = $this->language->get('text_success_clear');
}
}
$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode($json));
}
protected function refreshModification() {
$this->load->model('setting/modification');
$this->load->model('setting/setting');
//Log
$log = array();
// Begin
$xml = array();
// Load the default modification XML
$xml[] = file_get_contents(DIR_SYSTEM . 'modification.xml');
// This is purly for developers so they can run mods directly and have them run without upload sfter each change.
$files = glob(DIR_SYSTEM . '*.ocmod.xml');
if ($files) {
foreach ($files as $file) {
$xml[] = file_get_contents($file);
}
}
// Get the default modification file
$results = $this->model_setting_modification->getModifications();
foreach ($results as $result) {
if ($result['status']) {
$xml[] = $result['xml'];
}
}
$modification = array();
foreach ($xml as $xml) {
if (empty($xml)){
continue;
}
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->preserveWhiteSpace = false;
$dom->loadXml($xml);
// Log
$log[] = 'MOD: ' . $dom->getElementsByTagName('name')->item(0)->textContent;
// Wipe the past modification store in the backup array
$recovery = array();
// Set the a recovery of the modification code in case we need to use it if an abort attribute is used.
if (isset($modification)) {
$recovery = $modification;
}
$files = $dom->getElementsByTagName('modification')->item(0)->getElementsByTagName('file');
foreach ($files as $file) {
$operations = $file->getElementsByTagName('operation');
$files = explode('|', $file->getAttribute('path'));
foreach ($files as $file) {
$path = '';
// Get the full path of the files that are going to be used for modification
if ((substr($file, 0, 7) == 'catalog')) {
$path = DIR_CATALOG . substr($file, 8);
}
if ((substr($file, 0, 5) == 'admin')) {
$path = DIR_APPLICATION . substr($file, 6);
}
if ((substr($file, 0, 6) == 'system')) {
$path = DIR_SYSTEM . substr($file, 7);
}
if ($path) {
$files = glob($path, GLOB_BRACE);
if ($files) {
foreach ($files as $file) {
// Get the key to be used for the modification cache filename.
if (substr($file, 0, strlen(DIR_CATALOG)) == DIR_CATALOG) {
$key = 'catalog/' . substr($file, strlen(DIR_CATALOG));
}
if (substr($file, 0, strlen(DIR_APPLICATION)) == DIR_APPLICATION) {
$key = 'admin/' . substr($file, strlen(DIR_APPLICATION));
}
if (substr($file, 0, strlen(DIR_SYSTEM)) == DIR_SYSTEM) {
$key = 'system/' . substr($file, strlen(DIR_SYSTEM));
}
// If file contents is not already in the modification array we need to load it.
if (!isset($modification[$key])) {
$content = file_get_contents($file);
$modification[$key] = preg_replace('~\r?\n~', "\n", $content);
$original[$key] = preg_replace('~\r?\n~', "\n", $content);
// Log
$log[] = PHP_EOL . 'FILE: ' . $key;
}
foreach ($operations as $operation) {
$error = $operation->getAttribute('error');
// Ignoreif
$ignoreif = $operation->getElementsByTagName('ignoreif')->item(0);
if ($ignoreif) {
if ($ignoreif->getAttribute('regex') != 'true') {
if (strpos($modification[$key], $ignoreif->textContent) !== false) {
continue;
}
} else {
if (preg_match($ignoreif->textContent, $modification[$key])) {
continue;
}
}
}
$status = false;
// Search and replace
if ($operation->getElementsByTagName('search')->item(0)->getAttribute('regex') != 'true') {
// Search
$search = $operation->getElementsByTagName('search')->item(0)->textContent;
$trim = $operation->getElementsByTagName('search')->item(0)->getAttribute('trim');
$index = $operation->getElementsByTagName('search')->item(0)->getAttribute('index');
// Trim line if no trim attribute is set or is set to true.
if (!$trim || $trim == 'true') {
$search = trim($search);
}
// Add
$add = $operation->getElementsByTagName('add')->item(0)->textContent;
$trim = $operation->getElementsByTagName('add')->item(0)->getAttribute('trim');
$position = $operation->getElementsByTagName('add')->item(0)->getAttribute('position');
$offset = $operation->getElementsByTagName('add')->item(0)->getAttribute('offset');
if ($offset == '') {
$offset = 0;
}
// Trim line if is set to true.
if ($trim == 'true') {
$add = trim($add);
}
// Log
$log[] = 'CODE: ' . $search;
// Check if using indexes
if ($index !== '') {
$indexes = explode(',', $index);
} else {
$indexes = array();
}
// Get all the matches
$i = 0;
$lines = explode("\n", $modification[$key]);
for ($line_id = 0; $line_id < count($lines); $line_id++) {
$line = $lines[$line_id];
// Status
$match = false;
// Check to see if the line matches the search code.
if (stripos($line, $search) !== false) {
// If indexes are not used then just set the found status to true.
if (!$indexes) {
$match = true;
} elseif (in_array($i, $indexes)) {
$match = true;
}
$i++;
}
// Now for replacing or adding to the matched elements
if ($match) {
switch ($position) {
default:
case 'replace':
$new_lines = explode("\n", $add);
if ($offset < 0) {
array_splice($lines, $line_id + $offset, abs($offset) + 1, array(str_replace($search, $add, $line)));
$line_id -= $offset;
} else {
array_splice($lines, $line_id, $offset + 1, array(str_replace($search, $add, $line)));
}
break;
case 'before':
$new_lines = explode("\n", $add);
array_splice($lines, $line_id - $offset, 0, $new_lines);
$line_id += count($new_lines);
break;
case 'after':
$new_lines = explode("\n", $add);
array_splice($lines, ($line_id + 1) + $offset, 0, $new_lines);
$line_id += count($new_lines);
break;
}
// Log
$log[] = 'LINE: ' . $line_id;
$status = true;
}
}
$modification[$key] = implode("\n", $lines);
} else {
$search = trim($operation->getElementsByTagName('search')->item(0)->textContent);
$limit = $operation->getElementsByTagName('search')->item(0)->getAttribute('limit');
$replace = trim($operation->getElementsByTagName('add')->item(0)->textContent);
// Limit
if (!$limit) {
$limit = -1;
}
// Log
$match = array();
preg_match_all($search, $modification[$key], $match, PREG_OFFSET_CAPTURE);
// Remove part of the the result if a limit is set.
if ($limit > 0) {
$match[0] = array_slice($match[0], 0, $limit);
}
if ($match[0]) {
$log[] = 'REGEX: ' . $search;
for ($i = 0; $i < count($match[0]); $i++) {
$log[] = 'LINE: ' . (substr_count(substr($modification[$key], 0, $match[0][$i][1]), "\n") + 1);
}
$status = true;
}
// Make the modification
$modification[$key] = preg_replace($search, $replace, $modification[$key], $limit);
}
if (!$status) {
// Abort applying this modification completely.
if ($error == 'abort') {
$modification = $recovery;
// Log
$log[] = 'NOT FOUND - ABORTING!';
break 5;
}
// Skip current operation or break
elseif ($error == 'skip') {
// Log
$log[] = 'NOT FOUND - OPERATION SKIPPED!';
continue;
}
// Break current operations
else {
// Log
$log[] = 'NOT FOUND - OPERATIONS ABORTED!';
break;
}
}
}
}
}
}
}
}
// Log
$log[] = '----------------------------------------------------------------';
}
// Log
$ocmod = new Log('ocmod.log');
$ocmod->write(implode("\n", $log));
// Write all modification files
foreach ($modification as $key => $value) {
// Only create a file if there are changes
if ($original[$key] != $value) {
$path = '';
$directories = explode('/', dirname($key));
foreach ($directories as $directory) {
$path = $path . '/' . $directory;
if (!is_dir(DIR_MODIFICATION . $path)) {
@mkdir(DIR_MODIFICATION . $path, 0777);
}
}
$handle = fopen(DIR_MODIFICATION . $key, 'w');
fwrite($handle, $value);
fclose($handle);
}
}
// Maintance mode back to original settings
$this->model_setting_setting->editSettingValue('config', 'config_maintenance', $this->maintenance);
}
protected function validate() {
if (!$this->user->hasPermission('modify', 'extension/module/oc3x_storage_cleaner')) {
$this->error['warning'] = $this->language->get('error_permission');
}
return !$this->error;
}
protected function validateWidget() {
if (!$this->user->hasPermission('access', 'extension/module/oc3x_storage_cleaner') || !$this->user->hasPermission('modify', 'extension/module/oc3x_storage_cleaner') || !$this->config->get('oc3x_storage_cleaner_status')) {
$this->error['warning'] = $this->language->get('error_permission');
}
return !$this->error;
}
}
@@ -1,33 +0,0 @@
<?php
// Heading
$_['page_title'] = 'Очиcтка кэша';
$_['heading_title'] = '<a href="https://opencart3x.ru" target="_blank" title="Разработчик Opencart3x.ru" style="color:#233746"><i class="fa fa-circle-o"></i></a> '. $_['page_title'];
// Tab
$_['tab_settings'] = 'Настройки';
$_['tab_help'] = 'Помощь';
// Text
$_['text_extension'] = 'Модули';
$_['text_edit'] = 'Редактирование модуля';
$_['text_success'] = 'Настройки модуля обновлены!';
$_['text_success_clear'] = 'Успешно очищено!';
$_['text_documentation'] = 'Документация';
$_['text_developer'] = 'Разработчик';
$_['text_clear'] = 'Очистить';
$_['text_clear_all'] = 'Очистить все';
$_['text_refresh'] = 'Очистить и обновить';
$_['text_cache'] = 'Кэш';
$_['text_cache_system'] = 'Кэш twig и системы';
$_['text_cache_modification'] = 'Кэш модификаций';
$_['text_cache_image'] = 'Кэш изображений';
$_['text_log'] = 'Логи';
$_['text_log_error'] = 'Лог ошибок';
$_['text_log_modification'] = 'Лог модификаций';
// Entry
$_['entry_status'] = 'Статус';
$_['entry_size'] = 'Отображать размеры';
// Error
$_['error_permission'] = 'У вас нет прав для изменения этого модуля!';
@@ -1,74 +0,0 @@
<?php
class ModelExtensionModuleOc3xStorageCleaner extends Model {
public function getSize() {
$dirs = array(
'cache-system' => DIR_CACHE,
'cache-modification' => DIR_MODIFICATION,
'cache-image' => DIR_IMAGE . 'cache/',
'log-error' => DIR_LOGS . 'error.log',
'log-modification' => DIR_LOGS . 'ocmod.log',
);
foreach ($dirs as $key => $dir) {
$sizes[$key] = 0;
$files = array();
$path = array($dir . '*');
while (count($path) != 0) {
$next = array_shift($path);
if (is_array(glob($next))) {
foreach (glob($next) as $file) {
if (is_dir($file)) {
$path[] = $file . '/*';
}
$files[] = $file;
}
}
}
if (!empty($files)) {
rsort($files);
foreach ($files as $file) {
if ($file != $dir . 'index.html' && $file != $dir . '.htaccess') {
if (is_file($file)) {
$sizes[$key] += filesize($file);
}
}
}
}
}
foreach ($sizes as $key => $size) {
$output[$key] = $this->formatSize($size);
}
$output['all'] = $this->formatSize(array_sum($sizes));
return $output;
}
protected function formatSize($size) {
$sizenames = array(' B', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', 'YB');
$item = 0;
while ($size >= 1024) {
$size /= 1024;
$item++;
}
if ($item > 2) {
$output = round($size, 2) . $sizenames[$item];
} else {
$output = round($size, 0) . $sizenames[$item];
}
return $output;
}
}
@@ -1,63 +0,0 @@
{{ header }}{{ column_left }}
<div id="content">
<div class="page-header">
<div class="container-fluid">
<div class="pull-right">
<button type="submit" form="form" data-toggle="tooltip" title="{{ button_save }}" class="btn btn-primary"><i class="fa fa-save"></i></button>
<a href="{{ cancel }}" data-toggle="tooltip" title="{{ button_cancel }}" class="btn btn-default"><i class="fa fa-reply"></i></a>
</div>
<h1>{{ heading_title }}</h1>
<ul class="breadcrumb">
{% for breadcrumb in breadcrumbs %}
<li><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li>
{% endfor %}
</ul>
</div>
</div>
<div class="container-fluid">
{% if error_warning %}
<div class="alert alert-danger"><i class="fa fa-exclamation-circle"></i> {{ error_warning }}
<button type="button" class="close" data-dismiss="alert">&times;</button>
</div>
{% endif %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-pencil"></i> {{ text_edit }}</h3>
</div>
<div class="panel-body">
<form action="{{ action }}" method="post" enctype="multipart/form-data" id="form" class="form-horizontal">
<div class="form-group">
<label class="col-sm-2 control-label" for="input-oc3x_storage_cleaner_status">{{ entry_status }}</label>
<div class="col-sm-10">
<div class="btn-group" data-toggle="buttons">
{% if oc3x_storage_cleaner_status %}
<label class="btn btn-warning"><input type="radio" name="oc3x_storage_cleaner_status" value="0" autocomplete="off">{{ text_disabled }}</label>
<label class="btn btn-warning active"><input type="radio" name="oc3x_storage_cleaner_status" value="1" autocomplete="off" checked="checked">{{ text_enabled }}</label>
{% else %}
<label class="btn btn-warning active"><input type="radio" name="oc3x_storage_cleaner_status" value="0" autocomplete="off" checked="checked">{{ text_disabled }}</label>
<label class="btn btn-warning"><input type="radio" name="oc3x_storage_cleaner_status" value="1" autocomplete="off">{{ text_enabled }}</label>
{% endif %}
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="input-oc3x_storage_cleaner_size">{{ entry_size }}</label>
<div class="col-sm-10">
<div class="btn-group" data-toggle="buttons">
{% if oc3x_storage_cleaner_size %}
<label class="btn btn-warning"><input type="radio" name="oc3x_storage_cleaner_size" value="0" autocomplete="off">{{ text_disabled }}</label>
<label class="btn btn-warning active"><input type="radio" name="oc3x_storage_cleaner_size" value="1" autocomplete="off" checked="checked">{{ text_enabled }}</label>
{% else %}
<label class="btn btn-warning active"><input type="radio" name="oc3x_storage_cleaner_size" value="0" autocomplete="off" checked="checked">{{ text_disabled }}</label>
<label class="btn btn-warning"><input type="radio" name="oc3x_storage_cleaner_size" value="1" autocomplete="off">{{ text_enabled }}</label>
{% endif %}
</div>
</div>
</div>
</form>
</div>
<div style="background:#aaccdf;padding:15px;text-align:center;"><strong style="color:#233746;font-size:15px;">Другие модули для Opencart 3.x на нашем сайте <a href="https://opencart3x.ru" target="_blank">opencart3x.ru</a></strong></div>
</div>
</div>
</div>
{{ footer }}