Online-Adventskalender in jede Website einbinden.

Jetzt starten!

Modules

Kleine Helfer zum Erstellen von Backend-Modulen in TYPO3.

Zusätzlich enthält diese Erweiterung vordefinierte Backend-Module für:

  • Frontend-User (Dieses Modul kann in der Konfiguration des Erweiterungsmanagers deaktiviert werden).

Ein weiteres Beispiel für ein Backend-Modul finden Sie in der internal_notes Erweiterung im TER. Weiter stellt diese Erweiterung einen Manager für die internel notes in TYPO3 (sys_notes) dar.

Definieren von Datentabellen

Die Definition einer Datentabelle für das Backend kann einfach mit TypoScript vorgenommen werden.

Achtung:

Stellen Sie sicher, dass dieses TypoScript durch eine ext_typoscript_setup.txt Datei definiert ist, damit diese Definitionen immer verfügbar sind!

module.tx_yourextensionkey {
    settings {
        lists {

            downloadFileCollection {
                # Id of the backend module list - just take the parent key
                id = internalNotes
                # table defines the database table name for the records of this list.
                table = sys_note
                # Module identifier
                module = web_InternalNotesInternalNotes
                # Plugin identifier
                plugin = InternalNotes
                # sortingField defines the field, which should be used as default sorting
                sortingField = subject
                # sortingOrder defines the default sorting order for the default sorting field
                sortingOrder = asc
                # The limit defines, how many record should be displayed on each page
                limit = 20
                # Fields/columns of the data table
                fields {
                    # Define the fields/columns of your table
                }
                # Actions for each row of the data table
                actions {
                    # Define the actions for your table rows
                }
            }
            # Define more data tables in the same way
            aSecondTable {
                # ...
            }
        }
    }
}

Definieren von Tabellenfeldern

Der Field Key wird in Kleinbuchstaben geschrieben und stellt den Getter-Name einer Model-Eigenschaft dar!

module.tx_yourextensionkey {
    settings {
        lists {
            tableIdentifier {
                fields {
                    title {
                        format = Plain
                        sortable = 1
                    }
                    hidden {
                        format = Boolean
                        sortable = 1
                        # Requires following translations:
                        # tx_modules_label.boolean_true = yes
                        # tx_modules_label.boolean_false = no
                    }
                    description {
                        format = PlainEditable
                        sortable = 1
                        crop = 30
                    }
                    creationUser {
                        format = BackendUser/Username
                    }
                    creationDate {
                        format = DateTime
                        sortable = 1
                        dateFormat = d.m.Y H:i
                    }
                }
            }
        }
    }
}

Mögliche Ausgangsformate sind

Parameter/FormatPlainPlainEditableDateTimeEmailBooleanCustom
sortablexxxxx?
dateFormatx
cropxx
  • crop - Crop ist ein Integer-Value und schneidet den Zellinhalt nach der definierten Anzahl von Zeichen ab.

Definieren von Tabellenaktionen

Die Tabellenaktionen werden im Actions Node definiert. In diesem Node können Sie die Action für jede Tabellenzeile definieren.

Dies könnte wie folgt aussehen:

actions {
    # The action key is the identifier.
    # This key is used additionally for the translation key for the column title.
    edit {
        action = Edit
        # Translation keys
        # tx_modules_label.list_topic_action_edit = Edit topic
    }
    hideShow {
        action = HideShow
        # Translation keys
        # tx_modules_label.list_topic_action_hide = Hide topic
        # tx_modules_label.list_topic_action_show = Show topic
    }
    disableEnable {
        action = DisableEnable
        # Translation keys
        # tx_modules_label.list_frontend_user_action_enable = Enable frontend user
        # tx_modules_label.list_frontend_user_action_disable = Disable frontend user
    }
    delete {
        action = Delete
        # Data field of the record, where a label is store.
        # This label is used for the security question in the modal.
        subjectField = title
        # Translation keys
        # tx_modules_label.list_topic_action_delete_title = Delete this topic?
        # tx_modules_label.list_topic_action_delete_content = Are you sure you want to delete the topic `%1$s`?
        # tx_modules_label.list_topic_action_delete_cancel = Cancel
    }
}

Übersetzungen

Das Definieren von Übersetzungen für die Datentabellen funktioniert folgendermaßen:

module.tx_yourextensionkey {
    _LOCAL_LANG {
        default {
            #
            tx_downloadmanager_label.backend_filter = Filter
            tx_downloadmanager_label.backend_filter_submit = refresh

            # Message, if there are no records in the table
            tx_modules_label.list_download_file_collection_no_entries = No download file collections found

            # Table header title
            tx_modules_label.list_download_file_collection_header = Download file collection

            # Table header columns
            # Each identifier is build like:
            # tx_modules_label.list_ + list id underscored + _col_ + field key
            tx_modules_label.list_download_file_collection_col_title = Title
            tx_modules_label.list_download_file_collection_col_actions = Actions

            tx_modules_label.list_download_file_collection_action_edit = Edit download file collection
            tx_modules_label.list_download_file_collection_action_hide = Hide download file collection
            tx_modules_label.list_download_file_collection_action_show = Show download file collection
        }
        de {
            # German translation
            tx_modules_label.list_download_file_collection_no_entries = Es konnten keine Download-Datei-Dateisammlung gefunden werden
            tx_modules_label.list_download_file_collection_header = Download-Dateisammlung
            tx_modules_label.list_download_file_collection_col_title = Titel
            tx_modules_label.list_download_file_collection_col_actions = Aktionen
            tx_modules_label.list_download_file_collection_action_edit = Download-Dateisammlung bearbeiten
        }
    }
}

