我想根据一些数据动态加载插件。首先,我尝试使用Typoscript进行此操作,但是经过一些研究,我发现无法更改插件的设置(请参阅旧论坛条目)。
我需要settings.simplepoll.uid
根据传递的数据进行更改:
这是我尝试过的文字:
lib.loadSimplepoll = USER
lib.loadSimplepoll {
userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
extensionName = Simplepoll
pluginName = Polllisting
vendorName = Pixelink
switchableControllerActions {
SimplePoll {
1 = list
}
}
settings < plugin.tx_simplepoll.settings
settings {
simplepoll {
uid.current = 1
}
}
}
模板中的调用如下所示:
<f:cObject typoscriptObjectPath="lib.loadSimplepoll">{newsItem.simplepoll}</f:cObject>
弄清楚无法更改设置后,我尝试了一个viewhelper:
<?php
namespace Vendor\Extension\ViewHelpers;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class LoadSimplepollViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper
{
/**
* @param int $uid Uid of poll
* @return string
*/
public function render($uid) {
$cObj = GeneralUtility::makeInstance('TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer');
$configurationManager = GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Configuration\\ConfigurationManager');
$simplepollTs = $configurationManager->getConfiguration(
\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_SETTINGS,
'simplepoll',
'Polllisting'
);
$ttContentConfig = array(
'tables' => 'tt_content',
'source' => 1030,
'dontCheckPid' => 1
);
// returning this works perfectly!
// but I need to change the "settings.simplepoll.uid"
$data = $cObj->RECORDS($ttContentConfig);
$cObj->start($data, 'tx_simplepoll_domain_model_simplepoll');
$renderObjName = '<tt_content.list.20.simplepoll_polllisting';
$renderObjConf = $GLOBALS['TSFE']->tmpl->setup['tt_content.']['list.']['20.']['simplepoll_polllisting.'];
$renderObjConf['persistence']['storagePid'] = 394; // This does not work!
$renderObjConf['settings'] = $simplepollTs;
$renderObjConf['settings']['simplepoll']['uid'] = $uid;
return $cObj->cObjGetSingle($renderObjName, $renderObjConf);
}
}
viehelper的调用方式如下:
{vh:LoadSimplepoll(uid: '{newsItem.simplepoll}')}
现在,我可以uid
使用此行更改民意调查的:$renderObjConf['settings']['simplepoll']['uid'] = $uid;
我的问题现在是,它加载民意测验,但没有答案。我将此归结为一个事实,即该插件已经不知道Record Storage Page
了。该行$renderObjConf['persistence']['storagePid'] = 394;
无济于事。
我如何告诉插件Storage Pid
?
还是有另一种/更好的方式来加载具有更改数据的插件?
为什么不能settings.simplepoll.uid
在打字稿中进行修改?
因为扩展名simplepoll不能为其拼写设置处理任何stdWrap功能。
看一下代码:
此特殊设置在这里使用:
$simplePoll = $this->simplePollRepository->findByUid($this->settings['simplepoll']['uid']);
没有stdWrap,只是普通用法。
比较ext:news
:
在使用任何设置之前,将对其进行处理。打字稿设置与插件中的设置的专用连接。如有必要,可以使用stdWrap:此处
$this->originalSettings = $originalSettings;
// 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 . '.']
);
}
}
}
如您所见:
extbase不支持错字stdWrap功能。
您(和每个扩展作者)都需要手工完成。但是,即使在extbase之前也是如此。
这样,由于您无法配置值,因此只能欺骗TYPO3(和插件):
如果uid少,则每个uid都有一个变体
lib.loadSimplepoll123 < lib.loadSimplepoll
lib.loadSimplepoll123.settings.simplepoll.uid = 123
lib.loadSimplepoll234 < lib.loadSimplepoll
lib.loadSimplepoll234.settings.simplepoll.uid = 234
lib.loadSimplepoll345 < lib.loadSimplepoll
lib.loadSimplepoll345.settings.simplepoll.uid = 345
lib.loadSimplepoll456 < lib.loadSimplepoll
lib.loadSimplepoll456.settings.simplepoll.uid = 456
并称它为
<f:cObject typoscriptObjectPath="lib.loadSimplepoll{newsItem.simplepoll}" />
或者您构建实现stdWrap功能的拉取请求,并将其发送给扩展作者。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句