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
方法。有关示例,请参阅 。
当有人访问详情页面但没有记录或记录不可用时,如何重定向到另一个页面?
我有像
这样的详细记录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
方法。有关示例,请参阅