Zum Inhalt springen

Dateireferenz als Feld in einer Extension

Erstellt am 11. Mai 2020 · 11 Antworten · letzte Antwort am 22. Mai 2020

Tags: Fluid, TCA, TYPO3 10, Frage

trashi ·

Schönen guten Morgen,
ich bin mal wieder etwas am verzweifeln :-).

Vielleicht könnt ihr mir helfen.

Ich habe eine Extension entworfen in der ich die pages Tabelle etwas erweitern möchte.
Zum einen wären da:

1. ein boolischer Wert
2. ein Textwert für z.B. CSS Klassen
3. Eine Dateireferenz aus den bestehenden fileadmin

Nun Punk 1 und 2 funktionieren natürlich wunderbar. Nur aus der Referenz werd ich irgendwie nicht schlau.
Er zeigt diese zwar schön im Backend an und diese lässt sich auch den Erwartungen nach verwenden.
(also ein Bild aussuchen und demnach verlinken)
Allerdings steht in dem Feld ..._image lediglich nur eine 1. (jedoch die Referenz uid etc. alles stimmt und auf das betreffende Bild in sys_file)

Ich vermute den Fehler hier bei der definition wüsste aber beim besten Willen nicht was da falsch sein könnte.

<?php
defined('TYPO3_MODE') or die();

// Configure new fields:
$fields = [
    'tx_mnadditionalpagefields_custom_css_class' => [
        'label' => 'LLL:EXT:nm_addtional_page_fields/Resources/Private/Language/locallang_db.xlf:pages.tx_mnadditionalpagefields_custom_css_class',
        'exclude' => 1,
        'config' => [
            'type' => 'input',
            'max' => 255
        ],
    ],
    'tx_mnadditionalpagefields_activate_extended_rules' => [
        'exclude' => 1,
        'label' => 'LLL:EXT:nm_addtional_page_fields/Resources/Private/Language/locallang_db.xlf:pages.tx_mnadditionalpagefields_activate_extended_rules',
        'config' => [
            'type' => 'check',
            'default' => 0
        ]
    ],
    'tx_mnadditionalpagefields_extended_background_image' => [
        'exclude' => 1,
        'label' => 'LLL:EXT:nm_addtional_page_fields/Resources/Private/Language/locallang_db.xlf:pages.tx_mnadditionalpagefields_extended_background_image',
        'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig(
            'tx_mnadditionalpagefields_extended_background_image',
            [
                'maxitems' => 1,
                'minitems' => 0,
                'appearance' => [
                    'createNewRelationLinkTitle' => 'LLL:EXT:cms/locallang_ttc.xlf:images.addFileReference'
                ],
                'foreign_match_fields' => array(
                    'fieldname' => 'tx_mnadditionalpagefields_extended_background_image',
                    'tablenames' => 'pages',
                    'table_local' => 'sys_file',
                ),
            ],
            $GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext']
        ),
    ]
];

// Add new fields to pages:
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('pages', $fields);

// Make fields visible in the TCEforms:
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes(
    'pages', // Table name
    '--palette--;LLL:EXT:nm_addtional_page_fields/Resources/Private/Language/locallang_db.xlf:pages.palette_title;nm_addtional_page_fields', // Field list to add
    '1', // List of specific types to add the field list to. (If empty, all type entries are affected)
    'after:nav_title' // Insert fields before (default) or after one, or replace a field
);

// Add the new palette:
$GLOBALS['TCA']['pages']['palettes']['nm_addtional_page_fields'] = [
    'showitem' => 'tx_mnadditionalpagefields_activate_extended_rules,tx_mnadditionalpagefields_custom_css_class,tx_mnadditionalpagefields_extended_background_image'
];

Habe die ganze Extension (zur Einsicht) nochmal in den https://nintz.de/uploads/nm_addtional_page_fields_0.0.1_202005111123.zip gepackt.

Falls wer eine Idee hat immer gern her damit.

Viele Grüße,
trashi

Teisinger ·

Nur damit du nicht falsch suchst, das "...Allerdings steht in dem Feld ..._image lediglich nur eine 1. ..." ist korrekt so - TYPO3 speichert hier nur die Anzahl der Referenzen... also ein count().

Ein Lösung hab ich grad nicht im Kopf (brainAFK)... sollte aber nicht soooo schwer sein (nur umständlich... ) xD

trashi ·

