Auf Stefans TYPO3 Seite https://www.typo3lexikon.de/typo3-tutorials/ajax/eid-beispiele.html wird beschrieben wie man mit einer eID AJAX in einem Plugin zu realisieren.
ext_localconf.php
$GLOBALS['TYPO3_CONF_VARS']['FE']['eID_include'] = ['KKSoftwareIndexController::storeSession' => \KKSoftware\Kksession\Ajax\Session::class . '::storeSession'];
Session.php
<?php
namespace KKSoftware\Kksession\Ajax;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Extbase\Utility\DebuggerUtility;
class Session {
public function storeSession(ServerRequestInterface $request, ResponseInterface $response) {
$response->getBody()->write(json_encode($GLOBALS['TSFE']));
return $response;
}
}
main.js
$().ready(function() {
$.ajax({
url: 'index.php',
method: 'POST',
data: 'eID=KKSoftwareIndexController::storeSession',
success: function(result) {
console.log(result);
}
});
});
Die Konsolenausgabe ist ein leeres Array.
Warum kann ich hier nicht auf das TSFE-Array zugreifen?
Hintergrund:
Ich möchte gerne per $GLOBALS['TSFE']->fe_user auf die Session lesend und schreibend zugreifen.
Teilerfolg!!
Meine Session.php sieht jetzt so aus:
<?php
use TYPO3\CMS\Core\Utility\GeneralUtility;
$returnData = null;
$TSFE = \TYPO3\CMS\Core\Utility\GeneralUtility::_GP('TSFE');
if (!$TSFE) {
/** @var \TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController $TSFE */
$TSFE = GeneralUtility::makeInstance(
'TYPO3\\CMS\\Frontend\\Controller\\TypoScriptFrontendController',
$TYPO3_CONF_VARS,
0,
0
);
$TSFE->initFEuser();
$returnData['TSFE'] = $TSFE;
}
$type = \TYPO3\CMS\Core\Utility\GeneralUtility::_GP('action');
switch ($type) {
case 'lese':
$returnData['value'] = $TSFE->fe_user->getKey('ses', 'test');
break;
case 'schreibe':
$value = \TYPO3\CMS\Core\Utility\GeneralUtility::_GP('input');
$TSFE->fe_user->setKey('ses', 'test', $value);
break;
}
echo json_encode($returnData);
Und mein JS
var TSFE = null;
$().ready(function() {
$('button').on('click', function() {
var type = $(this).attr('id');
var inputData = $('#testinput').val();
$.ajax({
url: 'index.php',
method: 'POST',
data: {
'eID': 'KKSoftwareIndexController::storeSession',
'input': inputData,
'action': type,
'TSFE': TSFE
},
success: function(result) {
result = jQuery.parseJSON(result);
TSFE = result.TSFE;
if (type == 'lese') {
alert(result.value);
}
}
});
});
});
Und so sieht mein HTML zum Testen aus:
<input type="text" id="testinput"></input><button type="button" id="schreibe">Schreibe</button><br/><button type="button" id="lese">Lese</button>
Das Problem dabei:
Beim 1. Ajax-Call ist TSFE leer - ok
Beim 2. Ajax-Call ist TSFE gefüllt - ok
In StoreSession.php kommt aber ein Array an - also vom Typ her (entspricht zwar dem TFSE das von initFEuser() erzeugt wird, ist aber nur ein Array und nicht ein Objekt vom Typ TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController).
Also mein bisheriges Problem scheint nur noch zu sein aus dem Array ein Objekt zu machen.
Ich habe eine Lösung mit "normalem" Ajax (also mit uri.action und ohne eID) gefunden.
Guckst du hier:
#126073