Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


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

 

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

 

 

Надіслати
Поділитися на інших сайтах


Связана вся эта ерунда вот с чем, файл 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;
            }

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

Надіслати
Поділитися на інших сайтах


Эта проблема в файле 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 то пропишите название своей темы

Змінено користувачем Venter
Надіслати
Поділитися на інших сайтах

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

 

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

Надіслати
Поділитися на інших сайтах

Короче, чтобы все работало нормально, а то при выключении 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 относится в основном к админке

 

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

Надіслати
Поділитися на інших сайтах

Еще укоротил проверку в 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 при выключено дебаге, на фронте путь до шаблона нормальный, но когда его включаешь то что на админке что на фронте проверяется чисто путь до админки. С чем это связано пока что так и не понял

Надіслати
Поділитися на інших сайтах

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

то по админке в $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 и с новым шаблоном. Но факт что то конкретный баг, то что выше привел помогло

Надіслати
Поділитися на інших сайтах

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

 

Проблема: При попытке включения отладки событий во 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]

 

Надіслати
Поділитися на інших сайтах


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

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

 


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

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

Надіслати
Поділитися на інших сайтах

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

Надіслати
Поділитися на інших сайтах


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

 

В DOCUMENT_ROOT

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

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

Надіслати
Поділитися на інших сайтах

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

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

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

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

Надіслати
Поділитися на інших сайтах

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

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

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

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

Надіслати
Поділитися на інших сайтах

  • 7 months later...

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

 

Добавил в 

$_['template_directory'] = '';

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

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

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

Надіслати
Поділитися на інших сайтах


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

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

 

Добавил в 


$_['template_directory'] = '';

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


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

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

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

 

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

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

 

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.