#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’)».
До сих пор точно не знаю, что я сделал не так, но это работает так.