【问题标题】:TYPO3 Extbase: how to post form data to controllerTYPO3 Extbase:如何将表单数据发布到控制器
【发布时间】:2019-01-05 10:41:45
【问题描述】:

我无法将某些 Extbase 表单数据上传到控制器。在控制器中获取空值。这就是我所做的。

ext_localconf.php

        \TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
        'Webtech.Wttempro2',
        'Jobdeskform',
        [
            'Jobdeskform' => 'createbewerber, formMailBs'
        ],
        // non-cacheable actions
        [
            'Jobdeskform' => 'createbewerber, formMailBs'
        ]
    );

ext_tables.php

        \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
        'Webtech.Wttempro2',
        'Jobdeskform',
        'Jobdesk Form'
    );

Jobdeskform/CreateBewerber.html

                        <f:form action="formMailBs" controller="Jobdeskform" object="{jobdeskform}" objectName="jobdeskform" method="post">
                        <label>Refno</label><br>
                        <input type="text" property="refno" required/><br>
                        <label>Vorname</label><br>
                        <input type="text" property="vorname" required/><br>
                        <f:form.button>Submit</f:form.button>
                    </f:form>

Model/Jobdeskform.php 就是这么简单。它只是将成员变量与 getter 和 setter 一起使用。

/**
 * 
 * Tempro data for jobdeskform
 * 
 */
class Jobdeskform extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
    /**
     * refno
     *
     * @var string
     */
    protected $refno = '';

    /**
     * vorname
     *
     * @var string
     */
    protected $vorname = '';


    /**
     * Returns the refno
     *
     * @return int $refno
     */
    public function getRefno()
    {
        return $this->refno;
    }

    /**
     * Sets the refno
     *
     * @param int $refno
     * @return void
     */
    public function setRefno($refno)
    {
        $this->refno = $refno;
    }

    /**
     * @return string
     */
    public function getVorname()
    {
        return $this->vorname;
    }

    /**
     * @param string $vorname
     * @return void
     */
    public function setVorname($vorname)
    {
        $this->vorname = $vorname;
    }

}

类 JobdeskformController 扩展 \TYPO3\CMS\Extbase\Mvc\Controller\ActionController{

/**
 * action createBewerber
 *
 * @return void
 */
public function createbewerberAction()
{
    $baseuri = $this->request->getRequestUri();
    $parts = parse_url($baseuri);
    parse_str($parts['query'], $query);
    $this->view->assign('refno', htmlspecialchars($query['refno']));
}


/**
 * action formMailBs
 *
 * @param \Webtech\Wttempro2\Domain\Model\Jobdeskform $jobdeskform
 * @return void
 */
public function formMailBsAction(\Webtech\Wttempro2\Domain\Model\Jobdeskform $jobdeskform = NULL)
{

    \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($jobdeskform, 'FormObject:');
    //\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($jobdeskform->refno, 'Refno:');
    //\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($refno, 'Refno:');
    //\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($vorname, 'Vorname:');

    die('DEBUG!!');


}

}

当我调试表单时,我在变量 $jobdeskform 中得到空值。我在控制器中输入了一些数据。为什么我在控制器调试输出中看不到输入的表单数据?也许我没有看到重要的东西。谢谢你的帮助。

【问题讨论】:

    标签: forms typo3 extbase postdata


    【解决方案1】:

    输入字段中没有名称属性:

    您在 html 中的输入字段没有“名称”属性。它们目前是用纯html创建的,你可以用fluid form textfields创建字段:

    <f:form action="formMailBs" controller="Jobdeskform" objectName="jobdeskform" method="post">
        <label>Refno</label><br>
        <f:form.textfield property="refno" /><br>
        <label>Vorname</label><br>
        <f:form.textfield property="vorname" /><br>
        <f:form.button>Submit</f:form.button>
    </f:form>
    

    结果:

    <input type="text" name="tx_example_jobdeskform[jobdeskform][refno]">
    <input type="text" name="tx_example_jobdeskform[jobdeskform][vorname]">
    

    调试后值的任何简单方法都是在控制器中输出整个 $_POST 数组。使用您当前的输入字段,没有提交任何值(没有名称属性)。

    /**
     * action formMailBs
     *
     * @param \Webtech\Wttempro2\Domain\Model\Jobdeskform $jobdeskform
     * @return void
     */
    public function formMailBsAction(\Webtech\Wttempro2\Domain\Model\Jobdeskform $jobdeskform = NULL)
    {
        debug($_POST); 
        die('DEBUG!!');
    }
    

    注意:您可以使用简写函数debug 代替长的\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump 进行调试输出

    模型中变量类型不匹配:

    在您的模型中,$refno 属性定义为 string (@var string)

       /**
         * refno
         *
         * @var string
         */
        protected $refno = '';
    

    稍后在您的 setter 和 getter 方法中将其定义为 integer

       /**
         * Returns the refno
         *
         * @return int $refno
         */
        public function getRefno()
        {
            return $this->refno;
        }
    
        /**
         * Sets the refno
         *
         * @param int $refno
         * @return void
         */
        public function setRefno($refno)
        {
            $this->refno = $refno;
        }
    

    注意:您可以通过添加基本的validation error output 来发现此类错误。

    <f:form.validationResults>
      <f:if condition="{validationResults.flattenedErrors}">
        <ul class="errors">
          <f:for each="{validationResults.flattenedErrors}" as="errors" key="propertyPath">
            <li>{propertyPath}
              <ul>
              <f:for each="{errors}" as="error">
                <li>{error.code}: {error}</li>
              </f:for>
              </ul>
            </li>
          </f:for>
        </ul>
      </f:if>
    </f:form.validationResults>
    <f:form action="formMailBs" controller="Jobdeskform" objectName="jobdeskform" method="post">
        <label>Refno</label><br>
        <f:form.textfield property="refno" /><br>
        <label>Vorname</label><br>
        <f:form.textfield property="vorname" /><br>
        <f:form.button>Submit</f:form.button>
    </f:form>
    

    【讨论】:

    • 感谢您的出色回答。我还将尝试实现验证错误日志记录。我可以使用这种语法的模型。
    猜你喜欢
    • 2016-07-12
    • 2021-04-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多