Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PSR-7 request is missing in ContentObjectRenderer #54

Open
RZivaralam opened this issue May 24, 2024 · 1 comment
Open

PSR-7 request is missing in ContentObjectRenderer #54

RZivaralam opened this issue May 24, 2024 · 1 comment

Comments

@RZivaralam
Copy link

RZivaralam commented May 24, 2024

hey, I'm using the Solr and Jumpurl plugins. for indexing queues, solr uses a CLI command and I use this CLI command too. but unfortunately, I received this error "PSR-7 request is missing in ContentObjectRenderer. Inject with start(), setRequest() or provide via $GLOBALS['TYPO3_REQUEST']."
this error is a core error in typo3\sysext\frontend\Classes\ContentObject\ContentObjectRenderer.php file.it is beacuse that $GLOBALS['TYPO3_REQUEST'] and ServerRequestInterface are not set. actually in CLI command both of $GLOBALS['TYPO3_REQUEST'] and request will not set . I thought it was a bug from Solr but I saw this discussion at TYPO3-Solr/ext-solr#2973 and they have the following claim:
"When initializing the TSFE a TYPO3_REQUEST is also initialized. A request must always have an applicationtype attribute. If no applicationType is given ApplicationType::fromRequest($GLOBALS['TYPO3_REQUEST']) can't be used and throws an exception."

and they ask us If we have troubles with third-party code, we should give the hint to the maintainer of those extensions:

I added a little code in ext/jumpurl/Classes/TypoLink/LinkModifier.php(the error was here created) and checked if $GLOBALS['TYPO3_REQUEST'] set or not and after that, I could run the CLI command in solr without any errors. My solution was just a quick fix and surely you will have a more complete solution. I would be very grateful if you write a solution for this issue in new updates, I need your plugin :)

the following codes are :
use TYPO3\CMS\Core\Http\ApplicationType;
use TYPO3\CMS\Core\Http\ServerRequest;

public function __invoke(AfterLinkIsGeneratedEvent $event): void
{

if (($GLOBALS['TYPO3_REQUEST'] ?? null)instanceof ServerRequest && ApplicationType::fromRequest($GLOBALS['TYPO3_REQUEST'])->isFrontend())
{
(this if I used before I used your code)
if ($this->isEnabled($event)) {
$url = $event->getLinkResult()->getUrl();
$context = $event->getLinkResult()->getType();
$configuration = $event->getLinkResult()->getLinkConfiguration();
$this->contentObjectRenderer = $event->getContentObjectRenderer();
$this->frontendController = $this->contentObjectRenderer->getTypoScriptFrontendController();

// Strip the absRefPrefix from the URLs.
$urlPrefix = (string)$this->getTypoScriptFrontendController()->absRefPrefix;
if ($urlPrefix !== '' && str_starts_with($url, $urlPrefix)) {
    $url = substr($url, strlen($urlPrefix));
}

// Make sure the slashes in the file URL are not encoded.
if ($context === LinkService::TYPE_FILE) {
    $url = str_replace('%2F', '/', rawurlencode(rawurldecode($url)));
}

if ($context === LinkService::TYPE_PAGE && $url === '') {
    $url = '/';
}

$urlParameters = ['jumpurl' => $url];

$jumpUrlConfig = $configuration['jumpurl.'] ?? [];

// see if a secure File URL should be built
if (!empty($jumpUrlConfig['secure'])) {
    $secureParameters = $this->getParametersForSecureFile(
        $url,
        $jumpUrlConfig['secure.'] ?? []
    );
    $urlParameters = array_merge($urlParameters, $secureParameters);
} else {
    $urlParameters['juHash'] = JumpUrlUtility::calculateHash($url);
}

$typoLinkConfiguration = [
    'parameter' => $this->getTypoLinkParameter($jumpUrlConfig),
    'additionalParams' => GeneralUtility::implodeArrayForUrl('', $urlParameters),
];

$jumpurl = $this->getContentObjectRenderer()->typoLink_URL($typoLinkConfiguration);

// Now add the prefix again if it was not added by a typolink call already.
if ($urlPrefix !== '') {
    if (!str_starts_with($jumpurl, $urlPrefix)) {
        $jumpurl = $urlPrefix . $jumpurl;
    }
    if (!str_starts_with($url, $urlPrefix)) {
        $url = $urlPrefix . $url;
    }
}
$event->setLinkResult($event->getLinkResult()->withAttributes(['href' => $jumpurl, 'jumpurl' => $url]));

}
}

@klodeckl
Copy link

Same here. The fix works for me. Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants