0

我有一个自定义组件,实际上有几个。每个文件的开头和结尾都有原始和硬编码的 html/view/default.php

我有一个系统插件需要获取此 html,在某些情况下将其更改为其他内容,可以在后端进行管理。作为一个内容插件,它适用于所有 com_content 文章,但它被组件忽略,我的理解是系统插件可以做到这一点,但我无法将数据放入插件并返回它

组件文本示例($text1、$text2 定义在文档顶部)

  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>

我的插件:

      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;
    }
   }
   }

目前 $data 返回一个数组,其键为 1,值(字符串)为“”(空白/空)。

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

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

你能帮我吗?

谢谢

4

1 回答 1

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 作为插件名称。如果没有,系统将找不到该类,但可能不会抛出错误。它只会跳过它。这每次都给我带来麻烦。

要进行一些检查以确保它被调用,我通常会在文件顶部和函数内部抛出一个echoor 。var_dump确认该函数至少首先被调用,并且您应该是使其工作的大部分方法。

于 2013-06-20T17:20:34.923 回答