[smarty] Keine vollständige Ausgabe

Dragonilx

New Member
HiHo,

Bis vor einiger Zeit habe ich standard mässig immer mit der phpBB3 Template Engine gearbeitet.
Nun wollte ich meine Seite komplett auf Smarty umstellen, stoße aber schon auf das 1 Problem.

Ich würde gerne meine Artikel in der passenden Kategorie ausgeben lassen, erhalte aber nur die Kategorien als Ausgabe.

Hier mal mal Code

Code:
// Kategorien auslesen
		$DB->set_sql('SELECT * FROM ' . KBBASE_CAT);
		$DB->execute();
		
		while($cat = $DB->fetch_assoc())
		{
			$catdata[] = $cat;
		}
		$DB->free();
		
		// Post auslesen
    	$DB->set_sql('SELECT * FROM ' . KBBASE_POST .' WHERE post_depend_cat_id=:1');
		$DB->execute($cat['ID']);
    	while($post = $DB->fetch_assoc())
    	{
			$postdata[] = $post;
    	}
		$DB->free();


		$Smarty->assign(array(
				'catdata'		=> @$catdata,
				'postdata'		=> @$postdata,
				
		));

Code:
{foreach from=$catdata item=category}		
			<div class="cat_title"><p class="cat_space">{$category.title}</p></div><br />
            {foreach from=$postdata item=post}
            <div class="kb_post_title"><p>{$post.post_subject}</p></div><br />

{/foreach}

Alles andere wurde bereits umgestellt, lediglich das "kleine" Kategorie System macht mir Probleme.

Wie ist dies noch auf einfachste Weise zu bewerkstelligen? Hoffe ihr könnt mir da helfen.

Gruß
DragonilX
 
Hi,

ich bin mir grad etwas unsicher bzgl. der Sichtbarkeiten von php, aber biste sicher, dass in

Code:
$DB->execute($cat['ID'])

$cat überhaupt definiert ist? Ist das nicht evtl. lokal für die while-Schleife?
Evtl. erst mal mit print_r testen, ob im php-code überhaupt alles stimmt.

Dennis
 
HiHo,

Stimmt, $cat war nur definiert bzw nur für die while Schleife.
Habe noch eine extra abfrage eingebuat, nun werden mir die Kategorien und Artiek ausgegeben, allerdings werden die Artikel für die 1 Kategorie nun auch in jeder anderen angezeigt.

Hier nochmal der neue Code

