Последовательность вызовов функций (методов) при показе статьи в Joomla

Иногда бывает полезно узнать последовательность вызовов функций (методов) во время исполнения какого-либо скрипта.
Простейший способ сделать это, который мне попался под руку – это воспользоваться встроенным функционалом популярного бесплатного отладчика PHP – XDebug.

Для примера рассмотрим последовательность вызовов методов ядра Joomla реализующих такую простую вещь как вывод на экран страницы со статьей.

Подробная документация по выводу последовательности вывода вызовов с помощью XDebug расположена на официальном сайте отладчика по адресу http://xdebug.org/docs/stack_trace.

Воспользуемся двумя функциями для вывода колл-стека: xdebug_get_function_stack() (возвращает массив стека вызовов до этого пункта) и xdebug_print_function_stack() (показывает текущий стек вызова функций, подобным внешне способу показа XDebug ошибочных ситуаций).
Так как конечной точкой в процессе формирования статьи является шаблон вида вывода вставим функции в него C:\webserver\www\joomla\templates\joomla\html\com_content\article\default.php, например, перед выводом основного текста статьи:

<div class="article-content">
// ...
<?php if (isset ($this->article->toc)) : ?>
	<?php echo $this->article->toc; ?>
<?php endif; ?>
 
<?php xdebug_print_function_stack( '' ); ?>
<!--<?php var_dump(xdebug_get_function_stack()); ?>-->
 
<?php echo $this->article->text; ?>
// ...
</div>
В результате работы функции xdebug_print_function_stack() мы увидим следующую таблицу:

( ! ) Xdebug: user triggered in C:\webserver\www\joomla\templates\joomla\html\com_content\article\default.php on line 132
Call Stack
# Time Memory Function Location
1 0.0022 88824 {main}( ) …\index.php:0
2 0.5346 5736336 JSite->dispatch( ) …\index.php:68
3 0.5671 5969256 JComponentHelper->renderComponent( ) …\application.php:124
4 0.5841 6070064 require_once( 'C:\webserver\www\joomla\components\com_content\content.php' ) …\helper.php:162
5 0.5994 6441928 JController->execute( ) …\content.php:35
6 0.5994 6442632 ContentController->display( ) …\controller.php:236
7 0.6117 6733256 JController->display( ) …\controller.php:49
8 0.6499 7224624 JCacheView->get( ) …\controller.php:312
9 0.6504 7268904 ContentViewArticle->display( ) …\view.php:98
10 1.0164 9752408 JView->display( ) …\view.html.php:196
11 1.0164 9752408 JView->loadTemplate( ) …\view.php:195
12 1.0222 9901592 include( 'C:\webserver\www\joomla\templates\joomla\html\com_content\article\default.php' ) …\view.php:567
13 1.0326 9930440 xdebug_print_function_stack
( )
…\default.php:132

Которая описывает последовательность вызова функций и методов Joomla от корневого файла index.php до конечного default.php задействованных в выводе статьи.
Если воспользоваться функцией xdebug_get_function_stack() можно также заметить название объекта ContentViewArticle (ContentViewArticle object) (котрый по сути и является объектом данных статьи. Данные именно этого объекта используются в шаблоне например для вывода дат: <?php echo JHTML::_('date', $this->article->created, JText::_('DATE_FORMAT_LC3')); ?>) и предположить последовательность его создания:
  • …\components\com_content\controller.php: parent::display(true);
  • …\libraries\joomla\application\component\controller.php: $view = & $this->getView( $viewName, $viewType, '', array( 'base_path'=>$this->_basePath));
  • …\libraries\joomla\application\component\controller.php: $view = & $this->_createView( $name, $prefix, $type, $config )
  • …\libraries\joomla\application\component\controller.php: $result = new $viewClass($config);


Добавление комментария:

 css.php