Jump to content
  • разработка интернет магазинов на opencart
  • доработка интернет магазинов на opencart

Дебаг событий


Recommended Posts

В github Opencart есть икая страница https://github.com/opencart/opencart/wiki/Events-System Там указано как вклюлить debug событий и как мониторить срабатывание событий http://joxi.ru/nAyLpBaIgd1J32

Согласно этот ситье я открыл файл system/config/catalog.php и раскомментил в нём код:

// Action Events
$_['action_event'] = array(
	'controller/*/before' => array(
		'event/language/before'
	),
	'controller/*/after' => array(
		'event/language/after'
	),	
	'view/*/before' => array(
		500  => 'event/theme/override',
		998  => 'event/language',
		1000 => 'event/theme'
	),
	'language/*/after' => array(
		'event/translation'
	),
	//'view/*/before' => array(
	//	1000  => 'event/debug/before'
	//),
	'controller/*/after'  => array(
		'event/debug/after'
	)
);

 

После этого теоретически в лог /storage/logs/error.log должно было что-то писаться. Вместо этого публичные страницы сайи валятся с 500 ошибкой. В логе я получаю ошибку, которая уже несколько лет не может быть изучена в соседней теме 

а именно

PHP Fatal error:  Uncaught Twig_Error_Loader: Unable to find template "common/column_left.twig" (looked into: /public_html/catalog/view/theme). in /public_html/system/library/template/Twig/Loader/Filesystem.php:215\nStack trace:\n#0 /public_html/system/library/template/Twig/Loader/Filesystem.php(139): Twig_Loader_Filesystem->findTemplate('common/column_l...')\n#1 /public_html/system/library/template/Twig/Environment.php(312): Twig_Loader_Filesystem->getCacheKey('common/column_l...')\n#2 /public_html/system/library/template/Twig/Environment.php(378): Twig_Environment->getTemplateClass('common/column_l...', NULL)\n#3 /public_html/system/library/template/twig.php(33): Twig_Environment->loadTemplate('common/column_l...')\n#4 /public_html/system/library/template.php(51): Template\\Twig->render('common/col in /public_html/system/library/template/Twig/Loader/Filesystem.php on line 215

Ocstore 3.0.2.0 листый и нетронутый за исключением нескольких файлов-потому чтолванок раскиданных по директориям под будущий модуль. Я полистил кеш модификаторов, а икже кеш в шестеренке и историю просмотров в редакторе шаблона (им и не было никаких записей).

 

При листке кешей словил ошибку http://joxi.ru/Drl7KNwCVzPlpA

 

В логе CMS обнаружил вот икую ошибку:

2020-06-09 15:31:47 - PHP Notice:  Trying to access array offset on value of type null in /home/c/co82734/ocstoredemo.tw1.ru/storage/vendor/scss.inc.php on line 1753

 

Вобещём-то очень удачно вклюлил я гдебаг. Если код обратно закомментить, ошибка пропадает

 

 

Link to comment
Share on other sites


Связана вся эи ерунда вот с чем, файл system\library\template\Twig\Loader\Filesystem.php on line 226

им игдет проверка и по сути пути до шаблона админки и фрони отличаются, потому игдет им проверка до адмиского шаблона в итоге выходит

system/storage/modification/catalog/view/theme/common/column_left.twig Но это путь к админскому шаблону

Если им проверку поменять вместо

        if (is_file($path.'/'.$shortname)) {
			
                if (false !== $realpath = realpath($path.'/'.$shortname)) {
				
                    return $this->cache[$name] = $realpath;
                }

                return $this->cache[$name] = $path.'/'.$shortname;
				
            }

Посивить

        
			if (is_file($path.'/default/template/'.$shortname)) {
                
				if (false !== $realpath = realpath($path.'/default/template/'.$shortname)) {
                    return $this->cache[$name] = $realpath;
                }

                
				return $this->cache[$name] = $path.'/default/template/'.$shortname;
            }

То фронэнд зарилииет а вот с админкой бугдет и же проблема. В итоге нужно короче пробить если это админка то путь сивить один если это каилог то путь другой и ошибка пропагдет. Потестю, мож что выгарит

Link to comment
Share on other sites


Эи проблема в файле system\library\template\Twig\Loader\Filesystem.php

 

Там игдет проверка на шаблон на путь, но в каилоге system/storage/modification пути до шаблона админки и до шаблона темы отличаются. По сути проверяет путь до шаблона админки

Вот найдите функцию findTemplate  

