Schnellnavigation:

Kategorien

« März 2024»
S M T W T F S
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

Letzte Nachrichten

DSGVO
26.05.2018 18:39
Trackingtools und Datenschutzerklärung
14.03.2014 23:07
1:n und n:1 Relationen in Extbase
06.12.2013 12:04
Erste Abmahnungen wegen Google Analytics
04.10.2013 12:11

Kopieren Sie diesen Link in Ihren RSS-Reader

RSS 0.91Nachrichten
RSS 2.0Nachrichten

In eigener Sache

Peter Linzenkirchner, Lisardo EDV Beratung in Augsburg. Freelance und Partner für Design- und Webagenturen in Augsburg und München. Pixelgenaue Templates, valides HTML, barrierearm. TYPO3-Projekte, Extension-Programmierung und mehr ... 

Zur Zeit wird gefiltert nach: API
Filter zurücksetzen

Mit dem Extensionbuilder können Datenbank-Relationen für Extbase-Extensions leicht angelegt werden. Das wirklich schöne Interface hat aber zumindest in meinem Fall dazu geführt, dass ich mich anfangs nicht darum gekümmert habe, was genau denn dabei passiert. Und dann stand ich plötzlich vor dem Problem, dass die 1:n-Relation doch bitte ohne IRRE funktionieren soll. Das Problem ist an sich leicht zu lösen, aber eben nicht mehr allein über den Extensionbuilder. 

Worin liegt das Problem? 

Model A (Location) soll eine 1:n-Verbindung erhalten zu Model B (Image). Ziel ist die Präsentation von Orten mit Adresse, Beschreibung und beliebig vielen Bilder. Wird die Relation über den Extensionmanager angelegt (was sehr einfach geht), dann bekomme ich im Location-Datensatz im Backend ein IRRE-Feld für die Bilder. Soweit wunderbar einfach für den Redakteur, wenn es sich um ein paar Bilder handelt. Was aber, wenn es mehrere hundert Bilder sind? IRRE mit hunderten von Datensätzen macht keinen Spaß. 

Nun liegt der Gedanke nahe, einfach anders herum zu gehen: Wir legen einfach eine n:1-Verbindung von Model B (Image) zu Model A (Location) an. Im Backend ist das Ergebnis perfekt: Im Location-Datensatz sind die IRRE-Relationen zu den Bildern weg, während jetzt ein DropDown im Image-Datensatz erscheint, in dem die Location ausgewählt werden kann. Aber leider wird jetzt das Objekt auch anders herum gemappt: Model A (Location) enthält keinen Bezug mehr zu Modul B (Image) und die Locationliste zeigt somit keine Bilder mehr. Dagegen funktioniert es jetzt anders herum: die Bildliste enthält jetzt die Locations, was ich nicht brauche. 

Was ich erreichen will: 

Das Backend soll sich verhalten wie oben beschrieben, es soll also ein DropDown in den Bilderdatensätzen erscheinen, in dem ich die Location auswähle. Im Extensionbuilder erhalte ich das über eine n:1-Relation in Model B (Image). Für die Frontendausgabe brauche ich jedoch eine Liste der Locations mit den Bildern, was ich bekomme, wenn ich im Extensionbuilder eine 1:n-Relation in Model A (Locations) anlege. 

Wie bekomme ich das aufeinander? 

Datenbank

ich lege in der Datenbank zwei Felder an: in der Location-Tabelle das Feld "images" und in der Image-Tabelle das Feld "locations". Beide bekommen int(11) als Format. 

TCA

Im TCA der Location-Tabelle erstelle ich eine Definition für das Feld "images" in dieser Art: 

'type' => 'inline'
'foreign_table' => '….…._image',
'foreign_field' => 'locations',

damit erhalte ich das IRRE-Feld im Location-Datensatz. Im TCA der Image-Tabelle wird das Feld "locations" so definiert: 

