EXT:Form-从内容对象数据获取布局字段

时间:2019-07-23 08:28:18

标签: forms typo3 typo3-extensions

我试图在ext:form内容元素中获取内容对象数据的布局字段,以在选择了特定布局的情况下添加CSS类。但是将内容对象数据添加到流体模板(typo3/sysext/form/Classes/Controller/FormFrontendController.php:73)上,也没有为该元素呈现来自fluid_styled_content的框架容器。 我的布局字段配置如下:

TCEFORM.tt_content {
    layout {
        types.form_formframework {
            addItems {
                200 = Blue Form
            }

            removeItems = 1,2,3
        }
    }
}

我还尝试过向表单配置本身添加新的布局字段:

TYPO3:
  CMS:
    Form:
      ########### FORMEDITOR CONFIGURATION ###########
      prototypes:
        standard:
          ########### DEFAULT FORM ELEMENT DEFINITIONS ###########
          formElementsDefinition:
            Form:
              formEditor:
                editors:
                  9000:
                    identifier: 'layout'
                    group: select
                    templateName: 'Inspector-SingleSelectEditor'
                    label: 'Layout'
                    propertyPath: 'properties.layout'
                    selectOptions:
                      0:
                        value:
                        label: Normal
                      1:
                        value: form--blue
                        label: Blau

这在后端工作得很好,但是由于form元素的属性在The options "properties" were not allowed中进行了硬编码,因此在前端导致了typo3/sysext/form/Classes/Domain/Model/FormDefinition.php:382错误。

有什么想法可以在此处添加布局选择吗?最好是在content元素上,因为这将允许我使用具有不同布局的相同表单配置,而不用制作仅在布局中有所区别的重复表单配置。

2 个答案:

答案 0 :(得分:0)

内容对象数据可从Fluid_styled_content的通用模板中获得。在这里,您可以检查Ctype是否为“ form_formframework”,并使用CSS类包装表单。

<f:if condition="{content}">
<f:then>
    {content -> f:format.raw()}
</f:then>
<f:else>
    <f:if condition="{data.CType} == 'form_formframework'">
        <f:then>
            <div class="{data.layout}">
                <f:cObject typoscriptObjectPath="tt_content.{data.CType}.20" data="{data}" table="tt_content"/>
            </div>
        </f:then>
        <f:else>
            <f:cObject typoscriptObjectPath="tt_content.{data.CType}.20" data="{data}" table="tt_content"/>
        </f:else>
    </f:if>
</f:else>
</f:if>

答案 1 :(得分:0)

我们可以像这样({f:if(condition:'{data.layout}',then:'blue')})将流体模板布局添加到默认的fluid_style_content / Resource / Private / Layouts / default中。 html(我们可以在我们的网站模板中覆盖流体模板)-不考虑覆盖以下形式的装订器和Flexform值:

<f:if condition="{data.CType} == 'form_formframework'">
    <f:then>
        <section id="c{data.uid}" class="form-section {f:if(condition:'{data.layout}',then:'blue')}">
            <f:if condition="{data._LOCALIZED_UID}">
                <a id="c{data._LOCALIZED_UID}"></a>
            </f:if>
            <f:render section="Before" optional="true">
                <f:render partial="DropIn/Before/All" arguments="{_all}" />
            </f:render>
            <f:render section="Header" optional="true">
                <f:render partial="Header/All" arguments="{_all}" />
            </f:render>
            <f:render section="Main" optional="true" />
            <f:render section="Footer" optional="true">
                <f:render partial="Footer/All" arguments="{_all}" />
            </f:render>
            <f:render section="After" optional="true">
                <f:render partial="DropIn/After/All" arguments="{_all}" />
            </f:render>
        </section>
    </f:then>
    <f:else>
        <div id="c{data.uid}" class="frame frame-{data.frame_class} frame-type-{data.CType} frame-layout-{data.layout}{f:if(condition: data.space_before_class, then: ' frame-space-before-{data.space_before_class}')}{f:if(condition: data.space_after_class, then: ' frame-space-after-{data.space_after_class}')}">
            <f:if condition="{data._LOCALIZED_UID}">
                <a id="c{data._LOCALIZED_UID}"></a>
            </f:if>
            <f:render section="Before" optional="true">
                <f:render partial="DropIn/Before/All" arguments="{_all}" />
            </f:render>
            <f:render section="Header" optional="true">
                <f:render partial="Header/All" arguments="{_all}" />
            </f:render>
            <f:render section="Main" optional="true" />
            <f:render section="Footer" optional="true">
                <f:render partial="Footer/All" arguments="{_all}" />
            </f:render>
            <f:render section="After" optional="true">
                <f:render partial="DropIn/After/All" arguments="{_all}" />
            </f:render>
        </div>
    </f:else>
</f:if>

希望对所有人有帮助!