PHP:
// Grundlegende Daten zum Forum aufrufen
		$DB->set_sql('SELECT * FROM ' . KBBASE_CAT);
		$DB->execute();
		$kbcat = array();
		$kbcat = $DB->fetch_assoc();
		$DB->free();
		// Kategorien auslesen
        $DB->set_sql('SELECT * FROM ' . KBBASE_CAT);
        $DB->execute();
        
        while($cat = $DB->fetch_assoc())
        {
            $catdata[] = $cat;
        }
        $DB->free();
		
        // Post auslesen
        $DB->set_sql('SELECT * 
					 FROM 
					 ' . KBBASE_POST .' 
					 WHERE post_depend_cat_id=:1');
        $DB->execute($kbcat['ID']);
        while($post = $DB->fetch_assoc())
        {
            $postdata[] = $post;
        }
        $DB->free();
 
Da gäbe es 2 Lösungswege:

1. In der Smarty-Datei ein {if...} reinmachen, bevor du die Posts ausgibst, indem du post_depend_cat_id mit der Kategorie-ID vergleichst. (Eigentlich unschön, weil man meiner Meinung nach "Programmieren" in Templates auf ein Minimum beschränken sollte)

2. $postdata nicht als "alleinstehendes" Array an das Smarty-Template geben, sondern in $catdata für die passende Kategorie, die ausgegeben wird, übergeben. Dann ändert sich auch die Smarty-Datei, weil die geschachtelte Schleife über $category.postdata iteriert. D.h. wenn postdata nur für eine Kategorie definiert ist, werden die Posts auch nur für dieses Kategorie ausgegeben.


Gruß,
Dennis
 
HiHo,

Ok, ich habe es nun Gestern den ganzen Tag versucht aber ich bekomme es nicht. Da stoß ich wohl an meine Grenzen.

Naja, dann wird es erstmal auf Eis gelegt. Trotzdem Danke für deine Hilfe

Gruß
DragonilX
 
Ich glaub dein Problem ist, dass das Array was du übergibst völlig andere Indizes hat als die Kategorie ID. Probier mal folgendes (was ich allerdings etwas unschön finde):

PHP:
// Grundlegende Daten zum Forum aufrufen
        $DB->set_sql('SELECT * FROM ' . KBBASE_CAT);
        $DB->execute();
        $kbcat = array();
        $kbcat = $DB->fetch_assoc();
        $DB->free();
        // Kategorien auslesen
        $DB->set_sql('SELECT * FROM ' . KBBASE_CAT);
        $DB->execute();
        
        while($cat = $DB->fetch_assoc())
        {
            $catdata[] = $cat;
        }
        $DB->free();
        
        // Post auslesen
        $DB->set_sql('SELECT * 
                     FROM 
                     ' . KBBASE_POST .' 
                     WHERE post_depend_cat_id=:1');
        $DB->execute($kbcat['ID']);
        while($post = $DB->fetch_assoc())
        {
            $postdata[] = $post;
        }
        $DB->free();  

	$Smarty->assign(array(
			'catdata'		=> @$catdata,
			'postdata'        => @$postdata,
			'curr_id'          => $kbcat['ID']   // NEU
	));


Code:
{foreach from=$catdata item=category}		
			<div class="cat_title"><p class="cat_space">{$category.title}</p></div><br />
   {if $category.id == $curr_id}   // NEU: $category.id muss evtl. an den richtigen Namen in der Tabelle angepasst werden
            {foreach from=$postdata item=post}
            <div class="kb_post_title"><p>{$post.post_subject}</p></div><br />

            {/foreach}
    {/if}    // NEU
{/foreach}
 
HiHo,

Das stimmt unschön ist es.
Ich bevorzuge lieber sowas wie die phpbb template engine wo noch alles geternnt wird aber dies ist diesmal leider nicht möglich.

Thx für deinen Code, leider wird nur der 1 Kategorie die Artikel zugewiesen. Aller anderen bleiben leer.
 
HiHo,

Ok, nu habe ich einiges versucht, etliche HowTo`s angeschaut aber ich komme absolut nicht auf die Lösung.

Kann mir da bitte nochmal wer helfen?

Gruß
DragonilX
 
Hi,

ich scheitere im Moment an deinem Code, weil ich nicht weiß, was $kbcat['ID'] ist. So wie ich das sehe, fragst du doch mit:

PHP:
        $DB->set_sql('SELECT * 
                     FROM 
                     ' . KBBASE_POST .' 
                     WHERE post_depend_cat_id=:1');
        $DB->execute($kbcat['ID']);

nur exakt nach einer ID? Also warum sollen mehrere Kategorien mit Posts ausgegeben werden?


Dennis
 
Genau

PHP:
$kbcat['ID']

enthällt die ID der Kategorie, aber ich schaff es nicht diese immer um 1 zu erhöhen so das alle Kategorien mit den dazugehörigen Einträgen ausgegeben werden. Ich habe schon etliche Varianten versucht, ohne Erfolg.

Gruß
DragonilX
 
enthällt die ID der Kategorie, aber ich schaff es nicht diese immer um 1 zu erhöhe

Das willst du auch gar nicht. Was ist, wenn mal eine Kategorie zwischendrin fehlt? Dann suchst du nach einer nicht existierenden Kategorie...

Dein Problem liegt auch nicht an Smarty, sondern am PHP bzw. SQL... normalerweise macht man hier einen Join im SQL, so dass Posts zu den Kategorien zugordnet werden.

Du willst also, dass es am Ende folgendermaßen aussieht?

Kategorie 1:
Post 1_1
Post 1_2
...
Post 1_n

Kategorie 2:
Post 2_1
Post 2_2
....
Post 2_k

......
......
 
normalerweise macht man hier einen Join im SQL, so dass Posts zu den Kategorien zugordnet werden.

Eigentlich wird dies in meinem code bereits gemacht.

PHP:
$DB->set_sql('SELECT * 
                     FROM 
                     ' . KBBASE_POST .' 
                     WHERE post_depend_cat_id=:1
					 ORDER BY post_id DESC
					 LIMIT ' . $kbbase_config['front_limit']);
        $DB->execute($kbcat['ID']);

post_depend_cat_id ist die artikel ID und die :1 ist die Kategorie ID. :1 wird durch das unten stehende in klammern $kbcat['ID'] ersetzt
Du willst also, dass es am Ende folgendermaßen aussieht?

Kategorie 1:
Post 1_1
Post 1_2
Kategorie 2:
Post 2_1
Post 2_2

Tut es bereits jetzt schon. Allerdings werden mir nur die Post für die Kategorie 1: ausgegeben.
Andere Kategorien werden zwar auch ausgegeben, aber die dazu gehörigen Posts nicht.

Kategorie 1:
Post 1_1
Post 1_2
Kategorie 2:
Post wird nicht angeziegt
Post wird nicht angeziegt
Kategorie 3:
Post wird nicht angeziegt
Post wird nicht angeziegt
 
Back
Top