Перейти к публикации
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

Проблема при активации темы Opencart на ocStore


ArkNorm
 Поделиться

Рекомендованные сообщения

 

После установки шаблона темы, пропала возможность входа в пункт "модификаторы" админки. Получается так: в админке нажимаю на пункт "модификаторы" и происходит переход браузере по адресу : http://1.japan-moto.com/admin/index.php?route=marketplace/modification&user_token=SgruObVrYOjftK19X9iSvXs4VBaH***   с ошибкой HTTP ERROR 500

На стандартной теме ошибки нет. Причина в новом шаблоне темы, которая написана под  OpenCart (ошибки нет), а на  ocStore (у меня) ошибка есть. Техподдержка темы обеспечивает поддержку установленную на движок с чистым кодом.

Техподдержка хостинга даёт такую ошибку: 
PHP Fatal error:  Cannot redeclare ControllerMarketplaceModification::edit() in /home/japanmot/1.japan-moto.com/system/storage/modification/admin/controller/marketplace/modification.php on line 1488


Я нашел строку 1488, и сверху ей подобную. Содержание кода в них разное. Удалил строку и содержание сверху.  Ничего не изменилось. Потом восстановил и 
удалил строку и содержание внизу, которое было в ошибке, строку 1488 и код внутри. Также ничего не изменилось. То есть нельзя зайти в пункт "модификаторы". 
После каждого удаления чистил кеш через админку.

Прошу помощи, чтобы разобраться, где этот дублирующийся контент удалять.

 

Ссылка на комментарий
Поделиться на других сайтах


28.11.2022 в 00:32, ArkNorm сказал:

 

После установки шаблона темы, пропала возможность входа в пункт "модификаторы" админки. Получается так: в админке нажимаю на пункт "модификаторы" и происходит переход браузере по адресу : http://1.japan-moto.com/admin/index.php?route=marketplace/modification&user_token=SgruObVrYOjftK19X9iSvXs4VBaH***   с ошибкой HTTP ERROR 500

На стандартной теме ошибки нет. Причина в новом шаблоне темы, которая написана под  OpenCart (ошибки нет), а на  ocStore (у меня) ошибка есть. Техподдержка темы обеспечивает поддержку установленную на движок с чистым кодом.

Техподдержка хостинга даёт такую ошибку: 
PHP Fatal error:  Cannot redeclare ControllerMarketplaceModification::edit() in /home/japanmot/1.japan-moto.com/system/storage/modification/admin/controller/marketplace/modification.php on line 1488


Я нашел строку 1488, и сверху ей подобную. Содержание кода в них разное. Удалил строку и содержание сверху.  Ничего не изменилось. Потом восстановил и 
удалил строку и содержание внизу, которое было в ошибке, строку 1488 и код внутри. Также ничего не изменилось. То есть нельзя зайти в пункт "модификаторы". 
После каждого удаления чистил кеш через админку.

Прошу помощи, чтобы разобраться, где этот дублирующийся контент удалять.

 

Вот код страницы modification.php:
 

<?php
/**
 * Modifcation XML Documentation can be found here:
 *
 * https://github.com/opencart/opencart/wiki/Modification-System
 */
class ControllerMarketplaceModification extends Controller {
    private $error = array();

    public function index() {
          $this->load->model('extension/module/modification_manager');

        $this->model_extension_module_modification_manager->install();

        $this->load->language('marketplace/modification');

        $this->document->setTitle($this->language->get('heading_title'));

        $this->load->model('setting/modification');

        $this->getList();
    }

    public function edit() {
        $this->load->language('marketplace/modification');

        $this->document->setTitle($this->language->get('heading_title'));

        $this->load->model('setting/modification');

        if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validateForm()) {

$this->load->model('extension/module/modification_manager');

            $modification = $this->model_extension_module_modification_manager->getModification($this->request->get['modification_id']);

            if ($modification) {
$this->load->model('extension/module/modification_manager');

                $this->model_extension_module_modification_manager->addModificationBackup($this->request->get['modification_id'], $modification);
            }

$this->load->model('extension/module/modification_manager');

            $this->model_extension_module_modification_manager->editModification($this->request->get['modification_id'], $this->request->post);

            $this->session->data['success'] = $this->language->get('text_success');

            $url = '';

            if (isset($this->request->get['sort'])) {
                $url .= '&sort=' . $this->request->get['sort'];
            }

            if (isset($this->request->get['order'])) {
                $url .= '&order=' . $this->request->get['order'];
            }

            if (isset($this->request->get['page'])) {
                $url .= '&page=' . $this->request->get['page'];
            }

            if (!isset($this->request->get['update'])) {
                $this->response->redirect($this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'] . $url, true));
            } else {
                $this->refresh();
                $this->response->redirect($this->url->link('marketplace/modification/edit', 'user_token=' . $this->session->data['user_token'] . '&modification_id=' . $this->request->get['modification_id'] . $url, true));
            }
        }

        $this->getForm();
    }

    public function restore() {
        $this->load->language('marketplace/extension');

        $this->document->setTitle($this->language->get('heading_title'));

        $this->load->model('setting/modification');

        if (isset($this->request->get['modification_id']) AND isset($this->request->get['backup_id'])) {

$this->load->model('extension/module/modification_manager');

            $backup = $this->model_extension_module_modification_manager->getModificationBackup($this->request->get['modification_id'],$this->request->get['backup_id']);

            $url = '';

            if ($backup) {
$this->load->model('extension/module/modification_manager');

                $this->model_extension_module_modification_manager->setModificationRestore($this->request->get['modification_id'], $backup['xml']);
                $this->refresh();
                $this->response->redirect($this->url->link('marketplace/modification/edit', 'user_token=' . $this->session->data['user_token'] . '&modification_id=' . $this->request->get['modification_id'] . $url, true));
            } else {
                $this->response->redirect($this->url->link('marketplace/modification/edit', 'user_token=' . $this->session->data['user_token'] . '&modification_id=' . $this->request->get['modification_id'] . $url, true));
            }
        }

        $this->getForm();
    }

    public function clearHistory() {

        // Check user has permission
        if (!$this->user->hasPermission('modify', 'marketplace/modification')) {
            $json['error'] = $this->language->get('error_permission');
        }

        $this->load->model('setting/modification');
$this->load->model('extension/module/modification_manager');

        $this->model_extension_module_modification_manager->deleteModificationBackups($this->request->get['modification_id']);

        $this->response->redirect($this->url->link('marketplace/modification/edit', 'user_token=' . $this->session->data['user_token'] . '&modification_id=' . $this->request->get['modification_id'], true));
    }

    public function download() {
        $this->load->model('setting/modification');

$this->load->model('extension/module/modification_manager');

        $modification = $this->model_extension_module_modification_manager->getModification($this->request->get['modification_id']);

        if ($modification) {
            $xml = $modification['xml'];
        } else  {
            $xml = '';
        }

        $this->response->addHeader('Content-Type: application/xml');
        $this->response->setOutput($xml);
    }

    public function upload() {
        $this->load->language('marketplace/installer');

        $json = array();

        // Check user has permission
        if (!$this->user->hasPermission('modify', 'marketplace/modification')) {
            $json['error'] = $this->language->get('error_permission');
        }

        $this->load->model('setting/modification');

$this->load->model('extension/module/modification_manager');

        $modification = $this->model_extension_module_modification_manager->getModification($this->request->get['modification_id']);

        if (!$json) {
            if (!empty($this->request->files['file']['name'])) {
                if (!$this->request->files['file']['name'] == $modification['code'].".ocmod.xml") {
                    $json['error'] = $this->language->get('error_filetype');
                }

                if ($this->request->files['file']['error'] != UPLOAD_ERR_OK) {
                    $json['error'] = $this->language->get('error_upload_' . $this->request->files['file']['error']);
                }
            } else {
                $json['error'] = $this->language->get('error_upload');
            }
        }

        if (!$json) {
            // If no temp directory exists create it
            $path = 'temp-' . token(32);

            if (!is_dir(DIR_UPLOAD . $path)) {
                mkdir(DIR_UPLOAD . $path, 0777);
            }

            // Set the steps required for installation
            $json['step'] = array();
            $json['overwrite'] = array();

            if (strrchr($this->request->files['file']['name'], '.') == '.xml') {
                $file = DIR_UPLOAD . $path . '/install.xml';

                // If xml file copy it to the temporary directory
                move_uploaded_file($this->request->files['file']['tmp_name'], $file);

                if (file_exists($file)) {
                    $json['step'][] = array(
                        'text' => $this->language->get('text_xml'),
                        'url'  => str_replace('&amp;', '&', $this->url->link('marketplace/modification/xml', 'user_token=' . $this->session->data['user_token']."&modification_id=".$modification['modification_id'], true)),
                        'path' => $path
                    );

                    // Clear temporary files
                    $json['step'][] = array(
                        'text' => $this->language->get('text_remove'),
                        'url'  => str_replace('&amp;', '&', $this->url->link('marketplace/modification/remove', 'user_token=' . $this->session->data['user_token']."&modification_id=".$modification['modification_id'], true)),
                        'path' => $path
                    );
                } else {
                    $json['error'] = $this->language->get('error_file');
                }
            }
        }

        $this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
    }

    public function xml() {
        $this->load->language('marketplace/installer');

        $this->load->model('setting/modification');

$this->load->model('extension/module/modification_manager');

        $modification = $this->model_extension_module_modification_manager->getModification($this->request->get['modification_id']);

        $json = array();

        if (!$this->user->hasPermission('modify', 'marketplace/modification')) {
            $json['error'] = $this->language->get('error_permission');
        }

        $file = DIR_UPLOAD . $this->request->post['path'] . '/install.xml';

        if (!is_file($file) || substr(str_replace('\\', '/', realpath($file)), 0, strlen(DIR_UPLOAD)) != DIR_UPLOAD) {
            $json['error'] = $this->language->get('error_file');
        }

        if (!$json) {
            $this->load->model('setting/modification');

            // If xml file just put it straight into the DB
            $xml = file_get_contents($file);

            if ($xml) {
                try {
                    $dom = new DOMDocument('1.0', 'UTF-8');
                    $dom->loadXml($xml);

                    $name = $dom->getElementsByTagName('name')->item(0);

                    if ($name) {
                        $name = $name->nodeValue;
                    } else {
                        $name = '';
                    }

                    $code = $dom->getElementsByTagName('code')->item(0);

                    if (!$code) {
                        $json['error'] = $this->language->get('error_code');
                    }

                    $author = $dom->getElementsByTagName('author')->item(0);

                    if ($author) {
                        $author = $author->nodeValue;
                    } else {
                        $author = '';
                    }

                    $version = $dom->getElementsByTagName('version')->item(0);

                    if ($version) {
                        $version = $version->nodeValue;
                    } else {
                        $version = '';
                    }

                    $link = $dom->getElementsByTagName('link')->item(0);

                    if ($link) {
                        $link = $link->nodeValue;
                    } else {
                        $link = '';
                    }

                    $modification_data = array(
                        'name'    => $name,
                        'code'    => $code,
                        'author'  => $author,
                        'version' => $version,
                        'link'    => $link,
                        'xml'     => $xml,
                        'status'  => 1
                    );

                    if (!$json) {
$this->load->model('extension/module/modification_manager');

                        $this->model_extension_module_modification_manager->editModification($modification['modification_id'], $modification_data);
                    }
                } catch(Exception $exception) {
                    $json['error'] = sprintf($this->language->get('error_exception'), $exception->getCode(), $exception->getMessage(), $exception->getFile(), $exception->getLine());
                }
            }
        }

        $this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
    }

    public function remove() {
        $this->load->language('marketplace/modification');

        $json = array();

        if (!$this->user->hasPermission('modify', 'marketplace/modification')) {
            $json['error'] = $this->language->get('error_permission');
        }

        $directory = DIR_UPLOAD . $this->request->post['path'];

        if (!is_dir($directory) || substr(str_replace('\\', '/', realpath($directory)), 0, strlen(DIR_UPLOAD)) != DIR_UPLOAD) {
            $json['error'] = $this->language->get('error_directory');
        }

        if (!$json) {
            // Get a list of files ready to upload
            $files = array();

            $path = array($directory);

            while (count($path) != 0) {
                $next = array_shift($path);

                // We have to use scandir function because glob will not pick up dot files.
                foreach (array_diff(scandir($next), array('.', '..')) as $file) {
                    $file = $next . '/' . $file;

                    if (is_dir($file)) {
                        $path[] = $file;
                    }

                    $files[] = $file;
                }
            }

            rsort($files);

            foreach ($files as $file) {
                if (is_file($file)) {
                    unlink($file);

                } elseif (is_dir($file)) {
                    rmdir($file);
                }
            }

            if (file_exists($directory)) {
                rmdir($directory);
            }

            $json['success'] = $this->language->get('text_success');
        }

        $this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
    }


