TYPO3 扩展 - 如果没有设置记录或不可用,则重定向到显示操作中的另一个页面

TYPO3 Extension - Redirect to another page in show action if no record is set or not available

当有人访问详情页面但没有记录或记录不可用时,如何重定向到另一个页面?

我有像

这样的详细记录
domain.com/abc/ABC1234

当有人进入时

domain.com/abc/

...我得到:

Uncaught TYPO3 Exception
#1298012500: Required argument "record" is not set for Vendor\Extension\Controller\ActionController->show. (More information)

TYPO3\CMS\Extbase\Mvc\Controller\Exception\RequiredArgumentMissingException thrown in file
/is/htdocs/www/typo3_src-8.7.11/typo3/sysext/extbase/Classes/Mvc/Controller/AbstractController.php in line 425. 

...在这种情况下,我希望它重定向到:

domain.com/other-page/

...如果特定记录不可用,我也需要它。
... 怎么做?

/**
 * action show
 *
 * @param \Action $record
 * @return void
 */
public function showAction(Action $record) {

    $this->view->assign('record', $record);

}

这里有一些例子 ...但不确定如何实现它

编辑:有效的是...

/**
 * action show
 *
 * @param \Action $record
 * @return void
 */
public function showAction(Action $record=null) {   

  if ($record === null) { 
    $pageUid = 75;
    $uriBuilder = $this->uriBuilder;
    $uri = $uriBuilder
      ->setTargetPageUid($pageUid)
      ->build();
    $this->redirectToUri($uri, 0, 404);
  } else {
    $this->view->assign('record', $record);

  }

}

这可能是一个解决方案:

``` /** * 显示一个预订对象 * * @return无效 * @throws \TYPO3\CMS\Extbase\Mvc\Exception\NoSuchArgumentException */

public function showAction()
{
    $bookingObject = null;
    $bookingObjectUid = 0;
    if ($this->request->hasArgument('bookingObject')) {
        $bookingObjectUid = (int)$this->request->getArgument('bookingObject');
    }
    if ($bookingObjectUid > 0) {
        $bookingObject = $this->bookingObjectRepository->findByIdentifier($bookingObjectUid);
    }
    if (!($bookingObject instanceof BookingObject)) {
        $messageBody = 'Booking object can\'t be displayed.';
        $messageTitle = 'Error';
        $this->addFlashMessage($messageBody, $messageTitle, AbstractMessage::ERROR);
        $this->redirect('list');
    }
    $this->view->assign('bookingObject', $bookingObject);
}

```

这应该可以解决问题:

public function showAction(Action $record=null) {
  if ($record === null) { 
    $this->redirect(/* add parameters as needed */); 
  } else {
    // other code
  }

备选方案(来自 Simon Oberländer)

public function intializeShowAction() {
  if (!$this->request->hasArgument('record')) {
    $this->redirect(/* add parameters as needed */); // stops further execution
  }
}

你的问题表明应该有一个没有参数的其他动作,可能是一个 listAction,这是默认动作。未指定操作时将调用默认操作。这是 ExtensionUtility::configurePlugin() 调用中的第一个动作。

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
    'Vendor.' . $_EXTKEY,
    'Pluginname',
    array(
        'Domainobject' => 'list, show',
    ),
    // non-cacheable actions
    array(
        'Domainobject' => 'list, show',
    )
);

关于 > 身份 属性 "TTTT" 没有 UID

你必须区分无参数和无效参数。对于后者,您可以将 @ignorevalidation 添加到 showAction 注释并在操作中进行验证测试 - 或者您可以将其留给 extbase 以显示您看到的错误消息。 你从哪里得到一个 link 这样的域。com/abc/TTTT/ 无论如何?除非 link 已过期。

顺便说一句:在生产系统中,您可以禁用异常显示,这样网站的显示就可以了。

redirect 方法需要一个动作和控制器参数。所以你的重定向代码是错误的。

$this->redirect($actionName, $controllerName = NULL, $extensionName = NULL, array $arguments = NULL, $pageUid = NULL, $delay = 0, $statusCode = 303); 

要重定向到 PageUID,您需要使用 uriBuilder 和 redirectToUri 方法。有关示例,请参阅