Boardunity & Video Forum

Boardunity & Video Forum (https://boardunity.de/)
-   X-Mentor (Archiv) (https://boardunity.de/x-mentor-archiv-f51.html)
-   -   Fragen zu Modifikationen (https://boardunity.de/fragen-modifikationen-t1485.html)

Daniel Richter 02.03.2004 16:33

Fragen zu Modifikationen
 
Moin Philipp, Jan und alle anderen die sich mit X-Mentor gut auskennen.

Ich habe mich wohl dazu entschlossen X-Mentor für mein Politik-Magazin einzusetzen und habe dazu aber noch ein paar Fragen, weil ich gerade dabei bin, dass ganze ein wenig anzupassen.

Ich möchte Datensätze aus anderen SQL Tabellen auslesen und diese dann in dem Header Template ausgeben. Wie das technisch möglich ist, ist mir durchaus bewusst, allerdings werd ich nicht schlau aus dem Code. Wo soll ich den Code am besten einfügen, damit ich das erreichen kann?

Zweite Frage wäre, wie ich es denn realisieren kann die Kommentare direkt unter die Artikel anzeigen zu lassen. Könnt ihr mir dazu auch einen Tipp geben?


Wäre für Hinweise sehr dankbar.

Philipp Gérard 02.03.2004 17:12

Du benutzt den Header, also ist folgende Funktion für dich wichtig:

PHP-Code:

    function header($array = array())
         {
             if(
USE_NL == 1) {
                 
$array['USE_NL_1'] = "-->";
                 
$array['USE_NL_2'] = "<!--";
             }
             return 
$GLOBALS['Template']->load('header'$array);
         } 

Templates:

An dieser Funktion kann man das ganze TPL-Parsen leicht erklären. Du siehst, dass $array ein Array mit Werten ist, die später in der Funktion load() übergeben werden. Dort werden sie mit geschweiften Klammern umgeben und kurzerhand ersetzt. Das heißt {foo} im Template wird per

$array['foo'] = "Dies ist ein String";

zu Dies ist ein String.

MySQL:

$GLOBALS['Sql'] enthält das Objekt für Datenbankzugriffe. Die Funktion getdata (ergo: $GLOBALS['Sql']->getdata("QUERY");) gibt dir Daten deiner Wahl zurück. Wenn es nur ein Ergebnis gibt (WHERE id = '1') ist es ein einfacher Array, wenn es mehrere gibt ein verschachtelter (array(array(),array(),...)). Es gibt auch noch andere Funktionen, die einmal verstanden, die Arbeit sehr erleichtern. Ein Blick in die Datei sql.class.php genügt (theoretisch). Wie verarbeitest du dieses Query jetzt? Z.B. so:

PHP-Code:

for($i 0$i count($ergebnisse); $i++){
    
       
$return. = $GLOBALS['Template']->load("dateiname_ohne_endung",$ergebnisse[$i]);
    
    } 
     
     return 
$return

Nur her mit Nachfragen, dass kommt dann bald in einer zweite Version der Doku ;)

Daniel Richter 03.03.2004 09:47

Danke Philipp, dass geht schon mal.
Wie sieht das denn mit den Kommentaren unter den Artikeln aus?

Philipp Gérard 03.03.2004 11:46

Ich habs noch nicht ausprobiert, aber bau doch einfach eine Variable {kommentare} unter den Artikel ein und lass diese in der Funktion article() mit $this->comments($id); ersetzen. Sollte gehen. Anpassung der Optik dann wie gewohnt über die Templates.

PHP-Code:

 # auszug aus article($id):
 
 
$result[0]['kommentare'] = $this->comments($id);
 
 return 
$GLOBALS['Template']->load('article'$result[0]); 


Daniel Richter 03.03.2004 16:46

Danke Philipp, aber ich muss nochmal auf die Ausgabe im Header zurück kommen.
Ich mach das ganze jetzt im Footer, ist ja aber kein Unterschied. Folgendes:

Ich möchte im Footer die letzten 10 Beiträge meines Forums ausgeben und nutze dafür folgenden Query:

PHP-Code:

$result mysql_query("SELECT * FROM bb1_threads ORDER BY lastposttime DESC LIMIT 0,10"); 

Um die Datensätze in die Variablen zu bekommen nutze ich eine While Schleife:

PHP-Code:

         while($data mysql_fetch_array($result))
       {

       if(
USE_NL == 1) {

       
$array['threadid'] = $data['threadid'];
       
$array['topic'] = $data['topic'];
       }
       } 

Das geht ja natürlich nicht, weil nur der letzte Datensatz eingetragen ist, was ja nicht sinn und zweck ist.

Kannst du mir sagen, wie ich es bewerkstellige, dass alle Datensätze ausgegeben werden?

Hier nochmal die ganze footer Funktion

PHP-Code:

    function footer($array = array())
    {
    
          
$result mysql_query("SELECT * FROM bb1_threads ORDER BY lastposttime DESC LIMIT 0,10");
          echo 
mysql_error();
        
         while(
$data mysql_fetch_array($result))
       {

       if(
USE_NL == 1) {

       
$array['threadid'][] = $data['threadid'];
       
$array['topic'][] = $data['topic'];
       }
       }
    
      return 
$GLOBALS['Template']->load('footer'$array);
    } 


Patrick Gotthardt 03.03.2004 16:56

Warum lädst du nicht ein Template?

Bsp (unterhalb von echo mysql_error()):
PHP-Code:

  $array['boardentrys'] = '';
  if(
USE_NL == 1) {
      while(
$data mysql_fetch_assoc($result)) {
          
$array['boardentrys'] .= $GLOBALS['Template']->load('boardentrys'$data);
      }
  } 

Und dann im Footer {boardentrys} an die Stelle, an der die Einträge stehen sollen...
Dann müsstest du natürlich noch ein Template anlegen (hier: boardentrys).

So würde ich das jedenfalls machen...

Daniel Richter 03.03.2004 17:09

Ja, dass geht schon mal!
Aber wie kann ich jetzt die Strings, die ausgegeben werden, verkürzen? Also abbrechen und ... dahintersetzen?

Philipp Gérard 03.03.2004 17:31

Ein Blick auf die Funktion substr genügt.

Korrekt sähe das ganze so aus:

PHP-Code:

function footer($array = array(NULL)) {
  
    
$result $GLOBALS['Sql']->getdata("SELECT * FROM bb1_threads ORDER BY lastposttime DESC LIMIT 0,10");
  
    if(
USE_NL == 1) {
  
        for(
$x 0$x count($result); $x++){
  
          if(
strlen($result[$x]['topic']) > 10) { $result[$x]['topic'] = substr($result[$x]['topic'],0,10).'...'; }
          if(
strlen($result[$x]['topic']) <= 10){ $result[$x]['topic'] = $result[$x]['topic'].'...'; }
  
          
$array['boardentries'] .= $GLOBALS['Template']->load('boardentries'$result[$x]);
  
        }
        
    }
  
    return 
$GLOBALS['Template']->load('footer'$array);
  
  } 

Edit: Baut bitte in Zukunft auf die MySQL-Funktionen, das erleichtert euch die Arbeit und uns das Bugfixen ;-)

Daniel Richter 02.04.2004 11:50

Philipp ich glaub ich muss dich noch einmal mit meinen Fragen nerven. Das hat alles gut geklappt, auch die Ausgabe im Header Template. Aber eins funktioniert nicht. Es ist wieder eine SQL Abfrage und ich habe sie genauso wie die andere in die header function gepackt.

PHP-Code:

$result2 $GLOBALS['Sql']->getdata("SELECT * FROM xmentor_quote ORDER BY RAND() LIMIT 1");

if(
USE_NL == 1) {

for(
$x 0$x count($result2); $x++){

$array['quotetemp'] .= $GLOBALS['Template']->load('quotetemp'$result[$x]);

}



mein quotetemp.tpl sieht so aus:

PHP-Code:

{quote} - {author

Und genauso wirds auch ausgegeben. Also es erscheint lediglich:

{quote} - {author}


Hast du eine Idee, was das sein könnte?

Patrick Gotthardt 02.04.2004 12:41

Bin zwar nicht Phillip, aber so sollte es gehen:
PHP-Code:

$result2 $GLOBALS['Sql']->getdata("SELECT * FROM xmentor_quote ORDER BY RAND() LIMIT 1");
 
 if(
USE_NL == 1) {
 
$limit count($result2);
 for(
$x 0$x $limit$x++){
 
 
$array['quotetemp'] .= $GLOBALS['Template']->load('quotetemp'$result2[$x]);
 
 }
 
 } 


Daniel Richter 02.04.2004 12:45

Hey Danke Patrick. Hat wunderbar geklappt!

Daniel Richter 02.04.2004 12:59

Aber dummerweise funktioniert nun die Zufallsausgabe nicht so, wie sie soll.

PHP-Code:

SELECT FROM xmentor_quote ORDER BY RAND() LIMIT 1 

gibt nur den letzten Eintrag aus.

Philipp Gérard 02.04.2004 13:06

Was hat die die Zufallsausgabe von Zitaten mit dem Newsletter zu tun?

Folgender Code sollte seinen Zweck erfüllen, ohne unnötige Rechenzeit zu verschwenden:

PHP-Code:

$result2 $GLOBALS['Sql']->getdata("SELECT * FROM xmentor_quote ORDER BY RAND() LIMIT 1");
 
$array['quotetemp'] = $GLOBALS['Template']->load('quotetemp'$result2[0]); 


Daniel Richter 02.04.2004 13:08

hmm die IF Abfrage ist mir da wohl so reingerutscht ... keine Ahnung warum.
Aber die Zufallsausgabe funktioniert immer noch nicht. Es wird immer nur der neuste Eintrag ausgegeben.

Philipp Gérard 02.04.2004 13:24

Ist denn mehr als ein Zitat in der Tabelle? ;)

Daniel Richter 02.04.2004 23:04

Klar! 3.

Philipp Gérard 02.04.2004 23:53

Der SQL-Code ist korrekt - daran kann es nicht liegen...

Daniel Richter 03.04.2004 11:11

Ich habe bereits eine Lösung gefunden. Danke für die Mühen.

Daniel Richter 06.04.2004 17:18

Sag mal Philipp, gibt es auf der Artikelübersichtsseite (also da wo die einzelnen Artikel aufgelistet werden, auch in den Kateogrien ... kurz gesagt, dass article_preview Template) eine Möglichkeit, die Anzahl der im Artikel vorhandenen Kommentare auszugeben?

Daniel Richter 10.04.2004 16:02

Philipp keine Idee?

Patrick Gotthardt 10.04.2004 21:42

Für Kategorien (bei der Startseite musste es halt einfach anpassen:
Funktion category:
Suche:
PHP-Code:

$result $GLOBALS['Sql']->getdata("SELECT id,title,pretext,time,author,preimg 

Füge dahinter ein:
,comments

Nun hast du die Anzahl der Kommentare im als Template-Variable. ;)
(Hoffe ich zumindest... ^^")

Daniel Richter 11.04.2004 09:48

Ne das stimmt leider nicht. Damit liest man nur aus, ob die Erlaubnis für das Abgeben von Kommentaren erlaubt ist. Das heisst es wird 1 oder 0 ausgegeben.

Patrick Gotthardt 11.04.2004 10:10

*räusper*
Stimmt... bitte nicht meckern... war gestern spät und ich hab in die falsche Versiongeguckt... genau das, was du haben willst hab ich nämlich fertig in meiner Version drin:

PHP-Code:

    function index()
     {
         
$result $GLOBALS['Sql']->getdata("SELECT id,title,pretext,time,author,preimg,comments FROM " SQL_PREF SQL_TBL2 " WHERE status='1' ORDER BY time DESC LIMIT " NUM_FRONT);
         
$return "";
         for(
$x 0$x count($result); $x++) {
             if(
$result[$x]['comments'] == 1) {
                 
$query $GLOBALS['Sql']->query('SELECT COUNT(id) AS counted FROM '.SQL_PREF.SQL_TBL3.' WHERE artid='.$result[$x]['id']);
                 
$result[$x]['comments'] = $GLOBALS['Sql']->result($query0'counted'); 
             } else {
                 
$result[$x]['comments'] = 0;
             }
             
$result[$x]['comment'] = $result[$x]['comments'] != 'Kommentare' 'Kommentar'

Aber immerhin hatte ich schonmal den einen Teil der Lösung verraten... ^^"

Funktion category:
PHP-Code:

        for($x 0$x count($result); $x++) {
             if(
$result[$x]['comments'] == 1) {
                 
$query $GLOBALS['Sql']->query('SELECT COUNT(id) AS counted FROM '.SQL_PREF.SQL_TBL3.' WHERE artid='.$result[$x]['id']);
                 
$result[$x]['comments'] = $GLOBALS['Sql']->result($query0'counted'); 
             } else {
                 
$result[$x]['comments'] = 0;
             }
             
$result[$x]['comment'] = $result[$x]['comments'] != 'Kommentare' 'Kommentar'

Ich sollte so spät nicht versuchen zu denken... ^^"

Daniel Richter 11.04.2004 10:38

Funktioniert auch nicht *grübel*

Fehler auf der Index
Code:

Fatal error: Call to undefined function: result() in /www/htdocs/pforen/inc/system.class.php on line 140

Fehler in der Kategorie
Code:

Fatal error: Call to undefined function: result() in /www/htdocs/pforen/inc/system.class.php on line 283

Hast du vielleicht ne andere version? Ich hab die neuste (pl2)

exe 11.04.2004 11:59

Die Anzahl der Kommentare kann man auch mit einer Abfrage auslesen, dafür muss man nicht für jeden Artikel eine neue Abfrage an die Datenbank absetzen.
Ich kenn mich jetzt mit dem X-Mentor nicht besonders gut aus, aber wenn du die Artikel folgendermaßen ausliest sollte das funktionieren.

PHP-Code:

$result $GLOBALS['Sql']->getdata("SELECT a.id, a.title, a.pretext, a.time, a.author, a.preimg, a.comments, COUNT(c.id) AS num_comments FROM " SQL_PREF SQL_TBL2 " a LEFT JOIN  ".SQL_PREF.SQL_TBL3." c ON c.artid = a.id WHERE status='1' GROUP BY c.artid ORDER BY time DESC LIMIT " NUM_FRONT); 

In der Spalte 'num_comments' steht dann jeweils die Anzahl der Kommentare für den jeweiligen Artikel. Die Zahl ins Template reinzubringen sollte dann ja kein Problem mehr sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:15 Uhr.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25