2011-08-12 28 views
1

私はJoomlaで作業するのが初めてで、私はv1.5用に書いた外部PHPクラスを採用しています。 基本的には、Joomlaの環境をすべて読み込んで、Joomlaのすべてをクラスに利用できるようにするために、基本的にすべての詳細を説明しません。 これは基本的にindex.phpファイルを使用して行われます。Joomla 1.6外部PHPインタラクションの問題

これはv1.5でうまく動作し、しばらくの間行っていますが、v1.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; 
     } 

としては、V1.5ビットが正常に動作し、グローバル製メインフレームの変数を持つだけでindex.phpファイルである、と述べました。 v1.6ビットは '$ app-> dispatch();'に落ちます。

'die'を使用してフローをデバッグすると、/libraries/joomla/application.phpに関数ディスパッチされました。ここで、fall overポイントが '$ contents = JComponentHelper :: renderComponent($ component);'私が関数にかかったのは、/libraries/joomla/application/component/helper.phpの

です。後でいくつか「死んでしまいます」、私は落ち着きがあることがわかりました、「ob_start();」。 特にv1.5コードをチェックインして以来、完全に困惑していましたが、ここではv1.6とまったく同じです。

私は$ appスコープがこれの背後にある理由であると思われ、助けに感謝します。私は明らかな "$ GLOBALS ['app']"を喜んで試しました。

時間とポインタをいただきありがとうございます。

+0

私は知っているすべてを試して、この同じ質問を他の場所で尋ねましたが、たびに私は沈黙の壁で会いました。私はこれを引き起こす原因をどのように表現しているのかについて何かがあるのだろうかと思います。可能であればお手伝いください。ありがとう – Dayo

答えて

2

私はこの問題を次のように解決しました。

2つの別々の問題が発生しました。

第1に、v1.6セクションに「$ option」パラメータが正しく初期化されていませんでした。 this query I madeというユーザーのおかげで、私はそれを解決することができました。問題が解決しなかったが

// Dispatch the application. 
$option = JRequest::getCmd('option'); 
$app->dispatch($option); 

を、そしてコードはまだ「のob_start」の時点でクラッシュしていました:次のようにコードを変更することもできます。

第2に、クラッシュの実際の原因には至りませんでしたが、回避策が必要でした。問題のob_startビットは、/libraries/joomla/application/component/helper.phpにあるので、コンポーネントの出力を変数に集めるだけで、$ app-> dispatchというコードを引っ張って作業しました$ option) 'がファイルに書き込まれ、問題のセクションが修正されました。次のように

まず、私がメインセクションを変更:

// Dispatch the application. 
$option = JRequest::getCmd('option'); 
/** The process crashes here for some reason 
* (See https://stackoverflow.com/questions/7039162/). 
* So we comment out the Joomla! function, pull the code in here and 
* push the component content into the Joomla document buffer ourselves. 
**/ 
//$app->dispatch($option); 
$this->joomdispatch($option); 

次のように私は、 'joomdispatch' 関数を書いた:これにより

private function joomdispatch($option) { 
    /************************ 
    * This is pulled from function 'render' 
    * in /libraries/joomla/application.php 
    ************************/ 
    $document = JFactory::getDocument(); 
    $document->setTitle(JApplication::getCfg('sitename'). ' - ' .JText::_('JADMINISTRATION')); 
    $document->setDescription(JApplication::getCfg('MetaDesc')); 

    /************************ 
    * This is pulled from function 'renderComponent' 
    * in /libraries/joomla/application/component/helper.php 
    * Function 'renderComponent' is called by the 
    * '$contents = JComponentHelper::renderComponent($component);' line 
    * We exclude that line and jump to the function code 
    ************************/ 

    // Initialise variables. 
    $app = JFactory::getApplication(); 

    // Load template language files. 
    $template = $app->getTemplate(true)->template; 
    $lang = JFactory::getLanguage(); 
    $lang->load('tpl_'.$template, JPATH_BASE, null, false, false) 
     || $lang->load('tpl_'.$template, JPATH_THEMES."/$template", null, false, false) 
     || $lang->load('tpl_'.$template, JPATH_BASE, $lang->getDefault(), false, false) 
     || $lang->load('tpl_'.$template, JPATH_THEMES."/$template", $lang->getDefault(), false, false); 

    $scope = $app->scope; //record the scope 
    $app->scope = $option; //set scope to component name 

    // Build the component path. 
    $option = preg_replace('/[^A-Z0-9_\.-]/i', '', $option); 
    $file = substr($option, 4); 

    // Define component path. 
    define('JPATH_COMPONENT',    JPATH_BASE.DS.'components'.DS.$option); 
    define('JPATH_COMPONENT_SITE',   JPATH_SITE.DS.'components'.DS.$option); 
    define('JPATH_COMPONENT_ADMINISTRATOR', JPATH_ADMINISTRATOR.DS.'components'.DS.$option); 

    // get component path 
    if ($app->isAdmin() && file_exists(JPATH_COMPONENT.DS.'admin.'.$file.'.php')) { 
     $path = JPATH_COMPONENT.DS.'admin.'.$file.'.php'; 
    } else { 
     $path = JPATH_COMPONENT.DS.$file.'.php'; 
    } 

    $task = JRequest::getString('task'); 

    // Load common and local language files. 
    $lang->load($option, JPATH_BASE, null, false, false) 
     || $lang->load($option, JPATH_COMPONENT, null, false, false) 
     || $lang->load($option, JPATH_BASE, $lang->getDefault(), false, false) 
     || $lang->load($option, JPATH_COMPONENT, $lang->getDefault(), false, false); 

    // Handle template preview outlining. 
    $contents = null; 

    // Get component html 
    /************************ 
    * This has been edited from the native 'ob_start'. 
    * Could use curl as well 
     ***********************/ 
    $contents = file_get_contents($this->joomUrl . '/index.php?' . $this->joomQS); 

    // Build the component toolbar 
    jimport('joomla.application.helper'); 

    if (($path = JApplicationHelper::getPath('toolbar')) && $app->isAdmin()) { 
     // Get the task again, in case it has changed 
     $task = JRequest::getString('task'); 

     // Make the toolbar 
     include_once $path; 
    } 

    $app->scope = $scope; //revert the scope 

    /************************ 
    * Back to function 'renderComponent' code 
    * to complete process 
    ************************/ 
    $document->setBuffer($contents, 'component'); 

    // Trigger the onAfterDispatch event. 
    JPluginHelper::importPlugin('system'); 
    JApplication::triggerEvent('onAfterDispatch'); 
} 

を、すべてが正常に動作します。 (奇妙な)エラーの一番下に到達しなかったが、それを回避することができた。