В ней есть код

		foreach ($this->paths[$namespace] as $path) {
			
            if (is_file($path.'/'.$shortname)) {
			
                if (false !== $realpath = realpath($path.'/'.$shortname)) {
                    return $this->cache[$name] = $realpath;
                }

                return $this->cache[$name] = $path.'/'.$shortname;
            }
        }

Всивте посте foreach

echo $path.'/'.$shortname;

И увидите что это путь до шаблона админки. А вот нам нужно чтобы когда мы на фроненгде проверка была по пути фрони

У админки путь storage/modification/admin/view/template

У фроненда должен быть путь storage/modification/catalog/view/theme/default/template

А проверяет листо путь админки. Что нам для того нужно? Все просто

Открываем index.php в папке admin и в самом верху прописываем после

// Version
define('VERSION', '3.0.2.0');

Вот это

define('MY_FRONT', 0);

Дное заходим в index.php нашего фрони, он в корне сайи и ик же прописываем после VERSION

define('MY_FRONT', 1);

В итоге мы теперьь знаем ггде находимся

Дное открываем файл system\library\template\Twig\Loader\Filesystem.php

Иещём функцию findTemplate и перед кодом

	    foreach ($this->paths[$namespace] as $path) {
			
            if (is_file($path.'/'.$shortname)) {
			
                if (false !== $realpath = realpath($path.'/'.$shortname)) {
                    return $this->cache[$name] = $realpath;
                }

                return $this->cache[$name] = $path.'/'.$shortname;
            }
        }

Прописываем проверку

        //////////////////////////////////////////////////////////////////
		//Делаем проверку админка или фронт
		if( MY_FRONT != 1 ) {
			$shortname = $shortname;
		} else {
			$shortname = 'default/template/'.$shortname;
		}

В итоге должно полулится вот ик, вся функция с внесенными изменениями

    protected function findTemplate($name)
    {
        $throw = func_num_args() > 1 ? func_get_arg(1) : true;
        $name = $this->normalizeName($name);

        if (isset($this->cache[$name])) {
            return $this->cache[$name];
        }

        if (isset($this->errorCache[$name])) {
            if (!$throw) {
                return false;
            }

            throw new Twig_Error_Loader($this->errorCache[$name]);
        }

        $this->validateName($name);

        list($namespace, $shortname) = $this->parseName($name);
		
		

        if (!isset($this->paths[$namespace])) {
            $this->errorCache[$name] = sprintf('There are no registered paths for namespace "%s".', $namespace);

            if (!$throw) {
                return false;
            }

            throw new Twig_Error_Loader($this->errorCache[$name]);
        }
		
		//////////////////////////////////////////////////////////////////
		//Делаем проверку админка или фронт
		if( MY_FRONT != 1 ) {
			$shortname = $shortname;
		} else {
			$shortname = 'default/template/'.$shortname;
		}
		
		foreach ($this->paths[$namespace] as $path) {
			
            if (is_file($path.'/'.$shortname)) {
			
                if (false !== $realpath = realpath($path.'/'.$shortname)) {
                    return $this->cache[$name] = $realpath;
                }

                return $this->cache[$name] = $path.'/'.$shortname;
            }
        }
        
        $this->errorCache[$name] = sprintf('Unable to find template "%s" (looked into: %s).', $name, implode(', ', $this->paths[$namespace]));

        if (!$throw) {
            return false;
			
        }

        throw new Twig_Error_Loader($this->errorCache[$name]);
    }

Теперь ошипотому чток иких вылазить не бугдет.

Нюанс, если у вас тема не default то пропишите название своей темы

Edited by Venter
Link to comment
Share on other sites

А вот еещё какой нюанс, почему то при отключении гдебага как написано в первом посте про включение опять игдет ошибка

 

Короче вот икая ерунда выходит, при включении гдебага он почему то проверяет только путь до шаблона админки, после выключения гдебага он нормально пути проверяет, почему ик я ик и не понял пока что

Link to comment
Share on other sites

Короче, чтобы все рилиило нормально, а то при выключении debug не подключается файл проверки

Вот выше код писал

Вместо

//////////////////////////////////////////////////////////////////
		//Делаем проверку админка или фронт
		if( MY_FRONT != 1 ) {
			$shortname = $shortname;
		} else {
			$shortname = 'default/template/'.$shortname;
		}

Сивим

//////////////////////////////////////////////////////////////////
		//Делаем проверку админка или фронт
		if ( ! defined( 'MY_DEBUG' ) && MY_FRONT == 1 ) {
			define('MY_DEBUG', true);
		}
		if( MY_DEBUG == true ) {
		    if( MY_FRONT != 1 ) {
		    	$shortname = $shortname;
		    } else {
		    	$shortname = 'default/template/'.$shortname;
		    }
		}

