【问题标题】:TYPO3: Render a plugin via Typoscript or ViewHelper and change settingsTYPO3:通过 Typoscript 或 ViewHelper 渲染插件并更改设置
【发布时间】:2019-03-05 10:33:52
【问题描述】:

我想根据一些数据动态加载插件。首先我尝试用 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>

在弄清楚无法更改设置后,我尝试了查看助手:

<?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?

或者是否有另一种/更好的方法来加载具有变化数据的插件?

【问题讨论】:

    标签: typo3 typoscript extbase view-helpers


    【解决方案1】:

    为什么不能在打字稿中修改settings.simplepoll.uid?

    因为扩展 simplepoll 不处理任何 stdWrap 功能到它的打字稿设置。

    查看代码:
    这个特殊设置使用here:

    $simplePoll = $this->simplePollRepository->findByUid($this->settings['simplepoll']['uid']);
    

    没有 stdWrap,只是简单的用法。

    与ext:news比较:

    在使用任何设置之前,都会对其进行处理。排版设置与插件中设置的专用连接。如有必要,可以使用 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 功能的拉取请求并将其发送给扩展作者。

    【讨论】:

    • 哇,非常感谢您的研究和帮助!使用上述新闻扩展的修改代码,它正在工作。对我的结论:默认情况下,通过 Typoscript 加载扩展时无法更改设置。
    【解决方案2】:

    为什么不能修改打字稿中的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.stdWrap.current = 1 将导致 $this->settings['simplepoll' 的数组] 在 SimplePollController (['uid']['stdWrap']['current']=1) 和 settings.simplepoll.uid.cObject = TEXT ... 生成 SQL 错误:SELECT tx_simplepoll_domain_model_simplepoll.* FROM tx_simplepoll_domain_model_simplepoll WHERE tx_simplepoll_domain_model_simplepoll.uid = '1','TEXT' AND tx_simplepoll_domain_model_simplepoll.deleted=0 ...
    • settings.simplepoll.uid 可能没有 stdWrap。 cObject 也需要 stdWrap。
    • 在论坛帖子中,最后一个帖子给出了一个我怀疑的解决方案,因为override 也基于stdWrap。您是否尝试过使用override.cobject.TEXT? (在渲染时,所有temp.* 对象都不再存在。&lt; 操作符复制了打字稿,所以它又是打字稿,只有override)
    • @BerndWilkeπφ 我试过settings.simplepoll.useStdWrap = uid settings.simplepoll { uid.override.cObject &lt; temp.pollUid } 没有运气。 temp.pollUid 返回投票的 uid。难道我做错了什么?再次感谢您的帮助!
    • 我为这种情况添加了另一个答案(ext:simplepoll),似乎不支持任何灵活性。
    【解决方案3】:

    与此同时,我让 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}')}
    

    就是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多