Records and columns 

The extension adds three tables. One profile record, and two child tables whose records belong to exactly one profile and are edited inline in it.

The three tables 

Table Holds
tx_modernextbasefrontendedit_domain_model_profile One profile: names, an optional birthday, a biography, an optional image, the owning website user, and the relations to the two child tables.
tx_modernextbasefrontendedit_domain_model_address The postal addresses of one profile. Manually sorted, not shown as a table of its own in the backend.
tx_modernextbasefrontendedit_domain_model_email The e-mail addresses of one profile. Manually sorted, not shown as a table of its own in the backend.

Control columns 

All three tables are configured the same way for the columns TYPO3 manages itself:

Capability Columns
Timestamps tstamp, crdate
Soft delete deleted — deleting a record marks the row rather than removing it.
Publishing controls hidden, starttime, endtime
Language sys_language_uid, l10n_parent, l10n_source, l10n_diffsource
Workspaces versioningWS is enabled, so the t3ver_* columns exist and backend editing is workspace aware.

The two child tables additionally carry sorting as their manual sort column and are marked hideTable, so they are reached through the profile record and not through a list module view of their own.

Profile 

Column Type Notes
shortname input, trimmed, required The record label. lastname and firstname are appended to it in the backend record title.
firstname input, trimmed Optional.
lastname input, trimmed Optional. Records are listed sorted by last name, then first name.
birthday datetime with format => date and dbType => date, nullable, default null A date without a time of day. The column cannot store one.
bio text Optional free text.
image file, relationship => manyToOne, allowed => common-image-types At most one image per profile, stored as a sys_file_reference. What the frontend upload accepts is narrower than the TCA — see Image upload.
addresses inline to tx_modernextbasefrontendedit_domain_model_address foreign_field => profile, foreign_table_field => tablenames, foreign_sortby => sorting, at most 99 records, language synchronization allowed.
emails inline to tx_modernextbasefrontendedit_domain_model_email The same configuration, for the e-mail addresses.
fe_user select, renderType => selectSingle, on fe_users, maxitems => 1, default 0 The website user owning the record. A single value select is stored as a plain integer column. 0 is the item labelled as "no owner" and means the record belongs to nobody.

Ownership is read through SBUERKModernExtbaseFrontendEditSecurityProfileOwnershipResolverInterface, so an installation that keeps it somewhere other than this column replaces that one service and leaves the rest untouched.

Postal address 

Column Type Notes
profile passthrough The uid of the owning profile, written by the inline relation. Not an editable field, and not a property of the domain model.
tablenames passthrough The foreign_table_field of the relation.
type select, renderType => selectSingle, dbFieldLength => 150, default others One of home, work, others.
line1 input, trimmed The record label.
line2 input, trimmed Optional.

The three accepted values of type, with the label ids they are rendered through:

Value Backend and read plugins Editing surface
home tx_modernextbasefrontendedit_domain_model_address.type.home choice.address.type.home
work tx_modernextbasefrontendedit_domain_model_address.type.work choice.address.type.work
others tx_modernextbasefrontendedit_domain_model_address.type.others choice.address.type.others

The first column of ids lives in EXT:modern_extbase_frontend_edit/Resources/Private/Language/locallang_db.xlf, the second in locallang.xlf next to it. Both describe the same stored value, so overriding one without the other makes the read view and the editing surface disagree.

E-mail address 

Column Type Notes
profile passthrough The uid of the owning profile.
tablenames passthrough The foreign_table_field of the relation.
type select, renderType => selectSingle, dbFieldLength => 150, default others One of private, business, others.
email email, required The address itself, and the record label.
Value Backend and read plugins Editing surface
private tx_modernextbasefrontendedit_domain_model_email.type.private choice.email.type.private
business tx_modernextbasefrontendedit_domain_model_email.type.business choice.email.type.business
others tx_modernextbasefrontendedit_domain_model_email.type.others choice.email.type.others

Schema definition 

The database schema is generated from the TCA. ext_tables.sql of this extension defines exactly two columns, the type column of each child table:

type varchar(150) DEFAULT 'others' NOT NULL
Copied!

They are pinned because the definition TYPO3 generates for a type => select column differs between v13 and v14 — v13 uses an empty default, v14 the default from the TCA. Everything else, including every business column above, the inline parent pointers and the control columns, is created from the TCA and must not be repeated in ext_tables.sql.