[TYPO3-german] Daten einer Flexform eines ANDEREN Content-Elements lesen

bernd wilke x00nsji02 at sneakemail.com
Fri Feb 29 13:55:18 CET 2008


Widmann, Manfred Dipl.-Ing. schrieb am Fri, 29 Feb 2008 13:12:50 +0100:

> Hi!
> 
> Folgendes Problem:
> Ich möchte in einem Plugin auf bestimmte Infos (in diesem Fall auf die
> Angabe der StoragePIDs) zugreifen, die in einer Flexform eines anderen
> Content-Elements gespeichert ist. Genauer: ich möchte jenes
> Content-Element aus der tt_content selektieren, in dessen Flexform eine
> bestimmte PID als StoragePID verwendet wird.

das wird nicht so einfach sein (wenn überhaupt möglich).
Dazu muss man sich mal anschauen wie die Flexform-felder abgespeichert 
werden und wie SQl Abfragen realisiert.

normalerweise sehen abfragen in etwa so aus:
SELECT * FROM tabelle WHERE feld="wert"
oder noch 
SELECT * FROM tabelle WHERE feld LIKE "%wert%"

damit werden die datensätze geholt, die im Feld 'feld' den Wert 
'wert' (als Teilstring) enthalten.

das ist einfach bei normalen Feldern, die genau einen Wert enthalten. bei 
den 'Array-Feldern' (Komma-separierte Liste) wird es schon komplizierter:

suche Datensatz mit einer 5 in der Liste:

SELECT * FROM tabelle WHERE feld LIKE "%5%"
ist verkehrt! (liefert auch ergebnis wenn eine 15 eingetragen ist!)

SELECT * FROM tabelle WHERE concat(',',concat(feld,',')) LIKE "%,5,%"
ist richtig.

flexforms sind eine Sammlung von (Eingabe-)feldern, die in einem 
(Datenbank-)Feld gespeichert sind. es ist als notwendig nicht nur den 
Wert, sondern auch den Wert an der richtigen Stelle herauszuholen.
Performance ist dabei natürlich nicht mehr gegeben. Eine Suche über alle 
tt_content-Einträge eigentlich absoluter Wahnsinn, da für jeden Datensatz 
(und tt_content hat typischerweise sehr viele!) ein Haufen komplexer 
Stringoperationen für das flexformfeld gemacht werden müssen.

Alle Felder in denen etwas gesucht werden soll müssen eigentlich als 
eigenständige Felder in der Tabelle sein. Idealerweise als indiziertes 
Feld wenn ein genauer Eintrag gesucht wird.

Wenn du die BLOG-Extension selber schreibst empfehle ich dir das Feld mit 
der StoragePID nicht im Flexform unterzubringen. Dafür eignet sich z.b. 
das vorhandene Feld 'pages' ('startingpoint'), das zwar auch ein 
kommasepariertes Array ist, wo die Suche mit den beiden concats aber noch 
recht einfach ist und noch einfacher wird, wenn man definiert, dass nur 
ein Wert eingetragen werden darf.

Wenn es nicht deine Extension ist und du ein add-on zu einer bestehenden 
Extension schreiben willst:
wie wäre es, wenn du dir den Datensatz vom Admin/BE-User konfigurieren 
lässt?
bau ein (Flexform(?)-)Feld, in dem ein tt_content-Datensatz referenziert 
wird und lass ihn eintragen (insert record from ...)
Die Performance dürfte dann auch besser sein, weil nicht für jeden 
Seitenaufruf die gesamte tt_content durchsucht werden muss. (Eine 
(manuelle) Suche bei der Installation, statt ständige Suche bei jedem 
Seitenaufruf)
 
> Hintergrund:
> Ich schreibe einen Teaser für eine BLOG-Extension. Dort wird das
> Frontend-Plugin über eine Flexform konfiguriert und einer dieser
> Parameter ist die PID des General Storage in dem die Beiträge abgelegt
> werden. Mein Teaser selektiert nun aus der BLOG-Tabelle alle jene
> Einträge, die jünger als x Tage sind und liefert den Namen des Bloggers,
> den Titel, einen Teil des Inhalts und sollte auch einen Link auf den
> Beitrag liefern. Dazu muss ich aber im Teaser-Plugin jene PID finden,
> die jenen Content enthält, in dessen Flexform die StoragePid vorkommt,
> die ich als Parameter dem Teaser-Plugin mitgebe.
> 
> Die Flexform ist im Content als XML gespeichert ... wie komme ich also
> am leichtesten auf die PID? Ich meine select pid from tt_content where
> pi_flexform like "%280%" ist ein wenig sehr fehleranfällig???! Aber wie
> geht's besser?
> 
> lg
> Manfred

Bernd
-- 
http://www.pi-phi.de/t3v4/cheatsheet.html


More information about the TYPO3-german mailing list