TYPO3:将参数从视图传递到控制器-无法检测到参数的参数类型

时间:2019-04-15 06:17:06

标签: typo3 fluid extbase typo3-8.x

我正在尝试将视图中的参数传递给TYPO3 8.7中的控制器,但始终出现错误:

#1253175643: The argument type for parameter $player of method Playground\Tabletennis\Controller\AdminController->playerdetailsAction() could not be detected.

玩家列表从控制器传递到视图。在那里,我将列表槽传递给了一个部分,在该部分中,我对每个循环(作为播放器)使用a来显示名称,并用link.action包围起来,该操作应将播放器再次移交给控制器。

我从queryBuilder获取播放器列表,其中包含uid和名称。遍历它们的工作原理。但是,当我单击一个名称时,会出现错误。 “更多信息”链接说,我必须手动获取参数,但是尝试$keyword = $this->request->getArgument('player');也不起作用。

AdminController.php:

/**
* action info
*
*/
public function infoAction()
{
    $players = $this->getPlayers();

    $this->view->assign('players', $players);
}

/**
* action playerdetails
*
*/
public function playerdetailsAction($player)
{
   $this->view->assign('player', $player);
}

/**
* action returnPlayers
*/
function getPlayers()
{
    $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_tabletennis_domain_model_players');
    $statement = $queryBuilder
      ->select('uid', 'name')
      ->from('tx_tabletennis_domain_model_players')
      ->addOrderBy('name', 'ASC')
      ->execute();
    while ($row = $statement->fetchAll()) {
    return $row;
    }
}

视图:


Players:
<br /><br />

<ol>

<f:for each="{players}" as="player">

    <li>
        <f:link.action action="playerdetails" arguments="{player:player}">
           <b>{player.name}</b>
        </f:link.action>
    </li>


</f:for>

</ol>

我需要的是选定玩家的uid传递给控制器​​,但不知道如何。

2 个答案:

答案 0 :(得分:1)

您需要设置函数注释中的参数类型(和/或如果它是对象作为类型提示。如果不这样做,系统将不知道该如何做) uid通过GET变量获取。在您的情况下,它将类似于:

/**
 * action playerdetails
 *
 * @param \MyVendor\MyExt\Domain\Model\Player $player
 */
public function playerdetailsAction(\MyVendor\MyExt\Domain\Model\Player $player)
{
    $this->view->assign('player', $player);
}

更改此设置后,您很可能需要先清除“安装工具”中的缓存,然后才能使用。

有关此的更多信息,您可以在这里找到:https://docs.typo3.org/typo3cms/ExtbaseFluidBook/7-Controllers/1-Creating-Controllers-and-Actions.html#flow-pattern-display-a-single-domain-object

答案 1 :(得分:0)

好,所以将参数从控制器传递到模板再传递到局部,然后又传递回控制器时出了问题。我删除了部分并将代码打包到模板中。从那里传递参数,然后我可以使用“ $ this-> request-> getArgument('player')”来获取参数。

仍然不完全知道我做错了什么,但是它可以这样工作。