Page 1 of 1

Kompletten Content in eine Datei auslesen

Posted: Mon Sep 01, 2008 5:23 pm
by jeff1980
Hallo,

heute habe ich mal wieder ein "kleines" Anliegen, bei dem ich alleine irgendwie nicht weiter komme.

Es geht darum, dass wir von unserer Seite www.festtagsgedichte.de alle Seiten in eine einzige Datei auslesen möchten. Es handelt sich dabei um etwa 1500 Unterseiten mit Gedichten, die einfach (formatiert) untereinander stehen sollen. Im Idealfall so:

{Title}
{Content}

{Title}
{Content}
.
.
.

Ich habe es schon hinbekommen, mit der ADOdb-Abfrage von XAMPP den Inhalt einzulesen. Allerdings sind dort Infos drin, die wir nicht benötigen (2007-09-01 13:06:14, 91, string, content_en). Dafür fehlt halt die Überschrift, die jeweils als Seitentitle vorliegt (also anscheinend in einer anderen Tabelle der Datenbank).
Gibt es ein Script/Tag/Modul, mit dem wir das machen können? Oder hätte evtl. jemand einen Hinweis, wie ich mir diese Abfrage selber zusammenbasteln kann?

Bin für jeden Tip dankbar...

Viele Grüße
Jan

Re: Kompletten Content in eine Datei auslesen

Posted: Mon Sep 01, 2008 6:12 pm
by NaN
Du musst Die Tabellen mit den gewünschten Infos miteinander verknüpfen und nur die Spalten auswählen, die Du haben willst.
Somit kannst Du mit einer einzigen Datenbankabfrage Infos aus mehreren Tabellen auslesen.

Vergleiche mal die einzelnen Tabellen miteinander. Sie haben meist eines gemeinsam: Die content_id.
Somit kannst Du alle Einträge verschiedener Tabellen miteinander verknüpfen, die die gleiche content_id haben.
Kurzes Code-Beispiel:

Code: Select all


$query = "SELECT Tabelle_1_Spalte_1, 
			Tabelle_1_Spalte_2, 
			Tabelle_2_Spalte_5, 
   			Tabelle_2_Spalte_3, 
			Tabelle_3_Spalte_4, 
			Tabelle_4_Spalte_1
		FROM ".cms_db_prefix()."Tabelle_1 
		LEFT JOIN ".cms_db_prefix()."Tabelle_2 
		ON ".cms_db_prefix()."Tabelle_1.content_id = ".cms_db_prefix()."Tabelle_2.content_id 
	$dbresult = $db->Execute($query);
	while($dbresult && $row = $dbresult->FetchRow())
	{
		...
	}

Ich hoffe das bringt Dich weiter.

Re: Kompletten Content in eine Datei auslesen

Posted: Thu Sep 04, 2008 2:14 pm
by jeff1980
Hi,

sorry, dass ich jetzt erst reagiere. Bin gestern erst dazu gekommen, etwas mit dem Code von Dir zu experimentieren.
Leider habe ich es nicht wirklich hinbekommen. Ich habe versucht, es in einen Benutzerdefinierten Tag einzufügen, aber entweder habe ich Fehlermeldungen bekommen wegen Fehlerhaftem Code oder der Tag hat nichts gemacht, wenn ich ihn eingefügt habe.
Habs mir irgendwie leichter vorgestellt  ::). Aber ich werd noch mal ein bisschen friemeln...

Viele Grüße
Jan

Re: Kompletten Content in eine Datei auslesen

Posted: Thu Sep 04, 2008 2:22 pm
by NaN
Lass Dir doch mal mit echo $query; die Datenbankabfrage ausgeben.
Eventuell ist da ein Fehler drin.
Wenn es in unterschiedlichen Tabellen gleiche Spaltennamen gibt, die Du aber unbedingt haben willst, dann kommt es zu Problemen.
Dann musst Du bei der DB Abfrage mit sog. Aliases arbeiten.
Z.B. in zwei Tabellen steht eine Spalte namens XY die aber unterschiedlichen Inhalt haben. Wenn Du beide haben willst muss die Abfrage ungefähr so aussehen:

$query = "SELECT tabelle1.XY AS tab1_XY, tabelle2.XY AS tab2_XY...";

Danach kannst Du mit $row['tab1_XY'] bzw. $row['tab2_XY'] im php Code darauf zugreifen.

Re: Kompletten Content in eine Datei auslesen

Posted: Thu Sep 18, 2008 8:45 pm
by nhaack
Hi Jan,

hatte hierzu ein ganz praktisches Code-Gerippe rumliegen (bastel gerade an einem Plug-in). Ich war so frei es kurz anzupassen. Wenn du es ausprobieren möchtest, dann speichere den folgenden Code als "User Defined Tag" mit dem Namen "DUMP" im CMS.

Code: Select all

/* Get Global data */
global $gCms;


/* Get Database Configuration/Connection */

$db = &$gCms->db;

/*

mySQL Query
- Only queries "active" and "show in menu" enabled pages
- Only queries specified content block

*/

