TYPO3:通过 Typoscript 或 ViewHelper 呈现插件并更改设置
TYPO3: Render a plugin via Typoscript or ViewHelper and change settings
我想根据一些数据动态加载一个插件。首先,我尝试使用 Typoscript 来实现,但经过一些研究后我发现,无法更改插件的设置 (see old forum entry)。
我需要根据传入的数据更改settings.simplepoll.uid
:
这是我试过的 Typoscript:
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
?
或者是否有 another/better 加载带有变化数据的插件的方法?
为什么不能修改拼写错误的 settings.simplepoll.uid
?
你只需要正确的构造来修改它。
对于单个值,您可以使用 current
,但要正确使用。这是一个需要评估的 stdWrap 函数。
如果默认情况下没有 stdWrap
评估,它可能适用于 TEXT
类型的 cObject
settings.simplepoll.uid.cObject = TEXT
settings.simplepoll.uid.cObject.current = 1
或表示 stdWrap
您需要按字面意思使用 stdWrap
:
settings.simplepoll.uid.stdWrap.current = 1
数据传输的另一种变体是命名参数。只需构建一个关联数组作为数据参数并访问各个值:
流体:
<f:cObject typoscriptObjectPath="lib.arraytest" data="{a:'abc',b:'xyz'}" >
inside text
</f:cObject>
和打字错误:
lib.arraytest = COA
lib.arraytest {
10 = TEXT
10.field = a
10.wrap = /|/
20 = TEXT
20.field = b
20.wrap = \|\
}
这导致输出 /abc/\xyz\
。请注意:f:cobject
标签的内部文本将丢失,因为数据参数具有关于 inner children
.
的优先级
为什么不能在打字稿中修改 settings.simplepoll.uid
?
因为扩展 simplepoll 不处理任何 stdWrap 功能到它的错字设置。
查看代码:
使用此特殊设置 here:
$simplePoll = $this->simplePollRepository->findByUid($this->settings['simplepoll']['uid']);
没有 stdWrap,只是简单的用法。
与ext:news
比较:
在使用任何设置之前都会对其进行处理。 typoscript 设置与插件中的设置的专用连接。如果需要,可以使用 stdWrap:here
$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 功能的拉取请求并将其发送给扩展作者。
与此同时,我让 Viewhelpter 开始工作:
查看助手:
<?php
namespace Vendor\Extension\ViewHelpers;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class LoadSimplepollViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper
{
/**
* @return void
*/
public function initializeArguments()
{
parent::initializeArguments();
$this->registerArgument('simplepollUid', 'int', 'Uid of simplepoll', false);
}
/**
* @return string
*/
public function render()
{
$configurationManager = GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Configuration\ConfigurationManager');
$simplepollTs = $configurationManager->getConfiguration(
\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_SETTINGS,
'simplepoll',
'Polllisting');
$cObj = GeneralUtility::makeInstance('TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer');
$renderObjName = '<tt_content.list.20.simplepoll_polllisting';
$renderObjConf = $GLOBALS['TSFE']->tmpl->setup['tt_content.']['list.']['20.']['simplepoll_polllisting.'];
$renderObjConf['settings'] = $simplepollTs;
$renderObjConf['settings']['simplepoll']['uid'] = (int)$this->arguments['simplepollUid'];
return $cObj->cObjGetSingle($renderObjName, $renderObjConf);
}
}
在模板中调用viewhelper(别忘了注册命名空间):
{vh:LoadSimplepoll(simplepollUid: '{newsItem.ipgSimplepoll}')}
就是这样。
我想根据一些数据动态加载一个插件。首先,我尝试使用 Typoscript 来实现,但经过一些研究后我发现,无法更改插件的设置 (see old forum entry)。
我需要根据传入的数据更改settings.simplepoll.uid
:
这是我试过的 Typoscript:
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
?
或者是否有 another/better 加载带有变化数据的插件的方法?
为什么不能修改拼写错误的 settings.simplepoll.uid
?
你只需要正确的构造来修改它。
对于单个值,您可以使用 current
,但要正确使用。这是一个需要评估的 stdWrap 函数。
如果默认情况下没有 stdWrap
评估,它可能适用于 TEXT
cObject
settings.simplepoll.uid.cObject = TEXT
settings.simplepoll.uid.cObject.current = 1
或表示 stdWrap
您需要按字面意思使用 stdWrap
:
settings.simplepoll.uid.stdWrap.current = 1
数据传输的另一种变体是命名参数。只需构建一个关联数组作为数据参数并访问各个值:
流体:
<f:cObject typoscriptObjectPath="lib.arraytest" data="{a:'abc',b:'xyz'}" >
inside text
</f:cObject>
和打字错误:
lib.arraytest = COA
lib.arraytest {
10 = TEXT
10.field = a
10.wrap = /|/
20 = TEXT
20.field = b
20.wrap = \|\
}
这导致输出 /abc/\xyz\
。请注意:f:cobject
标签的内部文本将丢失,因为数据参数具有关于 inner children
.
为什么不能在打字稿中修改 settings.simplepoll.uid
?
因为扩展 simplepoll 不处理任何 stdWrap 功能到它的错字设置。
查看代码:
使用此特殊设置 here:
$simplePoll = $this->simplePollRepository->findByUid($this->settings['simplepoll']['uid']);
没有 stdWrap,只是简单的用法。
与ext:news
比较:
在使用任何设置之前都会对其进行处理。 typoscript 设置与插件中的设置的专用连接。如果需要,可以使用 stdWrap:here
$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 功能的拉取请求并将其发送给扩展作者。
与此同时,我让 Viewhelpter 开始工作:
查看助手:
<?php
namespace Vendor\Extension\ViewHelpers;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class LoadSimplepollViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper
{
/**
* @return void
*/
public function initializeArguments()
{
parent::initializeArguments();
$this->registerArgument('simplepollUid', 'int', 'Uid of simplepoll', false);
}
/**
* @return string
*/
public function render()
{
$configurationManager = GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Configuration\ConfigurationManager');
$simplepollTs = $configurationManager->getConfiguration(
\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_SETTINGS,
'simplepoll',
'Polllisting');
$cObj = GeneralUtility::makeInstance('TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer');
$renderObjName = '<tt_content.list.20.simplepoll_polllisting';
$renderObjConf = $GLOBALS['TSFE']->tmpl->setup['tt_content.']['list.']['20.']['simplepoll_polllisting.'];
$renderObjConf['settings'] = $simplepollTs;
$renderObjConf['settings']['simplepoll']['uid'] = (int)$this->arguments['simplepollUid'];
return $cObj->cObjGetSingle($renderObjName, $renderObjConf);
}
}
在模板中调用viewhelper(别忘了注册命名空间):
{vh:LoadSimplepoll(simplepollUid: '{newsItem.ipgSimplepoll}')}
就是这样。