最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

TYPO3 12 Forms - save custom field in database - Stack Overflow

programmeradmin3浏览0评论

Good day to you.

I would like to save my custom field in "forms" in the database but it's not working as intended. So far I got this nice yaml and I got my nice little textfield in the backend.

TYPO3:
  CMS:
    Form:
      prototypes:
        standard:
          formElementsDefinition:
            Form:
              formEditor:
                editors:
                  900:
                    # Extend finisher drop down
                    selectOptions:
                      35:
                        value: 'CustomFinisherSaveToDatabase'
                        label: 'Custom SaveToDatabase'
                propertyCollections:
                  finishers:
                    # add finisher fields
                    25:
                      identifier: 'CustomFinisherSaveToDatabase'
                      editors:
                        100:
                          # add expandable header area
                          identifier: header
                          label: "Custom SaveToDatabase"
                          templateName: Inspector-CollectionElementHeaderEditor
                        105:
                          # add remove button
                          identifier: removeButton
                          templateName: Inspector-RemoveElementEditor
                        110:
                          # add a new custom field defined as a TextEditor
                          identifier: 'mycustomfield'
                          templateName: 'Inspector-TextEditor'
                          label: 'Custom Field'
                          propertyPath: 'options.mycustomfield'
                          propertyValidators:
                            10: 'NotEmpty'
          finishersDefinition:
            CustomFinisherSaveToDatabase:
              implementationClassName: TYPO3\CMS\Form\Domain\Finishers\SaveToDatabaseFinisher
              # my mycustomfield is available in the backend, so far so good.
              FormEngine:
                label: 'Custom SaveToDatabase'
                elements:
                  mycustomfield:
                    identifier: 'mycustomfieldidentifier'
                    label: 'Custom Field'
                    config:
                      type: 'text'
              formEditor:
                iconIdentifier: 'form-finisher'
                label: 'Custom SaveToDatabase'
                predefinedDefaults:
                  options:
                    table: 'my_table'
                    mode: insert
                    databaseColumnMappings:
                      # save the value of mycustomfield in database
                      tablefield1:
                        value: '{mycustomfield}'
                      tablefield2:
                        value: '{mycustomfieldidentifier}'

But I'm literally saving the words "{mycustomfield}" and "{mycustomfieldidentifier}" in the database fields, not the value itself. Even without the quotation marks or the brackets, it doesn't work. Am I missing something here, or is that not possible?

Update: According to Mathias Brodala (thanks for the comment) I tried "elements" and changed my code to this:

          finishersDefinition:
            CustomFinisherSaveToDatabase:
              implementationClassName: TYPO3\CMS\Form\Domain\Finishers\SaveToDatabaseFinisher
              # my mycustomfield is available in the backend, so far so good.
              FormEngine:
                label: 'Custom SaveToDatabase'
                elements:
                  mycustomfield:
                    identifier: 'mycustomfieldidentifier'
                    label: 'Custom Field'
                    config:
                      type: 'text'
              formEditor:
                iconIdentifier: 'form-finisher'
                label: 'Custom SaveToDatabase'
                predefinedDefaults:
                  options:
                    table: 'my_table'
                    mode: insert
                    elements:
                      mycustomfield:
                        mapOnDatabaseColumn: 'tablefield1'
                      mycustomfieldidentifier:
                        mapOnDatabaseColumn: 'tablefield2'

But it still doesn't work. Either I made another mistake or I need the "parseOption" but don't know (yet) how to include it.

Second update: Ok, I got some kind of workaround....I am not very proud of it but it does the job.

So I added my own

class CustomSaveToDatabaseFinisher extends AbstractFinisher

and copied the whole original code from "SaveToDatabaseFinisher". Then I added these lines

    $databaseData[$elementsConfiguration[$elementIdentifier]['mapOnDatabaseColumn']] = $elementValue;
}

// custom fields added here
$databaseData[$elementsConfiguration['mycustomfield']['mapOnDatabaseColumn']] = $this->parseOption('mycustomfield');

return $databaseData;

It does the trick but I am not 100% satisfied with it....on the other hand I still don't know why "mycustomfield" is still ignored and I am open for suggestions. So far this is better than nothing. ^^

Thanks!

TZP

Good day to you.

I would like to save my custom field in "forms" in the database but it's not working as intended. So far I got this nice yaml and I got my nice little textfield in the backend.

