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

Ok。これをさらに深く見ていくと、飛び出すいくつかの問題があります。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;
}

当初の考え:

あなたが始めるための2つの考え。これが実際に質問に完全に答えるかどうかはわかりませんが、正しい方向に進むはずです.

まず、システム プラグインをトリガーする必要はありません。これらはシステム プラグインであるため、システムが処理します。コンポーネントでコンテンツ プラグインを使用したい場合 (もちろん可能です!)、最初のコード セットのようにプラグインをトリガーする必要があります。この場合、dispatch セクション全体を気にしないでください。

次に、プラグインは JDocument から本文を正しく取得するように設定されているように見えるため、動作するはずです。

考えられる問題は、システム プラグイン全体がトリガーされていないことです。インストールされていることと、すべてに正しい名前が付けられていることを確認してください。この名前に基づいて plugins/system/myplugin/myplugin.php にある必要があり、これを含む xml ファイルもプラグイン名として myplugin を参照するようにしてください。そうでない場合、システムはクラスを見つけられませんが、おそらくエラーはスローされません。スキップするだけです。これでは毎回困ります。

呼び出されることを確認するためだけにいくつかのチェックを行うために、通常、ファイルの上部近くで関数のすぐ内側にechoorをスローします。var_dump関数が少なくとも最初に呼び出されていることを確認してください。これを機能させるには、ほとんどの方法で行う必要があります。

于 2013-06-20T17:20:34.923 に答える