Nutzung von Erstellungsbenutzer, Datum oder Änderungsdatum

Wenn Sie den Erstellungsbenutzer, das Erstellungsdatum oder das Änderungsdatum eines Standard-TYPO3-Datensatzes verwenden möchten, müssen Sie die Extbase-Felder zuordnen:

config.tx_extbase.persistence.classes {

    CodingMs\Newsletters\Domain\Model\Topic.mapping {
        tableName = tx_newsletters_domain_model_topic
        recordType =
        columns {
            crdate.mapOnProperty = creationDate
            tstamp.mapOnProperty = modificationDate
            cruser_id.mapOnProperty = creationUser
        }
    }

}

Zusätzlich benötigen Sie die zugehörigen Getter und Setter im zugehörigen Extbase-Model.

Feature Flags nach Page/User TypoScript verwenden

Zuerst müssen Sie die Page/User TypoScript für Ihre Einstellungen definieren. Dies könnte wie folgt aussehen:

[adminUser = 0]
    mod.web_addressmanager {
        overview {
            disableNew = 0
            disableDelete = 0
        }
        overviewGroup {
            disable = 0
            disableNew = 0
            disableDelete = 0
        }
        overviewOrganisation {
            disable = 0
            disableNew = 0
            disableDelete = 0
        }
        overviewPosition {
            disable = 0
            disableNew = 0
            disableDelete = 0
        }
    }
[GLOBAL]

[adminUser = 1]
    mod.web_addressmanager {
        overview {
            disableNew = 0
            disableDelete = 0
        }
        overviewGroup {
            disable = 0
            disableNew = 0
            disableDelete = 0
        }
        overviewOrganisation {
            disable = 0
            disableNew = 0
            disableDelete = 0
        }
        overviewPosition {
            disable = 0
            disableNew = 0
            disableDelete = 0
        }
    }
[GLOBAL]

Der Basispfad wird mit web für den Namespace der Webmodule aufgebaut. Der Bezeichner web_addressmanager wird mit web_ und dem extension key (klein geschrieben und ohne Unterstriche!) verkettet. In der nächsten Ebene werden die Controller-Action- Names gruppiert. So würde z.B. mod.web_addressmanager.overviewGroup.disable = 1 die gesamte Ansicht deaktivieren. Diese Einstellungen werden direkt in Modules/BackendController validiert und werfen eine Exception, wenn versucht wird, eine deaktivierte View aufzurufen. Weitere Einstellungen wie disableNew oder disableDelete müssen Sie selbst vornehmen. Aber Achtung! Diese Einstellungen können dazu führen, dass Ihre Benutzer diese Aktion nicht auf andere Weise, z. B. mit dem Listen-Modul, durchführen können!

Frontend Module

ToDo-Liste

  • Hinzufügen einer frontend_user-Eigenschaft in Objekten, die vom Frontend aus editierbar sein sollen (DB, TCA, Model, Translation)
  • Definieren eines Frontend-Plugin (ext_localconf.php und ext_tables.php)
  • Definieren eines Frontend-Controller (siehe EXT:bookings oder EXT:address_manager)
  • Erforderliches Fluid-Template hinzufügen (Erstellen, Bearbeiten, Fehler, Liste)
  • FindAllForFrontendList und findByIdentifierFrontend im Objekt-Repository hinzufügen
  • Definieren einer statischen Vorlage für die TypoScript-Konfiguration
  • Fluid-Template-Pfade für EXT:modules in setup.typoscript hinzufügen
  • Sicher stellen, dass Objektmodell über Getter/Setter für deleted, hidden verfügt

Hinweis:

Wenn Sie den Löschvorgang für einen Datensatz deaktivieren möchten, können Sie options.disableDelete.tx_addressmanager_domain_model_address = 1 in page/user TypoScript verwenden.

FAQ

Warum funktioniert die Aktion HideShow nicht wie erwartet?

Vielleicht haben Sie vergessen, die verborgenen Eigenschaften zu Ihrem Modell hinzuzufügen. Fügen Sie Folgendes hinzu:

/**
 * @var boolean
 */
protected $hidden;

/**
 * @return bool
 */
public function isHidden()
{
    return $this->hidden;
}

/**
 * @param bool $hidden
 */
public function setHidden($hidden)
{
    $this->hidden = $hidden;
}

Stellen Sie zusätzlich sicher, dass Ihr Feld in TCA-Spalten eingestellt ist:

`hidden` => [
    `config` => [
        `type` => `passthrough`,
    ]
],
`crdate` => [
    `config` => [
        `type` => `passthrough`,
    ]
],
`tstamp` => [
    `config` => [
        `type` => `passthrough`,
    ]
],

Warum wird das Delete-Modal nicht angezeigt?

Vielleicht haben Sie vergessen, das erforderliche RequireJs-Modul hinzuzufügen:

$pageRenderer->loadRequireJsModule(`TYPO3/CMS/Backend/Modal`);