Kategorien
- [-]Developer (104)
- API (15)
- Backend (17)
- Extensions (29)
- HTML & CSS (4)
- Typoscript (33)
- [-]Redaktionelles (21)
- Anleitungen (9)
- Tipps (8)
- [-]Sonstiges (50)
- SEO (8)
Schlagwortwolke
« | September 2010 | » | ||||
---|---|---|---|---|---|---|
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 |
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
Letzte Kommentare
- Das liegt daran, dass die captcha.php versucht, das halbe...
- 05.12.2017 00:41
- Hallo, danke für den tollen Beitrag. Kann man die...
- 22.10.2015 10:05
- Vielen Dank für den Austausch guter Artikel. Es ist eine...
- 17.08.2015 10:58
- Hallo Peter, danke für die Extension. Ich habe sie auf...
- 27.08.2014 12:51
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: September 1
Filter zurücksetzen
mehrsprachige Extensions
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:
- sys_language_uid int(11) DEFAULT'0'NOT NULL,
- l18n_parent int(11) DEFAULT'0'NOT NULL,
- l18n_diffsource mediumblob NOT NULL,
Die »ext_tables.php« muss so erweitert werden:
- [--snip--]
- "delete"=>"deleted",
- 'transOrigPointerField' =>'l18n_parent',
- 'transOrigDiffSourceField'=>'l18n_diffsource',
- 'languageField' =>'sys_language_uid',
- [--snip--]
Und das »columns«-Array in der »tca.php« ebenfalls:
- [--snip--]
- 'exclude'=>1,
- 'label' =>'LLL:EXT:lang/locallang_general.xml:LGL.language',
- 'type' =>'select',
- 'foreign_table' =>'sys_language',
- 'foreign_table_where'=>'ORDER BY sys_language.title',
- )
- )
- ),
- 'displayCond'=>'FIELD:sys_language_uid:>:0',
- 'exclude' =>1,
- 'label' =>'LLL:EXT:lang/locallang_general.xml:LGL.l18n_parent',
- 'type' =>'select',
- ),
- 'foreign_table' =>'tx_meineExtension',
- 'foreign_table_where'=>'AND tx_meineExtension.uid=###CURRENT_PID### AND tx_meineExtension.sys_language_uid IN (-1,0)',
- )
- ),
- 'type'=>'passthrough'
- )
- ),
- [--snip--]
- ),
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:
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:
- <?xml version="1.0"encoding="utf-8"standalone="yes"?>
- <T3locallang>
- <meta type="array">
- <type>module</type>
- <description>Language labelsforplugin tx_meineExtension_pi1</description>
- </meta>
- <data type="array">
- <languageKey index="default"type="array">
- <label index="eindeutigerName">Headline in Defaultsprache</label>
- </languageKey>
- <languageKey index="en"type="array">
- <label index="eindeutigerName">Headline in English</label>
- </languageKey>
- <languageKey index="de"type="array">
- <label index="eindeutigerName">Überschrift in Deutsch</label>
- </languageKey>
- </data>
- </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:
- <?xml version="1.0"encoding="utf-8"standalone="yes"?>
- <!DOCTYPE T3locallang [
- <!ENTITY euro"&euro;">
- ]>
- <T3locallang>
- <meta type="array">
- <type>module</type>
- <description>Language labelsforplugin tx_tmeineExtension_pi1</description>
- </meta>
- <data type="array">
- <languageKey index="default"type="array">
- <label index="eindeutigerName">Preis is&euro;</label>
- </languageKey>
- </data>
- </T3locallang>
Sieht komisch aus, funktioniert aber. Die nächste Möglichkeit ist wahrscheinlich einfacher:
HTML in »locallang.xml«
- <?xml version="1.0"encoding="utf-8"standalone="yes"?>
- <T3locallang>
- <meta type="array">
- <type>module</type>
- <description>Language labelsforplugin tx_meineExtension_pi1</description>
- </meta>
- <data type="array">
- <languageKey index="default"type="array">
- <label index="eindeutigerName"><![CDATA[<strong style='color:#00005a;'>und so weiter</strong>]]></label>
- </languageKey>
- </data>
- </T3locallang>
Jeder HTML-eintrag muss also mit
- <![CDATA[ ]]>
maskiert werden.
Ausgabe ins Frontend
Damit eine Ausgabe möglich wird, muss die »class.tx_meineExtension_pi1.php« erweitert werden:
- classtx_meineExtension_pi1extendstslib_pibase {
- // snip
- functionmain($content,$conf){
- // snip
- $this->pi_loadLL();
- // snip
Die Zeile $this->pi_loadLL(); lädt die notwendige Klasse.
Die eigentliche Ausgabe des Textes erfolgt so:
- $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:
- if ($GLOBALS['TSFE']->sys_language_content==0){
- $whereClause="pid=xyz".
- ' AND (sys_language_uid IN (-1,0) OR (sys_language_uid='.
- $GLOBALS['TSFE']->sys_language_uid.
- ' AND l18n_parent=0)) '.
- $this->cObj->enableFields($tableName);
- }else{
- $whereClause="pid=xyz".
- ' AND (sys_language_uid IN (-1,0) OR (sys_language_uid='.
- $GLOBALS['TSFE']->sys_language_uid.
- ' AND l18n_parent=0)) ';
- }
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:
- while ($row=$GLOBALS ['TYPO3_DB']->sql_fetch_assoc($newsResult) ){
- if ($GLOBALS['TSFE']->sys_language_content){
- $row=$GLOBALS['TSFE']->sys_page->getRecordOverlay($tableName,$row,$GLOBALS['TSFE']->sys_language_content,$GLOBALS['TSFE']->sys_language_mode=='strict'?'hideNonTranslated':'');
- }
- }
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.
Eigene Konstanten im TypoScript
Man kann eigene Konstanten definieren und diese im TypoScript-Template verwenden. Zuerst die Konstante definieren (in der Kategorie Constants im TypoScript-Template):
- # neue Konstante
- test.konstante1=4
Auf diese Konstante kann im TypoScript so zugegriffen werden:
- page.20=TEXT
- page.20.value={$test.konstante1}
Man muss also die Konstante mit geschweiften Klammern umgeben und ein Dollarzeichen davor setzen.
Diese Konstanten können auch über den Constant-Editor verwaltet werden. Dazu muss allerdings direkt oberhalt der Definition der Konstante ein Kommentar eingetragen werden, der die Konstante in den Constant-Editor aufnimmt:
- # cat=Grundeinstellungen//; type=int+; label=Navigations-ID: Geben Sie eine ID ein. Der Text kann auch deutlich länger sein.
- test.konstante1=4
Die Syntax:
- # cat=[Kategorie]/[Subkategorie]/[Position]; type=[Feldtyp]; label=[Titel]:[Beschreibung]
- test.konstante1=4
TCEFORM: Inhaltselemente im Backend formatieren
Die Optionen aller Eingabefelder im Backend können modifizert (= geändert oder erweitert) werden. Prinzipiell ist die Syntax:
- TCEFORM.[tablename].[field] {
- # Feld komplett entfernen:
- disabled=1
- # Item entfernen
- removeItems=1,2,3
- # Item hinzufügen (Achtung: erfordert für das Frontend noch TypoScript im Template!)
- addItems.[itemValue]=100,101
- # Umbenennen
- altLabels.[item_value]=ein ganz neuer Name
- }
Leider gibt es keine Dokumentation, welche Optionen für welches Feld zur Verfügung stehen und wie diese im Frontend ausgegeben werden. Das kann man wohl am einfachsten aus dem Quelltext des Eingabeformulars im Backend entnehmen. Für das Frontend kenne ich im Moment nur die Möglichkeit, es auszutesten bzw im Falle von tt_content das TypoScript von css_styled_content durchzusehen.
Bezeichnungen der Headline-Layouts ändern:
Ins TSconfig der der Seite folgendes eintragen:
- TCEFORM.tt_content {
- # ausblenden
- header_layout.removeItems=1,4,5,100
- # mit anderem Namen versehen
- header_layout.altLabels.0=Ebene 1,H1
- header_layout.altLabels.2=Ebene 2,H2
- header_layout.altLabels.3=Ebene 3,H3
- }
Falls H1 nicht genutzt werden soll, muss die Default-Einstellung noch geändert werden, bzw. die Ausgabe für header_layout.altLabels.0. Das geht über folgende Eingabe im Constants-Bereich des TypoScript-Templates:
- # Voreinstellunge auf Headline <h3>
- content.defaultHeaderType=3
Rahmenoptionen umbenennen:
- TCEFORM.tt_content {
- # Rahmenoptionen im Bereich Typ
- section_frame {
- # neue Labels
- altLabels {
- 10=Kasten
- 5=Linie davor
- 6=Linie danach
- 11=BoxBlau
- 12=BoxGrau
- }
- # ausblenden
- removeItems=1,20,21
- }
- }
Neue Rahmenoptionen hinzufügen
Das ist etwas aufwändiger, da hierzu auch das TypoScript von tt_content verändert werden muss. Erster Schritt im TSconfig der Seite:
- # neuer Rahmen dazu
- TCEFORM.tt_content.section_frame {
- addItems.100=Mal ganz anders
- }
Danach im TypoScript-Template:
- tt_content.stdWrap.innerWrap.cObject= CASE
- tt_content.stdWrap.innerWrap.cObject {
- 100=TEXT
- 100.value= <div class="mal-ganz-anders">|</div>
- }
Danach ganz normal in der CSS-Datei formatieren.
ACHTUNG: Das funktioniert seit TYPO3 4.3 nicht mehr; hier wurde css_styled_content etwas verändert. Man kann zwar die alte Fassung als static_content in das Template laden, aber besser ist es, es auf die neue Art zu machen:
- tt_content.stdWrap.innerWrap.cObject {
- # Definitionen zuweisen
- 100=<tt_content.stdWrap.innerWrap.cObject.default
- # Klasse zuweisen
- 100.15.value=mal-ganz-anders
- }
Das hat auch den Vorteile, dass die Abstände oben und unten funktionieren.
Weiterführende Links:
Frontend User Object fe_user
Über GLOBALS[‘TSFE’]->fe_user kann man sich die gesamte Konfiguration der Frontenduser ausgeben lassen:
- $GLOBALS['TYPO3_DB']->debugOutput=true;
- echot3lib_div::debug($GLOBALS['TSFE']->fe_user);
Ergebnis:
- tslib_feuserauth Object
- (
- [global_database]=>
- [session_table]=>fe_sessions
- [name]=>fe_typo_user
- [get_name]=>ftu
- [user_table]=>fe_users
- [username_column]=>username
- [userident_column]=>password
- [userid_column]=>uid
- [lastLogin_column]=>lastlogin
- (
- [deleted]=>deleted
- [disabled]=>disable
- [starttime]=>starttime
- [endtime]=>endtime
- )
- [formfield_uname]=>user
- [formfield_uident]=>pass
- [formfield_chalvalue]=>challenge
- [formfield_status]=>logintype
- [security_level]=>normal
- [auth_include]=>
- [auth_timeout_field]=>6000
- [lifetime]=>0
- [gc_time]=>6000
- [gc_probability]=>1
- [writeStdLog]=>
- [writeAttemptLog]=>
- [sendNoCacheHeaders]=>0
- [getFallBack]=>1
- [hash_length]=>10
- [getMethodEnabled]=>1
- [lockIP]=>2
- [lockHashKeyWords]=>useragent
- [warningEmail]=>
- [warningPeriod]=>3600
- [warningMax]=>3
- [checkPid]=>1
- [checkPid_value]=>0
- [id]=>ed2f34eb0c
- [cookieId]=>ed2f34eb0c
- [loginFailure]=>
- [loginSessionStarted]=>
- [get_URL_ID]=>
- [newSessionID]=>
- [forceSetCookie]=>
- [dontSetCookie]=>
- [challengeStoredInCookie]=>
- [loginType]=>FE
- [svConfig]=>
- [writeDevLog]=>
- [formfield_permanent]=>permalogin
- [usergroup_column]=>usergroup
- [usergroup_table]=>fe_groups
- (
- (
- )
- (
- )
- (
- )
- )
- (
- [0]=>
- )
- (
- )
- [userTSUpdated]=>0
- [showHiddenRecords]=>0
- (
- [th_mailformplus17]=>
- )
- [sesData_change]=>0
- [userData_change]=>0
- [is_permanent]=>1
- [user]=>
- )
- </pre>|</b><b>|Object:<pre>tslib_feuserauth Object
- (
- [global_database]=>
- [session_table]=>fe_sessions
- [name]=>fe_typo_user
- [get_name]=>ftu
- [user_table]=>fe_users
- [username_column]=>username
- [userident_column]=>password
- [userid_column]=>uid
- [lastLogin_column]=>lastlogin
- (
- [deleted]=>deleted
- [disabled]=>disable
- [starttime]=>starttime
- [endtime]=>endtime
- )
- [formfield_uname]=>user
- [formfield_uident]=>pass
- [formfield_chalvalue]=>challenge
- [formfield_status]=>logintype
- [security_level]=>normal
- [auth_include]=>
- [auth_timeout_field]=>6000
- [lifetime]=>0
- [gc_time]=>6000
- [gc_probability]=>1
- [writeStdLog]=>
- [writeAttemptLog]=>
- [sendNoCacheHeaders]=>0
- [getFallBack]=>1
- [hash_length]=>10
- [getMethodEnabled]=>1
- [lockIP]=>2
- [lockHashKeyWords]=>useragent
- [warningEmail]=>
- [warningPeriod]=>3600
- [warningMax]=>3
- [checkPid]=>1
- [checkPid_value]=>0
- [id]=>ed2f34eb0c
- [cookieId]=>ed2f34eb0c
- [loginFailure]=>
- [loginSessionStarted]=>
- [get_URL_ID]=>
- [newSessionID]=>
- [forceSetCookie]=>
- [dontSetCookie]=>
- [challengeStoredInCookie]=>
- [loginType]=>FE
- [svConfig]=>
- [writeDevLog]=>
- [formfield_permanent]=>permalogin
- [usergroup_column]=>usergroup
- [usergroup_table]=>fe_groups
- (
- (
- )
- (
- )
- (
- )
- )
- (
- [0]=>
- )
- (
- )
- [userTSUpdated]=>0
- [showHiddenRecords]=>0
- (
- [th_mailformplus17]=>
- )
- [sesData_change]=>0
- [userData_change]=>0
- [is_permanent]=>1
- [user]=>
- )
- </pre>|</b><b>|Object:<pre>tslib_feuserauth Object
- (
- [global_database]=>
- [session_table]=>fe_sessions
- [name]=>fe_typo_user
- [get_name]=>ftu
- [user_table]=>fe_users
- [username_column]=>username
- [userident_column]=>password
- [userid_column]=>uid
- [lastLogin_column]=>lastlogin
- (
- [deleted]=>deleted
- [disabled]=>disable
- [starttime]=>starttime
- [endtime]=>endtime
- )
- [formfield_uname]=>user
- [formfield_uident]=>pass
- [formfield_chalvalue]=>challenge
- [formfield_status]=>logintype
- [security_level]=>normal
- [auth_include]=>
- [auth_timeout_field]=>6000
- [lifetime]=>0
- [gc_time]=>6000
- [gc_probability]=>1
- [writeStdLog]=>
- [writeAttemptLog]=>
- [sendNoCacheHeaders]=>0
- [getFallBack]=>1
- [hash_length]=>10
- [getMethodEnabled]=>1
- [lockIP]=>2
- [lockHashKeyWords]=>useragent
- [warningEmail]=>
- [warningPeriod]=>3600
- [warningMax]=>3
- [checkPid]=>1
- [checkPid_value]=>0
- [id]=>ed2f34eb0c
- [cookieId]=>ed2f34eb0c
- [loginFailure]=>
- [loginSessionStarted]=>
- [get_URL_ID]=>
- [newSessionID]=>
- [forceSetCookie]=>
- [dontSetCookie]=>
- [challengeStoredInCookie]=>
- [loginType]=>FE
- [svConfig]=>
- [writeDevLog]=>
- [formfield_permanent]=>permalogin
- [usergroup_column]=>usergroup
- [usergroup_table]=>fe_groups
- (
- (
- )
- (
- )
- (
- )
- )
- (
- [0]=>
- )
- (
- )
- [userTSUpdated]=>0
- [showHiddenRecords]=>0
- (
- [th_mailformplus17]=>
- )
- [sesData_change]=>0
- [userData_change]=>0
- [is_permanent]=>1
- [user]=>
- <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.
Formulare mit E Mailadresse als Dropdown
Im Mailformular soll ein Dropdownmenü angeboten werden, mit dessen Hilfe die Zieladresse ausgewählt werden kann. Umsetzung mit der Extension Mailformplus.
Im Template:
Im TypoScript:
- plugin.tx_thmailformplus_pi1.default.contact_to=TEXT
- plugin.tx_thmailformplus_pi1.default.contact_to.data=GPvar:to
- plugin.tx_thmailformplus_pi1.default.contact_to.wrap= |
- [globalVar=GP:to=eins]
- plugin.tx_thmailformplus_pi1.default.email_to=eins@e-mail.de
- [globalVar=GP:to=zwei]
- plugin.tx_thmailformplus_pi1.default.email_to=zwei@e-mail.de
- [globalVar=GP:to=drei]
- plugin.tx_thmailformplus_pi1.default.email_to=drei@e-mail.de
Quelle: Deutschsprachige Mailingliste; Beitrag von Fabian Seltmann.
[Update]
Bei Powermail gibt es einen Eintrag hierzu direkt im Manual.