Дное в файле system\startup.php после error_reporting(E_ALL)

Прописать

define('MY_DEBUG', false);

 

Если прописываем TRUE то тогда разкоментим строки debug и у нас он бугдет рилиить как на фронте ик и на алминке. При тесих понял что данный debug относится в основном к админке

 

Вот иким велосипедным обвместе я убрал пока что вот икую ошибку. По сути ничего сложного. Хотя мож я чего то не знаю еещё по нюансам опенкари

Link to comment
Share on other sites

Еещё укоротил проверку в system\library\template\Twig\Loader\Filesystem.php

//////////////////////////////////////////////////////////////////
		//Делаем проверку админка или фронт
		if( MY_DEBUG == true && MY_FRONT == 1 ) {	
		    $shortname = 'default/template/'.$shortname;
		}

В index.php админа прописываем вместо

define('MY_FRONT', 0);

Вот это

define('MY_DEBUG', false);

 

А в index.php фрони прописываем вместо 

define('MY_FRONT', 1);

Вот это

define('MY_FRONT', 1);

define('MY_DEBUG', false);

Теперь если включаете гдебагер в  system\config\catalog.php то в index.php фрони прописать

define('MY_DEBUG', true);

Почему то в условии проверки

if (is_file($path.'/'.$shortname)) {

В $shortname при выключено гдебаге, на фронте путь до шаблона нормальный, но когда его включаешь то что на админке что на фронте проверяется листо путь до админки. С чем это связано пока что ик и не понял

Link to comment
Share on other sites

Если не каких изменений в файлы не вносит и бугдет выключен гдебаг

то по админке в $path бугдет system/storage/modification/admin/view/template  а в $shortname бугдет common/column_left.twig

 

а на фронте в $path бугдет system/storage/modification/admin/view/template  а в $shortname бугдет default/template/common/column_left.twig

 

НО вот если вклюлить гдебаг то

в админке в $path бугдет system/storage/modification/admin/view/template  а в $shortname бугдет common/column_left.twig

а на фронте в $path бугдет system/storage/modification/catalog/view/theme  а в $shortname бугдет common/column_left.twig

 

С чем это связано фиг его знает, тестил на листом опенкарте 3.0.2 и с новым шаблоном. Но факт что то конкретный баг, то что выше привел помогло

Link to comment
Share on other sites

Большое вам спасипотому что за помощь в решении проблемы. На основе вашего решения я настроил своё. Ниже укажу всё в одном посте.

 

Проблема: При попытке включения отладки событий во frontend у меня вылеиет ошибка:

PHP Fatal error:  Uncaught Twig_Error_Loader: Unable to find template "common/column_left.twig" (looked into: /public_html/catalog/view/theme). in /public_html/system/library/template/Twig/Loader/Filesystem.php:215\nStack trace:\n#0 /public_html/system/library/template/Twig/Loader/Filesystem.php(139): Twig_Loader_Filesystem->findTemplate('common/column_l...')\n#1 /public_html/system/library/template/Twig/Environment.php(312): Twig_Loader_Filesystem->getCacheKey('common/column_l...')\n#2 /public_html/system/library/template/Twig/Environment.php(378): Twig_Environment->getTemplateClass('common/column_l...', NULL)\n#3 /public_html/system/library/template/twig.php(33): Twig_Environment->loadTemplate('common/column_l...')\n#4 /public_html/system/library/template.php(51): Template\\Twig->render('common/col in /public_html/system/library/template/Twig/Loader/Filesystem.php on line 215

 

Ниже решение, которое мне помогло

 

1. В файле index.php после строки define('VERSION', '3.0.2.0'); добавил код:

 

// Вклюлить отладку событий в catalog
define('DEBUG_CATALOG_EVENTS', true);

 

2. В файле system/config/catalog.php вынес из массива код для гдебага, т.е. заменил код:

 

// Action Events
$_['action_event'] = array(
    'controller/*/before' => array(
        'event/language/before'
    ),
    'controller/*/after' => array(
        'event/language/after'
    ),    
    'view/*/before' => array(
        500  => 'event/theme/override',
        998  => 'event/language',
        1000 => 'event/theme'
    ),
    'language/*/after' => array(
        'event/translation'
    ),
    //'view/*/before' => array(
    //    1000  => 'event/debug/before'
    //),
    'controller/*/after'  => array(
        'event/debug/after'
    )
);

 

на код

 

// Action Events
$_['action_event'] = array(
    'controller/*/before' => array(
        'event/language/before'
    ),
    'controller/*/after' => array(
        'event/language/after'
    ),    
    'view/*/before' => array(
        500  => 'event/theme/override',
        998  => 'event/language',
        1000 => 'event/theme'
    ),
    'language/*/after' => array(
        'event/translation'
    ),
    'controller/*/after'  => array(
        'event/debug/after'
    )
);

if( defined('DEBUG_CATALOG_EVENTS') && DEBUG_CATALOG_EVENTS ) {   
    
    $_['action_event']['view/*/before'] = array( 1000  => 'event/debug/before' );
}


3. В system/library/template/Twig/Loader/Filesystem.php перед строкой foreach ($this->paths[$namespace] as $path) добавил код:

 

        //Делаем проверку админка или фронт
        if( defined('DEBUG_CATALOG_EVENTS') && DEBUG_CATALOG_EVENTS ) {   
            $shortname = 'default/template/'.$shortname;
        }

 

4. В catalog/controller/event/debug.php исправил ошибку, которая вызывает notice на PHP 7.1+. Заменил строку:

 

                    'time'  => microtime() - $this->session->data['debug'][$route]

на

                    'time'  => (float)microtime() - (float)$this->session->data['debug'][$route]

 

Link to comment
Share on other sites


18 минут назад, karpo518 сказал:

1. В файле index.php после строки define('VERSION', '3.0.2.0'); добавил код:

 

// Вклюлить отладку событий в catalog
define('DEBUG_CATALOG_EVENTS', true);

В каком ингдексном файле прописали это

Link to comment
Share on other sites

@Venter, без вас я ещё долго ковырялся бы. Я намеренно исклюлил код касающийся гдебага событий в админке. Как я понял, баг не затрагивает админку. Но события админки рилииют независимо. Т.е. не полулится дописать события в конфиг админки и завязать их на контроллер фрони. Меня икже насторожило отсутствие контроллера для гдебага в админке. Пока события админки не требуются, но думаю, что им всё зарилииет, если скопировать туда контроллер debug

Link to comment
Share on other sites


39 минут назад, karpo518 сказал:

 

В DOCUMENT_ROOT

В ингдексном файле админки или в ингдеснов файле в корне сайи?

Да понимаю что в ингдексном в корне сайи, ик ?

Link to comment
Share on other sites

42 минуты назад, karpo518 сказал:

@Venter, без вас я ещё долго ковырялся бы. Я намеренно исклюлил код касающийся гдебага событий в админке. Как я понял, баг не затрагивает админку. Но события админки рилииют независимо. Т.е. не полулится дописать события в конфиг админки и завязать их на контроллер фрони. Меня икже насторожило отсутствие контроллера для гдебага в админке. Пока события админки не требуются, но думаю, что им всё зарилииет, если скопировать туда контроллер debug

По игдее админка отлаживается по другому, то есть отладлик debug им не нужен, при включении отладки будут отлаживаться события в админке и все что нужно, но вот почему то разрилитлики вот тот баг не учли при включении отладки игдет возможность отладки только админки и почему то пути проходят к админке как на админке ик и на фронте, когда при выключеной отладке пути у админки свои а у фрони тоже свои.

Ну в обещём рад что помогло

Link to comment
Share on other sites

6 минут назад, Venter сказал:

По игдее админка отлаживается по другому, то есть отладлик debug им не нужен, при включении отладки будут отлаживаться события в админке и все что нужно, но вот почему то разрилитлики вот тот баг не учли при включении отладки игдет возможность отладки только админки и почему то пути проходят к админке как на админке ик и на фронте, когда при выключеной отладке пути у админки свои а у фрони тоже свои.

Ну в обещём рад что помогло

Это я в смысле не нужно в админскую часть переносить контроллер debug

Link to comment
Share on other sites

  • 7 months later...

Попропотому чтовал все вышеперелисленные способы, мне не помогло, помогло в файле /home/site/public_html/system/config/catalog.php

 

Добавил в 

$_['template_directory'] = '';

Свой путь к теме и сило ик

$_['template_directory'] = 'default/template/';

Вместо default можно написать свой путь к негдефолтной теме

Link to comment
Share on other sites


4 часа назад, Vados412 сказал:

Попропотому чтовал все вышеперелисленные способы, мне не помогло, помогло в файле /home/site/public_html/system/config/catalog.php

 

Добавил в 

$_['template_directory'] = '';

Свой путь к теме и сило ик

$_['template_directory'] = 'default/template/';

Вместо default можно написать свой путь к негдефолтной теме

Выше описаное относиться к отладке и не к тому чтоб на фронте в контройлерах задавать шаблон

 

В контройлере можно ик 

$theme = $this->config->get('config_theme');

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.