• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Blog CMS mit mehreren Seiten

  • Ersteller Ersteller toney
  • Erstellt am Erstellt am
T

toney

Guest
Guten Morgen,

ich baue seit einer Weile an einem eigenen CMS-Blogsystem, dass auch schon einen beachtlichen Umfang bekommen hat. Soweit funktioniert auch alles ziemlich gut, nur ein Problem beschäftigt mich schon lange.

Und zwar sollen die einzelnen Blogbeiträge nicht alle auf einer einzigen Seite stehen, da das irgendwann zu viele sind. Ich habe also die Anzahl Blogs auf 10 pro Seite beschränkt und unten einen Link zur nächsten Seite mit den nächsten 10 Beiträgen. Aktuell ist das so geregelt:

Meine Daten werden in einer XML mit folgender Struktur gespeichert:
Code:
<?xml version="1.0"?>
<data>
	<blog>
		<entry private="n" disabled="n" id="1" type="blog">
			<title>Test</title>
			<author>admin</author>
			<categories>
				<category>Blubb</category>
				<category>Test</category>
				<category>1234</category>
			</categories>
		</entry>
	</blog>
</data>

Mittels PHP zähle ich dann alle Einträge, die weder privat noch disabled sind (also für jeden sichtbar). Dieser Wert durch 10 geteilt ergibt die Anzahl Seiten, die ich benötige. Die Seitenzahl wird in der URL übergeben. Bei Seite 1 werden also die 10 Beiträge mit den höchsten ID's ausgegeben, bei seite 2 die nächsten 10 (alles von hinten nach vorne, damit der aktuelste immer oben steht), usw.

Das funktioniert so alles eigentlich ganz gut, solange es keine privaten bzw. deaktivierten Beiträge gibt. Und genau dort liegt mein Problem. Wenn auf Seite 1 z.B. ein beitrag vorhanden ist, der auf disabled="y" (yes) gesetzt ist, dann werden mir auf Seite 1 nur 9 Beiträge ausgegeben, da ja bei Seite 1 dann nur 9 öffentliche Beiträge vorhanden sind und der deaktivierte nur nicht eingeblendet wird.

Ich zerbreche mir schon ewig den Kopf darüber, ob es nicht eine elegantere Lösung gibt, in der auch deaktivierte und private Einträge berücksichtigt werden. Also hier nun die Frage: Kann mir jemand zu einer besseren Methode/Strategie raten, wie ich das umsetzen kann? Wie wird sowas von Profis umgesetzt?

Ich danke schonmal für alle Antworten...
Gruß, toney
 
Wer schreibt die XML-File?
Ist das ganze ein Webservice über den du dir das holst?
Denn solche Blogeinträge hätte ich ja eher über eine Datenbank abgefragt.

Ansonsten wenns nur per XML geht wäre nun meine frage. Sähe deine XML-File so aus, wenn sie 2 Blogeinträge enthalten würde?
Code:
<?xml version="1.0"?>
<data>
    <blog>
        <entry private="n" disabled="n" id="1" type="blog">
            <title>Test</title>
            <author>admin</author>
            <categories>
                <category>Blubb</category>
                <category>Test</category>
                <category>1234</category>
            </categories>
        </entry>
    </blog>
        <blog>
        <entry private="n" disabled="n" id="2" type="blog">
            <title>Test</title>
            <author>admin</author>
            <categories>
                <category>Blubb2</category>
                <category>Test2</category>
                <category>12342</category>
            </categories>
        </entry>
    </blog>
</data>

Und wenn ja. Lässt du dir die XML mit maximal 10 Einträgen ausgeben?
Wenn ja solltest du etwas am Auslieferungsscript der XML ändern.
Hast du alle blog-Einträge hin so verändere nur das Auslesen-Script.
Lass einen Counter hochzählen, für jedes mal, dass ein Script angezeigt werden kann.

Am leichtesten wäre es dennoch das über ne Datenbank zu machen ;)
Code:
 SELECT * FROM `blog` WHERE `private` = 'false' AND `disabled` = 'false' ORDER BY `id` DESC
 
Hallo und danke erstmal für die Antwort.

