【问题标题】:How to effectively debug TYPO3-Fluid-Form for new object?如何为新对象有效调试 TYPO3-Fluid-Form?
【发布时间】:2018-07-20 01:15:51
【问题描述】:

我有一个名为 Application 的对象的“普通”控制器。这个对象变得相当复杂,并使用 ajax 验证和大量 jQuery 函数来验证属性值等等。 不幸的是,我偶尔会从 processAction 中收到错误,告诉我没有设置必要的参数 $newApplication。

Core: Exception handler (WEB): Uncaught TYPO3 Exception: #1298012500: 
Required argument "newApplication" is not set for 
VENDOR\myExt\Controller\ApplicationController->process

新的应用程序对象正在从 newAction 传递到流体模板,就像它在 TYPO3-docbase 的博客/帖子示例中显示的那样。

不幸的是,我一直在寻找原因,为什么进程操作没有正确地从表单中获取应用程序对象,因为它偶尔会发生(在生产系统的日志中出现错误)但我无法重现它在我自己的测试客户端上,在不同的浏览器上一切正常。另外,表格是公开的,所以我认为这不是与访问权限等相关的问题。

任何关于如何有效调试这种情况的提示都会非常有帮助。 在此先感谢,奥利弗

其他信息和代码:

<v:variable.set name="nationalityoptions" value="{v:variable.convert(value: {}, type: 'array')}" />

<div id="bewerbungsformcontent"  class="customerform">
<f:form id="newApplicationForm" name="newApplication" extensionName="myExt" object="{newApplication}" objectName="newApplication" controller="Application" action="process" enctype="multipart/form-data" method="post">
<div name="personaldatadiv" id="personal_data_div" class="applicationform_block_div">
        <h3><f:translate key="LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:personaldata-fieldset-title"/></h3>
        <p><label for=""><f:translate key="LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-title" /></label>
        <f:form.select id="applicationform_genderselect" name="title" class="form_select" property="title" options="{vendor:TcaOptions(property: 'title', subject: 'Car24\\Car24\\Domain\\Model\\Application')}" value="0" /><span class="required">*</span></p>
        <p><label for=""><f:translate key="LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-salutation" /></label>
        <f:form.select id="applicationform_salutationselect" name="salutation" class="form_select" property="salutation" options="{vendor:TcaOptions(property: 'salutation', subject: 'Car24\\Car24\\Domain\\Model\\Application')}" value="0" /></p>
        <p><label for=""><f:translate key="LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-forename" /></label>
        <f:form.textfield id="applicationform_forenameinput" name="forename" class="form_textinput" placeholder="{f:translate(key: 'LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-forename')}" property="forename" value="" required="true" /><span class="required">*</span></p>
        <p><label for=""><f:translate key="LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-name" /></label>
        <f:form.textfield id="applicationform_nameinput" name="name" class="form_textinput" placeholder="{f:translate(key: 'LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-name')}" property="name" value="" required="true" /><span class="required">*</span></p>
        <p><label for=""><f:translate key="LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-postalcode" /></label>
        <f:form.select options="{}" id="applicationform_postalnumberinput" name="addressPostalCity" class="form_select select2_plz" value="" /><span class="required">*</span></p>
        <p><label for=""><f:translate key="LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-street" /></label>
        <f:form.textfield id="applicationform_streetinput" name="addressStreet" class="form_select" placeholder="{f:translate(key: 'LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-street')}" property="addressStreet" value="" required="true" /><span class="required">*</span></p>
        <p><label for=""><f:translate key="LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-housenumber" /></label>
        <f:form.textfield id="applicationform_housenumberinput" name="addressNumber" class="form_textinput" placeholder="{f:translate(key: 'LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-housenumber')}" property="addressNumber" value="" required="true" /><span class="required">*</span></p>
        <p><label for=""><f:translate key="LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-country" /></label>
        <f:form.textfield id="applicationform_countryinput" name="addressCountry" class="form_textinput_readonly" property="addressCountry" required="true" value="{f:translate(key: 'LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-country-germany')}" readonly="true" tabindex="-1" /><span class="required">*</span></p>
        <p><label for=""><f:translate key="LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-birthdate" /></label>
        <f:form.textfield id="applicationform_birthdateselect" name="dateselect" class="form_dateselect" placeholder="dd.mm.yyyy" required="true" value="" /><span class="required">*</span></p>
        <p><label id="applicationform-label-reference" for="applicationform-referencenumber"><f:translate key="LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-origin" /></label>
        <f:form.select id="applicationform_originselect" name="nationality" class="form_select" property="nationality" options="{vendor:TcaOptions(property: 'nationality', subject: 'Car24\\Car24\\Domain\\Model\\Application')}"/><span class="required">*</span></p>
        <h3><f:translate key="LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationinfo-fieldset-contactinfo"/></h3>
        <h5><f:translate key="LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-phoneinfo"/></h5>
        <p><label for="applicationform_phonecodeinput"><f:translate key="LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-phone" /></label>
        <f:form.textfield id="applicationform_phonecodeinput" name="contactPhoneCode" property="contactPhoneCode" class="form_textinput" placeholder="{f:translate(key: 'LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-phonecode')}" value="" />
        <f:form.textfield id="applicationform_phoneinput" name="contactPhone" property="contactPhone" class="form_textinput" placeholder="{f:translate(key: 'LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-phone-number')}" value="" /><span class="required">*</span></p>
        <p><label for="applicationform_mobileinput"><f:translate key="LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-mobile" /></label>
        <f:form.textfield id="applicationform_mobileinput" name="contactMobile" class="form_textinput" property="contactMobile" placeholder="{f:translate(key: 'LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-mobile')}" value="" /><span class="required">*</span></p>
        <p><label for="applicationform_mailinput"><f:translate key="LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-mail" /></label>
        <f:form.textfield type="email" id="applicationform_mailinput" name="contactMail" class="form_textinput" property="contactMail" placeholder="{f:translate(key: 'LLL:EXT:vendor/Resources/Private/Language/locallang_applicationform.xlf:applicationform-mail')}" value="" required="true" /><span class="required">*</span></p>
    </div>