$q = "
	SELECT 
		content_name, 
		show_in_menu, 
		active, 
		prop_name,
		content
		
	FROM 
		".cms_db_prefix()."content, ".cms_db_prefix()."content_props
		
	WHERE 
		".cms_db_prefix()."content.content_id = ".cms_db_prefix()."content_props.content_id
		
	AND 
		active = 1

	AND 
		show_in_menu = 1
		
	AND 
		prop_name = '$params[block]'
		



";

/* Execute mySQL Query and Error handle */

$dbresult = $db->Execute( $q );

if( !$dbresult )
{
    echo 'DB error: '. $db->ErrorMsg()."<br/>";
}


/*
	Processing of mySQL query

*/

$content_dump = array();
	
while ($dbresult && $dbqueryresultrow = $dbresult->FetchRow())
{
	
		$dump_item = new StdClass;
		$dump_item->title = $dbqueryresultrow[content_name];
		$dump_item->content = $dbqueryresultrow[content];
		$content_dump[] = $dump_item;
		
}

$smarty = &$gCms->GetSmarty();
		$smarty->assign(dump, $content_dump);
	return;

Aufrufen kannst du das ganze dann einfach von jedem Template / jeder Page:

=====
Achtung: wenn innerhalb des Contents einer Seite verwendet -> bitte in HTML/Quellansicht des WYSIWYG wechseln und dort eingeben.
=====

Code: Select all

{dump block="content_en"}
Mit dem Parameter Block kannst du ganz bestimmte content blocks ausgeben lassen. Content_en ist aber der übliche Standard-Block. nach dem Tag-Aufruf steht dir ein Smarty array mit dem Namen "dump" zur verfügung. Mit folgendem Smartycode in der Seite kannst du dann z.B. alle Titel und Inhalte deiner Site ausgeben.

Code: Select all

{dump block="content_en"}

{foreach from=$dump item=dump_item} 
<h1>{$dump_item->title}</h1>
<p>{$dump_item->content}</p>
{/foreach}

Der User-Tag marschiert dabei stumpf duch deine Datenbank und spuckt zu jeder Seite den gewünschten Content-Block (sofern vorhanden) und Titel aus. Dabei wäre dann auch zB. die Startseite inbegriffen. Wenn du also viele Einträge hast die du nicht nutzen willst, dann müstest du sie per Hand raus sortieren.

Ich habe das ganze nur mal fix auf einer leeren CMS Installation mit einer handvoll Seite probiert. Sollte aber auch in deinem Fall seinen Dienst tun oder dir zumindest eine Hilfe/Inspiration sein können.

Beste Grüße
Nils

Re: Kompletten Content in eine Datei auslesen

Posted: Fri Sep 19, 2008 7:02 am
by derAuge
Hallo Nils
das ist ein feiner Tag
Habe ihn auch mal getestet. (Will ja auch etwas lernen)
leider funktioniert er bei mir nicht
Kommt beim ersten Seitenaufruf eine Fehlermeldung:
string(136) "Smarty error: [in content:content_en line 2]: syntax error: unrecognized tag: $dump_item->title (Smarty_Compiler.class.php, line 446)" string(117) "Smarty error: [in content:content_en line 2]: syntax error: unrecognized tag '' (Smarty_Compiler.class.php, line 590)" string(138) "Smarty error: [in content:content_en line 3]: syntax error: unrecognized tag: $dump_item->content (Smarty_Compiler.class.php, line 446)" string(117) "Smarty error: [in content:content_en line 3]: syntax error: unrecognized tag '' (Smarty_Compiler.class.php, line 590)"
Nach einem F5 Seite neu laden bleibt die Seite leer

Was mache ich falsch?

Gruß

derAuge

Re: Kompletten Content in eine Datei auslesen

Posted: Fri Sep 19, 2008 7:20 am
by jeff1980
Hi,

auf diesen Code wäre ich nie gekommen! Habe auch immer noch etwas rumprobiert, wenn Zeit war, aber habe nicht wirklich was hinbekommen.

Zuerst hatte ich auch Probleme, den Tag einzubauen. So hat es dann geklappt:

In diesem Abschnitt (ziemlich weit unten) war ein kleiner "Fehler", der nur die Überschrift, nicht aber den Content ausgegeben hat. So funktioniert es nun:

Code: Select all

		$dump_item = new StdClass;
		$dump_item->title = $dbqueryresultrow[content_name];
		$dump_item->content = $dbqueryresultrow[content];
		$content_dump[] = $dump_item;
Zudem musste ich beim Einfügen auf die entsprechende Seite den WYSIWYG-Editor deaktivieren, da sonst der Tag nicht richtig erkannt wurde. Also:
- neue Seite erstellen,
- WYSIWYG ausschalten (über das Häkchen)
- dann diesen Code einfügen:

Code: Select all

{dump block="content_en"}
{php}
{foreach from=$dump item=dump_item} 
<h3>{$dump_item->title}</h3>
<p>{$dump_item->content}</p>
{/foreach}
{/php}
Damit hat es bei mir dann geklappt. (Habe h1 in h3 geändert, da bei mir h1 so riesig formatiert ist - hat also keinen Einfluss auf das Skript)

