3
votes

TYPO3: Rendre un plugin via Typoscript ou ViewHelper et modifier les paramètres

Je voudrais charger un plugin dynamiquement en fonction de certaines données. J'ai d'abord essayé de le faire avec Typoscript, mais après quelques recherches, j'ai compris qu'il n'était pas possible de modifier les paramètres du plugin ( voir l'ancienne entrée du forum ).

Je dois changer settings.simplepoll.uid code > selon les données transmises:

Voici le Typoscript que j'ai essayé:

{vh:LoadSimplepoll(uid: '{newsItem.simplepoll}')}

L'appel dans le modèle ressemble à ça:

XXX

Après avoir compris que changer les paramètres n'est pas possible, j'ai essayé un 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);
    }
}

Le viehelper est appelé comme ceci:

<f:cObject typoscriptObjectPath="lib.loadSimplepoll">{newsItem.simplepoll}</f:cObject>

Je suis maintenant en mesure de modifier l ' uid du sondage avec cette ligne: $ renderObjConf ['settings'] ['simplepoll'] ['uid'] = $ uid;

Mon problème est maintenant, qu'il charge le sondage, mais pas les réponses . J'ai retracé cela jusqu'au fait que le plugin ne connaît plus la page de stockage des enregistrements . La ligne $ renderObjConf ['persistence'] ['storagePid'] = 394; n'aide pas.

Comment puis-je indiquer au plugin le code Storage Pid >?

Ou y a-t-il une autre / meilleure façon de charger un plugin avec des données changeantes?


0 commentaires

3 Réponses :


0
votes

Pourquoi ne serait-il pas possible de modifier settings.simplepoll.uid dans typoscript?
vous avez juste besoin de la construction correcte pour le modifier.

Pour une valeur unique, vous pouvez utiliser current , mais utilisez-le correctement. C'est une fonction stdWrap qui doit être évaluée.
S'il n'y a pas d'évaluation stdWrap par défaut, cela peut fonctionner avec un cObject de type TEXT

lib.arraytest = COA
lib.arraytest {
  10 = TEXT
  10.field = a
  10.wrap = /|/

  20 = TEXT
  20.field = b
  20.wrap = \|\
}

ou pour indiquer un stdWrap , vous devez utiliser stdWrap littéralement:

<f:cObject typoscriptObjectPath="lib.arraytest" data="{a:'abc',b:'xyz'}" >
    inside text
</f:cObject>

une autre variante de le transfert de données sont des paramètres nommés. Construisez simplement un tableau associatif comme paramètre de données et accédez aux valeurs individuelles:

fluid:

settings.simplepoll.uid.stdWrap.current = 1

et le typoscript:

settings.simplepoll.uid.cObject = TEXT
settings.simplepoll.uid.cObject.current = 1

qui aboutit à une sortie de / abc / \ xyz \ . Attention: le texte interne de la balise f: cobject sera perdu car le paramètre data a la priorité sur les enfants internes .


5 commentaires

Je pense que j'ai déjà essayé les deux versions (car elles sont mentionnées dans le message du forum lié) et aucune ne fonctionne: settings.simplepoll.uid.stdWrap.current = 1 donnera un tableau pour $ this -> settings ['simplepoll'] dans le SimplePollController ( ['uid'] ['stdWrap'] ['current'] = 1 ) et settings.simplepoll.uid.cObject = TEXT ... génère une erreur SQL: SELECT tx_simplepoll_domain_model_simplepoll. * FROM tx_simplepoll_domain_model_simplepoll WHERE tx_simplepoll_domain_model_simplepoll.uid = '1', 'TEXT_domain_model_simplepoll WHERE tx_simplepoll_domain_model_simplepoll.uid =' 1 ',' TEXT_domain 'AND tximple_simple =' 1 ',' TEXT_domain_simple = '1', 'TEXT_domain_simple.


settings.simplepoll.uid n'a probablement pas stdWrap. cObject nécessite également stdWrap.


dans le message du forum, le dernier message donne une solution que je doute comme override également basée sur stdWrap . Avez-vous essayé d'utiliser override.cobject.TEXT ? (au moment du rendu, tous les objets temp. * n'existent plus. L'opérateur < copie le typoscript et il est donc à nouveau typoscript, uniquement avec un override < / code>)


@ BerndWilkeπφ J'ai essayé settings.simplepoll.useStdWrap = uid settings.simplepoll {uid.override.cObject sans chance. temp.pollUid renvoie l'uid du sondage. Est-ce que je fais quelque chose de mal? Merci encore pour votre aide!


J'ai ajouté une autre réponse car pour ce cas (ext: simplepoll) il ne semble y avoir aucun support pour une flexibilité.



1
votes

Pourquoi ne serait-il pas possible de modifier settings.simplepoll.uid dans typoscript?

parce que l'extension simplepoll ne gère aucune fonctionnalité stdWrap dans ses paramètres de typographie.

Jetez un œil au code:
ce paramètre spécial est utilisé icif :

<f:cObject typoscriptObjectPath="lib.loadSimplepoll{newsItem.simplepoll}" />

pas de stdWrap, juste un usage ordinaire.

comparez-le à ext: news :

avant que tout paramètre ne soit utilisé, il est traité. Une jointure dédiée des paramètres de typoscript avec les paramètres du plugin. Et si nécessaire, il y a un stdWrap possible: ici a>

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

Comme vous pouvez le voir:
extbase ne vous prend pas en charge avec la fonctionnalité stdWrap de typoscript.
Vous (et chaque auteur d'extension) devez le faire à la main. Mais c'était le cas même avant extbase.

De cette façon: comme vous ne pouvez pas configurer votre valeur, vous ne pouvez tromper TYPO3 (et le plugin):
si vous avez un petit nombre d'uids, vous pouvez avoir une variante pour chaque uid

    $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 . '.']
                );
            }
        }
    }

et l'appeler comme

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

ou vous créez une pull request mettant en œuvre la fonctionnalité stdWrap et l'envoyez à l'auteur de l'extension.


1 commentaires

Wow, merci beaucoup pour vos recherches et votre aide! Avec un code modifié de l'extension de nouvelles mentionnée ci-dessus, cela fonctionne. Conclusion pour moi: il n'est par défaut pas possible de modifier les paramètres lors du chargement d'une extension via Typoscript.



0
votes

En attendant, j'ai fait fonctionner le Viewhelpter:

Viewhelper:

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

Appelez le viewhelper dans le modèle (n'oubliez pas d'enregistrer l'espace de noms):

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

Voilà.


0 commentaires