2

如何从 Extbase 调用ContentObjectRenderer方法stdWrap

pi_base 插件的设置是:

plugin.tx_myextension {
    standard = TEXT
    standard.value = Sorry, no data could be fetched!
}

在没有 Extbase 的 TYPO3 扩展中,您拥有$conf带有键的数组

'standard' =>
     'TEXT' (string)

和钥匙

 'standard.' => 
      'value' (array) =>
          'Sorry, no data could be fetched!'. 

然后通过以下方式调用该方法:

$out =
    $cObj->stdWrap(
        $conf['standard'],
        $conf['standard.']
    );

这将呈现所需的文本“抱歉,无法获取数据!” 进入$out.

但是在 Extbase 中,您没有这种方式的 $conf 数组。Exbase 提供$this->settings用于存储设置的设置部分。

plugin.tx_myextension {
    settings {
        standard = TEXT
        standard.value = Sorry, no data could be fetched!
    }
}

Extbase 内部将标准设置存储为包含以下数据的二维数组:

'standard' 
   => 'value' (Array) 
       => 'Sorry, no data could be fetched!'

'standard' 
   => '_typoScriptNodeValue' (Array) 
       => 'TEXT'

我已经尝试过这种方式($conf = $this->settings):

$out =
    $cObj->stdWrap(
        '',
        $conf['standard']
    );

我试过这个:

$out =
    $cObj->stdWrap(
        $conf['standard']['_typoScriptNodeValue'],
        $conf['standard']
    );

但结果只是一个空字符串。

使用 Extbase 完成 std​​Wrap 渲染的推荐方法是什么?

4

2 回答 2

1

也许看看新闻扩展会有所帮助。IMO 这是一种适当、灵活的方式,没有太多开销。

    // Use stdWrap for given defined settings

    if (isset($originalSettings['useStdWrap']) && !empty($originalSettings['useStdWrap'])) {
        $typoScriptService = GeneralUtility::makeInstance(TypoScriptService::class);
        $typoScriptArray = $typoScriptService->convertPlainArrayToTypoScriptArray($originalSettings);
        $stdWrapProperties = GeneralUtility::trimExplode(',', $originalSettings['useStdWrap'], true);
        foreach ($stdWrapProperties as $key) {
            if (is_array($typoScriptArray[$key . '.'])) {
                $originalSettings[$key] = $this->configurationManager->getContentObject()->stdWrap(
                    $typoScriptArray[$key],
                    $typoScriptArray[$key . '.']
                );
            }
        }
    }

    // start override
    if (isset($tsSettings['settings']['overrideFlexformSettingsIfEmpty'])) {
        $typoScriptUtility = GeneralUtility::makeInstance(TypoScript::class);
        $originalSettings = $typoScriptUtility->override($originalSettings, $tsSettings);
    }

    // ...

    $this->settings = $originalSettings;

摘自https://github.com/georgringer/news/blob/main/Classes/Controller/NewsController.php#L658-L688的片段

于 2022-02-16T11:00:41.797 回答
1

基本上$cObj->stdWrap只支持stdWrap指令 - 但是,您使用的是cObject指令 (with TEXT)

让我们假设您settings在 TypoScript 中看起来像这样:

plugin.tx_myextension {
    settings {
        standard {
          # cObject is a stdWrap function
          # (that was the missing piece)
          cObject = TEXT
          cObject.value = Sorry, no data could be fetched!
        }
    }
}

Extbase 控制器内部$this->settings保存了 TypoScript 路径的所有数据,plugin.tx_myextension.settings如前面的示例所示 - 并且该结构已被转换为“普通数组”。

因此,在控制器动作中,事情看起来像这样:

public function myAction()
{
    // consider using dependency-injection instead
    $typoScriptService = GeneralUtility::makeInstance(\TYPO3\CMS\Core\TypoScript\TypoScriptService::class);
    // converting "plain array" back to TypoScript array
    $typoScriptArray = $typoScriptService->convertPlainArrayToTypoScriptArray($this->settings['standard']);

    // invoking stdWrap instruction    
    $cObj = $this->configurationManager->getContentObject();
    $out = $cObj->stdWrap('', $typoScriptArray);
    // ...
}

其他注意事项:

  • 在 Extbase 中,来自 TypoScript 的插件设置和特定插件的潜在 FlexForm 设置被合并
    • →确保在“执行”它作为指令之前保持范围分离
    • → 否则编辑器可能能够stdWrap通过 FlexForm 触发函数
    • 那将是“注入”和安全漏洞
  • 例如使用plugin.tx_myextension.instructions专用于例如stdWrap,而不是把所有东西都放在plugin.tx_myextension.settings
  • 通常考虑将与视图相关的方面移动到相应的视图或流体模板,例如在那里使用f:cObject视图助手
于 2022-02-16T11:13:08.787 回答