Also okay das mit der 1 dachte ich mir im Hinterkopf bereits, da der Datensatz selber ja alle Referenzen hält.

Werde mir jetzt mal das DataProcessing anschauen, aber erschreckend wie man sowas simples so komplex gestalten kann. :-/

Melde mich sofern Fortschritte zu verbuchen sind.

trashi ·

Okay sorry Doppelantwort:

Also ich habe nun eine Datei sys_template.php in Configuration\Overrides\ angelegt mit folgenden Inhalt.

<?php
defined('TYPO3_MODE') || die();

call_user_func(function()
{
    /**
     * Extension key
     */
    $extensionKey = 'site_package';

    /**
     * Default TypoScript
     */
    \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile(
        $extensionKey,
        'Configuration/TypoScript',
        'mn_additional_page_fields'
    );
});

Dazu habe ich dann in Configuration\TypoScript\setup.typoscript angelegt.

tt_content.image.30 = FLUIDTEMPLATE
tt_content.image.30 {
    #file = EXT:myextension/Resources/Private/Templates/ContentObjects/Image.html
    dataProcessing.10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
    dataProcessing.10 {
        # the field name where relations are set
        # + stdWrap
        references.fieldName = tx_mnadditionalpagefields_extended_background_image

        # the table name where relations are put, defaults to the currently selected record from $cObj->getTable()
        # + stdWrap
        references.table = pages

        # A list of sys_file UID records
        # + stdWrap
        files = 252

        # A list of File Collection UID records
        # + stdWrap
        collections = 13,14

        # A list of FAL Folder identifiers and files fetched recursive from all folders
        # + stdWrap
        folders = 1:fileadmin/nintz.de/images/ConanExiles/
        folders.recursive = 1

        # Property of which the files should be sorted after they have been accumulated
        # can be any property of sys_file, sys_file_metadata
        # + stdWrap
        sorting = description

        # Can be "ascending", "descending" or "random", defaults to "ascending" if none given
        # + stdWrap
        sorting.direction = descending

        # The target variable to be handed to the ContentObject again, can be used
        # in Fluid e.g. to iterate over the objects. defaults to "files" when not defined
        # + stdWrap
        as = ownImage
    }
}

Habe im Basistemplate das Package "mn_additional_page_fields" hinzuigefügt.
Aber finde dazu rein gar nicht im TemplateObject Browser ?
Sollte hier nicht wenigstens dann tt_conten.image.30 mit irgendwas belegt sein?
Der Browser zeit dazu gar nichts an.

trashi ·

Nach einigen hin und her verstehe ich langsam die Welt nicht mehr.
Da draußen gibt es wie es scheint hundert Ansäte aber mit keinem komme ich irgendwie weiter.

Habe nun diesen FilesProcessor angelegt und dieser wird auch im Typoscript angezigt.
Aber die Variable ownImage ist leer, bzw nicht vorhanden NULL.

Sieht so aus.
http://prntscr.com/sf8rn4

Julian.​Hofmann ·

Naja, "komplex gestalten" ist etwas negativ ausgedrückt. Es ist sehr flexibel gebaut, muss aber auch Altlasten mit berücksichtigen.

IMO stoplerst Du über genau die Flexibilität: der FilesProcessor erfasst Relationen entweder via references *oder* files *oder* collections *oder* folders - nicht *und*,*und*,*und*. alle vier Möglichkeiten als Quelle zu definieren macht wenig Sinn (Weiß nicht, was die höchste Prio erhält).

In Deinem Fall hast Du via TCA ja sys_file_references angelegt, d.h. Du braucht nur den "references"-Block:

tt_content.image.30 = FLUIDTEMPLATE
tt_content.image.30 {
  dataProcessing.10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
  dataProcessing.10 {
    references.fieldName = tx_mnadditionalpagefields_extended_background_image
    references.table = pages
    as = ownImage
  }
}
trashi ·

Hmm die Email zur Antwort nicht bekommen -.- (deswegen die Pause)

Ja aber nun habe ich die neuen Systeme etwas besser verstanden.
Und die Sache mit dem FileProcessor verstehe ich grundsätzlich ja auch.

Nur bekomme ich dieses Feld ownImage überhaupt nicht richtig "ab".

