User:Maholtz

From TYPO3Wiki

Jump to: navigation, search

Hallo,

ich werde mich bemühen beim wachsen des deutschsprachigen Teils von http://wiki.typo3.org mitzuhelfen.

gruß, martin

Contents

IRC

ries hat den Bot Number-5 gebaut, derzeit läuft der noch auf seinem Server.

Ggf. übernimmt Phlogi (aka Cyrill) die Pflege. (Stand 25.08.2008)

eigene Unterseiten zum aufbau, Gedächtnis und ggf. späterer veröffentlichung

User:Maholtz/ExtDev

User:Maholtz/Backend sollte auf De:TSconfig landen

User:Maholtz/snippets

Es folgen Code-Schnipsel, Gedächtnisstützen uvm

Seiten die ein TypoScript-Element auf deutsch behandeln bekommen diesen Ausdruck an den Anfang gesetzt. {{De:Tag|TypoScript}}

Mit Gleichheitszeichen Teile ich die Seite in Abschnitte auf, ein Gleichheitszeichen bedeutet h1 usw.
===== Ueberschrift5 =====
Auf diese Abschnitte kann ich dann via Anker referenzieren #Ueberschrift5

Erzeugt ein Sprachenmenü für die TYPOScript Referenz TypoScript Referenz {{Lang|TSref|TypoScript Referenz|}}
Erzeugt ein Sprachenmenü für TypoScript Datentypen {{Lang|TSrefDataTypes|TSref Datentypen|}}

Diese Struktur verwendet?
http://wiki.typo3.org/index.php/TSref/optionSplit

Sprachenmenü, noch zu bearbeiten und als Typoscript markieren
 {{Lang|TSref/getText|TypoScript Referenz - getText|}}
 ''This page is {{Tag|document in progress}}.''
{{De:Tag|TypoScript}}

De:Rootline_menues

De:Indexed_search Deutsche Seite zur Indexed Search Extension


De:TSref - TypoScript-Referenz, dort sollten mit der Zeit alle TypoScript Befehle erklärt sein. Dank des Wikis mit einer großen Anzahl von Code-Schnipseln?

Meine Liste

Seiten die ich noch überarbeiten möchte:

und dann geht es ab dort weiter: http://typo3.org/documentation/document-library/references/doc_core_tsref/4.0.0/view/7/1/


Howto - was ich bei dem Erstellen von TYPOScript Seiten nicht vergessen möchte

Wie erreiche ich was: http://wiki.typo3.org/index.php/Help:Contents

Sprachenmenü, Seiten befindet sich in Bearbeitung und TypoScript-Tag ganz nach oben.

 {{Lang|TSref/getText|TypoScript Referenz - getText|}}
 ''This page is {{Tag|document in progress}}.''
 {{De:Tag|TypoScript}}

Darunter folgt dann die Überschrift

 == Überschrift==

Dann vielleicht eine Liste von _wichtigen_ Links:

* [[De:TSref|Zurück zur Übersicht]]
* [[De:TSrefFunctions|TypoScript Funktionen]] ([[De:TSref/typolink|typolink]], [[De:TSref/stdWrap|stdWrap]])
* [[De:TSref/getText|getText]], [[De:TSref/optionSplit|optionSplit]]
* [[De:TSrefConditions|Bedingungen]]
* [[De:TSref/cObject|Liste der TypoScript Objekte]] ([[De:TSref/IMAGE|IMAGE]],[[De:TSref/HMENU|HMENU]])
* [[De:TSrefSetup|Toplevel Objekte]]

schaut dann so aus:


Und dann die Elemente.