</f:form>
</div>

【问题讨论】:

  • 您能否向我们提供您的 f:form 和表单中的一些 f:form-elements 标签?
  • 确定!信息已更新
  • 不幸的是,该对象已经变得相当复杂,我必须添加一个 facebook-campaign-pixel 作为额外的标头数据,我将其添加到控制器的 newAction 内的标头中。目前,我怀疑在特定情况下与 javascript/jquery 问题有关,我还无法重现/发现。所有属性数据在我的测试中都被正确映射,我检查了每个表单输入
  • 源代码在f:form.* 组件上混合使用propertyname,这可能与您期望的不同:使用property 意味着您指的是对象属性,这意味着Extbase 可以做诸如验证之类的事情,并在该属性上设置值(HTML 字段名称自动嵌套在对象名称包装器中)。但是,当您使用 name 时,这意味着您正在创建一个全新的控制器参数,而不是对象上的属性。对于每个 name 用法,您必须在操作上有一个相应的参数,否则该值将被简单地删除。
  • 非常感谢。现在只是整理表格=)

标签: controller typo3 fluid domain-model


【解决方案1】:

您很可能遇到以下问题之一:

  • 您的控制器操作需要一个对象作为参数,但在您的 f:form 中您没有设置对象名称或设置为错误名称。
  • 您的表单发布到不同插件中的控制器操作,但您没有指定目标插件名称,因此接收插件不会读取请求参数。
  • 您发布的数据无法映射到正确的目标对象类型;例如,数据可能不完整,或者您发布的对象标识符不存在。
  • 您在某处重定向到需要参数但不包含参数的操作。

其中大部分归结为您构建模板的方式。经验法则:使用objectproperty 属性保留尽可能多的表单组件,而不是手动制作字段名称。

在发生此故障时调试$this-&gt;request 可能会产生更多信息,例如缺少参数值或发生重定向时的源操作。

只有在您发布模板代码时才能提供更多信息(具体来说,包括f:form 标签在内的所有内容)。仅供参考,使用 ajax 验证也可能导致实际验证要求和您执行的验证之间不同步 - 因此,看似有效的对象在被控制器映射和验证时可能无效。请注意,您在控制器中所做的任何覆盖也可能对验证和参数映射等行为产生影响。

编辑:显然,从您在上面发布的源代码中,您正在使用自定义表单属性 names 而不是使用对象 property。这确实会对控制器参数映射产生影响:您的字段将作为单独的帖子字段传递,而不是对象上的属性。

【讨论】:

  • 如果你的 JS 在提交之前做任何事情来操作 DOM,这可能是问题的原因。你不应该混合nameproperty (IIRC,property 将优先,你在name 中写的任何内容都没有效果)。我确实怀疑在发生的边缘情况下,某些东西正在以产生验证或映射错误的方式操纵输入。你不能真正调试它(除了检查提到的请求) - 但你可以调试的是你的 JS 或 XHR 的一部分,它可能正在更改字段值或以其他方式修改表单的 DOM。
  • 如果您转向请求调试,请特别注意参数嵌套在原始请求中的方式(控制器参数名称作为包装器)。当您的案例发生时,您可能会在错误的位置找到值。
  • 实际上我仍然无法真正“调试”=>如果参数不是正确的对象类型,控制器操作不会被执行,那么我该如何转储发送值!?
  • 进一步挖掘 ActionController / AbstractController 类并从那里调试。您需要调试在调用您的操作之前但在参数映射发生之后执行的代码点。
猜你喜欢
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 2020-12-07
相关资源
最近更新 更多