[gelöst] Datenbankzugriff über Smarty

Diskussionen zur Smarty-Template-Engine
Locked
LightFighter

[gelöst] Datenbankzugriff über Smarty

Post by LightFighter »

Nach 2 Tagen Im-Internet-Stöbern und Foren/Handbücher-Durchforsten bitte ich hier um Hilfe.
???
Mein Grundanliegen ist eine mehrsprachige Seite zu entwickeln. Genau genommen möchte ich eine fertige deutschsprachige Seite um weitere Sprachen erweitern.

Mein Lösungsansatz:
1. Es wird eine Tabelle in MySQL-DB angelegt und mit Textblöcken gefüllt (Die Spalten heißen: Block_id,de,en,ru,usw.) Das ist schon gelöst.
2. Im Content werden anstatt eines deutschen Textes UDT's platziert. Die UDT's sollen entsprechend der Sprachenauswahl aus der Datenbank einen entsprechenden Textblock rausholen und darstellen.
Abgesehen davon, dass noch Cookies und Sessions in Spiel kommen, kann ich bisher noch nicht meine Textbausteine aus DB in Content bringen.
Das ist die Klasse, über die ich mein Anliegen realisieren wollte:

Code: Select all

<?php
class TextBausteine
{
  function Baustein($my_lang,$b_id)
  {
    $db =& $this->GetDB();
    $q = "SELECT ".$my_lang." FROM ".cms_db_prefix()."multilanguage WHERE block_id=".$b_id;
    $dbresult = $db->Execute( $q );
	$assign=$my_lang.$b_id;

    global $gCms;
    $smarty =& $gCms->GetSmarty();
    $smarty->assign($assign,$dbresult);
  }
}
	$test = new TextBausteine;
?>
Und das schrieb ich in meine UDT:

Code: Select all

{$test->Baustein('de','185')}{$de185|sprintf}
Meine bisherige Versuche endeten mit einer Fehlermeldung:"Call to a member function Baustein() on a non-object"
Was mache ich falsch?
Last edited by LightFighter on Thu Jul 01, 2010 6:44 am, edited 1 time in total.
nockenfell
Power Poster
Power Poster
Posts: 751
Joined: Fri Sep 12, 2008 2:34 pm
Location: Schweiz / Switzerland

Re: Datenbankzugriff über Smarty

Post by nockenfell »

Wenn ich deinen PHP Code richtig interpretiere, machst du beim Aufruf von $test->Baustein kein neues Objekt. Ich nehme mal an, dass er das Objekt $test nicht zur Verfügung hat. Du müsstest dieses so wie du es angedacht hast im $gCms ablegen, damit ist später zur Verfügung steht.

Hast du dir mal folgenden Thread angesehen:
http://forum.cmsmadesimple.org/index.php?topic=45131

Die Mehrsprachigkeit könnte sich recht einfach mit dem AdvancedContent Modul lösen lassen. Sicher einfacher als du es bisher angedacht hast, denke ich.
[this message is written with 100% recycled bits]
LightFighter

Re: Datenbankzugriff über Smarty

Post by LightFighter »

Danke für die schnelle Antwort!

Entschuldige die doove Frage des Anfängers... Wie genau lege ich irgendwas in $gCms ab?

Die Variante mit AdvancedContent oder Babel muss ich genauer unter die Lupe nehmen. Scheint verlockend zu sein. Vielen Dank für den Hinweis.
nockenfell
Power Poster
Power Poster
Posts: 751
Joined: Fri Sep 12, 2008 2:34 pm
Location: Schweiz / Switzerland

Re: Datenbankzugriff über Smarty

Post by nockenfell »

Du kannst im Objekt $gCms z.B. so eine Variable definieren:

Code: Select all

$gCms->Agenda[entry] .= $entry;
Entsprechend für ein neues Objekt:

Code: Select all

$gCms->bausteine = new TextBausteine;
[this message is written with 100% recycled bits]
LightFighter

Re: Datenbankzugriff über Smarty

Post by LightFighter »

Halleluja! Ich bin erlöst!
Die Lösung war genauso simpel wie genial. Mein Gedankengebäude war viel zu kompliziert. Ich wollte doch ursprünglich eine Klasse erstellen, dann aus UDT auf die Methode dieser Klasse zugreifen und ihr gleich zwei Parameter übergeben, und erst dann, wenn die Methode eine Smarty-Variable initialisiert hat, wollte ich diese Variable im Content einsetzen. So ein Schwachsinn! Das geht doch viel einfacher: Den Datenbankzugriff, Verarbeitung der Ergebnisse und eine echo-Ausgabe in UDT direkt packen und Parameterübergabe definieren. Fertig. Ungefähr so:

Code: Select all

$my_lang = $params['my_lang'];
$b_id = $params['b_id'];
$db = mysql_connect('localhost','User_name','password') or die("Verbindungsversuch fehlgeschlagen");
$dbank = mysql_select_db("db_name", $db) or die("Konnte die Datenbank nicht wählen.");
$dbresult = mysql_query("SELECT * FROM multilanguage WHERE block_id='".$b_id."'") or die("Anfrage nicht erfolgreich");

	while ($ausgabe = mysql_fetch_array($dbresult))
	{
	echo $ausgabe[$my_lang];
	}
Dann im Content einfach den Aufruf starten. In etwa so:

Code: Select all

{baustein my_lang="en" b_id="322"}<br />
{baustein my_lang="en" b_id="321"}
Funktioniert. Jetzt muss ich noch irgendwie hinkriegen, dass Benutzer die Sprache selbst wählen kann. Vielen Dank für die Unterstützung, nockenfell!!!
nockenfell
Power Poster
Power Poster
Posts: 751
Joined: Fri Sep 12, 2008 2:34 pm
Location: Schweiz / Switzerland

Re: Datenbankzugriff über Smarty

Post by nockenfell »

LightFighter wrote: Funktioniert. Jetzt muss ich noch irgendwie hinkriegen, dass Benutzer die Sprache selbst wählen kann. Vielen Dank für die Unterstützung, nockenfell!!!
Das solltest du auch über ein UDT lösen können. Meine Überlegung dazu:

Das UDT fügst du im Menütemplate ein. Es generiert ein Text im Sinne von "?lang=de". Die Sprache des Nutzers kannst du auslesen und mal als Standard setzen. Die Sprache wird entweder in einer Session oder in einem Cookie gespeichert.

Wenn nun der Nutzer auf den Link "www.seite.de/seite.htm?lang=en" klickt (z.B. hinter der Flagge hinterlegt), wertest du das über ein $_GET['lang'] aus und passt die Werte in der Session an.

Im Template liest du nun die Session aus und generierst entsprechend den richtigen Content.
[this message is written with 100% recycled bits]
Locked

Return to “Smarty-Tipps und -Tricks”