Я новичок в работе с Joomla, и я адаптирую внешний php-класс, который я написал для v1.5. Не вдаваясь во все детали, в основном, я использую функцию для загрузки среды Joomla, после которой все в Joomla доступно для класса. Это делается, главным образом, с помощью файла index.php.
Он отлично работает с v1.5 и на некоторое время, но пытается адаптировать его для версии 1.6, он падает.
Вот функция:
private function loadJoomla() { $path_base = rtrim($this->joomFullPath, '/'); // Set flag that this is a parent file define( '_JEXEC', 1 ); define( 'DS', DIRECTORY_SEPARATOR ); switch ($joomlaVersion) { case 'v1.6': if (file_exists($path_base . '/defines.php')) { include_once $path_base . '/defines.php'; } if (!defined('_JDEFINES')) { define('JPATH_BASE', $path_base); require_once JPATH_BASE.'/includes/defines.php'; } require_once JPATH_BASE.'/includes/framework.php'; // Mark afterLoad in the profiler. JDEBUG ? $_PROFILER->mark('afterLoad') : null; // Instantiate the application. $app = JFactory::getApplication('site'); // Initialise the application. $app->initialise(); // Mark afterIntialise in the profiler. JDEBUG ? $_PROFILER->mark('afterInitialise') : null; // Route the application. $app->route(); // Mark afterRoute in the profiler. JDEBUG ? $_PROFILER->mark('afterRoute') : null; // Dispatch the application. $app->dispatch(); // Mark afterDispatch in the profiler. JDEBUG ? $_PROFILER->mark('afterDispatch') : null; // Render the application. $app->render(); // Mark afterRender in the profiler. JDEBUG ? $_PROFILER->mark('afterRender') : null; // Return the response. return $app; break; case 'v1.5': // PREPARE define('JPATH_BASE', $path_base); require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' ); require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' ); JDEBUG ? $_PROFILER->mark( 'afterLoad' ) : NULL; // CREATE THE APPLICATION $GLOBALS['mainframe'] =& JFactory::getApplication('site'); // INITIALISE THE APPLICATION /* set the language */ $GLOBALS['mainframe']->initialise(); JPluginHelper::importPlugin('system'); /* trigger the onAfterInitialise events */ JDEBUG ? $_PROFILER->mark('afterInitialise') : NULL; $GLOBALS['mainframe']->triggerEvent('onAfterInitialise'); // ROUTE THE APPLICATION $GLOBALS['mainframe']->route(); /* authorization */ $GLOBALS['Itemid'] = JRequest::getInt( 'Itemid'); $GLOBALS['mainframe']->authorize($GLOBALS['Itemid']); /* trigger the onAfterRoute events */ JDEBUG ? $_PROFILER->mark('afterRoute') : NULL; $GLOBALS['mainframe']->triggerEvent('onAfterRoute'); // DISPATCH THE APPLICATION $GLOBALS['option'] = JRequest::getCmd('option'); $GLOBALS['mainframe']->dispatch($GLOBALS['option']); /* trigger the onAfterDispatch events */ JDEBUG ? $_PROFILER->mark('afterDispatch') : NULL; $GLOBALS['mainframe']->triggerEvent('onAfterDispatch'); // RENDER THE APPLICATION $GLOBALS['mainframe']->render(); /* trigger the onAfterRender events */ JDEBUG ? $_PROFILER->mark('afterRender') : NULL; $GLOBALS['mainframe']->triggerEvent('onAfterRender'); // RETURN THE RESPONSE return JResponse::toString($GLOBALS['mainframe']->getCfg('gzip')); break; default: return NULL; break; }
Как сказано, бит версии 1.5 отлично работает и является только файлом index.php с переменной mainframe, сделанной глобально. Бит v1.6 падает на '$ app-> dispatch ();'.
Отладка потока с помощью «die» заставила меня работать с диспетчером в /libraries/joomla/application.php, где я обнаружил, что точкой падения над «$ content = JComponentHelper :: renderComponent ($ component)»; который заставил меня функционировать renderComponent в /libraries/joomla/application/component/helper.php
Несколько «умирает» позже, я обнаружил, что падение должно быть, дождитесь его, «ob_start ();». Полностью сбитый с толку, особенно после проверки кода v1.5, я вижу, что он точно такой же, как и v1.6 здесь.
Я подозреваю, что область $ app может быть причиной этого и по достоинству оценят некоторую помощь. Я пробовал очевидное «$ GLOBALS ['приложение»] без радости.
Спасибо, что нашли время и указатели.