Page 1 of 1

[gelöst] Datenbankzugriff über Smarty

Posted: Tue Jun 29, 2010 7:20 am
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?

Re: Datenbankzugriff über Smarty

Posted: Tue Jun 29, 2010 8:23 am
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.

Re: Datenbankzugriff über Smarty

Posted: Tue Jun 29, 2010 9:15 am
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.

Re: Datenbankzugriff über Smarty

Posted: Tue Jun 29, 2010 10:56 am
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;

Re: Datenbankzugriff über Smarty

Posted: Thu Jul 01, 2010 6:35 am
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!!!

Re: Datenbankzugriff über Smarty

Posted: Thu Jul 01, 2010 7:46 am
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.