'type' => 'select',
'foreign_table' => 'tx_camplist_domain_model_location',

wobei ich als Typ angeben kann, was ich benötige, hier ein Select, also je nach den weiteren Definitionen entweder ein Auswahlfeld oder ein DropDown. 

Objektmapping in beiden Models

Beide Models erweitere ich nun um die Objekt-Attribute $images im Location-Model (die Kommentare nicht vergessen!) und $locations im Image-Model. Dazu natürlich in beiden Models die passenden Getter und Setter ergänzen. 

Abschluss

Man kann jetzt im Backend die Bilder auf zwei Arten hinzufügen: entweder direkt als Datensatz und dort die Location in einem Dropdown auswählen, oder über IRRE im Location-Datensatz. Wenn ich die IRRE-Felder im Location-Datensatz verstecken will, so lösche ich im TCA der Location-Tabelle unter "types.1.showitem" den Eintrag "images". 

Kategorien: API  Kommentare 0

Es ist prinzipiell möglich, den RTE in Flexforms – und damit auch in FCEs – zu konfigurieren. Wie das geht, wird  im Wiki auf typo3.org beschrieben, oder in der API-Dokumentation (nach »defaultExtras« suchen). Mit diesem Eintrag in den defaultExtras wird der RTE z. B. beschränkt auf fett, kursiv und Links:

  1. <defaultExtras>richtext[bold|italic|link]:rte_transform[mode=css]</defaultExtras>

Oder vielmehr sollte ... es funktioniert nämlich nicht mehr. Es gibt einen Bug-Report dazu, dem auch ein Patch für die Core-Klasse class.t3lib_tceforms beiliegt. Nach dem Einspielen des Patch funktioniert es wieder. 

Kategorien: API/Tipps  Kommentare 0
Tags: rte, fce

Ziel ist die Erstellung einer Extension, die alle Features zur Mehrsprachigkeit bietet, die zur Ausstattung von TYPO3 gehören.

Die Datenbank-Struktur

Diese drei Felder müssen zusätzlich in der Extension in der »ext_tables.sql« angelegt werden:

  1. sys_language_uid int(11) DEFAULT'0'NOT NULL,
  2. l18n_parent int(11) DEFAULT'0'NOT NULL,
  3. l18n_diffsource mediumblob NOT NULL,