    public function delete() {
        $this->load->language('marketplace/modification');

        $this->document->setTitle($this->language->get('heading_title'));

        $this->load->model('setting/modification');

        if (isset($this->request->post['selected']) && $this->validate()) {
            foreach ($this->request->post['selected'] as $modification_id) {
$this->load->model('extension/module/modification_manager');

                $this->model_extension_module_modification_manager->deleteModification($modification_id);
$this->load->model('extension/module/modification_manager');

                $this->model_extension_module_modification_manager->deleteModificationBackups($modification_id);
            }

            $this->session->data['success'] = $this->language->get('text_success');

            $url = '';

            if (isset($this->request->get['sort'])) {
                $url .= '&sort=' . $this->request->get['sort'];
            }

            if (isset($this->request->get['order'])) {
                $url .= '&order=' . $this->request->get['order'];
            }

            if (isset($this->request->get['page'])) {
                $url .= '&page=' . $this->request->get['page'];
            }

            $this->response->redirect($this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'] . $url, true));
        }

        $this->getList();
    }

    public function refresh($data = array()) {
        $this->load->language('marketplace/modification');

        $this->document->setTitle($this->language->get('heading_title'));

        $this->load->model('setting/modification');
        $this->load->model('design/theme');

        if ($this->validate()) {
                $error_log = array();

            // Clear vqmod cache
            $vqmod_path = substr(DIR_SYSTEM, 0, -7) . 'vqmod/';

            if (file_exists($vqmod_path)) {
                $vqmod_cache = glob($vqmod_path.'vqcache/vq*');

                if ($vqmod_cache) {
                    foreach ($vqmod_cache as $file) {
                        if (file_exists($file)) {
                            @unlink($file);
                        }
                    }
                }

                if (file_exists($vqmod_path.'mods.cache')) {
                    @unlink($vqmod_path.'mods.cache');
                }

                if (file_exists($vqmod_path.'checked.cache')) {
                    @unlink($vqmod_path.'checked.cache');
                }
            }

            // Clear log before refresh modifications
          fclose($handle);
            
                    $handle = fopen(DIR_LOGS . 'ocmod_error.log', 'w+');
            $handle = fopen(DIR_LOGS . 'ocmod.log', 'w+');
            fclose($handle);

            // Just before files are deleted, if config settings say maintenance mode is off then turn it on
            $maintenance = $this->config->get('config_maintenance');

            // Clear logs on refresh
            $handle = fopen(DIR_LOGS . 'ocmod.log', 'w+');
            fclose($handle);

            $handle = fopen(DIR_LOGS . 'ocmod_error.log', 'w+');
            fclose($handle);


            $this->load->model('setting/setting');

            $this->model_setting_setting->editSettingValue('config', 'config_maintenance', true);

            //Log
            $log = array();

            // Clear all modification files
            $files = array();

            // Make path into an array
            $path = array(DIR_MODIFICATION . '*');

            // 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 modification files
            foreach ($files as $file) {
                if ($file != DIR_MODIFICATION . 'index.html') {
                    // If file just delete
                    if (is_file($file)) {
                        unlink($file);

                    // If directory use the remove directory function
                    } elseif (is_dir($file)) {
                        rmdir($file);
                    }
                }
            }

            // 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 after each change.
            $files = glob(DIR_SYSTEM . '*.ocmod.xml');

            if ($files) {
                foreach ($files as $file) {
                    $xml[] = file_get_contents($file);
                }
            }

            // Get the default modification file
$this->load->model('extension/module/modification_manager');

            $results = $this->model_extension_module_modification_manager->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;
                $error_log_mod = '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;
                }

                if ($this->config->get('config_theme') == 'default') {
                    $theme = $this->config->get('theme_default_directory');
                } else {
                    $theme = $this->config->get('config_theme');
                }

                $store_id = (int)$this->config->get('config_store_id');

                $files = $dom->getElementsByTagName('modification')->item(0)->getElementsByTagName('file');

                foreach ($files as $file) {
                    $operations = $file->getElementsByTagName('operation');
                
                    $file_error = $file->getAttribute('error');

                    $files = explode('|', str_replace("\\", '/', $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) {
                                if ($file_error != 'skip') {
                                    $error_log[] = '----------------------------------------------------------------';
                                    $error_log[] = $error_log_mod;
                                    $error_log[] = 'MISSING FILE!';
                                    $error_log[] = $path;                                    
                                }
                            }

                            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])) {

                                        $route = substr(mb_strstr($key, 'template'), 9, -5);

                                        $theme_info = $this->model_design_theme->getTheme($store_id, $theme, $route);

                                        if ($theme_info) {
                                            $content = html_entity_decode($theme_info['code'], ENT_QUOTES, 'UTF-8');
                                        } else {
                                            $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) {
                                            if ($error != 'skip') {
                                                $error_log[] = "\n";
                                                $error_log[] = $error_log_mod;
                                                $error_log[] = 'NOT FOUND!';
                                                $error_log[] = 'CODE: ' . $search;
                                                $error_log[] = 'FILE: ' . $key;
                                            }
                                            // 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));

            if ($error_log) {
                $ocmod = new Log('ocmod_error.log');
                $ocmod->write(implode("\n", $error_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', $maintenance);

            // Do not return success message if refresh() was called with $data
            $this->session->data['success'] = $this->language->get('text_success');

            $url = '';

            if (isset($this->request->get['sort'])) {
                $url .= '&sort=' . $this->request->get['sort'];
            }

            if (isset($this->request->get['order'])) {
                $url .= '&order=' . $this->request->get['order'];
            }

            if (isset($this->request->get['page'])) {
                $url .= '&page=' . $this->request->get['page'];
            }

            //$url = $this->getListUrlParams();

            if (!empty($data['redirect'])) {
                $redirect = $data['redirect'];
            } elseif (!empty($this->request->get['redirect'])) {
                $redirect = $this->request->get['redirect'];
            } else {
                $redirect = 'marketplace/modification';
            }

            $this->response->redirect($this->url->link($redirect, 'user_token=' . $this->session->data['user_token'] . $url, true));
        }

        $this->getList();
    }

    public function clear() {
        $this->load->language('marketplace/modification');

        $this->document->setTitle($this->language->get('heading_title'));

        $this->load->model('setting/modification');

        if ($this->validate()) {
            $files = array();

            // Make path into an array
            $path = array(DIR_MODIFICATION . '*');

            // 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 modification files
            foreach ($files as $file) {
                if ($file != DIR_MODIFICATION . 'index.html') {
                    // If file just delete
                    if (is_file($file)) {
                        unlink($file);

                    // If directory use the remove directory function
                    } elseif (is_dir($file)) {
                        rmdir($file);
                    }
                }
            }

            $this->session->data['success'] = $this->language->get('text_success');

            $url = '';

            if (isset($this->request->get['sort'])) {
                $url .= '&sort=' . $this->request->get['sort'];
            }

            if (isset($this->request->get['order'])) {
                $url .= '&order=' . $this->request->get['order'];
            }

            if (isset($this->request->get['page'])) {
                $url .= '&page=' . $this->request->get['page'];
            }

            $this->response->redirect($this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'] . $url, true));
        }

        $this->getList();
    }

    public function enable() {
        $this->load->language('marketplace/modification');

        $this->document->setTitle($this->language->get('heading_title'));

        $this->load->model('setting/modification');

        if (isset($this->request->get['modification_id']) && $this->validate()) {
$this->load->model('extension/module/modification_manager');

            $this->model_extension_module_modification_manager->enableModification($this->request->get['modification_id']);

            $this->session->data['success'] = $this->language->get('text_success');

            $url = '';

            if (isset($this->request->get['sort'])) {
                $url .= '&sort=' . $this->request->get['sort'];
            }

            if (isset($this->request->get['order'])) {
                $url .= '&order=' . $this->request->get['order'];
            }

            if (isset($this->request->get['page'])) {
                $url .= '&page=' . $this->request->get['page'];
            }

            $this->response->redirect($this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'] . $url, true));
        }

        $this->getList();
    }

    public function disable() {
        $this->load->language('marketplace/modification');

        $this->document->setTitle($this->language->get('heading_title'));

        $this->load->model('setting/modification');

        if (isset($this->request->get['modification_id']) && $this->validate()) {
$this->load->model('extension/module/modification_manager');

            $this->model_extension_module_modification_manager->disableModification($this->request->get['modification_id']);

            $this->session->data['success'] = $this->language->get('text_success');

            $url = '';

            if (isset($this->request->get['sort'])) {
                $url .= '&sort=' . $this->request->get['sort'];
            }

            if (isset($this->request->get['order'])) {
                $url .= '&order=' . $this->request->get['order'];
            }

            if (isset($this->request->get['page'])) {
                $url .= '&page=' . $this->request->get['page'];
            }

            $this->response->redirect($this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'] . $url, true));
        }

        $this->getList();
    }

    public function clearlog() {
        $this->load->language('marketplace/modification');

        $this->document->setTitle($this->language->get('heading_title'));

        $this->load->model('setting/modification');

        if ($this->validate()) {
            $handle = fopen(DIR_LOGS . 'ocmod.log', 'w+');

            fclose($handle);

            $this->session->data['success'] = $this->language->get('text_success');

            $url = '';

            if (isset($this->request->get['sort'])) {
                $url .= '&sort=' . $this->request->get['sort'];
            }

            if (isset($this->request->get['order'])) {
                $url .= '&order=' . $this->request->get['order'];
            }

            if (isset($this->request->get['page'])) {
                $url .= '&page=' . $this->request->get['page'];
            }

            $this->response->redirect($this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'] . $url, true));
        }

        $this->getList();
    }

    protected function getList() {
        if (isset($this->request->get['sort'])) {
            $sort = $this->request->get['sort'];
        } else {
            $sort = 'date_modified';
        }

        if (isset($this->request->get['order'])) {
            $order = $this->request->get['order'];
        } else {
            $order = 'DESC';
        }

        if (isset($this->request->get['page'])) {
            $page = (int)$this->request->get['page'];
        } else {
            $page = 1;
        }

        $url = '';

        if (isset($this->request->get['sort'])) {
            $url .= '&sort=' . $this->request->get['sort'];
        }

        if (isset($this->request->get['order'])) {
            $url .= '&order=' . $this->request->get['order'];
        }

        if (isset($this->request->get['page'])) {
            $url .= '&page=' . $this->request->get['page'];
        }

          $this->load->model('extension/module/modification_manager');

        if (isset($this->request->get['filter_name'])) {
            $filter_name = $this->request->get['filter_name'];
        } else {
            $filter_name = null;
        }

          if (isset($this->request->get['filter_xml'])) {
            $filter_xml = $this->request->get['filter_xml'];
        } else {
            $filter_xml = null;
        }

        if (isset($this->request->get['filter_author'])) {
            $filter_author = $this->request->get['filter_author'];
        } else {
            $filter_author = null;
        }

        $url = $this->getListUrlParams();

        $data['add'] = $this->url->link('marketplace/modification/add', 'user_token=' . $this->session->data['user_token'] . $url, true);
        $data['filter_name'] = $filter_name;
        $data['filter_author'] = $filter_author;
        $data['filter_xml'] = $filter_xml;

        $data['modified_files'] = array();

        $modified_files = self::modifiedFiles(DIR_MODIFICATION);

        $modification_files = $this->getModificationXmlFiles();

        foreach($modified_files as $modified_file) {
            if(isset($modification_files[$modified_file])){
                $modifications = $modification_files[$modified_file];
            } else {
                $modifications = array();
            }

            $data['modified_files'][] = array(
                'file' => $modified_file,
                'modifications' => $modifications
            );
        }

        // Error log
        $error_file = DIR_LOGS . 'ocmod_error.log';

        if (file_exists($error_file)) {
            $data['error_log'] = htmlentities(file_get_contents($error_file, FILE_USE_INCLUDE_PATH, null));
        } else {
            $data['error_log'] = '';
        }
        
        $data['clear_log'] = $this->url->link('marketplace/modification/clearlog', 'user_token=' . $this->session->data['user_token'] . $url, true);
        $data['filter_action'] = $this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'], true);
        $data['reset_url'] = $this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'], true);

        $data['tab_files'] = $this->language->get('tab_files');
        $data['tab_error'] = $this->language->get('tab_error');
        $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('heading_title'),
            'href' => $this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'], true)
        );

        $data['refresh'] = $this->url->link('marketplace/modification/refresh', 'user_token=' . $this->session->data['user_token'] . $url, true);
        $data['clear'] = $this->url->link('marketplace/modification/clear', 'user_token=' . $this->session->data['user_token'] . $url, true);
        $data['delete'] = $this->url->link('marketplace/modification/delete', 'user_token=' . $this->session->data['user_token'] . $url, true);

        $data['modifications'] = array();

        $filter_data = array(
          'filter_name'      => $filter_name,
            'filter_author'      => $filter_author,
            'filter_xml'      => $filter_xml,
            'sort'  => $sort,
            'order' => $order,
            'start' => ($page - 1) * $this->config->get('config_limit_admin'),
            'limit' => $this->config->get('config_limit_admin')
        );

$this->load->model('extension/module/modification_manager');

        $modification_total = $this->model_extension_module_modification_manager->getTotalModifications();

$this->load->model('extension/module/modification_manager');

        $results = $this->model_extension_module_modification_manager->getModifications($filter_data);

        foreach ($results as $result) {
            $data['modifications'][] = array(
                'date_modified'      => $result['date_modified'] && $result['date_modified'] != '0000-00-00 00:00:00' ? date(date('Ymd') == date('Ymd', strtotime($result['date_modified'])) ? 'G:i' : $this->language->get('date_format_short'), strtotime($result['date_modified'])) : null,
                'edit'                 => $this->url->link('marketplace/modification/edit', 'user_token=' . $this->session->data['user_token'] . '&modification_id=' . $result['modification_id'] . $url, true),
                'download'             => $this->url->link('marketplace/modification/download', 'user_token=' . $this->session->data['user_token'] . '&modification_id=' . $result['modification_id'] , true),
                'modification_id' => $result['modification_id'],
                'name'            => $result['name'],
                'author'          => $result['author'],
                'filename'        => $result['code'].".ocmod.xml",
                'version'         => $result['version'],
                'status'          => $result['status'] ? $this->language->get('text_enabled') : $this->language->get('text_disabled'),
                'date_added'      => date($this->language->get('date_format_short'), strtotime($result['date_added'])),
                'link'            => $result['link'],
                'edit'            => $this->url->link('marketplace/modification/edit', 'user_token=' . $this->session->data['user_token'] . '&modification_id=' . $result['modification_id'], true),
                'download'        => $this->url->link('marketplace/modification/download', 'user_token=' . $this->session->data['user_token'] . '&modification_id=' . $result['modification_id'], true),
                'enable'          => $this->url->link('marketplace/modification/enable', 'user_token=' . $this->session->data['user_token'] . '&modification_id=' . $result['modification_id'], true),
                'disable'         => $this->url->link('marketplace/modification/disable', 'user_token=' . $this->session->data['user_token'] . '&modification_id=' . $result['modification_id'], true),
                'enabled'         => $result['status']
            );
        }

        $data['user_token'] = $this->session->data['user_token'];

        if (isset($this->error['warning'])) {
            $data['error_warning'] = $this->error['warning'];
        } else {
            $data['error_warning'] = '';
        }

        if (isset($this->session->data['success'])) {
            $data['success'] = $this->session->data['success'];

            unset($this->session->data['success']);
        } else {
            $data['success'] = '';
        }

        if (isset($this->request->post['selected'])) {
            $data['selected'] = (array)$this->request->post['selected'];
        } else {
            $data['selected'] = array();
        }

        $url = '';

        if ($order == 'ASC') {
            $url .= '&order=DESC';
        } else {
            $url .= '&order=ASC';
        }

        if (isset($this->request->get['page'])) {
            $url .= '&page=' . $this->request->get['page'];
        }

          if (isset($this->request->get['filter_name'])) {
            $url .= '&filter_name=' . urlencode(html_entity_decode($this->request->get['filter_name'], ENT_QUOTES, 'UTF-8'));
        }

        if (isset($this->request->get['filter_author'])) {
            $url .= '&filter_author=' . urlencode(html_entity_decode($this->request->get['filter_author'], ENT_QUOTES, 'UTF-8'));
        }

        if (isset($this->request->get['filter_xml'])) {
            $url .= '&filter_xml=' . urlencode(html_entity_decode($this->request->get['filter_xml'], ENT_QUOTES, 'UTF-8'));
        }

        $data['sort_date_modified'] = $this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'] . '&sort=date_modified' . $url, true);
        $data['sort_name'] = $this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'] . '&sort=name' . $url, true);
        $data['sort_author'] = $this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'] . '&sort=author' . $url, true);
        $data['sort_version'] = $this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'] . '&sort=version' . $url, true);
        $data['sort_status'] = $this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'] . '&sort=status' . $url, true);
        $data['sort_date_added'] = $this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'] . '&sort=date_added' . $url, true);

        $url = '';

        if (isset($this->request->get['sort'])) {
            $url .= '&sort=' . $this->request->get['sort'];
        }

        if (isset($this->request->get['order'])) {
            $url .= '&order=' . $this->request->get['order'];
        }

          if (isset($this->request->get['filter_name'])) {
            $url .= '&filter_name=' . urlencode(html_entity_decode($this->request->get['filter_name'], ENT_QUOTES, 'UTF-8'));
        }

        if (isset($this->request->get['filter_author'])) {
            $url .= '&filter_author=' . urlencode(html_entity_decode($this->request->get['filter_author'], ENT_QUOTES, 'UTF-8'));
        }

        if (isset($this->request->get['filter_xml'])) {
            $url .= '&filter_xml=' . urlencode(html_entity_decode($this->request->get['filter_xml'], ENT_QUOTES, 'UTF-8'));
        }
        $pagination = new Pagination();
        $pagination->total = $modification_total;
        $pagination->page = $page;
        $pagination->limit = $this->config->get('config_limit_admin');
        $pagination->url = $this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'] . $url . '&page={page}', true);

        $data['pagination'] = $pagination->render();

        $data['results'] = sprintf($this->language->get('text_pagination'), ($modification_total) ? (($page - 1) * $this->config->get('config_limit_admin')) + 1 : 0, ((($page - 1) * $this->config->get('config_limit_admin')) > ($modification_total - $this->config->get('config_limit_admin'))) ? $modification_total : ((($page - 1) * $this->config->get('config_limit_admin')) + $this->config->get('config_limit_admin')), $modification_total, ceil($modification_total / $this->config->get('config_limit_admin')));

        $data['sort'] = $sort;
        $data['order'] = $order;

        // Log
        $file = DIR_LOGS . 'ocmod.log';

        if (file_exists($file)) {
            $data['log'] = htmlentities(file_get_contents($file, FILE_USE_INCLUDE_PATH, null));
        } else {
            $data['log'] = '';
        }

        $data['clear_log'] = $this->url->link('marketplace/modification/clearlog', 'user_token=' . $this->session->data['user_token'], true);

        $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/modification_manager/list', $data));
    }

    protected function getForm() {

        $this->load->language('marketplace/modification');

        $this->document->addStyle('view/javascript/codemirror/lib/codemirror.css');
        $this->document->addStyle('view/javascript/codemirror/theme/xq-dark.css');
        $this->document->addScript('view/javascript/codemirror/lib/codemirror.js');
        $this->document->addScript('view/javascript/codemirror/lib/xml.js');
        $this->document->addScript('view/javascript/codemirror/lib/formatting.js');

        $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('heading_title'),
            'href' => $this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'], true)
        );

        $data['heading_title'] = $this->language->get('heading_title');
        $data['text_form'] = $this->language->get('text_form');
        $data['text_no_results'] = $this->language->get('text_no_results');
        $data['entry_name'] = $this->language->get('entry_name');
        $data['entry_xml'] = $this->language->get('entry_xml');

        $data['column_id'] = $this->language->get('column_id');
        $data['column_code'] = $this->language->get('column_code');
        $data['column_date_added'] = $this->language->get('column_date_added');
        $data['column_restore'] = $this->language->get('column_restore');

        $data['button_update'] = $this->language->get('button_update');
        $data['button_save'] = $this->language->get('button_save');
        $data['button_cancel'] = $this->language->get('button_cancel');
        $data['button_restore'] = $this->language->get('button_restore');
        $data['button_history'] = $this->language->get('button_history');

        $data['tab_general'] = $this->language->get('tab_general');
        $data['tab_backup'] = $this->language->get('tab_backup');

        $data['user_token'] = $this->session->data['user_token'];

        if (isset($this->error['warning'])) {
            $data['error_warning'] = $this->error['warning'];
        } else {
            $data['error_warning'] = '';
        }

        if (isset($this->session->data['success'])) {
            $data['success'] = $this->session->data['success'];

            unset($this->session->data['success']);
        } else {
            $data['success'] = '';
        }

        $url = '';

        if (!isset($this->request->get['modification_id'])) {
            $data['action'] = $this->url->link('marketplace/modification/add', 'user_token=' . $this->session->data['user_token'] . $url, true);
        } else {
            $data['action'] = $this->url->link('marketplace/modification/edit', 'user_token=' . $this->session->data['user_token'] . '&modification_id=' . $this->request->get['modification_id'] . $url, true);
        }

        $data['restore'] = $this->url->link('marketplace/modification/restore', 'user_token=' . $this->session->data['user_token'] . '&modification_id=' . $this->request->get['modification_id'] . $url, true);
        $data['history'] = $this->url->link('marketplace/modification/clearhistory', 'user_token=' . $this->session->data['user_token'] . '&modification_id=' . $this->request->get['modification_id'] . $url, true);
        $data['cancel'] = $this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'] . $url, true);

        $this->load->model('setting/modification');

$this->load->model('extension/module/modification_manager');

        $backups = $this->model_extension_module_modification_manager->getModificationBackups($this->request->get['modification_id']);

        $data['backups'] = array();

        if ($backups) {
            foreach ($backups as $backup) {
                $data['backups'][] = array(
                    'backup_id'     => $backup['backup_id'],
                    'code'          => $backup['code'],
                    'date_added'    => $backup['date_added'],
                    'restore'       => $this->url->link('marketplace/modification/restore', 'user_token=' . $this->session->data['user_token'] . '&modification_id=' . $this->request->get['modification_id'] . '&backup_id=' . $backup['backup_id'] . $url, true)
                );
            }
        }

$this->load->model('extension/module/modification_manager');

        $modification = $this->model_extension_module_modification_manager->getModification($this->request->get['modification_id']);

        if (isset($this->request->post['name'])) {
            $data['name'] = htmlentities(ltrim($this->request->post['name']));
        } elseif (isset($modification)) {
            $data['name'] = htmlentities(ltrim($modification['name']));
        }

        if (isset($this->request->post['xml'])) {
            $data['xml'] = htmlentities(ltrim($this->request->post['xml'], ""));
        } elseif (isset($modification)) {
            $data['xml'] = htmlentities(ltrim($modification['xml'], ""));
        }

        $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('marketplace/modification_form', $data));
    }

    protected function validateForm() {
        if (!$this->user->hasPermission('modify', 'marketplace/modification')) {
            $this->error['warning'] = $this->language->get('error_permission');
        }

        if ((utf8_strlen($this->request->post['name']) < 2)) {
            $this->error['name'] = $this->language->get('error_name');
        }

        if ($this->error && !isset($this->error['warning'])) {
            $this->error['warning'] = $this->language->get('error_warning');
        }

        return !$this->error;
    }

public function add() {
        $this->load->language('marketplace/modification');

        $this->load->model('extension/module/modification_manager');

        if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validateForm()) {
            $xml = html_entity_decode($this->request->post['xml'], ENT_QUOTES, 'UTF-8');

            $dom = new DOMDocument('1.0', 'UTF-8');
            $dom->preserveWhiteSpace = false;
            $dom->loadXml($xml);

            $data = array(
                'version' => '',
                'author' => '',
                'link' => '',
                'status' => 1
            );

            $data['xml'] = $xml;

            $data['name'] = $dom->getElementsByTagName('name')->item(0)->textContent;

            $data['code'] = $dom->getElementsByTagName('code')->item(0)->textContent;

            if ($dom->getElementsByTagName('version')->length) {
                $data['version'] = $dom->getElementsByTagName('version')->item(0)->textContent;
            }

            if ($dom->getElementsByTagName('author')->length) {
                $data['author'] = $dom->getElementsByTagName('author')->item(0)->textContent;
            }

            $this->model_extension_module_modification_manager->addModification($data);

            $modification_id = $this->db->getLastId();

            $this->session->data['success'] = $this->language->get('text_success');

            $this->response->redirect($this->url->link('marketplace/modification/edit', 'user_token=' . $this->session->data['user_token'] . $this->getListUrlParams(array('modification_id' => $modification_id)), true));
        }

        $this->getForm();
    }

    public function edit() {
        $this->load->language('marketplace/modification');

        $this->load->model('extension/module/modification_manager');
        
        if (($this->request->server['REQUEST_METHOD'] == 'POST') && !empty($this->request->get['modification_id']) && $this->validateForm()) {
            $modification_id = $this->request->get['modification_id'];

            $xml = html_entity_decode($this->request->post['xml'], ENT_QUOTES, 'UTF-8');

            $dom = new DOMDocument('1.0', 'UTF-8');
            $dom->preserveWhiteSpace = false;
            $dom->loadXml($xml);

            $data = array();

            $data['xml'] = $xml;

            $data['name'] = $dom->getElementsByTagName('name')->item(0)->textContent;

            $data['code'] = $dom->getElementsByTagName('code')->item(0)->textContent;

            if ($dom->getElementsByTagName('version')->length) {
                $data['version'] = $dom->getElementsByTagName('version')->item(0)->textContent;
            } else {
                $data['version'] = '';
            }

            if ($dom->getElementsByTagName('author')->length) {
                $data['author'] = $dom->getElementsByTagName('author')->item(0)->textContent;
            } else {
                $data['author'] = '';
            }

            if ($dom->getElementsByTagName('link')->length) {
                $data['link'] = $dom->getElementsByTagName('link')->item(0)->textContent;
            } else {
                $data['link'] = '';
            }

            $this->model_extension_module_modification_manager->editModification($modification_id, $data);

            $url = $this->getListUrlParams(array('modification_id' => $modification_id));

            if (isset($this->request->get['refresh'])) {
                $this->response->redirect($this->url->link('marketplace/modification/refresh', 'user_token=' . $this->session->data['user_token'] . $url, true));
            }

            if ($this->db->countAffected()) {
                $this->session->data['success'] = $this->language->get('text_success');

                $this->response->redirect($this->url->link('marketplace/modification/edit', 'user_token=' . $this->session->data['user_token'] . $url, true));
            }
        }

        $this->getForm();
    }
    
    public function download() {
        
        if (!$this->user->hasPermission('modify', 'marketplace/modification')) {
            $this->response->redirect($this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'], true));
        }

        if (isset($this->request->get['modification_id'])) {
            $modification_id = $this->request->get['modification_id'];
        } else {
            $modification_id = 0;
        }
        
        $this->load->model('extension/module/modification_manager');
        $modification = $this->model_extension_module_modification_manager->getModification($modification_id);

        if ($modification) {
            $filename = $modification['code'] . '.ocmod.xml';
            $file = $modification['xml'];

            ob_start();
            echo $file;
            $download = ob_get_contents();
            $size = ob_get_length();
            ob_end_clean();
            
            if (!headers_sent()) {
                if (!empty($modification['xml'])) {
                    header('Content-Type: application/octet-stream');
                    header('Content-Disposition: attachment; filename="' . $filename . '"');
                    header('Content-Transfer-Encoding: binary');
                    header('Expires: 0');
                    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
                    header('Pragma: public');
                    header('Content-Length: ' . $size);

                    if (ob_get_level()) {
                        ob_end_clean();
                    }

                    echo $download;

                    exit();
                } else {
                    exit($this->language->get('error_file'));
                }
            } else {
                exit($this->language->get('error_headers'));
            }
        } else {
            $this->response->redirect($this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'] . $url, true));
        }
    }
    
    public function getForm() {
        $data['heading_title'] = $this->language->get('heading_title');

        $data['text_enabled'] = $this->language->get('text_enabled');
        $data['text_disabled'] = $this->language->get('text_disabled');

        $data['button_save'] = $this->language->get('button_save');
        $data['button_download'] = $this->language->get('button_download');
        $data['button_refresh'] = $this->language->get('button_refresh');
        $data['button_cancel'] = $this->language->get('button_cancel');

        if (isset($this->error['warning'])) {
            $data['error_warning'] = $this->error['warning'];
        } elseif (!empty($this->error)) {
            $data['error_warning'] = $this->language->get('error_warning');
        } else {
            $data['error_warning'] = '';
        }

        if (isset($this->session->data['success'])) {
            $data['success'] = $this->session->data['success'];

            unset($this->session->data['success']);
        } else {
            $data['success'] = false;
        }

        if (isset($this->error['xml'])) {
            $data['error_xml'] = $this->error['xml'];
        }

        $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('heading_title'),
            'href' => $this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'] . $this->getListUrlParams(), true)
        );

        if (isset($this->request->get['modification_id'])) {
            $this->load->model('extension/module/modification_manager');

            $modification_info = $this->model_extension_module_modification_manager->getModification($this->request->get['modification_id']);
            if (!$modification_info) exit;

            $data['text_form'] = sprintf($this->language->get('text_edit'), $modification_info['name']);

            $data['action'] = $this->url->link('marketplace/modification/edit', '&modification_id=' . $modification_info['modification_id'] . '&user_token=' . $this->session->data['user_token'], true);

            $data['refresh'] = $this->url->link('marketplace/modification/edit', '&modification_id=' . $modification_info['modification_id'] . '&refresh=1&user_token=' . $this->session->data['user_token'], true);

            $this->document->setTitle($modification_info['name'] . ' » ' . $data['heading_title']);
        } else {
            $data['text_form'] = $this->language->get('text_add');

            $data['refresh'] = false;

            $data['action'] = $this->url->link('marketplace/modification/add', 'user_token=' . $this->session->data['user_token'], true);

            $this->document->setTitle($data['heading_title']);
        }

        $data['cancel'] = $this->url->link('marketplace/modification', 'user_token=' . $this->session->data['user_token'] . $this->getListUrlParams(), true);

        $data['modification'] = array();

        if (!empty($modification_info)) {
            $data['modification']['status'] = $modification_info['status'];
        } else {
            $data['modification']['status'] = 0;
        }

        if (isset($this->request->post['xml'])) {
            $data['modification']['xml'] = html_entity_decode($this->request->post['xml'], ENT_QUOTES, 'UTF-8');
        } elseif (!empty($modification_info)) {
            $data['modification']['xml'] = $modification_info['xml'];
        } else {
            $data['modification']['xml'] = '';
        }

        $this->document->addStyle('view/javascript/codemirror/lib/codemirror.css');
        $this->document->addScript('view/javascript/codemirror/lib/codemirror.js');
        $this->document->addScript('view/javascript/codemirror/mode/xml/xml.js');

        $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/modification_manager/form', $data));
    }

    private function validateForm() {
        if (!$this->user->hasPermission('modify', 'marketplace/modification')) {
            $this->error['warning'] = $this->language->get('error_permission');
        }

        $error = false;

        // Required
        if (empty($this->request->post['xml'])) {
            $error = $this->language->get('error_required');
        }

        // 2. Validate XML
        if (!$error) {
            libxml_use_internal_errors(true);

            $dom = new DOMDocument('1.0', 'UTF-8');

            if(!$dom->loadXml(html_entity_decode($this->request->post['xml'], ENT_QUOTES, 'UTF-8'))){

                foreach (libxml_get_errors() as $error) {
                    $msg = '';

                    switch ($error->level) {
                        case LIBXML_ERR_WARNING :
                            $msg .= "Warning $error->code: ";
                            break;
                        case LIBXML_ERR_ERROR :
                            $msg .= "Error $error->code: ";
                            break;
                        case LIBXML_ERR_FATAL :
                            $msg .= "Fatal Error $error->code: ";
                            break;
                    }

                    $msg .= trim ( $error->message ) . "\nLine: $error->line";

                    $error = $msg;
                }

                libxml_clear_errors();
            }

            libxml_use_internal_errors(false);
        }

        // 3. Required tags
        if (!$error && (!$dom->getElementsByTagName('name') || $dom->getElementsByTagName('name')->length == 0 || $dom->getElementsByTagName('name')->item(0)->textContent == '')) {
            $error = $this->language->get('error_name');
        }

        if (!$error && (!$dom->getElementsByTagName('code') || $dom->getElementsByTagName('code')->length == 0 || $dom->getElementsByTagName('code')->item(0)->textContent == '')) {
            $error = $this->language->get('error_code');
        }

        // 4. Check code isn't duplicate
        if (!$error) {
            $code = $dom->getElementsByTagName('code')->item(0)->textContent;

            $this->load->model('extension/module/modification_manager');
            
            $modification_info = $this->model_extension_module_modification_manager->getModificationByCode($code);

            if ($modification_info && (!isset($this->request->get['modification_id']) || $modification_info['modification_id'] != $this->request->get['modification_id'])) {
                $error = sprintf($this->language->get('error_exists'), $modification_info['name'], $modification_info['code']);
            }
        }

        if ($error) {
            $this->error['xml'] = $error;
        }

        return !$this->error;
    }

    static function modifiedFiles($dir, $dirLen = 0) {
        $tree = glob(rtrim($dir, '/') . '/*');
        if (!$dirLen) {
            $dirLen = strlen($dir);
        }
        $files = array();

        if (is_array($tree)) {
            foreach($tree as $file) {
                if ($file == $dir . 'index.html') {
                    continue;
                } elseif (is_file($file)) {
                    $files[] = substr($file, $dirLen);
                } elseif (is_dir($file)) {
                    $files = array_merge($files, self::modifiedFiles($file, $dirLen));
                }
            }
        }

        return $files;
    }

    protected function getListUrlParams(array $params = array()) {
        if (isset($params['sort'])) {
            $params['sort'] = $params['sort'];
        } elseif (isset($this->request->get['sort'])) {
            $params['sort'] = $this->request->get['sort'];
        }

        if (isset($params['order'])) {
            $params['order'] = $params['order'];
        } elseif (isset($this->request->get['order'])) {
            $params['order'] = $this->request->get['order'];
        }

        if (isset($params['filter_name'])) {
            $params['filter_name'] = urlencode(html_entity_decode($params['filter_name'], ENT_QUOTES, 'UTF-8'));
        } elseif (isset($this->request->get['filter_name'])) {
            $params['filter_name'] = urlencode(html_entity_decode($this->request->get['filter_name'], ENT_QUOTES, 'UTF-8'));
        }

        if (isset($params['filter_author'])) {
            $params['filter_author'] = urlencode(html_entity_decode($params['filter_author'], ENT_QUOTES, 'UTF-8'));
        } elseif (isset($this->request->get['filter_author'])) {
            $params['filter_author'] = urlencode(html_entity_decode($this->request->get['filter_author'], ENT_QUOTES, 'UTF-8'));
        }

        if (isset($params['filter_xml'])) {
            $params['filter_xml'] = urlencode(html_entity_decode($params['filter_xml'], ENT_QUOTES, 'UTF-8'));
        } elseif (isset($this->request->get['filter_xml'])) {
            $params['filter_xml'] = urlencode(html_entity_decode($this->request->get['filter_xml'], ENT_QUOTES, 'UTF-8'));
        }

        if (isset($params['page'])) {
            $params['page'] = $params['page'];
        } elseif (isset($this->request->get['page'])) {
            $params['page'] = $this->request->get['page'];
        }

        $paramsJoined = array();

        foreach($params as $param => $value) {
            $paramsJoined[] = "$param=$value";
        }

        return '&' . implode('&', $paramsJoined);
    }

    protected function getModificationXmlFiles() {
        $return = array();

        $baseLen = strlen(substr(DIR_SYSTEM, 0, -7));

        $xml = array();

        $xml[] = file_get_contents(DIR_SYSTEM . 'modification.xml');

        $files = glob(DIR_SYSTEM . '*.ocmod.xml');

        if ($files) {
            foreach ($files as $file) {
                $xml[] = file_get_contents($file);
            }
        }

        $results = $this->model_extension_module_modification_manager->getModifications();

        foreach ($results as $result) {
            if ($result['status']) {
                $xml[] = $result['xml'];
            }
        }

        foreach ($xml as $xml) {
            if (empty($xml)){
                continue;
            }

            $dom = new DOMDocument('1.0', 'UTF-8');
            $dom->preserveWhiteSpace = false;
            $dom->loadXml($xml);

            $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 . str_replace('../', '', substr($file, 8));
                    }

                    if (substr($file, 0, 5) == 'admin') {
                        $path = DIR_APPLICATION . str_replace('../', '', substr($file, 6));
                    }

                    if (substr($file, 0, 6) == 'system') {
                        $path = DIR_SYSTEM . str_replace('../', '', substr($file, 7));
                    }

                    if ($path) {
                        $files = glob($path, GLOB_BRACE);

                        if ($files) {
                            foreach ($files as $file) {
                                $file = substr($file, $baseLen);

                                if (!isset($return[$file])) {
                                    $return[$file] = array();
                                }

                                if ($dom->getElementsByTagName('code')->length) {
                                    $code = $dom->getElementsByTagName('code')->item(0)->textContent;
                                } else {
                                    continue;
                                }

                                if (!empty($return[$file])) {
                                    foreach ($return[$file] as $return_file) {
                                        if ($return_file['code'] == $code) {
                                            continue 2;
                                        }
                                    }
                                }

                                if ($dom->getElementsByTagName('name')->length) {
                                    $name = $dom->getElementsByTagName('name')->item(0)->textContent;
                                } else {
                                    continue;
                                }

                                if ($dom->getElementsByTagName('author')->length) {
                                    $author = $dom->getElementsByTagName('author')->item(0)->textContent;
                                } else {
                                    $author = '';
                                }

                                $return[$file][] = array(
                                    'code' => $code,
                                    'name' => $name,
                                    'author' => $author
                                );
                            }
                        }
                    }
                }
            }
        }

        return $return;
    }


    protected function validate() {
        if (!$this->user->hasPermission('modify', 'marketplace/modification')) {
            $this->error['warning'] = $this->language->get('error_permission');
        }

        return !$this->error;
    }
}
 

Ссылка на комментарий
Поделиться на других сайтах


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.