2013-06-20 94 views
0

我有一个自定义组件,实际上有几个。每次都会有开头原料和硬编码的HTML和结束他们的/view/default.php从组件获取硬编码值插入Joomla 3.x

我有一个系统插件,需要得到这个网站,并在某些情况下,将其更改为别的东西,可以在后端管理。作为一个内容插件,这在所有com_content文章中都能正常工作,但它被组件忽略,我的理解是系统插件可以做到这一点,但我无法将数据导入插件并返回它

组件文本示例

 jimport('joomla.plugin.plugin'); 

    class plgSystemMyplugin extends JPlugin { 
function onBeforeRender() { 

    if (JFactory::getDocument()->getType() != 'html') { 
      return; 
    } 
    else { 
    $document=JFactory::getDocument(); 
    $document->addCustomTag('<!-- System Plugin has been included (for testing) -->');   
    $document=JResponse::getBody(); 

    $bob=JResponse::getBody(); 


     $db = &JFactory::getDbo(); 
     $db->setQuery('SELECT 1, 2 FROM #__table'); 
     $results = $db->loadRowList(); 
     $numrows=count($results); 

       if($numrows >0) { 
           foreach($results as $regexes) { 
           $document = str_replace($regexes[0],$regexes[1],$document); 
           } 
           return $document; 
       } 
       else { 
        $document = 'error with plugin'; 
       } 
    JResponse::setBody($document); 
    return $document; 
    } 
    } 
    } 

此刻$数据返回具有“一键1个值(字符串)的阵列:$文本1,$文本2在文档的顶部)

JPluginHelper::importPlugin('system'); 
    JPluginHelper::importPlugin('plgSystemMyplugin'); 
    $dispatcher =& JDispatcher::getInstance(); 
    $data = array($text1, $text2); // any number of arguments you want 
    $data = $dispatcher->trigger('onBeforeRender', $data); 

    <article> 
<div class="spacer" style="height:25px;"></div> 
<div class="page_title_text"> 
    <h1>title</h1> 
    <?php var_dump($data); ?> 
</div> 
<section> 

我的插件限定“(空白/空白)。

但不是我期望的数据库中的数据。

简单来说我有我的文件,我的数据库 {sometext},它应该返回 <p>my other text</p>

你能帮助

谢谢

回答

1

好的。深入研究这个问题会遇到一些问题。最大的缺点是,您将getBody保存到名为$bob的变量中,但随后切换到使用上述对象形式的$document,而不是内容。

此外,您还有一个return $document挂在代码的中间,阻止您看到您将设置$document作为新身体。也许应该更象下面这样:

$bob=JResponse::getBody(); 


    $db = &JFactory::getDbo(); 
    $db->setQuery('SELECT 1, 2 FROM #__table'); 
    $results = $db->loadRowList(); 
    $numrows=count($results); 

    if($numrows >0) { 
     foreach($results as $regexes) { 
      $bob = str_replace($regexes[0],$regexes[1],$bob); 
     } 
    } 
    else { 
     $bob = 'error with plugin'; 
    } 
    JResponse::setBody($bob); 
    return $document; 
} 

原始的思考:

两个想法,让你开始。我不确定这会实际上完全回答这个问题,但应该让你朝着正确的方向前进。

首先,你不应该触发系统插件。他们是系统插件,所以系统会为你照顾。如果你想在你的组件中使用内容插件(你肯定可以做!),那么你必须像第一组代码一样触发它们。在这种情况下,请不要打扰整个调度部分。

其次,您的插件看起来设置为正确抓取JDocument的正文,所以应该可以正常工作。

可能的问题是整个系统插件没有被触发。确保它已安装,并且所有内容的命名都是正确的。它必须位于基于此名称的plugins/system/myplugin/myplugin.php上,并确保带有此参数的xml文件也将myplugin引用为插件名称。如果没有,系统将不会找到该类,但可能不会抛出错误。它会跳过它。这每次都给我带来麻烦。

要做一些检查,以确保它被调用,我通常会在文件的顶部附近抛出一个echovar_dump,并在函数内部。确认函数至少要先被调用,并且您应该是实现此功能的大部分方法。

+0

感谢这个,我有'$ document-> addCustomTag('<! - 系统插件已包含(用于测试) - >');'在系统插件代码中,并且正在输出到屏幕。它正确安装,名称和位置相匹配,但似乎没有创建任何进一步的屏幕。 – ChelseaStats

+0

我添加了更新。 –

+0

'$ bob'有一些我正在做的调试,但在整个过程中都使用了'$ document',包括上面的代码将body分配给'$ bob',它也被分配到'$ document',但仍然无法获得这个插件改变原始内容。感谢您的帮助,但。 :-) – ChelseaStats