FLUID TYPO3中的表单对象出错

时间:2013-07-19 10:17:19

标签: php typo3 fluid extbase

我创建了一个名为Play的自定义模型,它具有带有getter和setter的属性TitleBody

在我的某个控制器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;

}

2 个答案:

答案 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');
}