[Frage] Dateireferenz als Feld in einer Extension TYPO3-Version: -

  • trashi trashi
    T3PO
    0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    11. 05. 2020, 13:32

    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.

    [code]<?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'
    ];
    [/code]

    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

  • Hilfreichster Beitrag

  • Julian.Hofmann Julian.Ho...
    Flash Gordon
    1 x
    2981 Beiträge
    122 Hilfreiche Beiträge
    12. 05. 2020, 06:39 - Hilfreichster Beitrag

    Um via Fluid drauf zuzugreifen, dürfte der einfachste Weg via dataProcessing sein:
    https://docs.typo3.org/c/typo3/cms-core/master/en-us/Changelog/7.4/Feature-67662-DataProcessorForFiles.html


  • Teisinger Teisinger
    Jedi-Meister
    0 x
    441 Beiträge
    29 Hilfreiche Beiträge
    11. 05. 2020, 18:06

    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

    https://github.com/groundstack-org

  • Julian.Hofmann Julian.Ho...
    Flash Gordon
    1 x
    2981 Beiträge
    122 Hilfreiche Beiträge
    12. 05. 2020, 06:39

    Um via Fluid drauf zuzugreifen, dürfte der einfachste Weg via dataProcessing sein:
    https://docs.typo3.org/c/typo3/cms-core/master/en-us/Changelog/7.4/Feature-67662-DataProcessorForFiles.html

  • trashi trashi
    T3PO
    0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    12. 05. 2020, 07:40

    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 trashi
    T3PO
    0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    12. 05. 2020, 09:11

    Okay sorry Doppelantwort:

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

    [code]<?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'
    );
    });
    [/code]

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

    [code]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
    }
    }
    [/code]

    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 trashi
    T3PO
    0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    12. 05. 2020, 12:13

    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 Julian.Ho...
    Flash Gordon
    1 x
    2981 Beiträge
    122 Hilfreiche Beiträge
    13. 05. 2020, 14:55

    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:

    [code]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
    }
    }
    [/code]

  • trashi trashi
    T3PO
    0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    19. 05. 2020, 12:01

    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 Julian.Ho...
    Flash Gordon
    1 x
    2981 Beiträge
    122 Hilfreiche Beiträge
    19. 05. 2020, 20:52

    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:

    [code]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
    }
    }[/code]
    (getestet in TYPO3 10.4.3)

  • trashi trashi
    T3PO
    0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    20. 05. 2020, 08:18

    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 ...

    [code]......
    > 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
    [/code]

    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 ^^