【问题标题】:Call TYPO3 plugin from other plugin's body从其他插件的主体调用 TYPO3 插件
【发布时间】:2026-02-12 13:10:02
【问题描述】:

我需要从其他插件的主体中调用typo3插件并将其结果传递给模板。这是描述我想要实现的目标的伪代码:

$data['###SOME_VARIABLE###'] = $someOtherPlugin->main();
$this->cObj->substituteMarkerArray($someTemplate, $data);

有可能吗?

谢谢!

【问题讨论】:

    标签: typo3 typoscript typo3-tca


    【解决方案1】:

    @mitchiru 的回答很好,基本正确。

    如果你已经用 Kickstarter 创建了你的外部扩展并且你正在使用 pi_base 那么已经有一个 tslib_cObj 的实例并且整个构造变得更简单了:

    // get type of inner extension, eg. USER or USER_INT
    $cObjType = $GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_innerextension_pi1'];
    // get configuration array of inner extension
    $cObjConf = $GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_innerextension_pi1.'];
    // add own parameters to configuration array if needed - otherwise skip this line
    $cObjConf['myparam'] = 'myvalue';
    // call main method of inner extension, using cObj of outer extension
    $content = $this->cObj->cObjGetSingle($cObjType, $cObjConf);
    

    【讨论】:

      【解决方案2】:

      如果你使用整个 pi 结构,它就不会起作用,例如对于链接、标记功能等,TSFE 数据可能已损坏。

      德米特里说: http://lists.typo3.org/pipermail/typo3-english/2008-August/052259.html

      $cObjType = $GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_rgsmoothgallery_pi1'];
      $conf = $GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_rgsmoothgallery_pi1.'];
      $cObj = t3lib_div::makeInstance('tslib_cObj');
      $cObj->start(array(), '_NO_TABLE');
      $conf['val'] = 1;
      $content = $cObj->cObjGetSingle($cObjType, $conf); //calling the main method
      

      【讨论】:

        【解决方案3】:

        这肯定会起作用(我已经检查过了):http://lists.typo3.org/pipermail/typo3-english/2008-August/052259.html

        可能费迪尔的回答也是正确的,但我没有机会尝试。

        干杯!

        【讨论】:

        • 是的。我们可以在这个例子中看到 t3lib_div:makeInstance 方法,正如我在之前的回答中提到的那样。
        【解决方案4】:

        你应该使用 t3lib_div:makeInstance 方法。

        TYPO3 的“powermail”扩展中有一个工作示例。

        function getGeo() {
            // use geo ip if loaded
            if (t3lib_extMgm::isLoaded('geoip')) {
                require_once( t3lib_extMgm::extPath('geoip').'/pi1/class.tx_geoip_pi1.php');
                $this->media = t3lib_div::makeInstance('tx_geoip_pi1');
                if ($this->conf['geoip.']['file']) { // only if file for geoip is set
                    $this->media->init($this->conf['geoip.']['file']); // Initialize the geoip Ext
                    $this->GEOinfos = $this->media->getGeoIP($this->ipOverride ? $this->ipOverride : t3lib_div::getIndpEnv('REMOTE_ADDR')); // get all the infos of current user ip
                }
            }
        
        }
        

        【讨论】:

          【解决方案5】:

          首先,您必须在使用之前或在您的类之外包含您的插件类:

          include_once(t3lib_extMgm::extPath('myext').'pi1/class.tx_myext_pi1.php');
          

          其次在您的代码中(以 main 为例)

          $res = tx_myext_pi1::myMethod();
          

          【讨论】:

          • 它只在某些情况下有效。通常你应该使用 t3lib_div:makeInstance 而不是使用“新”或静态调用,这是 TYPO3 核心团队推荐的。