Jump to content

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

 

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

 

 

Share this post


Link to post
Share on other sites

Понятно 

Share this post


Link to post
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;
            }

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

Share this post


Link to post
Share on other sites
Posted (edited)

Эта проблема в файле 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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
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 относится в основном к админке

 

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

Share this post


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

Share this post


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

Share this post


Link to post
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]

 

Share this post


Link to post
Share on other sites
18 минут назад, karpo518 сказал:

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

 

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
16 минут назад, Venter сказал:

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

 

В DOCUMENT_ROOT

Share this post


Link to post
Share on other sites
39 минут назад, karpo518 сказал:

 

В DOCUMENT_ROOT

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

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

Share this post


Link to post
Share on other sites
42 минуты назад, karpo518 сказал:

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

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

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

Share this post


Link to post
Share on other sites
6 минут назад, Venter сказал:

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×

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.