TYPO3:
  CMS:
    Form:
      prototypes:
        standard:
          formElementsDefinition:
            Form:
              formEditor:
                editors:
                  900:
                    # Extend finisher drop down
                    selectOptions:
                      35:
                        value: 'CustomFinisherSaveToDatabase'
                        label: 'Custom SaveToDatabase'
                propertyCollections:
                  finishers:
                    # add finisher fields
                    25:
                      identifier: 'CustomFinisherSaveToDatabase'
                      editors:
                        100:
                          # add expandable header area
                          identifier: header
                          label: "Custom SaveToDatabase"
                          templateName: Inspector-CollectionElementHeaderEditor
                        105:
                          # add remove button
                          identifier: removeButton
                          templateName: Inspector-RemoveElementEditor
                        110:
                          # add a new custom field defined as a TextEditor
                          identifier: 'mycustomfield'
                          templateName: 'Inspector-TextEditor'
                          label: 'Custom Field'
                          propertyPath: 'options.mycustomfield'
                          propertyValidators:
                            10: 'NotEmpty'
          finishersDefinition:
            CustomFinisherSaveToDatabase:
              implementationClassName: TYPO3\CMS\Form\Domain\Finishers\SaveToDatabaseFinisher
              # my mycustomfield is available in the backend, so far so good.
              FormEngine:
                label: 'Custom SaveToDatabase'
                elements:
                  mycustomfield:
                    identifier: 'mycustomfieldidentifier'
                    label: 'Custom Field'
                    config:
                      type: 'text'
              formEditor:
                iconIdentifier: 'form-finisher'
                label: 'Custom SaveToDatabase'
                predefinedDefaults:
                  options:
                    table: 'my_table'
                    mode: insert
                    databaseColumnMappings:
                      # save the value of mycustomfield in database
                      tablefield1:
                        value: '{mycustomfield}'
                      tablefield2:
                        value: '{mycustomfieldidentifier}'

But I'm literally saving the words "{mycustomfield}" and "{mycustomfieldidentifier}" in the database fields, not the value itself. Even without the quotation marks or the brackets, it doesn't work. Am I missing something here, or is that not possible?

Update: According to Mathias Brodala (thanks for the comment) I tried "elements" and changed my code to this:

          finishersDefinition:
            CustomFinisherSaveToDatabase:
              implementationClassName: TYPO3\CMS\Form\Domain\Finishers\SaveToDatabaseFinisher
              # my mycustomfield is available in the backend, so far so good.
              FormEngine:
                label: 'Custom SaveToDatabase'
                elements:
                  mycustomfield:
                    identifier: 'mycustomfieldidentifier'
                    label: 'Custom Field'
                    config:
                      type: 'text'
              formEditor:
                iconIdentifier: 'form-finisher'
                label: 'Custom SaveToDatabase'
                predefinedDefaults:
                  options:
                    table: 'my_table'
                    mode: insert
                    elements:
                      mycustomfield:
                        mapOnDatabaseColumn: 'tablefield1'
                      mycustomfieldidentifier:
                        mapOnDatabaseColumn: 'tablefield2'

But it still doesn't work. Either I made another mistake or I need the "parseOption" but don't know (yet) how to include it.

Second update: Ok, I got some kind of workaround....I am not very proud of it but it does the job.

So I added my own

class CustomSaveToDatabaseFinisher extends AbstractFinisher

and copied the whole original code from "SaveToDatabaseFinisher". Then I added these lines

    $databaseData[$elementsConfiguration[$elementIdentifier]['mapOnDatabaseColumn']] = $elementValue;
}

// custom fields added here
$databaseData[$elementsConfiguration['mycustomfield']['mapOnDatabaseColumn']] = $this->parseOption('mycustomfield');

return $databaseData;

It does the trick but I am not 100% satisfied with it....on the other hand I still don't know why "mycustomfield" is still ignored and I am open for suggestions. So far this is better than nothing. ^^

Thanks!

TZP

Share Improve this question edited Mar 31 at 13:47 TZP asked Mar 28 at 11:19 TZPTZP 535 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 1

You need to use elements instead which is meant for mapping form element values to DB columns.

Compared to that the databaseColumnMappings option is meant for static values instead.

发布评论

评论列表(0)

  1. 暂无评论