我创建了一个名为Play
的自定义模型,它具有带有getter和setter的属性Title
和Body
。
在我的某个控制器Master
中,我有new and create actions
public function newAction(\TYPO3\Playground\Domain\Model\Play $newPlay = NULL) {
$this->view->assign('newPlay', $newPlay);
}
我的观点如下:
<table>
<f:form action="create" name="newPlay" object="{newPlay}">
<th>Title:</th>
<td>
<f:form.textfield property="title"/>
</td>
<th>Body:</th>
<td>
<f:form.textarea property="body"/>
</td>
</th>
<tr>
<td>
<f:form.submit value="Create"/>
</td>
</tr>
</f:form>
</table>
但是在我在控制器中的创建函数中我得到此错误必需参数“newPlay”未设置。
public function createAction(\TYPO3\Playground\Domain\Model\Play $newPlay) {
echo $newPlay->getBody();
echo $newPlay->getTitle();
}
我在这里遗漏了什么吗?
更新
将名称与对象匹配并删除字段属性的括号后,这是错误:
属性路径中的属性映射异常“”:找不到可用于从“数组”转换为“TYPO3 \ Playground \ Domain \ Model \ Play”的转换器。
我的解决方案
我非常肯定有一种比这更好的方式
public function createAction() {
$newPlayArray=$this->request->getArgument('newPlay');
$newPlay = json_decode(json_encode($newPlayArray), FALSE);
echo $newPlay->title;
}
答案 0 :(得分:3)
表单的名称必须与对象
匹配<f:form action="create" name="newPlay" object="{newPlay}">
用于设置字段的名称。
<强>更新强>
您是否设置了PHPDoc评论?这些是Extbase开发所必需的,也是非常重要的。 例如:
/**
* @param \TYPO3\Playground\Domain\Model\Play $newPlay
* @dontvalidate $newPlay
*/
public function newAction(\TYPO3\Playground\Domain\Model\Play $newPlay = NULL) {
$this->view->assign('newPlay', $newPlay);
}
答案 1 :(得分:0)
尝试始终将对象传递给视图。在您的情况下,您很可能传递NULL:
/**
* @param \TYPO3\Playground\Domain\Model\Play $newPlay
* @dontvalidate $newPlay
* @return void
*/
public function newAction(\TYPO3\Playground\Domain\Model\Play $newPlay = NULL) {
if (is_null($newPlay)) {
$newPlay = $this->objectManager->create('TYPO3\Playground\Domain\Model\Play');
}
$this->view->assign('newPlay', $newPlay);
}
保持表单不变,只需获取createAction中的对象:
/**
* @param \TYPO3\Playground\Domain\Model\Play $newPlay
* @return void
*/
public function createAction(\TYPO3\Playground\Domain\Model\Play $newPlay) {
$this->playRepository->add($newPlay);
$this->redirect('anyAction');
}