Es ist kein Webservice, das CMS schreibt die XML selbst. MySQL hatte ich ursprünglich geplant, ist aber leider in diesem Fall nicht möglich.
Der XML-Code oben war nur ein Ausschnitt. Es gibt neben den Blogbeiträgen auch noch andere Beiträge, z.B. Startseitenbeiträge, News, Tutorials usw. So sieht also die komplette XML-Struktur aus:

Code:
<?xml version="1.0"?>
<data>
    <home>
        <entry private="n" disabled="n" id="1" type="home">
            <title>Test</title>
            <author>admin</author>
            <categories>
                <category>Blubb</category>
                <category>Test</category>
                <category>1234</category>
            </categories>
        </entry>
    </home>
    <news>
        <entry private="n" disabled="n" id="2" type="news">
            <title>Test</title>
            <author>admin</author>
            <categories>
                <category>Blubb</category>
                <category>Test</category>
                <category>1234</category>
            </categories>
        </entry>
    </news>
    <blog>
        <entry private="n" disabled="n" id="3" type="blog">
            <title>Test</title>
            <author>admin</author>
            <categories>
                <category>Blubb</category>
                <category>Test</category>
                <category>1234</category>
            </categories>
        </entry>
        <entry private="n" disabled="n" id="4" type="blog">
            <title>Test</title>
            <author>admin</author>
            <categories>
                <category>Blubb2</category>
                <category>Test2</category>
                <category>12342</category>
            </categories>
        </entry>
    </blog>
    <tutorials/>
    ...
</data>

Ich lasse mir die XML komplett ausgeben, aber eben nur 10 Beiträge pro Seite.

Mit einem Counter hochzählen wollte ich auch schon, aber da ich mit foreach arbeite und nicht mit einer for-Schleife geht das nicht so einach (bzw. habs noch nicht hinbekommen). Wahrscheinlich wäre das die sinnvollste Methode, aber naja. Bin eben noch kein Experte :)
 
Ich würde alle Beiträge durchgehen und mir die IDs derjenigen, die angezeigt werden sollen, in einem Array zwischenspeichern. Aus diesem Array kannst du dann die Beiträge 0-9 oder 10-19 oder wie auch immer auslesen und darstellen.

Eventuell können solche „Abfragen“ auch direkt als XPath formuliert werden, weiß ich gerade nicht sicher.

Dein System wird insgesamt übrigens zunehmend inperformant, je mehr Beiträge in der Textdatei stehen. Wenn du 1000 Beiträge hast, von denen nur 10 angezeigt werden sollen, liest du dennoch erstmal alle 1000 aus. Macht 99 % unnötige Operationen.
 
Stimmt, ein Array ist wahrscheinlich ne gute Möglichkeit. Werd mal schauen, ob ich das irgendwie umgesetzt bekomme.
Die Abfragen sind schon als XPath formuliert, aber funktioniert eben nicht ganz so perfekt.

Für das Problem mit der Performance ist schon ein kleines Workaround geplant, dass das Problem zumindest verringert. Ich kann für das Projekt leider nicht mit MySQL arbeiten, deshalb muss ich wohl oder übel so bei XML bleiben...
 
Achso, wo wir grad beim Thema Performance sind:
Nehmen wir an ich habe 100 Beiträge unter <home>, 80 unter <news> und 300 unter <blog>, und ich will nur die news auslesen. Würde das Script dann nicht eigentlich "nur" auf die 80 <news>-Beiträge zugreifen und die anderen ignorieren? Das würde ja dann zumindest schonmal ein kleines Bisschen helfen, da nicht alle 480 Beiträge ausgelesen werden.. oder?
 
Bei Bibliotheken wie DOM oder (ich denke auch) SimpleXML kannst du davon ausgehen, dass die immerzu das gesamte Dokument parsen und einlesen. Mit xml_parser_create kannst du dir vielleicht was basteln, das etwas effizienter ist. Allerdings glaube ich nicht, dass sich da Kosten/Nutzen rechnen.

Die einfachere Lösung wäre es, unterschiedliche Einträge/Eintragsgruppen in unterschiedliche Dateien zu schreiben.
 
Zurück
Oben