Die »ext_tables.php« muss so erweitert werden:

  1. "ctrl"=> Array (
  2.   [--snip--]
  3.   "delete"=>"deleted",   
  4.   'transOrigPointerField'  =>'l18n_parent',
  5.   'transOrigDiffSourceField'=>'l18n_diffsource',
  6.   'languageField'      =>'sys_language_uid',
  7.   [--snip--]

Und das »columns«-Array in der »tca.php« ebenfalls:

  1. "columns"=> Array (
  2.   [--snip--]
  3.   'sys_language_uid'=> array(
  4.     'exclude'=>1,
  5.     'label' =>'LLL:EXT:lang/locallang_general.xml:LGL.language',
  6.     'config'  => array(
  7.         'type'                =>'select',
  8.         'foreign_table'   =>'sys_language',
  9.         'foreign_table_where'=>'ORDER BY sys_language.title',
  10.         'items'       => array(
  11.             array('LLL:EXT:lang/locallang_general.php:LGL.allLanguages', -1),
  12.             array('LLL:EXT:lang/locallang_general.php:LGL.default_value',0)
  13.         )
  14.     )
  15.   ),
  16.   'l18n_parent'=> array(
  17.     'displayCond'=>'FIELD:sys_language_uid:>:0',
  18.     'exclude'  =>1,
  19.     'label'   =>'LLL:EXT:lang/locallang_general.xml:LGL.l18n_parent',
  20.     'config'      => array(
  21.         'type'  =>'select',
  22.         'items'=> array(
  23.             array('',0),
  24.         ),
  25.         'foreign_table'   =>'tx_meineExtension',
  26.         'foreign_table_where'=>'AND tx_meineExtension.uid=###CURRENT_PID### AND tx_meineExtension.sys_language_uid IN (-1,0)',
  27.     )
  28.   ),
  29.   'l18n_diffsource'=> array(
  30.     'config'=> array(
  31.         'type'=>'passthrough'
  32.     )
  33.   ),
  34.   [--snip--]
  35. ),

Wichtig: Damit die Zuordnung der Sprach-Overlays funktioniert, muss oben bei »foreign_table« die korrekte Tabellenbezeichnung der Extension eingegeben werden, ebenso bei »foreign_table_where« – insgesamt also dreimal.

Damit die Redakteure später nicht nur Language-Overlay-Datensätze anlegen, sondern einen Datensatz direkt einer Sprache zuordnen können (um z. B. Datensätze in einer Fremsprache anlegen zu können, ohne dass es zuvor einen Datensatz in der Standardsprache gibt), muss auch noch das »types«-Array in der »tca.php« erweitert werden:

  1. "types"=> Array (
  2.   "0"=> Array("showitem"=>"hidden;;1;;1-1-1, sys_language_uid;;1;;3-3-3,
  3.   [-- snip --]
  4. ),

Damit erscheint im Backend ein DropDown-Menü mit einer Auswahl von allen definierten Alternativ-Sprachen sowie der Auswahl »Alle«.

Im Backend müsste jetzt alles richtig ausgegeben werden: Die Redakteure können neue Datensätze anlegen, diese einer oder allen Sprachen zuordnen, oder nachträglich Datensätze in der Standardsprache übersetzen. Also genauso wie bei den normalen Inhaltselementen.

Natürlich muss die Ausgabe im Frontend das entsprechend berücksichtigen

Ausgabe von sprachabhängigen Texten ins Template

Damit sind nicht die Inhalte aus den Datentabellen gemeint sondern zum Beispiel Überschriften oder Labels für Formularfelder, die ebenfalls den Sprachen angepasst werden müssen. Diese Texte werden zunächst in die »locallang.xml« im pi1-Ordner der Extension eingetragen:

  1. <?xml version="1.0"encoding="utf-8"standalone="yes"?>
  2. <T3locallang>
  3.     <meta type="array">
  4.         <type>module</type>
  5.         <description>Language labelsforplugin tx_meineExtension_pi1</description>
  6.     </meta>
  7.     <data type="array">
  8.         <languageKey index="default"type="array">
  9.             <label index="eindeutigerName">Headline in Defaultsprache</label>
  10.         </languageKey>
  11.         <languageKey index="en"type="array">
  12.             <label index="eindeutigerName">Headline in English</label>
  13.         </languageKey>
  14.         <languageKey index="de"type="array">
  15.             <label index="eindeutigerName">Überschrift in Deutsch</label>
  16.         </languageKey>
  17.     </data>
  18. </T3locallang>

Diese Datei muss in UTF-8 abgespeichert werden, sonst gibt es entweder eine leere Frontend-Seite oder eine Fehlermeldung, je nach TYPO3-Version. Sie darf weder HTML noch Entities enthalten. In der Regel wirds das nicht brauchen (da die Datei ja UTF-8 ist), aber falls doch, gibt es folgende Möglichkeiten:

Entitiy definieren:

  1. <?xml version="1.0"encoding="utf-8"standalone="yes"?>
  2. <!DOCTYPE T3locallang [
  3.     <!ENTITY euro"&amp;euro;">
  4. ]>
  5. <T3locallang>
  6.     <meta type="array">
  7.         <type>module</type>
  8.         <description>Language labelsforplugin tx_tmeineExtension_pi1</description>
  9.     </meta>
  10.     <data type="array">
  11.         <languageKey index="default"type="array">
  12.                 <label index="eindeutigerName">Preis is&amp;euro;</label>
  13.         </languageKey>
  14.     </data>
  15. </T3locallang>

Sieht komisch aus, funktioniert aber. Die nächste Möglichkeit ist wahrscheinlich einfacher:

HTML in »locallang.xml«

  1. <?xml version="1.0"encoding="utf-8"standalone="yes"?>
  2. <T3locallang>
  3.     <meta type="array">
  4.         <type>module</type>
  5.         <description>Language labelsforplugin tx_meineExtension_pi1</description>
  6.     </meta>
  7.     <data type="array">
  8.         <languageKey index="default"type="array">
  9.             <label index="eindeutigerName"><![CDATA[<strong style='color:#00005a;'>und so weiter</strong>]]></label>
  10.         </languageKey>
  11.     </data>
  12. </T3locallang>

Jeder HTML-eintrag muss also mit

  1. <![CDATA[   ]]>

maskiert werden.

Ausgabe ins Frontend

Damit eine Ausgabe möglich wird, muss die »class.tx_meineExtension_pi1.php« erweitert werden:

  1. classtx_meineExtension_pi1extendstslib_pibase {
  2.   // snip
  3.   functionmain($content,$conf){
  4.   // snip
  5.   $this->pi_loadLL();
  6.   // snip
  7.  

 

Die Zeile $this->pi_loadLL(); lädt die notwendige Klasse.

Die eigentliche Ausgabe des Textes erfolgt so:

  1. $txt=$this->pi_getLL('eindeutigerName','default',FALSE);

Die Optionen bedeuten:

  • Name/Bezeichnung des Eintrags in der »locallang.xml«
  • Defaultwert – in der Regel ein englischer Begriff, als Platzhalter, falls der Eintrag in der locallang.xml fehlt
  • TRUE wenn der Wert durch htmlspecialchars() laufen soll

Daten aus den Datentabellen auslesen

Das erweist sich als das eigentliche Problem. Ich habe noch keine endgültige Lösung, aber die folgende funktioniert fürs erste.

1. Schritt: Daten aus der Tabelle holen. Dabei interessiert erstmal nur der WHERE-Teil des sql-Statements, der Rest dürfte klar sein:

  1. if ($GLOBALS['TSFE']->sys_language_content==0){
  2.   $whereClause="pid=xyz".
  3.   ' AND (sys_language_uid IN (-1,0) OR (sys_language_uid='.
  4.   $GLOBALS['TSFE']->sys_language_uid.
  5.   ' AND l18n_parent=0)) '.
  6.   $this->cObj->enableFields($tableName);
  7. }else{
  8.   $whereClause="pid=xyz".
  9.   ' AND (sys_language_uid IN (-1,0) OR (sys_language_uid='.
  10.   $GLOBALS['TSFE']->sys_language_uid.
  11.   ' AND l18n_parent=0)) ';
  12. }

Erläuterung: In der Defaultsprache wird »$this->cObj->enableFields()« aufgerufen, damit die versteckten Datensätze (und die gelöschten etc) nicht sichtbar werden. Bei den Alternativ-Sprachen entfällt das in diesem Schritt sondern folgt erst in einem weiteren. Die Zeile »’ AND (sys_language_uid ….« wählt alle Datensätze aus, die in »sys_language_uid« 0 (= Standardsprache) oder -1 (= alle Sprachen) stehen haben. Sie wählt aber auch alle Datensätze in der Alternativsprache aus, die keinen Eintrag in der Standardsprache haben.

Im nächsten Schritt werden die Sprach-Overlays geholt: die Felder des Datensatzes werden mit den Einträgen in der Alternativ-Sprache überschrieben:

  1. while ($row=$GLOBALS ['TYPO3_DB']->sql_fetch_assoc($newsResult) ){
  2.   if ($GLOBALS['TSFE']->sys_language_content){
  3.       $row=$GLOBALS['TSFE']->sys_page->getRecordOverlay($tableName,$row,$GLOBALS['TSFE']->sys_language_content,$GLOBALS['TSFE']->sys_language_mode=='strict'?'hideNonTranslated':'');
  4.   }
  5. }

Je nach Spracheinstellung werden dabei auch Einträge entfernt – also z. B. wenn sys_language_mode=strict eingestellt ist, werden alle nicht übesetzten Einträge entfernt.

Über GLOBALS[‘TSFE’]->fe_user kann man sich die gesamte Konfiguration der Frontenduser ausgeben lassen:

  1. $GLOBALS['TYPO3_DB']->debugOutput=true;
  2. echot3lib_div::debug($GLOBALS['TSFE']->fe_user);

Ergebnis:

  1. tslib_feuserauth Object
  2. (
  3.     [global_database]=>
  4.     [session_table]=>fe_sessions
  5.     [name]=>fe_typo_user
  6.     [get_name]=>ftu
  7.     [user_table]=>fe_users
  8.     [username_column]=>username
  9.     [userident_column]=>password
  10.     [userid_column]=>uid
  11.     [lastLogin_column]=>lastlogin
  12.     [enablecolumns]=> Array
  13.         (
  14.             [deleted]=>deleted
  15.             [disabled]=>disable
  16.             [starttime]=>starttime
  17.             [endtime]=>endtime
  18.         )
  19.  
  20.     [formfield_uname]=>user
  21.     [formfield_uident]=>pass
  22.     [formfield_chalvalue]=>challenge
  23.     [formfield_status]=>logintype
  24.     [security_level]=>normal
  25.     [auth_include]=>
  26.     [auth_timeout_field]=>6000
  27.     [lifetime]=>0
  28.     [gc_time]=>6000
  29.     [gc_probability]=>1
  30.     [writeStdLog]=>
  31.     [writeAttemptLog]=>
  32.     [sendNoCacheHeaders]=>0
  33.     [getFallBack]=>1
  34.     [hash_length]=>10
  35.     [getMethodEnabled]=>1
  36.     [lockIP]=>2
  37.     [lockHashKeyWords]=>useragent
  38.     [warningEmail]=>
  39.     [warningPeriod]=>3600
  40.     [warningMax]=>3
  41.     [checkPid]=>1
  42.     [checkPid_value]=>0
  43.     [id]=>ed2f34eb0c
  44.     [cookieId]=>ed2f34eb0c
  45.     [loginFailure]=>
  46.     [loginSessionStarted]=>
  47.     [get_URL_ID]=>
  48.     [newSessionID]=>
  49.     [forceSetCookie]=>
  50.     [dontSetCookie]=>
  51.     [challengeStoredInCookie]=>
  52.     [loginType]=>FE
  53.     [svConfig]=>
  54.     [writeDevLog]=>
  55.     [formfield_permanent]=>permalogin
  56.     [usergroup_column]=>usergroup
  57.     [usergroup_table]=>fe_groups
  58.     [groupData]=> Array
  59.         (
  60.             [title]=> Array
  61.                 (
  62.                 )
  63.  
  64.             [uid]=> Array
  65.                 (
  66.                 )
  67.  
  68.             [pid]=> Array
  69.                 (
  70.                 )
  71.  
  72.         )
  73.  
  74.     [TSdataArray]=> Array
  75.         (
  76.             [0]=>
  77.         )
  78.  
  79.     [userTS]=> Array
  80.         (
  81.         )
  82.  
  83.     [userTSUpdated]=>0
  84.     [showHiddenRecords]=>0
  85.     [sesData]=> Array
  86.         (
  87.             [th_mailformplus17]=>
  88.         )
  89.  
  90.     [sesData_change]=>0
  91.     [userData_change]=>0
  92.     [is_permanent]=>1
  93.     [user]=>
  94. )
  95. </pre>|</b><b>|Object:<pre>tslib_feuserauth Object
  96. (
  97.     [global_database]=>
  98.     [session_table]=>fe_sessions
  99.     [name]=>fe_typo_user
  100.     [get_name]=>ftu
  101.     [user_table]=>fe_users
  102.     [username_column]=>username
  103.     [userident_column]=>password
  104.     [userid_column]=>uid
  105.     [lastLogin_column]=>lastlogin
  106.     [enablecolumns]=> Array
  107.         (
  108.             [deleted]=>deleted
  109.             [disabled]=>disable
  110.             [starttime]=>starttime
  111.             [endtime]=>endtime
  112.         )
  113.  
  114.     [formfield_uname]=>user
  115.     [formfield_uident]=>pass
  116.     [formfield_chalvalue]=>challenge
  117.     [formfield_status]=>logintype
  118.     [security_level]=>normal
  119.     [auth_include]=>
  120.     [auth_timeout_field]=>6000
  121.     [lifetime]=>0
  122.     [gc_time]=>6000
  123.     [gc_probability]=>1
  124.     [writeStdLog]=>
  125.     [writeAttemptLog]=>
  126.     [sendNoCacheHeaders]=>0
  127.     [getFallBack]=>1
  128.     [hash_length]=>10
  129.     [getMethodEnabled]=>1
  130.     [lockIP]=>2
  131.     [lockHashKeyWords]=>useragent
  132.     [warningEmail]=>
  133.     [warningPeriod]=>3600
  134.     [warningMax]=>3
  135.     [checkPid]=>1
  136.     [checkPid_value]=>0
  137.     [id]=>ed2f34eb0c
  138.     [cookieId]=>ed2f34eb0c
  139.     [loginFailure]=>
  140.     [loginSessionStarted]=>
  141.     [get_URL_ID]=>
  142.     [newSessionID]=>
  143.     [forceSetCookie]=>
  144.     [dontSetCookie]=>
  145.     [challengeStoredInCookie]=>
  146.     [loginType]=>FE
  147.     [svConfig]=>
  148.     [writeDevLog]=>
  149.     [formfield_permanent]=>permalogin
  150.     [usergroup_column]=>usergroup
  151.     [usergroup_table]=>fe_groups
  152.     [groupData]=> Array
  153.         (
  154.             [title]=> Array
  155.                 (
  156.                 )
  157.  
  158.             [uid]=> Array
  159.                 (
  160.                 )
  161.  
  162.             [pid]=> Array
  163.                 (
  164.                 )
  165.  
  166.         )
  167.  
  168.     [TSdataArray]=> Array
  169.         (
  170.             [0]=>
  171.         )
  172.  
  173.     [userTS]=> Array
  174.         (
  175.         )
  176.  
  177.     [userTSUpdated]=>0
  178.     [showHiddenRecords]=>0
  179.     [sesData]=> Array
  180.         (
  181.             [th_mailformplus17]=>
  182.         )
  183.  
  184.     [sesData_change]=>0
  185.     [userData_change]=>0
  186.     [is_permanent]=>1
  187.     [user]=>
  188. )
  189. </pre>|</b><b>|Object:<pre>tslib_feuserauth Object
  190. (
  191.     [global_database]=>
  192.     [session_table]=>fe_sessions
  193.     [name]=>fe_typo_user
  194.     [get_name]=>ftu
  195.     [user_table]=>fe_users
  196.     [username_column]=>username
  197.     [userident_column]=>password
  198.     [userid_column]=>uid
  199.     [lastLogin_column]=>lastlogin
  200.     [enablecolumns]=> Array
  201.         (
  202.             [deleted]=>deleted
  203.             [disabled]=>disable
  204.             [starttime]=>starttime
  205.             [endtime]=>endtime
  206.         )
  207.  
  208.     [formfield_uname]=>user
  209.     [formfield_uident]=>pass
  210.     [formfield_chalvalue]=>challenge
  211.     [formfield_status]=>logintype
  212.     [security_level]=>normal
  213.     [auth_include]=>
  214.     [auth_timeout_field]=>6000
  215.     [lifetime]=>0
  216.     [gc_time]=>6000
  217.     [gc_probability]=>1
  218.     [writeStdLog]=>
  219.     [writeAttemptLog]=>
  220.     [sendNoCacheHeaders]=>0
  221.     [getFallBack]=>1
  222.     [hash_length]=>10
  223.     [getMethodEnabled]=>1
  224.     [lockIP]=>2
  225.     [lockHashKeyWords]=>useragent
  226.     [warningEmail]=>
  227.     [warningPeriod]=>3600
  228.     [warningMax]=>3
  229.     [checkPid]=>1
  230.     [checkPid_value]=>0
  231.     [id]=>ed2f34eb0c
  232.     [cookieId]=>ed2f34eb0c
  233.     [loginFailure]=>
  234.     [loginSessionStarted]=>
  235.     [get_URL_ID]=>
  236.     [newSessionID]=>
  237.     [forceSetCookie]=>
  238.     [dontSetCookie]=>
  239.     [challengeStoredInCookie]=>
  240.     [loginType]=>FE
  241.     [svConfig]=>
  242.     [writeDevLog]=>
  243.     [formfield_permanent]=>permalogin
  244.     [usergroup_column]=>usergroup
  245.     [usergroup_table]=>fe_groups
  246.     [groupData]=> Array
  247.         (
  248.             [title]=> Array
  249.                 (
  250.                 )
  251.  
  252.             [uid]=> Array
  253.                 (
  254.                 )
  255.  
  256.             [pid]=> Array
  257.                 (
  258.                 )
  259.  
  260.         )
  261.  
  262.     [TSdataArray]=> Array
  263.         (
  264.             [0]=>
  265.         )
  266.  
  267.     [userTS]=> Array
  268.         (
  269.         )
  270.  
  271.     [userTSUpdated]=>0
  272.     [showHiddenRecords]=>0
  273.     [sesData]=> Array
  274.         (
  275.             [th_mailformplus17]=>
  276.         )
  277.  
  278.     [sesData_change]=>0
  279.     [userData_change]=>0
  280.     [is_permanent]=>1
  281.     [user]=>
  282. <p>)</p>

Dabei werden die Daten des eingeloggten Benutzers und seiner Benutzergruppe ausgegeben. Damit kann einfach überprüft werden, ob es sich um einen gültigen Benutzer handelt und ob er der richtigen Gruppe angehört.

In eigenen Extensions gibt es eine einfache Möglichkeit zu verhindern, dass beim Einbinden von Dateien für den Download – zum Beispiel aus einem Unterordner von fileadmin – diese Dateien nochmals in den /uploads/-Ordner kopiert werden. Dazu muss in der tca.php der internal_type von file auf file_refence umgestellt werden:

  1. 'file'=> array (       
  2.     'exclude'=>0,    
  3.     'label'=>'LLL:EXT:MyExtension/locallang_db.xml:tx_myExtension.file',       
  4.     'config'=> array (
  5.         'type'=>'group',
  6.         ## hier umstellen von file auf file_refence: ######
  7.         'internal_type'=>'file_reference',
  8.         'allowed'=>'',   
  9.         'disallowed'=>'php,php3',  
  10.         'max_size'=>$GLOBALS['TYPO3_CONF_VARS']['BE']['maxFileSize'],  
  11.         'uploadfolder'=>'uploads/myExtension',
  12.         'size'=>1,   
  13.         'minitems'=>0,
  14.         'maxitems'=>1,
  15.     )
  16. ),

Dadurch wird nicht mehr der reine Dateiname in der Datenbank gespeichert sondern der komplette Pfad auf die Datei. Natürlich muss das bei der weiteren Verarbeitung der Datei auch entsprechend berücksichtigt werden.

Weiterführende Links