Der ImageProcessor wird nun auch erkannt, nur passiert gefühlt hier überhaupt nichts.
(Object Browser Bild -> https://prnt.sc/sjjzhd)

Würde da nicht ggf. ein eigener FileProcessor angeraten?
Das wollte ich auch nochmal probieren. Generell will ich eigentlich nur den Dateinamen der verlinkten Datei haben, aber ganz so einfach scheint das wohl nicht.

Vielleicht zum Verständnis, ich will lediglich einen erweiterbaren Satz von Feldern
an den Page Datensätzen haben um noch etwas besser (an der Seite selber) so etwas wie Seitenhintergrund und alternative Klassennamen setzen lassen zu können.
Damit im fluid Template (was dann ja eigentlich zur Bootstrap Erweiterung gehört) entsprechend reagieren zu können.

Vielen Dank für eure/deine Hilfe.

Die Extension liegt hier auch nochmal zum Download bereit: https://nintz.de/fileadmin/uploads/extended_page_fields_0.0.1_202005191001.zip

Julian.​Hofmann ·

Nochmal kurz zum Verständnis: die Felder sind im pages-Datensatz, anzeigen möchtest Du sie aber in einem Contentelement (d.h. tt_content-Datensatz)?

Ist wichtig zu wissen, da TypoScript ein Datenarray übergeben bekommt, dieses aber abhängig vom Context ist. Im PAGE-Objekt z.B. bekommst Du via ".field = nav_title" das Feld "nav_title" aus dem pages-Datensatz. Innerhalb eines Contentelement greift "field" auf die Felder des tt_content-Datensatzes zu.
Ähnlich verhält es sich auch bei dataProcessing - genau gucken, welche Daten verarbeitet werden. Eine richtige Konfiguration auf falsche Daten angewendet führt auch nicht zum Erfolg.

Mal ein passendes, minimalistisches Snippet für Deine EXT:extended_page_fields:

page >
page = PAGE
page.20 = FLUIDTEMPLATE
page.20 {
  template = TEXT
  template.value(
    <f:debug>{ownImage}</f:debug>
    <h1>Testing EXT:extended_page_fields and FilesProcessor</h1>
    <p>Background-Image is <f:uri.image image="{ownImage.0}" /></p>
  )
  dataProcessing.10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
  dataProcessing.10 {
    references.fieldName = tx_extendedpagefields_extended_background_image
    as = ownImage
  }
}

(getestet in TYPO3 10.4.3)

trashi ·

Hey Hallo Julian,
vielen Dank für deine Mühen soweit.

Der Schnipsel wird gleich mal ausprobiert, wobei ich gestern auch schon weitere Erfolge hatte.
Also im Extensiontemplate konnte ich mit einem manuellen query alles wunderbar auflösen und im eigenen Template die Information ausgeben. Könnte man daraus nicht einen Viewhelper machen der für mich Inhalte dann wrapt?

Aber aktuell kämpfe ich noch mit einem UpdateProblem, wollte heute Morgen auf 10.4.3 updaten und composer stellt sich quer ...

......
> post-autoload-dump: @typo3-cms-scripts
> typo3-cms-scripts: typo3cms install:fixfolderstructure


  [ TYPO3\CMS\Core\DependencyInjection\NotFoundException ]
  Container entry "TYPO3\CMS\Install\Service\LateBootService" is not availabl
  e.


install:fixfolderstructure

Script typo3cms install:fixfolderstructure handling the typo3-cms-scripts event returned with error code 255
Script @typo3-cms-scripts was called via post-autoload-dump

http://prntscr.com/sk4xuw

Scheint aber wohl irgendwie kein manuell provoziertes Problem zu sein. Zumindest konnte ich es nicht auf meine Extensions oder ähnliches zurück führen. Habe auch mal alles raus genommen, der Fehler war der gleiche.

Es bleibt spannend ^^

trashi ·

Okay nachdem composer sich wohl neu geordnet hatte durfte ich dann auch endlich weiter arbeiten.

Also dein Schnipsel arbeitet 1A vielen Dank. Hilft beim verstehen des Systems, mittlerweile verstehe ich auch das grundsätzliche Problem was mich an meiner Idee hinderte.

Hier das Ergebnis deines Schnipsels: https://prnt.sc/sk9vc9

Habe nun in meinem Fall einen ViewHelper angelegt und den eigenen query da hinein verfrachtet.
Und man siehe da der ViewHelper ist sogar "global" verwendbar und ich kann mit den eingegebenen Werten arbeiten und die Referenzdatei nutzen.

Vielen Dank für deine Geduld und Hilfestellungen :-)