[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