TYPO3: передача аргумента из представления в контроллер — не удалось определить тип аргумента для параметра

#typo3 #fluid #extbase #typo3-8.x

#typo3 #fluid #extbase #typo3-8.x

Вопрос:

Я пытаюсь передать аргумент из представления в контроллер в TYPO3 8.7, но продолжаю получать ошибку:

#1253175643: The argument type for parameter $player of method PlaygroundTabletennisControllerAdminController->playerdetailsAction() could not be detected.

Список игроков передается из контроллера в представление. Там я передаю корыто списка частичному, в котором я использую для каждого цикла (как player) для отображения имен, окруженных link.action, который должен снова перевести player на контроллер.

Я получаю список игроков из QueryBuilder и содержит uid и name. Итерация через них работает. Но когда я нажимаю на имя, я получаю сообщение об ошибке. Ссылка «дополнительная информация» гласит, что я должен получить аргумент вручную, но попытка $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 выбранного проигрывателя, переданный контроллеру, но не знаю как.

Комментарии:

1. не могли бы вы поделиться именами ваших таблиц?

Ответ №1:

Вам нужно установить, какой тип параметра находится в аннотации функции (и / или, если это объект, в качестве подсказки типа. Если вы этого не сделаете, система не будет знать, что делать с uid, который она получает через переменную GET. В вашем случае это сделало бы что-то вроде:

 /**
 * action playerdetails
 *
 * @param MyVendorMyExtDomainModelPlayer $player
 */
public function playerdetailsAction(MyVendorMyExtDomainModelPlayer $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. Не имеет значения, какую комбинацию я пробую, все сводится к этой ошибке: #1297759968: Исключение при сопоставлении свойств в пути к свойству «»: не разрешено сопоставлять свойство «uid». Вам нужно использовать $propertyMappingConfiguration-> allowProperties(‘uid’), чтобы включить сопоставление этого свойства. Разрешение всех свойств просто приводит к новой ошибке, для создания объекта должно быть установлено значение true в propertyMappingConfiguration . После нескольких попыток я не смог перейти к следующей ошибке, так что я все еще застрял.

2. Теперь я вижу, что вы не используете репозиторий для получения объектов модели для игроков. У вас есть модель для этого или вы делаете все с помощью QueryBuilder внутри контроллера?

Ответ №2:

Итак, что-то пошло не так при передаче аргументов от контроллера к шаблону к частичному, а затем обратно к контроллеру. Я удалил частичное и упаковал код в шаблон. Оттуда передается аргумент, и я могу получить аргумент с помощью «$this-> request-> getArgument (‘player’)».

До сих пор точно не знаю, что я сделал не так, но это работает так.