TYPO3: визуализируйте плагин через Typoscript или ViewHelper и измените настройки - PullRequest
1 голос
/ 05 марта 2019

Я хотел бы загрузить плагин динамически в соответствии с некоторыми данными.Сначала я попытался сделать это с 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?

Или есть другой / лучший способ загрузить плагин с изменяющимися данными?

Ответы [ 3 ]

0 голосов
/ 06 марта 2019

Почему нельзя изменить settings.simplepoll.uid в опечатке?

, поскольку расширение simplepoll не обрабатывает какие-либо функциональные возможности stdWrap в своих настройках опечатки.

Посмотрите код:
эта специальная настройка используется здесь :

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

без stdWrap, просто простое использование.

сравните его с ext:news:

, прежде чем какие-либо настройки будут использованы, он будет обработан.Выделенное соединение настроек Typoscript с настройками в плагине.И если необходимо, возможен 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 не поддерживает вас с функцией typoscript stdWrap.
Вы (и каждыйрасширение автора) нужно сделать это вручную.Но это было так еще до extbase.

Таким образом: поскольку вы не можете настроить свое значение, вы можете обмануть только TYPO3 (и плагин):
если у вас есть небольшое количество идентификаторов, которые вы можете иметьодин вариант для каждого идентификатора пользователя

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, и отправьте его автору расширения.

0 голосов
/ 13 марта 2019

Тем временем я заставил Viewhelpter работать:

ViewHelper:

<?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);
    }
}

Вызовите помощник вида в шаблоне (не забудьте зарегистрировать пространство имен):

{vh:LoadSimplepoll(simplepollUid: '{newsItem.ipgSimplepoll}')}

Вот и все.

0 голосов
/ 05 марта 2019

Почему нельзя изменить settings.simplepoll.uid в опечатке?
вам просто нужна правильная конструкция, чтобы изменить ее.

Для одного значения вы можете использовать current, но используйте его правильно. Это функция stdWrap, которую необходимо оценить.
Если по умолчанию нет оценки stdWrap, она может работать с cObject типа TEXT

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.

...