Ach, und was anscheinend auch wichtig ist: Den Namen des Benutzerdefinierten Tags komplett klein schreiben.

So sollte es dann klappen.

Und nun noch mal ein dickes Danke an Nils!

Viele Grüße
Jan

PS: Ich finde, dieser Tag ist es wert, zumindest in den Modul/Tag-Downloads aufzutauchen. Man benötigt ihn vielleicht nicht alle Tage, aber eine sinnvolle Erweiterung (z.B. auch für Firmenpräsentationen) ist er auf jeden Fall. So kann man einfach mal die komplette Webseite speichern und in Word o.ä. schön für eine Mappe aufarbeiten.

Re: Kompletten Content in eine Datei auslesen

Posted: Fri Sep 19, 2008 7:33 am
by derAuge
Zudem musste ich beim Einfügen auf die entsprechende Seite den WYSIWYG-Editor deaktivieren, da sonst der Tag nicht richtig erkannt wurde. Also:
- neue Seite erstellen,
- WYSIWYG ausschalten (über das Häkchen)
- dann diesen Code einfügen:
Das war mein Problem. Hatte es im HTML-Modus eingegeben. Da wurde aber etwas verfälscht.
Der Tipp ist sehr gut

Dasa {PHP} und {/PHP} habe ich nicht gebraucht


Auch ein Danke von meiner Seite an Nils


Gruß

derAuge

Re: Kompletten Content in eine Datei auslesen

Posted: Fri Sep 19, 2008 1:33 pm
by nhaack
Freut mich zu hören, dass der Tag für euch so praktisch ist. Ich werde gleich mal meinen ersten Post anpassen damit nicht alle über den kleinen Fehler stolpern.

Mir fallen immer neue Szenarios ein, in denen der Tag helfen kann. Z.b. Texte ins Lektorat geben, einfachere Kostenschätzung einer professionellen Übersetzung, schnelle Text-Auszüge für Präsentationen, einfacher Überblick über alle öffentlichen Inhalte...

Hach, für solche Lösungsansätze liebe ich CMSMS. Vieles lässt sich so unkompliziert umsetzen und die neueste Version ist auch bei umfangreichen eigenen Erweiterungen ein gutes Stückchen schneller geworden.

Ich habe ein Projekt angemeldet, dann kann der Tag in Zukunft heruntergeladen werden. Danke Jan für die Inspiration ;). Werde dann den Tag aber noch um ein paar optionale Parameter erweitern.

Was wären weitere Funktionen/Optionen eines solchen Content Dump Tags?

Beste Grüße
Nils

Re: Kompletten Content in eine Datei auslesen

Posted: Fri Sep 19, 2008 2:02 pm
by NaN
Besten Dank für die Vorstellung.
Ich denke auch, dass man derartige Scripte sehr vielseitig und vor allem sinnvoll einsetzen kann.
nhaack wrote:
Was wären weitere Funktionen/Optionen eines solchen Content Dump Tags?
Naja, ein paar mehr Parameter wären nicht schlecht. Damit man z.B. auch inaktive Seiten oder Seiten, die nicht im Menü angezeigt werden ausgeben kann.
Oder ein paar Parameter mit denen man nur bestimmte Seiten (alias/id/hierarchie/level) ausgeben kann.
Wenn daraus ein Modul nebst Adminpanel werden soll, wäre es nicht schlecht, wenn es eine Option gibt, mit der man angeben kann wie die Ausgabe erfolgen soll. Im Browser alles auf einer Seite oder eine Datei zum Download (evtl. ein zip-Archiv mit einer Datei für jede Seite).

Re: Kompletten Content in eine Datei auslesen

Posted: Fri Sep 19, 2008 3:05 pm
by jeff1980
Hi,

das mit den Aliases, IDs etc. finde ich auch super - vielleicht auch andersherum. Also so, dass man bestimmte Seiten ausblenden kann (Impressum, Kontakt, Home usw. - eben Seiten, die keinen wirklichen "Inhalt" haben).
Zudem fände ich cool, wenn man das Datum der Veröffentlichung und der letzten Bearbeitung einbinden könnte. Und evtl. den Verfasser/letzten Bearbeiter. Den letzten Punkt speziell für Firmen die mit verschiedenen Benutzern arbeiten. So kann man bei Besprechungen alles ausdrucken und sieht direkt den Verantwortlichen.

Bin gespannt auf das Endprodukt. Echt toll, dass Du das machen willst.

Viele Grüße
Jan

Edith: Was natürlich auch noch toll wäre, die Daten zu sortieren (alphabetisch, nach ID etc...) - aber jetzt werde ich abgebrüht...  :P

Re: Kompletten Content in eine Datei auslesen

Posted: Sat Sep 20, 2008 4:48 am
by nhaack
Hallo zusammen,

habe eine erste Plug-In Version hier http://forum.cmsmadesimple.org/index.php/topic,25925.0.html veröffentlicht. Da sollte alles dabei sein. Das Plug-In ist äußerst flexibel einsetzbar wie ich festgestellt habe (damit lassen sich sogar Site-RSS Feeds erstellen).

Freue mich auf euer Feedback.

Grüße
Nils