Zum Inhalt springen

Farbwerte aus Datenbank in TS einlesen?

Erstellt am 28. Januar 2009 · 9 Antworten · letzte Antwort am 28. Januar 2009

Tags: Datenbank, Frage

wok ·

Ich hab in einem Template folgende Konstanten (im Feld Constants) definiert:

color_adresse_background = #88A3D3
color_adresse_text = #FFFFFF

Im Setup wird eine dynamisch mit dem GIFBUILDER eine Grafik generiert. Hierbei werden die in den Konstanten definierten Farben verwendet ($color_adresse_background und $color_adresse_text).

 			...
 			### Adressblock wird als Grafik ausgegeben
			ADRESSE = IMAGE
			ADRESSE.file = GIFBUILDER
			ADRESSE.file {
				XY = 350, 160
				
				backColor = {$color_adresse_background}
				transparentBackground = 1
				
				### Adresszeile 1
				10 = TEXT
				10.text = Eine Beispielzeile
				10.fontSize = 9.5
				10.fontFile = fileadmin/Fonts/verdana.ttf
				10.fontColor = {$color_adresse_text}
				10.antiAlias = 1
				10.offset = 20, 25
			}
 			...

Das funktioniert auch prima. Auf den Unterseiten ändere ich jeweils nur die Konstanten in +ext-Templates.
Jetzt würde ich gerne aber die Farbwerte aus einer Datenbank auslesen und in Abhängigkeit von der pid zuweisen.
Mit der folgenden MySQL-Query könnte ich den Farbwert auslesen.

SELECT value FROM `tx_virtualcss` WHERE `pid`="5" AND `stylesheet`="myStyleSheet" AND `selector`=".address" AND `property`="background-color"

$color_adresse_background soll den Wert "value" erhalten.
Im Moment bin ich völlig orientierungslos, wie ich das realisieren soll.
Muss ich dazu eine Extension schreiben?
Kann mir jemand grob (oder noch besser konkret) einen Lösungsweg aufweisen?

WoK

Julian.​Hofmann ·

Hallo WoK.

Via TS kannst Du über die Funktion select eine Tabelle abfragen. Allerdings muss die Tabelle TYPO3 bekannt sein, d.h. im TCA definiert sein.

wok schrieb

Muss ich dazu eine Extension schreiben?

Jain. Obiges Bekanntmachen ist via (simpler) Extension möglich. Über den Kickstarter kannst Du eine Tabelle erzeugen und die nötigen Definitionen/Deklarationen generieren.

Viele Grüße
Julian

freshman17 ·

Das geht so

lib.formular = CONTENT
lib.formular {
  table = tt_content
  select {
    where = pid = 6
    andWhere {
      header_layout = 1
      dataWrap  = crdate = 1231172336
    }
  }
  renderObj = IMAGE
  renderObj {
    file = GIFBUILDER
    file {
      XY = 350, 160
      transparentBackground = 1
      
      10 = TEXT
      10.text.field = header
      10.offset = 20, 25
    }
  }
}

Nur noch die Tabelle und die Felder anpassen

wok ·

Hallo freshman17,

ich wollte Dein TS mal ausprobieren, aber irgendwas mache ich falsch. Einen passenden Eintrag in der Tabelle tt_content habe ich angelegt. Wahrscheinlich mache ich nur einen völlig blödsinnigen Fehler ...

page = PAGE
page.typeNum=0

page {
	stylesheet = {$css_datei}

	10 = TEMPLATE
	10.template = FILE
	10.template.file = {$content_datei}
	
	10.workOnSubpart = TEST

	10.marks.INHALT {
		lib.formular = CONTENT
		lib.formular {
			table = tt_content
			select {
			where = pid = 11
			andWhere {
				header_layout = 1
				dataWrap  = crdate = 1231172336
		}
		renderObj = IMAGE
		renderObj {
			file = GIFBUILDER
			file {
				XY = 350, 160
				transparentBackground = 1
     
				10 = TEXT
				10.text.field = header
				10.offset = 20, 25
			}
		}
	}
}
wok ·

Hallo Julian,

ich kenn mich mit TS noch nicht so gut aus und auch nicht mit dem Schreiben von Extensions. Bisher habe ich nur in einer vorhandenen Extension herumgebastet.

Gibt es vielleicht irgendeine Extension, an der ich mich orientieren könnte? Ich weiss einfach nicht, wo ich bei einer Extension mit meiner Fragestellung ansetzen soll ... mittlerweile bewundere ich jeden, der ein absolut simple Extension für Typo3 geschrieben hat.

Danke!

Wolle

Julian.​Hofmann ·

Da gab's mehrere Probleme:
a) Klammerung fehlerhaft. Du hattest einige Klammer im TS nicht geschlossen
b) lib.formular ist Objekt. Dieses wird zur besseren Übersicht 8und ggf. mehrmaligem Gebrauch) erzeugt und dann dem Marker nur zugewiesen.

Das könnte klappen:

page = PAGE
page.typeNum=0

