【问题标题】:Error in Form Objects in FLUID TYPO3FLUID TYPO3 中的表单对象错误
【发布时间】:2013-07-18 14:18:45
【问题描述】:

我创建了一个名为Play 的自定义模型,它具有TitleBody 属性以及getter 和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;

}

【问题讨论】:

    标签: php typo3 fluid extbase


    【解决方案1】:

    表单名称必须与对象匹配

    <f:form action="create" name="newPlay" object="{newPlay}">
    

    用于设置字段的名称。

    更新

    你设置了 PHPDoc cmets 吗?这些对于 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);
    }
    

    【讨论】:

    • 它仍然显示同样的错误!我也清除了缓存。
    • 您还需要删除属性名称{title}{body}中的括号,否则属性将填充变量值。
    • 我需要在某处转换传递的对象吗?请检查我的更新
    【解决方案2】:

    尝试始终将对象传递给视图。在您的情况下,您很可能通过 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');
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多