Zum Inhalt springen

Ausgeblendete Datensatz-Felder in TCE MAIN Speichern-Hook

Erstellt am 12. Juni 2012 · 10 Antworten · letzte Antwort am 13. Juni 2012

Tags: Frage

Typo3Cuckoo ·

Hi,

ich habe in einem Datensatz meiner Extension ein Feld namens hash. Dieses Feld soll vom Benutzer nicht bearbeitet werden können, denn der Wert dieses Feldes wird automatisch beim Speichern eines Datensatzes generiert (alles im Backend).

Die automatische Generierung funktioniert einwandfrei, solange man das Feld im Backend bearbeiten kann (es ist also im TCE Form vorhanden). Dazu benutze ich folgenden Hook aus t3lib/class.t3lib_tcemain.php:

<?php
function processDatamap_preProcessFieldArray(&$fieldArray, $table, $id, &$tceobj)
{
    if($table == 'tx_meineext_meinetabelle')
    {
        $fieldArray['hash'] = '1234567890';
    }
}
?>

Im TCA wird das Feld momentan wie folgt definiert (es ist also ganz normal sichtbar und editierbar):

<?php
'hash' => array (
    'label' => 'Hash',
    'config' => array (
        'type' => 'input',
        'size' => '30',
        'eval' => 'int',
    )
),
?>

Um das Feld im Backend auszublenden habe ich im TCA den Typ passthrough eingetragen.

<?php
'hash' => array (
    'config' => array (
        'type' => 'passthrough',
    )
),
?>

Dies hatte jedoch zur Folge, dass das Feld im Hook nicht mehr vorhanden war.

Mit readOnly => 1 hatte ich genau so wenig Glück:

<?php
'hash' => array (
    'label' => 'Hash',
    'config' => array (
        'type' => 'input',
        'size' => '30',
        'eval' => 'int',
        'readOnly' => 1,
    )
),
?>

Wie kann man ein Feld im Backend so verbergen, dass es im Hook dennoch verfügbar ist?

Typo3Cuckoo ·

Danke erst Mal für den Link.

TCEFORM.<table>.<field>.disabled = 1

Damit kann man ein Feld aus dem TCE Form entfernen. Aber ich hab dann genau das gleiche Problem wie oben beschrieben: es ist im Hook nicht mehr verfügbar. Im Array $fieldArray fehlt das ausgeblendete Feld und ich kann es nicht mehr bearbeiten.

Nochmal meine Frage:

Ich möchte ein bestimmtes Feld im Backend ausblenden, damit Redketuere dieses nicht bearbeiten können. Gleichzeitig muss es aber für TYPO3 (d.h. für den Speichern-Hook) verfügbar bleiben, damit der Wert des Feldes automatisch generiert und in die DB gespeichert werden kann.

Geht das überhaupt?
Wenn ja: welche Möglichkeiten gibt es?
Muss ich vielleicht einen anderen Hook benutzen?

aemka ·

Zur Not nutze halt keinen der Parameter aus dem Hook und schreibe direkt mit exec_Insert... in die Datenbank.

Typo3Cuckoo ·
aemka schrieb

Zur Not nutze halt keinen der Parameter aus dem Hook und schreibe direkt mit exec_Insert... in die Datenbank.

D.h. mein Vorhaben ist auf "normalem" Wege gar nicht möglich (normaler Weg = kein direkter DB Zugriff)?

igorshmigor ·

Oder aber mit process_datamap:

require_once(PATH_t3lib.'class.t3lib_tcemain.php');
$datamap=array(
   'tx_meineext_meinetabelle'=>array(
      $id => array(
         'hash' => '1234567890'
      )
   )
)
$tce=t3lib_div::makeInstance('t3lib_TCEmain');
$tce->start($datamap,null);
$tce->process_datamap();

Nicht getestet, müsste aber funktionieren.

Typo3Cuckoo ·
igorshmigor schrieb

Oder aber mit process_datamap:

require_once(PATH_t3lib.'class.t3lib_tcemain.php');
$datamap=array(
   'tx_meineext_meinetabelle'=>array(
      $id => array(
         'hash' => '1234567890'
      )
   )
)
$tce=t3lib_div::makeInstance('t3lib_TCEmain');
$tce->start($datamap,null);
$tce->process_datamap();

Nicht getestet, müsste aber funktionieren.

Danke, werde ich gleich mal testen.

Ich müsste aber wissen wo das reinkommt? :o

Gibt's dazu noch mehr Infos?

igorshmigor ·

In deinen Hook, nach der if-Bedingung. Allerdings müsstest Du wahrscheinlich einen anderen Hook nutzen, um sicherzustellen, dass der Eintrag bereits erstell wurde, bevor Du versuchst den Hash-Wert zu ändern. Ich denke das hier müsste der richtige Hook für diesen Prozess sein: processDatamap_afterDatabaseOperations($hookObjectsArr, $status, $table, $id, $fieldArray)

Weiter Infos zu process_datamap im Buch "TYPO3-Extensions entwickeln" von Dmitry Dulepov auf Seite 45 oder in der Dokumentation TYPO3 Core API unter diesem Link: https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/Index.html

Typo3Cuckoo ·

Jetzt funktionierts! 🙂

Mein Hook sieht jetzt folgendermaßen aus:

<?php

require_once (PATH_t3lib . 'class.t3lib_tcemain.php');

class tx_meineext_tcemainprocessdatamap
{
   public function processDatamap_afterDatabaseOperations(&$status, &$table, &$id, &$fieldArray, &$tceobj)
   {
      if($table == 'tx_meinext_meinetabelle')
      {
         if($status == 'new')
            $currentId = $tceobj->substNEWwithIDs[$id];
         else
            $currentId = $id;
            
         if($currentId>0)
         {
            $data = array(
               'tx_meinext_meinetabelle' => array(
                  $currentId => array(
                     'hash' => '123456789'
                  )
               )
            );
            $tce = t3lib_div::makeInstance('t3lib_TCEmain');
            $tce->stripslashes_values = 0;  
            $tce->start($data, null);  
            $tce->process_datamap();              
         }
      }
   }
}
?>

Hook-Klasse registrieren in ext_localconf.php

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'][] = 'EXT:'.$_EXTKEY.'/class.tx_meineext_tcemainprocessdatamap.php:tx_meineext_tcemainprocessdatamap';