page {
	stylesheet = {$css_datei}

	10 = TEMPLATE
	10.template = FILE
	10.template.file = {$content_datei}
	
	10.workOnSubpart = TEST

	10.marks.INHALT < lib.formular
}
lib.formular = CONTENT
lib.formular {
	table = tt_content
	select {
		where = pid = 11
		andWhere {
			header_layout = 1
			dataWrap  = crdate = 1231172336
		}
	}
	renderObj = IMAGE
		renderObj {
			file = GIFBUILDER
			file {
				XY = 350, 160
				transparentBackground = 1
     
				10 = TEXT
				10.text.field = header
				10.offset = 20, 25
			}
		}
	}
}

Die Extension wäre nur nötig, falls Du die Farbwerte in einer eigenen Tabelle verwalten willst.
Was die Extension angeht: einfach mal die Extension 'kickstarter' installieren. Und dann 'Create new extension' und die Tabelle entsprechend Deinen Wünschen anlegen. Dann das ganze speichern/schreiben lassen. Und dann die Extension im Ext-Manager installieren.
Sollte (in dieser einfachen Form) ohne tieferes Wissen gehen, da Du lediglich die Datenstruktur/Tabelle brauchst, nicht aber irgendeine Ausgabe via FE-Plugin oder BE-Modul.

Viele Grüße
Julian

wok ·

Hallo Julian,

danke für das angepasste TS. Leider funktioniert das auch nicht. Ich habe den Eindruck, dass am Schluss eine Klammer zu viel ist. Aber auch daran hängt es nicht.

Julian.Hofmann schrieb

Die Extension wäre nur nötig, falls Du die Farbwerte in einer eigenen Tabelle verwalten willst.

Ja, genau das will ich. Das heisst, die Tabelle wird von einer anderen Extension (virtualcss) bereits verwaltet. Auf die Werte aus dieser Tabelle will ich zugreifen (siehe mein ursprüngliches Posting).

Julian.Hofmann schrieb

Sollte (in dieser einfachen Form) ohne tieferes Wissen gehen, da Du lediglich die Datenstruktur/Tabelle brauchst, nicht aber irgendeine Ausgabe via FE-Plugin oder BE-Modul.

Ich glaube, den Zugriff auf die Daten der Tabelle dürfte ich irgendwie hinbekommen (sofern das über PHP erfolgen kann). Ich hab nur keinerlei Plan, wie und wo ich dann in der Extension den Wert value dann dem $color_adresse_background etc. aus dem TS zuordnen kann.

Irgendwie hab ich grade das Gefühl, ich sehe den Wald vor lauter Bäumen nicht mehr ...

Vielen Dank,

Wolle

freshman17 ·

Du hast doch schon die Lösung! Also ich habe die Tabelle tx_virtualcss nicht kann es also nicht testen. Mit tt_content läufts bei mir. Hier mal ein komplettes TS für eine Testseite.

temp.formular = CONTENT
temp.formular {
  table = tx_virtualcss
  select {
    where = pid = 5
    andWhere {
      stylesheet = myStyleSheet
      dataWrap  = selector = .address
      dataWrap = property = background-color
    }
  }
  renderObj = IMAGE
  renderObj {
    file = GIFBUILDER
    file {
      XY = 350, 160
      
      backColor.field = #Feld aus DB mit Farbe
      
      transparentBackground = 1

      10 = TEXT
      10.text = Eine Beispielzeile
      10.fontSize = 9.5
      10.fontFile = fileadmin/Fonts/verdana.ttf
      10.fontColor.field = #weiteres Feld aus DB mit Farbe
      10.antiAlias = 1
      10.offset = 20, 25
    }
  }
}

temp.mainTemplate = TEMPLATE
temp.mainTemplate {
  template = FILE
  template.file = fileadmin/template/template.html
  workOnSubpart = DOCUMENT_BODY
  subparts.MENU < temp.formular
}

page = PAGE
page.typeNum = 0
page.10 < temp.mainTemplate
wok ·

Hallo freshman17,

danke für das TS. Ich habe es auf meine Konfiguration hin angepasst, aber es will einfach nicht funktionieren. Ich hab keine Ahnung weshalb. Es wird einfach keine Grafik anstelle des Markers ausgegeben.
Sicherheitshalber habe ich auch die beiden Zeilen mit den Datenfeld-Bezeichnern "field" mal rausgenommen und durch die direkte Farbzuweisungen (backColor = #CCCCCC) ersetzt. Auch dann erfolgt keine Grafikausgabe. Auch das zusätzliche Ausklammern des Datenbankaufrufs hat keine Ausgabe gebracht.
Ich hab keine Ahnung, weshalb keine Grafik erstellt wird.

Aber da gibt es auch noch ein anderes Problem:
die Werte für $color_adresse_background und $color_adresse_text befinden sich jeweils in einer eigenen Zeile in der Datenbanktabelle.

Danke für die Hilfe!

Wolle

wok ·

Hallo,

ich bin jetzt darauf gestossen, woran das Problem lag.

Ich musste das "select" ändern.

	table = tt_content
	select {
		where = pid = 28
	}

Ausserdem muss der Wert für pid der aktuellen Seiten-id entsprechen und ein Eintrag mit der pid=28 in der Datenbanktabelle enthalten sein.

Ich versteh das allerdings nicht: Warum kann ich nicht Einträge mit einer anderen pid aus der Datenbank auslesen? Was soll die "where"-Bedingung hier dann überhaupt?

Kann mir das jemand erklären?

Wolle