1

我创建了一个名为的自定义模型Play,它具有属性Title以及Bodygetter 和 setter。

在我的一个控制器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();
}

我在这里错过了什么吗?

更新

在将名称与对象匹配并删除字段属性的括号后,这是错误:

属性路径“”的属性映射时出现异常:未找到可用于从“array”转换为“TYPO3\Playground\Domain\Model\Play”的转换器。

我的解决方案

我很确定有比这更简洁的方法

public function createAction() {

    $newPlayArray=$this->request->getArgument('newPlay');
    $newPlay = json_decode(json_encode($newPlayArray), FALSE);
    echo $newPlay->title;

}
4

2 回答 2

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);
}
于 2013-07-19T11:01:02.290 回答
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');
}
于 2013-11-02T10:59:29.173 回答