Links sind in der Regel auf TYPOScript Funktionen, Objekten oder Datentypen.

  Datentyp: [[De:TSrefDataTypes#string|string]]
  Funktion: [[De:TSref/stdWrap|stdWrap]]
  Objekt:   [[De:TSref/HTML|HTML]]
  Wenn TYPOScript noch getestet werden muss: {{Tag|todo TypoScript-test}} 

Bei den Objekten gibt es immer eine Tabelle mit den zur Verfügung stehenden Funktionen:

{| {{DesignTable|background-color:white}}
| '''Eigenschaft'''
| '''Datentyp'''
| '''Kommentar'''
| '''Standardwert'''

|-
|
|
|
|-

|}
[tsref:(cObject).FILE]


{| {{DesignTable|background-color:white}}
| '''Property:'''
| '''Data type:'''
| '''Description:'''
| '''Default:'''

|-
|
|
|
|-

|}
[tsref:(cObject).FILE]

Häufig wiederkehrende Datentypen und Funktionen

Englisch Deutsch
[[TSref/stdWrap|stdWrap]] [[De:TSref/stdWrap|stdWrap]]
[[TSref/getText|getText]] [[De:TSref/getText|getText]]


[[TSrefDataTypes#string|string]] [[De:TSrefDataTypes#string|string]]
[[TSrefDataTypes#wrap|wrap]] [[De:TSrefDataTypes#wrap|wrap]]


[[TSrefDataTypes#int|int]] [[De:TSrefDataTypes#int|int]]
[[TSrefDataTypes#boolean|boolean]] [[De:TSrefDataTypes#boolean|boolean]]


Links auf interne und Externe Quellen

Link auf eine Extension:

 <extension>mhnotifychanger</extension>
 wird zu 
 Notify Changer (mhnotifychanger) (contact: maholtz)

Extensions die Dependency Fehler haben, Seiten deren TypoScript getestet werden usw. unter Teamwork eintragen

Schnipsel die ich nicht vergessen möchte

Crawler

Konfigurationsbeispiel aus
Cache Managemetn (cachemgm) (contact: kasper)
tx_crawler.crawlerCfg.paramSets {
 language = &L=[|_TABLE:pages_language_overlay;_FIELD:sys_language_uid]
 language.procInstrFilter = tx_cachemgm_recache
 language.baseUrl = http://localhost:8888/typo3/dummy_4.0/  
}

Typoscript verwenden

Via Typoscript

plugin.tx_extension_pi1.textdatei = 'EXT:extension/datei.txt';

und im PHP-Skript:

$this->cObj->fileResource($this->conf['textdate']);

öffentliche Extensions

csc_with_multimedia (csc_with_multimedia) (contact: maholtz) Dokumentation

Notify Changer (mhnotifychanger) (contact: maholtz) Extensions/mhnotifychanger/manual

paypal2commerce (paypal2commerce) (contact: maholtz) manual Handbuch


Also Vorlage für Extension Dokumentation sollte das Template verwendet werden. (Die Vorlage gibt es auch als OpenOffice .sxw)

Tipps und Tricks für die Extensionprogrammierung:

// bitte die abgesetzte Query speichern
$GLOBALS['TYPO3_DB']->store_lastBuiltQuery = 1;
// Query ausführen
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($select_fields,$from_table,$where_clause,$groupBy,$orderBy,$limit);
// welches Select wurde abgeschickt?
echo $GLOBALS['TYPO3_DB']->debug_lastBuiltQuery;


Beim arbeiten mit Frontend-Extensions, können die Felder die bearbeitet werden könnnen geholt werden:
$fieldlist = $GLOBALS['TCA'][$this->table]['feInterface']['fe_admin_fieldList'];


Wichtige Links rund um Extension Programmierung


TYPOScript

Auf globale Einstellungen zugreifen:

  • $GLOBALS["TSFE"]->tmpl->setup['config.']


Page ID auslesen / verwenden

$pid = (isset($this->conf['pid'])?$this->conf['pid']:$GLOBALS['TSFE']->id);

TCA erweitern

Ein Eintrag in der tca.php einer Extension, im Abschnitt "columns" kann z.B. so aussehen:

"name" => Array (		
	"exclude" => 1,		
	"label" => "LLL:EXT:exampleext/locallang_db.xml:tx_exampleext_table.name",		
	"config" => Array (
		"type" => "input",	
		"size" => "30",	
		"eval" => "required",
	)
),

Bei dem Config-Bereich können einige Dinge geändert werden. Der Wert von "type" kann folgende Werte annehmen: input, text, check, radio, select, group, none, passthrough, user, flex.

Es können weitere Eigenschaften definiert werden:

default: Default Wert
size : Größe des Input-Feldes
eval : Auswertung, z.B. required, date, double2 (das DB Feld sollte dann via double(11,2) definiert sein)
cols : Bei typ "text" 
rows : Bei typ "text"
max  : Anzahl maximaler Zeichen
checkbox : Anzeige der Checkbox for dem Feld ("0" oder "1")
range : Bereich in dem ein Wert liegen darf, bei Datum z.B. 
"range" => Array (
	"upper" => mktime(0,0,0,12,31,date("Y")+20),
	"lower" => mktime(0,0,0,date("m")-1,date("d"),date("Y"))
)


Alles rund um Flexforms in eigenen Extensions was mir wichtig erscheint

ext_tables.php anpassen:
// Das Feld pi_flexform enthält die XML-Daten der Flexform.
// Also muss es bei der Wahl der Extension auch angezeigt werden.
$TCA['tt_content']['types']['list']['subtypes_addlist'][$_EXTKEY.'_pi1']='pi_flexform';
// Flexform an das Plugin binden
// meintest steht für das Verzeichnis der Extension, dort wird auch die Flexform-Datei abgelegt
t3lib_extMgm::addPiFlexFormValue($_EXTKEY.'_pi1','FILE:EXT:meintest/flexform_ds_pi1.xml');
// Falls mehrere Plugins existieren, werden _pi2 usw. genutzt
// Die XML-Datei bestimmt wie die Flexform aussieht, in diesem Beispiel
// wird bei Mehrsprachigkeit trotzdem nur eine Eingabemöglichkeit angegeben
// Bei Sprachneutralen Eingaben sinnvoll.
flexform_ds_pi1.xml
<T3DataStructure>
	<meta>
		<langDisable>1</langDisable>

		<!--  <langChildren>1</langChildren>!-->
	</meta>
	<sheets>
		<sDEF>
			<ROOT>
				<TCEforms>
					<sheetTitle>Einstellungen - wird dann angezeigt</sheetTitle>
				</TCEforms>
				<type>array</type>
				<el>
					<seite>
						<TCEforms>
							<exclude>1</exclude>
							<label>Ein Contentelement wählen</label>
							<config>
								<type>group</type>
								<internal_type>db</internal_type>
								<allowed>tt_content</allowed>
								<size>1</size>
								<maxitems>1</maxitems>
								<minitems>0</minitems>
								<show_thumbs>1</show_thumbs>
							</config>
						</TCEforms>
      					</seite>
				</el>
			</ROOT>
		</sDEF>
	</sheets>
</T3DataStructure>

Zugriff in der Extension erhalten wir via:

// Initialisieren der Flexform und die Daten des Plugins holen
$this->pi_initPIflexForm(); // einmal z.B. in main()

// die Einstellungen holen wir uns dann via:
$this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'seite', 'sDEF')
// pi_getFFvalue ist eine Funktion der Klasse tslib_pibase

TypoScript in eigener Extension verwenden

TypoScript (Liste TypoScript)

 #Typoscript:
 plugin.tx_meineext.abstract = TEXT
 plugin.tx_meineext.abstract {
   crop = 250 | ... | 1
   wrap = <p>|</p>
 }
 plugin.tx_meineext.coa = COA
 plugin.tx_meineext.coa {
   10 = HTML
   10.value = Hallo Welt
   10.value.wrap = <h1>|</h1>
 }
 // Die Konfiguration könnte in TypoScript gemacht werden,
 // es kann aber auch direkt in der Extension geschrieben werden
 $this->conf['abstract'] = 'TEXT';
 $this->conf['abstract.']['crop'] = '250 | ... | 1';
 $this->conf['abstract.']['wrap'] = '<p>|</p>';
 foreach ($data as $key => $value) {
     // Dynamisch kann jetzt der Inhalt von "value" gesetzt werden:
     $this->conf['abstract.']['value'] = $value['abstract'];
     // Einfache Objekte so:
     $content .= $this->cObj->cObjGetSingle($this->conf['abstract'],$this->conf['abstract.'],'abstract.');
     // COA (Content Object Arrays):
     $content .= $this->cObj->cObjGet($this->conf['coa.'],'coa.');
 }

Mehrsprachige Extensions entwickeln

Zur Vorbereitung: http://typo3.org/documentation/document-library/extension-manuals/doc_l10nguide/1.0.0/view/1/2/#id2796573

Der Kickstarter kann schon einiges vorbereiten. Die Verwendung in der Extension ist auch relativ einfach:


Damit via Typoscript

pluginname_pix._LOCAL_LANG.de.text = Anderer Text 

gesetzt werden kann, muss die Zuweisung in der Main-Funktion in der folgenden Reihenfolge ablaufen:

$this->conf=$conf;
$this->pi_loadLL();

da pi_loadLL auf this->conf zugreift. Und die Ergebnisse zwischenspeichert - also nur einmal berechnet.


In der locallang.xml der Extension werden die Einträge für die unterschiedlichen Sprachen vorgenommen.

 <languageKey index="default" type="array">
   <label index="list_mode_1">Mode 1</label>
   ....
 </languageKey>

Wichtiger Hinweis an dieser Stelle: innerhalb von "default" dürfen nur ANSI Zeichen, also keine Umlaute verwendet werden. Im Abschnitt "de" dürfen dann auch die deutschen Umlaute (öäüß) eingesetzt werden.

 <languageKey index="de" type="array">
   <label index="list_mode_1">Modus 1</label>
   ....
 </languageKey>

In der Extension kann dann auf den Inhalt zugegriffen werden:

 $this->pi_getLL('list_mode_1','Text, falls kein Eintrag in locallang.xml',true);

Der erste Parameter entspricht dem index eines label-Tags aus der locallang.xml, der zweite Parameter ist ein "Fallback". Falls in der locallang.xml kein entsprechender Eintrag vorhanden ist, dann wird dieser Text verwendet. Der dritte Parameter bestimmt, ob der Text noch durch htmlspecialchars() geschickt werden soll.

Die entsprechenden Spracheinstellungen können jetzt auch via TypoScript

 plugin.tx_meineext_pi1._LOCAL_LANG.de.list_mode_1 = Der erste Modus

angepasst werden.


Wenn aber die Daten aus der Datenbank gelesen werden sollen, und z.B. aus einer mit dem Kickstarter angelegten Tabelle die Einträge in der korrekten Spalte angezeigt werden sollen, hilft folgender Schnipsel weiter:

 if ($this->LLkey) {
   $where_clause .= ' AND sys_language_uid='.intval($GLOBALS['TSFE']->config['config']['sys_language_uid']);
 }

Das Feld sys_language_uid ist in der Tabelle vorhanden (wenn man das entsprechend im Kickstarter angelegt hat). In $this->LLkey wird der Inhalt der gesetzten Sprache (z.B. "en") abgelegt. Er bezieht sich klassicherweise auf den L-Parameter.

In $GLOBALS['TSFE']->config['config']['sys_language_uid'] ist der Wert, den man via TypoScript für den entsprechenden Sprachparamter gesetzt hat.


 [globalVar = GP:L=1]
   config.language = en
   # Dieser Wert wird für die Übersetzung verwendet und auf diesen Wert wird entsprechend in der Abfrage oben bezogen.
   config.sys_language_uid = 1
   config.htmlTag_langKey = en
   config.locale_all = en_EN
 [global]

Wenn jetzt Allerdings auch noch die Seiten (Tabelle pages) relevant werden, dann funktioniert der Weg von oben so nicht mehr.

 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($select_fields,$from_table,$where_clause,$groupBy,$orderBy,$limit);
 // Einen Datensatz holen
 $data = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
 
 if ($GLOBALS['TSFE']->sys_language_content) {
   // Der sys_language_mode wird berücksichtigt.
   $OLmode = ($this->sys_language_mode == 'strict'?'hideNonTranslated':);
   // Die bereits abgefragten Daten werden jetzt überschrieben, dafür werden die benötigten Inhalte aus der entsprechend
   // übersetzten Tabelle verwendet.
   $data = $GLOBALS['TSFE']->sys_page->getRecordOverlay($from_table, $data, $GLOBALS['TSFE']->sys_language_content, $OLmode);
 }

Globale Variablen für die TYPO3 Programmierung

Die folgenden Werte existieren, welche wann verwendet werden sollten und in welchem Context vorhanden sind, ist noch offen

  • HTTP_POST_VARS
  • _POST
  • HTTP_GET_VARS - Array
  • _GET
  • HTTP_COOKIE_VARS
  • _COOKIE
  • HTTP_SERVER_VARS
  • _SERVER
  • HTTP_ENV_VARS - Array
  • _ENV - Array
  • HTTP_POST_FILES - Array
  • _FILES - Array
  • _REQUEST - Array
  • TYPO3_MISC - Array
  • TT - Object
  • GLOBALS - Array
  • TYPO3_CONF_VARS - Array
  • T3_VAR - Array
  • TYPO_VERSION - 4.1
  • T3_SERVICES - Array
  • displayErrors - -1
  • TYPO3_LOADED_EXT - Array
  • _EXTKEY - Der Extensionkey der Extension, die die Variable abfragt
  • _EXTCONF - Enthält einen serialisierten String der aus den Einstellungen beim Installieren der Extension erzeugt wird.
  • EM_CONF - Array
  • EXEC_TIME - 1180958569
  • SIM_EXEC_TIME - 1180958569
  • TYPO3_DB - Object
  • CLIENT - Array
  • temp_extId -
  • temp_TSFEclassName - tslib_fe
  • TSFE - Object
  • temp_previewConfig -
  • BE_USER - Object
  • LANG - Object
  • TCA - Array
  • temp_incFiles - Array
  • temp_file -
  • INTiS_config - Array
  • INTiS_cPart - Array
  • INTiS_resourceList - Array
  • INTiS_theLib - ?
  • INTiS_incFile - ?
  • LANG_GENERAL_LABELS -

Hooks

Die ID ist auch nach dem speichern noch in der Form NEWabcde123 und kann mit dem Array:
if (!is_numeric($id)) $id = $this->substNEWwithIDs[$id];
in eine Zahlzurückverwandelt werden


Caching

Das Plugin wird in einer der conf-Dateien via:

t3lib_extMgm::addPlugin

geladen. der Dritte Parameter definiert, ob als USER oder als USER_INT.

0 bedeutet USER_INT
1 bedeutet USER

Das Plugin wird in der ext_localconf mit der methode

addPItoST43($key,$classFile=,$prefix=,$type='list_type',$cached=0) 

eingeführt: addPlugin ist nur für das BE relevant und kennt den cache Parameter nicht. Der Parameter ist der der 5 in einer anderen Methode

Wichtig ist dabei, dass innerhalb der Main-Methode des Plugins eine der folgenden Zeilen hinzugefügt wird:

$this->pi_USER_INT_obj=1; // USER_INT Objekt
$this->pi_USER_INT_obj=0; // USER Obj


tt_news / Caching

TCEMAIN.clearCacheCmd = 647,637

Typoscript ein kleiner Rundblick

die entsprechenden Bereiche habe ich auf die folgende Seite ausgelager: User:Maholtz/45MinutesTypoScript

Typoscript macht das Leben (mit TYPO3) leichter

Dateien listen

Geht auch mit Typoscript ganz einfach:

page.100 = HTML
# Verzeichnis, Dateityp usw. auswählen
page.100.value.filelist = fileadmin/dateien/|jpg,jpeg|name| |1
# Wir bekommen eine komma-getrennte Liste mit den Dateinamen
# wir benötigen die Split-Funktion um diese Elemente einzeln zu bearbeiten.
page.100.value.split {
 token = ,
 cObjNum = 1
 1 {
   10 = IMAGE
   # wir importieren den aktuellen Dateinamen (current)
   10.file.import.current=1
   # Anzeige nur mit 250px Breite
   10.file.width = 250px
   # Zusätzlich wird ein Link erstellt, der auf die richtige Datei verlinkt.
   10.stdWrap.typolink.parameter.current = 1
   10.wrap = <div style="padding:10px;">|</div>
 }
}

HTML in Feldern erlauben

# in der Überschrift soll ein <u>-Tag zugelassen werden,
# ansonsten aber alle Elemente wie gewohnt geparst werden.
lib.stdheader.10.setCurrent.htmlSpecialChars = 0
lib.stdheader.10.setCurrent.parseFunc {
  allowTags = u
  denyTags = *
  constants=1
  nonTypoTagStdWrap.HTMLparser = 1
  nonTypoTagStdWrap.HTMLparser {
    keepNonMatchedTags=1
    htmlSpecialChars = 2
    allowTags = u
    removeTags = *
  }
}


Title-Tag anpassen

Ziel: im Title Tag soll nicht nur ein fester Wert mit der aktuellen Seite stehen, sondern die Rootline.

Lösung: Wir bauen ein Rootline-Menü und fügen das in den Title-Tag ein.


# wichtiger Hinweis:
# config.noPageTitle = 1 besagt aus, dass der aktuelle Seitenname nicht mehr angezeigt werden soll. 
# Der Inhalt des Titel-Feldes aus dem Template wird trotzdem angezeigt.
# Man erhält also zwei <title>-Tags, außer man schaltet mit
config.noPageTitle = 2
# die Generierung des Title-Tags vollkommen aus.


# Ein rootline Menü erstellen
titletagrootline = HMENU
titletagrootline {
  special = rootline
  special.range = 0|-1
  includeNotInMenu = 1
  1 = TMENU
  1.wrap = | 
  1.noBlur = 1
  1.NO {
    stdWrap.noTrimWrap = | | » |
    doNotLinkIt=1
  } 
  1.CUR = 1
  1.CUR {
    stdWrap.noTrimWrap = | | |
    doNotLinkIt=1
  }
}


titletag = COA
titletag.20 < titletagrootline
titletag.wrap = <title>TG Münster von 1862 e.V. | </title>
# Und jetzt auf der Seite noch anzeigen lassen.
page.headerData.20 < titletag

Hat geholfen? Dann freue ich mich über einen kurzen Kommentar:)

Bytes berechnet mit 1024

Wenn wir z.B. Entfernungswerte nach m | km analog zu Bytes aufteilen wollen, dann können wir bytes nicht verwenden.

Eine alternative Lösung sieht so aus (kennt jemand einen schöneren Weg, dann schreibs doch hier rein)

Man könnte einen stdWrap für "meter" anlegen, dann ist es genauso schön wie "bytes" verwendbar. Ich weiß aber nicht, was man dafür erweitern muss. Ist aber bestimmt möglich. --Daniel Brüßler 12:25, 28 February 2007 (CET)

hm... da müsste die class.tslib_content.php erweitert werden (die Funktion stdWrap und eine neue Funktion dimensions?). Wenn müsste es möglich sein einen bliebigen Faktor zu nehmen. Also die Möglichkeit 1024,1000 aber auch 10 oder 12 als Faktor zu verwenden sollte schon sein. In der TSlib ist die Grenze übrigens nicht auf 1023 gesetzt sonder auf 900. Dadurch wird verhindert das dort steht 999 Bytes anstatt von 0.9 Bytes. Sollte vielleicht auch Variabel sein. Ob es jemand braucht?

entfernung = COA
entfernung {
   # Der Fall größer als 999, also soll km ausgegeben werden
   100 = HTML
   100.value.wrap = |  km
   # bytes rechnet mit dem Faktor 1024
   # 100.value.bytes = 1
   # 100.value.bytes.labels =  m |  km 
   100.value.if.isLessThan = 999
   # Annahme: in subtitle steht die Entfernung, selbstverständlich 
   # kann jedes andere Feld dafür verwendet werden
   100.value.if.value.field = subtitle
   100.value.prioriCalc = 1
   100.value.cObject = TEXT
   100.value.cObject.dataWrap = {field:subtitle} / 1000
   100.value.insertData=1
   100.value.if.isTrue.field = subtitle
   
   # Der Fall kleiner als 1000, also soll m ausgegeben werden
   150 = HTML
   150.value.wrap = |  m

   # Bildet die Basis für den Vergleich von isGreaterThan
   150.value.if.value.field = subtitle
   # gibt true zurück, wenn der Wert in "isGreaterThan" größer ist als der "Basis-Wert"
   # d.h. wenn die Entfernung kleiner als 1000 ist, dann wird "true" zurückgegeben
   150.value.if.isGreaterThan = 1000
   # Sicherstellen, dass irgendein Wert gesetzt ist
   150.value.if.isTrue.field = subtitle
   den Wert holen
   150.value.field = subtitle
   150.value.insertData=1
   
   
   # Das Feld ist leer
   200 = HTML
   200.value = k.A.
   200.value.if.isFalse.field = subtitle
}

tt_news Relateded News pro Kategorie

Leider funktioniert das so noch nicht!


plugin.tt_news {
 showRelatedNewsByCategory = 1
 # Sortiert nicht nach der Category, sondern der Anzahl der Verknüpften Kateogrien
 listOrderBy = category
 displayList.categoryTitles_stdWrap.dataWrap = <h1>|</h1>
 displayList.categoryTitles_stdWrap.if.equals.dataWrap = {register:newsCategoryUid}
 displayList.categoryTitles_stdWrap.if.value.dataWrap = {register:relatedcategory}
 # Die Kategorie soll nur ausgegeben werden, wenn eine neue Kategorie beginnt.
 # d.h. die beiden Register müssen unterschiedlich sein.
 # das trifft zu, wenn die erste Related-News gerendert wird, da dann der Register
 # relatedcategory noch leer ist und es trifft bei jedem Kategorie wechsel zu,
 # da dann newsCategoryUid einen anderen Wert hat und relatedcategory noch den 
 # alten
 displayList.categoryTitles_stdWrap.if.negate=1
 displayList.categoryTitles_stdWrap.append = COA
 displayList.categoryTitles_stdWrap.append {
    # Dieser Register wrid nach dem if ausgeführt.
    10 = LOAD_REGISTER
    10.relatedcategory.cObject = TEXT
    10.relatedcategory.cObject.dataWrap = {register:newsCategoryUid}
 } 
}

Der Ansatz ist eher simple, die Umsetzung hat etwas gedauert (nachher bin ich bekanntlich immer schlauer). Zuerst wird via listOrderBy sichergestellt, dass die Related-News nach der Kategorie sortiert werden.

Im Register newsCategoryUid steht die ID der ersten Kategorie der News. Das wird mit dem Register-Wert von relatedcategory verglichen. Dieser Wert wird via append gefüllt. Bei der ersten Related-News ist der Register relatedcategory noch leer, also wird der Header ausgegeben. Bei allen folgenden News ist relatedcategory gefüllt und erst wenn die Kategorie in newsCategoryUid wechselt, gibt die if-Bedingung ein true (man beachte das .negate=1) zurück. Die Überschrift (Kategorie) wird ausgegeben.

tt_news via XML ausliefern - pro Kategorie

tt_news muss ganz normal konfiguriert werden.
Damit dann in Abhängigkeit von dem Kategorie Parameter &tx_ttnews[cat]=1 nur die bestimmte Kategorie im RSS-Feed auftaucht, 
muss der Code wie folgt angepasst werden.
Jetzt braucht der RSS-Feed nur um den jeweiligen Parameter erweitert werden, und wir bekommen einen RSS-Feed einer bestimmten Kategorie.
[globalVar = HTTP_GET_VARS|tx_ttnews|cat>0]
xmlnews.10.categoryMode = 1
xmlnews.10.categorySelection = {GPvar:tx_ttnews|cat}
xmlnews.10.categorySelection.intval = 1
[end]

RTE ... in bearbeitung

Einen Default-Wert für das Target Feld im Link-Editor setzen. Dieser Wert wird dann im Textfeld vorbelegt und kann von dem Benutzer geändert werden.

RTE.default.defaultLinkTarget = _self

Br innerhalb von p-Tags zulassen

RTE.default.proc.dontConvBRtoParagraph = 1

Extensions

ich versuche hier mal ein paar Extensions mir anzuschauen und diese zu vergleichen

Chat Extensions

Derzeit im Repository gefunden:

AJAX Chat 0.2.5

[TYPO3-Extension "vjchat" not found]

Mit Manual


"Before you install the extension you should consider a page or sysfolder where the data records for the chat will be placed (chat entries, rooms and sessions)." das ist im derzeitigen Handbuch nicht ganz korrekt. Die Datensätze können nur in einem __sysfolder__ angelegt werden.


auch fehlt der Hinweis, dass für diese Extension, zwingend prototypejs (prototypejs) (contact: vtietz) erforderlich ist...

und Prototype liegt unter der __MIT-style license__ wie die sich im zusammenspiel mit der gpl verhält ist mir unklar, vermutlich sollte es aber keine Probleme geben? Das sollte noch geprüft werden.

Chatbox 0.0.4

Chatbox (so_chat) (contact: onnoschuit)

Mit Manual

Laut Manual ist diese Extension ein Test der JPSpan (so_jpspan) (contact: onnoschuit)

habe ich mir nicht näher angeschaut

Ajax Chat 0.0.3

ajaxchat (ajaxchat) (contact: andi_puehringer)

Mit Manual

nach Angaben des Manual hat diese Extension noch Probleme mit der Mozilla Familie und hat einen deutlich geringeren Umfang als vjchat

[netzrezepte.de] Ajax Chat 0.0.2

ajaxchat (ajaxchat) (contact: andi_puehringer)

Mit Manual

Dieses ist die Vorgänger Version von Ajax Chat 0.0.3, der Extension-Key wurde geändert und somit liegt die alte Extension noch im Repository.

Wer ist online

kh_usersonline

Users Online (kh_usersonline) (contact: karsten)

Version: 0.2.2


erstellt zwei eigene Tabellen


Zitat: You can show the number of guests (not logged in users), members (logged in users) and all users together. Further it can display the login name of the current user.


Out of the Box:

Zur Zeit sind 0 Gäste
und 1 Mitglied online.

max: 1 Besucher

Du bist eingeloggt als maholtz.

sehr schön.

Leider bezieht sich diese Abfrage nur auf die IP. So dass zwei Personen aus einem Firmennetz oder über ein Proxy nur als eine Person gezählt werden (auch wenn beide angemeldet sind!)

gsi_whoisonline

Who-Is-Online (gsi_whoisonline) (contact: masi)

ändert die TAbelle tt_content

ALTER TABLE tt_content ADD tx_gsiwhoisonline_order int(11) unsigned NOT NULL default '0';
ALTER TABLE tt_content ADD tx_gsiwhoisonline_limit int(11) NOT NULL default '0';

Diese Extensions ist auf "shy" gestellt.

Ein paar Einstellungen müssen im Konstanten-Editor gesetzt werden, dann arbeitet die Extension aber sauber mit der Benutzerliste der newloginbox und mit cwt_community zusammen.

Anzeige der angemeldeten Benutzer funktioniert out of the box.

Die Anzeige wird durch ein HTML-Template gestaltet.

Allerdings nicht Sprach-Abhängig.

Neben TypoScript existiert die Möglichkeit auch ein Frontend-Plugin als Content-Element hinzuzufügen. Das scheint allerdings die Konstanten zu ignorieren:(

Diese Extension bezieht sich nur auf Frontend-Benutzer, nicht auch auf "Gäste".

fgc_whoson

fgc_whoson (fgc_whoson) (contact: fehlgeleitet)

legt eine eigene Tabelle an

benötigt die Extension xajax, allerdings ist das nicht in den dependencies eingetragen:/

TYPO3 Fatal Error: Extension key "xajax" was NOT loaded! (t3lib_extMgm::extPath)

Diese Extension geht davon aus, dass jemand "beobachten" möchte wer online ist. Es

da die Seite, die das Plugin enthält auf no_cache stehen soll (obwohl die Abfrage via Ajax passiert) ist sie nicht dafür geeignet, dass sie auf jede Seite gesetzt wird. Sei berechnet die Personen die online sind, ebenfalls anhand der IP-Adressen.


Die Extensions schmeißt den gesamten XML-Output in eine Alert-Box wenn es Fehler gibt - für die Produktivumgebung imho nicht geeignet.

sd_useronline

sd_useronline (sd_useronline) (contact: mschouten)

legt eine eigene Tabelle an


aber derzeit nicht mehr im Repository zu finden?


baut auf kh_usersonline auf und erweitert diese um den User, damit nicht alleine die IP für die Zuordnung verwendet wird.

Allerdings fängt das nur Benutzer ab, die mit der gleichen IP-Adresse surfen und eingeloggt sind.


ich habe die Erweiterung so angepasst, dass sie sich bei nicht eingeloggten Besuchern aufs Cookie bezieht, so können wir auch die Zahlen der "anonymen Benutzer" die über die gleiche IP kommen besser messen.

mp_users_online

MP Users Online (mp_users_online) (contact: pixelschlampe) 0.3.1

Ohne Anleitung

hm... mir ist auch nicht klar, warum ich die Extension (weder Plugin noch Typoscript) zum laufen bekomme.

Personal tools