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?
3 Réponses :
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
.
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
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é.
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.
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.
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à.