Hallo,
ich möchte eine Frontend-Extension schreiben (nachfolgend "EXT:count"), die ein Tracking für List-Items einer anderen Extension (nachfolgend "EXT:list") durchführt.
Anforderung an EXT:count:
- Wenn jemand eine List-View von EXT:list (z.B. mit 10 News) im Frontend aufruft, soll der entsprechende Counter von EXT:count für jedes der angezeigten List-Items um 1 hochgezählt werden (also alle 10 Counter für die 10 News). Die EXT:count muss also eine Tabelle haben mit je einem Eintrag für die jeweils "fremde UID" und ein Feld mit dem Counter.
- Die Aufrufe von EXT:list durch Roboter / Crawler sollen nicht gezählt werden
- Ganz wichtig: das Ganze soll die Seite nicht langsamer machen.
Frage: Wie realisiere ich das am besten?
Überlegungen von mir (was ist davon jeweils zu halten? :-) ):
1. Die UIDs der im FE ausgegebenen List-Items von EXT:List könnte ich in einer Globalen Variable speichern und diese dann in EXT:count auslesen. (An der EXT:list soll so wenig wie möglich verändert werden)
2. Wenn ich die EXT:count im Footer der List-Pages per Javascript einbinden würde, macht es die Ladegeschwindigkeit der Seite nicht langsamer und Crawler / Robots ohne Javascriptausführung würden kein Count auslösen.
<script src="ext_count.php?uid-list_to_count=10,11,12,15..." type="text/javascript">
Fragen:
zu 1.: Gibt es einen besseren Weg ohne Globale Variablen (und ohne an EXT:list viel ändern zu müssen)
zu 2.: - Ist das mit dem Javascript eine gute Idee?
- Wie rufe ich die neue Extbase-Extension EXT:count direkt per Javascript auf?
- Kann ich ein Extbase-FE-Plugin erstellen, das als Default-Action den Counter hochzählt aber keine View hat. (EXT:count soll ja nichts ausgeben!)
Wäre super genial, wenn mir jemand weiter helfen könnte und Tipps für mich hat. :-)
Schöne Grüße
Micha
ich fürchte, dass mittlerweile doch einige bots und crawler javascript beherrschen, insbesondere halt auch der googlebot. und der ist, je nach webseite natürlich, doch recht traffic-intensiv.
die frage ist: wieso solltest du an EXT:list was ändern?
wenn es eine vernünftige extbase extension mit ordentlichem domainmodel ist, dann erweitere das model der EXT:list einfach in der EXT:count um 'tx_count_counter' oder so ähnlich. 😉
Globale Variablen braucht ma also schon mal nicht. ...
Crawler und bots problem: da wirst um eine entsprechende liste nicht rumkommen.
eventuell mal bei awstats oder so reinschauen.
ladezeit: naja, bei 10 news auf eine seite überall einen autoincrement wert um eins erhöhen ... ich weiss ja nicht was ihr für einen server habt, aber ab einem athlon xp mit 2gb RAM und einer sata platte sollte das eigentlich nicht das problem sein ... 😉
Aber natürlich, man könnte das auch via javascript aufrufen, wenn man wollte. und beispielsweise dann via eID das update machen. sollte auch funktionieren.
dann braucht's kein plugin, view und sonstnochwas, nur einen link auf ein eID script.
bin mir nicht ganz sicher, aber ich glaub in rx_shariff ist das halbwegs ordentlich durchexerziert, kannst mal da reingucken.
Hallo Bastian,
herzlichen Dank für Deine schnelle Antwort und die guten Tipps. :-)
Wenn EXT:list eine vernünftige Extbase-Extension ist und EXT:count das Model von EXT:list erweitert (wie von dir geschrieben), muss dann nicht trotzdem EXT:list angepasst werden?
Oder wie teilt die EXT:list der EXT:count mit: "Folgende UIDs wurden jetzt in der List ausgegeben"?
Danke, die Extension "rx_shariff" werde ich mir bzgl. "Javascriptaufruf" anschauen.
Micha
Nein, du musst nur das Model von EXT:list (bzw. besser gesagt der datensätze die in EXT:list angezeigt werden) entsprechend erweitern.
Ein Model erweitert an indem man:
1. in der ext_tables.sql das feld hinzufügt
2. in der ext-tables.php das feld allfällig zum zum TCA hinzufügen (der kram mit \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns). Oder noch besser über den Weg mit dem Ordner TCA/Overrides/
3. im ordner "Model" der EXT:count einen Datei hinzufügt die heisst dann List.php
4. Dort gibt es eine Klasse List, die extended \Vendor\List\Domain\Model\ListData
5. in der klasse brauchst du für das Feld eine protected variable sowie getter und setter.
6. du musst natürlich noch das extbase mapping für das model entsprechend konfigurieren. Das ist der ganze config.tx_extbase.persistence.classes kram. geht halt IMHO nur einmal pro ext.
Bei news geht das auch via ext_tables.php:
$GLOBALS['TYPO3_CONF_VARS']['EXT']['news']['classes']['Domain/Model/News'][] = 'extensionkey';
(bin mir nicht 100 pro sicher, aber soweit ich weiss ist das ein reines EXT:news-spezifikum, damit kann man das Model mehr als einmal erweitern. also in Ext:1 um feld X und in Ext:2 um feld y ...)
und dann brauchst du natürlich ein eigenes Partial für das listitem.
Dabei kannst du das original kopieren, und einfach um das entsprechende fluid erweitern.
in deinem fall einfach je eintrag ein aufruf auf Ext:count/myEidScript/count(listItemUid) ...
das ist jetzt nicht alles total ausformuliert, aber du sollst das ja selbst programmieren. 😉
ansonsten: ich mache sowas gegen geld, seit 2k sogar hauptberuflich. 😉
schlagwörter für allfällige google-suchen:
extend extbase model from outside
liefert unter anderem auch:
http://www.lukasjakob.com/extend-a-typo3-extbase-model-with-custom-field/