interne Variablen von Artikeln anzeigen

ZuMe
Beiträge: 71
Registriert: Sa 20. Dez 2003, 13:36
Kontaktdaten:

interne Variablen von Artikeln anzeigen

Beitrag von ZuMe » Mi 3. Jan 2007, 13:11

Hallo,

ich möchte gerne im Frontend von Contenido Module einbinden, die interne Informationen aus dem Contenido Backend anzeigen.

Also zum Beispiel: Ich habe 5 Autoren, die berechtigt sind, in einer Kategorie zu schreiben. Unter den von ihnen geschriebenen Artikeln sollte dann stehen "Geschrieben von $Autor am $Datum".
Das wäre dann also die interne Information, die im Backend von Contenido hinterlegt ist, welcher der Berechtigten den Artikel denn verfasst hat und wann.
Oder ich möchte, daß die Top10 der aufgerufenen Seiten mit einem kleinen Modul auf der Startseite angezeigt werden, als Navigationshilfe für meine Leser, und die Anzahl der Visits insgesamt.

All diese Daten gibt es ja im Backend von Contenido, eben einmal als Artikel-Attribut und einmal als Teil der Contenido-Statistik.
Leider habe ich in der Suche niemanden gefunden, der solch ein Vorgehen schon einmal beschrieben hätte.

Gibt es Contenido-interne Variablen, die diese Dinge sowieso schon haben und auslesen? Wenn ja, wie heissen die, gibt es dazu eine Doku irgendwo?
Direkt auslesen aus der DB geht bei den Artikel-Attributen sicher auch irgendwie (wenn ich herauskriegen kann, welcher Artikel gerade angezeigt wird, was sicher auch wieder eine Variable ist...... ;) ), aber bei den Statistiken....?

Wäre dankbar für jeden Tipp.

thx & lg,
Suse

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Mi 3. Jan 2007, 14:29

die artikelinfos bekommst du so raus:

Modul Output

Code: Alles auswählen

<?php

$oArticle = new Article ( $idart, $client, $lang );

$tpl = new Template();
$tpl->reset();

// assign article infos
$tpl->set("s","AUTHOR",       $oArticle->getField('author') );
$tpl->set("s","CREATED",      $oArticle->getField('created') );
$tpl->set("s","MODIFIED",     $oArticle->getField('lastmodified') );
$tpl->set("s","MODIFIED_BY",  $oArticle->getField('modifiedby') );
$tpl->set("s","PUBLISHED",    $oArticle->getField('published') );
$tpl->set("s","PUBLISHED_BY", $oArticle->getField('publishedby') );

// print template
print $tpl->generate($cfgClient[$client]["tpl"]["path"] . 'ArticleInfo.html', 1, 0);

?>

Datei ArticleInfo.html, gehört ins mandatenverzeichnis/templates

Code: Alles auswählen

<!-- Artikelinfo -->
Author: {AUTHOR}<br />
Erzeugt: {CREATED}<br />
Modifiziert von: {MODIFIED_BY}<br />
Modifiziert am: {MODIFIED}<br />
Veröffentlicht von: {PUBLISHED_BY}<br />
Veröffentlicht am: {PUBLISHED}<br />

und hier die top 10 artikel:
Modul Output:

Code: Alles auswählen

<?php
// initialize template engine
$tpl = new Template();
$tpl->reset();

$intTopLimit = 10;

$db = new DB_Contenido();

// define article counts
$arrArticles = array();
$arrTitles = array();
// build sql query
$sqlStats = "SELECT
                C.title, A.visited, C.idart
            FROM ".$cfg["tab"]["stat"]." AS A,
                 ".$cfg["tab"]["cat_art"]." AS B,
                 ".$cfg["tab"]["art_lang"]." AS C
            WHERE
                C.idart = B.idart
            AND
                C.idlang = A.idlang
            AND
                B.idcatart = A.idcatart
            AND
                A.idclient = '".$client."'
            AND
                A.idlang = ".$lang."
            ORDER BY
                A.visited DESC";
// run sql query
$db->query($sqlStats);

// build array for sort options
while ( $db->next_record()) {
   
   if ( !isset($arrArticles[$db->f('idart')])) {
      $arrArticles[$db->f('idart')] = 0;
   }
   $arrArticles[$db->f('idart')]+= $db->f('visited');
   $arrTitles[$db->f('idart')] = urldecode($db->f('title'));
}




// get all archived stats
$sqlStats = "SELECT
                C.title, A.visited, C.idart
            FROM ".$cfg["tab"]["stat_archive"]." AS A,
                 ".$cfg["tab"]["cat_art"]." AS B,
                 ".$cfg["tab"]["art_lang"]." AS C
            WHERE
                C.idart = B.idart
            AND
                C.idlang = A.idlang
            AND
                B.idcatart = A.idcatart
            AND
                A.idclient = '".$client."'
            AND
                A.idlang = ".$lang."
            ORDER BY
                A.visited DESC";
// run sql query
$db->query($sqlStats);

// store query results to template
while ( $db->next_record()) {
   
   if ( !isset($arrArticles[$db->f('idart')])) {
      $arrArticles[$db->f('idart')] = 0;
      $arrTitles[$db->f('idart')] = urldecode($db->f('title'));
   }
   $arrArticles[$db->f('idart')]+= $db->f('visited');
}

arsort( $arrArticles );

$i = 0;
foreach ($arrArticles as $intIdart => $intVisited ) {
   $i++;
   $tpl->set('d', 'HREF', $sess->url("front_content.php?idart=" . $intIdart . '&lang=' . $lang . '&client=' . $client));
   $tpl->set('d', 'NAME', $arrTitles[$intIdart]);
   $tpl->set('d', 'VISITS', $intVisited);
   $tpl->next();
   if ($i == $intTopLimit) {
      break;
   }
}

// print template
print $tpl->generate($cfgClient[$client]["tpl"]["path"] . 'top10.html', 1, 0);
?>
Datei top10.html, gehört ins mandatenverzeichnis/templates

Code: Alles auswählen

<ul>
<!-- BEGIN:BLOCK -->
	<li><a href="{HREF}" class="top10" title="{NAME}">{NAME} ({VISITS})</a></li>
<!-- END:BLOCK -->
</ul>
Zuletzt geändert von stese am Mi 3. Jan 2007, 15:03, insgesamt 1-mal geändert.

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Mi 3. Jan 2007, 14:45

und hier für die gesamt hits:

Modul Output

Code: Alles auswählen

<?php
$db = new DB_Contenido();

// get all stats in current month
$sqlTotalHits = "SELECT sum(visited) as total FROM " . $cfg["tab"]["stat"];
$db->query($sqlTotalHits);
$db->next_record();

$intStatsTotal = $db->f('total');

// get all archived stats
$sqlTotalHits = "SELECT sum(visited) as total FROM " . $cfg["tab"]["stat_archive"];
$db->query($sqlTotalHits);
$db->next_record();

$intStatsTotal+= $db->f('total');

print 'Gesamt Hits: ' . $intStatsTotal;
?>

Bei den TOP10 Artikeln gibts nen kleines Problem. die funktionieren momentan nämlich nur für den aktuellen monat. um auch die historie einzubeziehen muss man das ganze bissl verkomplizieren ... das muss ich mir mal bei gelegenheit anschauen - dafür habe ich momentan keine zeit

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Mi 3. Jan 2007, 15:04

so, habe den modulcode für die top10 geändert, so dass auch archivierte statistiken berücksichtigt werden

ZuMe
Beiträge: 71
Registriert: Sa 20. Dez 2003, 13:36
Kontaktdaten:

Beitrag von ZuMe » Do 4. Jan 2007, 12:31

Wow... du hast ja meine ganze arbeit schon gemacht ! :shock:
Vielen Dank! *gleich mal reinwühlt* 8)

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Do 4. Jan 2007, 13:47

gern geschehen - 1x im jahr hat man seinen sozialen tag ;)

ZuMe
Beiträge: 71
Registriert: Sa 20. Dez 2003, 13:36
Kontaktdaten:

Beitrag von ZuMe » Mo 19. Mär 2007, 12:24

Hallo :)

ich habe das Modul jetzt schon eine ganze Weile erfolgreich im Einsatz mit der Statistik des letzten Monats und möchte mich bei stese nochmals bedanken, daß er so fleissig gleich alles fertig gemacht hat.

Leider ist es nicht sehr performant, die gesamte Archiv-Statistik abzufragen und dann die top10 davon in eine Liste zu posten (das, so habe ich es verstanden, macht dieses Modul ja, wenn man es nicht entsprechend auf die Statistik des aktuellen Monats einstellt.).

Ich hatte deshalb versucht, ein LIMIT in die SQLquery der Abfrage einzufügen, immerhin will ich ja nur die top10 oder top7 oder so. Wenn ich das aber mache, kommt (ohne syntax-fehler) einfach nur eine leere Ausgabe. Auch dann, wenn ich das LIMIT auf 5000 setze... :shock:

(Ich habe mir auch http://www.contenido.org/forum/viewtopic.php?t=10873 angesehen, denn immerhin macht dieses Modul ja etwas sehr sehr ähnliches. Allerdings kriege ich das überhaupt nicht zum laufen (wieder - kein syntax-fehler, aber auch keinerlei Ausgabe). )

Vielleicht bin ich ja irgendwie zu doof. *seufz*
Warum kann ich bei diesem Quellcode hier kein LIMIT in die sql-Abfrage setzen, kann mir jemand sagen wo ich da meinen Denkfehler mache? Gibt es eine andere Möglichkeit, die Performance dieser Abfrage zu erhöhen, aber dennoch die gesamte Statistik abzufragen?


noob-Zusatzfrage (*nochmal seufzt*) :
Ich suche ausserdem eine Möglichkeit, die zuletzt geänderten UND die neusten Artikel auch als Top10 (zusammen) auszugeben. Nun gibt es ja einen Tabellenwert created und einen lastmodified. Wenn ich diese aber mit der Query so wie hier abfragen will, funktioniert das auch nicht, liefert wieder keinerlei Ausgabe. Manche Artikel haben kein lastmodified datum (was an sich ja logisch ist), manche aber auch bei created einfach keines...?
Ich bin auch gar nicht sicher, ob ich dafür vielleicht eine andere Tabelle fragen muss (z.b. cat_art_lang?). Auch scheitert mein zugegebenermaßen sehr lückenhaftes SQL-wissen dann daran, wie ich solch eine Abfrage dazu bringe, ein ODER zu nehmen, also einfach die 10 neusten (egal ob geändert oder ganz neu) Artikel herauszusuchen.

Hilfe, bitte? *ganz lieb guckt* :D

lg,
Suse

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Mo 19. Mär 2007, 13:27

Fangen wir mit einem Schritt an:
Ich hatte deshalb versucht, ein LIMIT in die SQLquery der Abfrage einzufügen, immerhin will ich ja nur die top10 oder top7 oder so. Wenn ich das aber mache, kommt (ohne syntax-fehler) einfach nur eine leere Ausgabe. Auch dann, wenn ich das LIMIT auf 5000 setze...
Wie sah denn Dein finales SQL-Statement aus?

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

ZuMe
Beiträge: 71
Registriert: Sa 20. Dez 2003, 13:36
Kontaktdaten:

Beitrag von ZuMe » Mo 19. Mär 2007, 15:18

so :
[...]
$intTopLimit = 10;

$db = new DB_Contenido();

// define article counts
$arrArticles = array();
$arrTitles = array();
// build sql query
$sqlStats = "SELECT
C.title, A.visited, C.idart
FROM ".$cfg["tab"]["stat_archive"]." AS A,
".$cfg["tab"]["cat_art"]." AS B,
".$cfg["tab"]["art_lang"]." AS C
WHERE
C.idart = B.idart
AND
C.idart != 1
AND
C.idart != 529
AND
C.idart != 645
AND
C.idart != 91
AND
C.idart != 92
AND
C.idart != 93
AND
C.idart != 31
AND
C.idart != 532
AND
C.idlang = A.idlang
AND
B.idcatart = A.idcatart
AND
A.idclient = '".$client."'
AND
A.idlang = ".$lang."
LIMIT 10
ORDER BY
A.visited DESC";

// run sql query
$db->query($sqlStats);
[...]
Ich habe an dem Code faulerweise nichts verändert ausser die ArtikelIDs von der Abfrage ausgenommen, die den Haupt-Kategorien angehören, oder von der Suche sind.
Diese möchte ich nicht in der Statistik haben, denn man kann ja eh direkt draufklicken.
Wie gesagt, wenn ich das LIMIT statement drin habe, gibt es zwar keinen Fehler, aber auch keine Ausgabe. Entfernt man es, bekommt man die Top10 in der Ausgabe fehlerfrei.

Ich frage hier nur die archivierten Stats ab, um einen allgemeinen Überblick aller Aufrufe zu erhalten, mir geht es nicht um die sekündlichen Veränderungen. ;)
Wie gesagt benötigt dieser Query so (ohne LIMIT statement) aber gute 15-20 sec. Zeit, in der Seitenaufbau "hängt", darum habe ich derzeit auf der "live" Seite stattdessen
FROM ".$cfg["tab"]["stat"]." AS A,
also nur die Abfrage des aktuellen Monats und nicht der Archive. Der Limit-Effekt ist hier aber genau derselbe.
Ich kann mir ja auch vorstellen, daß die Statistiken erst ausgerechnet werden und da alle "Hits" sozusagen einzeln in dieser Tabelle liegen und sie erst zusammen gerechnet werden müssen (was wahrscheinlich das Contenido Backend bei der Darstellung sonst ja macht). Das hieße, man müsste die Anfrage nicht auf die 10 Artikel, sondern die 5000 ersten Aufrufe oder so beschränken und dann zusammenrechnen. Aber auch wenn ich ein so hohes Limit vorgebe, kommt einfach null heraus.

lg,
Suse

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Mo 19. Mär 2007, 15:31

Code: Alles auswählen

A.idlang = ".$lang." 
ORDER BY 
A.visited DESC 
LIMIT 0, 10";


Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

stese
Beiträge: 1040
Registriert: Fr 3. Dez 2004, 17:47
Wohnort: München
Kontaktdaten:

Beitrag von stese » Mo 19. Mär 2007, 16:46

nur dass dann ihre ausgabe nicht mehr wie gewünscht alle archvierten top10 aufrufe hat.

er zählt ja -eigentlich ganz banal - alle hits jeder monate aus den stats und archiven zusammen. in der aktuellen stats stehen ja nur die aufrufe des monats - sprich man müsste das ganze über subqueries in mysql 4.1 oder höher schreiben, um diese dann auch noch später korrekt sortieren zu können - andernfalls hast du eine top 10 am monatsanfang, die nicht aussagefähig ist.

aber um die ganze geschichte mit subqueries umzubauen (mal unter der voraussetzung dass der server die schon unterstützt) habe ich leider keine zeit.

andere idee wäre es, eine seperate mysql tabelle zu basteln, die für die idartlang immer alles hochzählt - die wäre dann auch deutlich einfacher zu sortieren - da muss man aber schon in die statistikfunktion contenidos eingreifen (oder gibts da ne chain für?)

ZuMe
Beiträge: 71
Registriert: Sa 20. Dez 2003, 13:36
Kontaktdaten:

Beitrag von ZuMe » Mo 19. Mär 2007, 21:03

Genau, stese. Wenn ich das so mache wie von HerrB vorgeschlagen, kommt zwar eine Ausgabe, aber die Zahlen stimmen überhaupt nicht mehr.

Hier zum Beispiel von meiner Webseite :

Statistik der Artikelaufrufe aus dem Archiv : (Table stat_archive, kein Limit)
Häufig besuchte Artikel :
Völker Faerûns (863)
Die Welt Faerûn (681)
Die Elfen (621)
Götter Faerûns (514)
Berufe Faerûns (427)
Große Gottheiten (304)
Karten Faerûns (291)
Elfische Namen & Sprache (290)
Götter der Menschen (285)
Über ZuMe (265)
Statistik der Artikelaufrufe aus dem Archiv mit der LIMIT bedingung (Table stat_archive, query mit LIMIT 0,10) :
Häufig besuchte Artikel :
Völker Faerûns (490)
Die Elfen (270)
Götter Faerûns (264)
Die Welt Faerûn (261)
Berufe Faerûns (139)
Statistik des aktuellen Monats : (table stat, kein Limit)
Häufig besuchte Artikel :
Die Halblinge (264)
Völker Faerûns (152)
Downloads (114)
Die Elfen (102)
Götter Faerûns (97)
Berufe Faerûns (87)
Die Welt Faerûn (75)
Sternenelfen (66)
Götter der Menschen (59)
Planetouched (52)
... bereue ich es, wenn ich frage, was die von HerrB angegebene Limit-Anfrage bewirkt? :wink:

Wenn ich stese richtig verstanden haben, ist es mit der Statistik-Tabelle also nicht möglich, eine (performante) Top10 Abfrage einzubauen, da man die Abfrage-Art deutlich ändern und untergliedern müsste, ja?
Wenn ja, macht euch keinen Kopp. Das da ist ein privates Projekt und ich stehe zu meiner Unfähigkeit. ;)

lg,
Suse

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Di 20. Mär 2007, 17:19

... bereue ich es, wenn ich frage, was die von HerrB angegebene Limit-Anfrage bewirkt?
Nein. Ich habe den Code nur überflogen und insofern nur die richtige Syntax genannt (und habe übersehen, dass da noch was summiert wird).

Welche mySQL-Version? Ich gucke mal nach einem gruppierten SQL-Statement.

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

ZuMe
Beiträge: 71
Registriert: Sa 20. Dez 2003, 13:36
Kontaktdaten:

Beitrag von ZuMe » Mi 21. Mär 2007, 09:35

Die aktuell laufende MySQL Version ist: 4.1.15-Debian_0.dotdeb.1-log
sagt HostEurope. ;)
Verwendetes Contenido ist übrigens 4.6.8, und php bin ich im Moment bei 4.4.4.

Danke !

lg,
Suse

barneyy
Beiträge: 16
Registriert: Di 29. Mai 2007, 15:17
Wohnort: NRW
Kontaktdaten:

Kurze Rückfrage zum Datumsformat

Beitrag von barneyy » Fr 19. Okt 2007, 10:22

Hallo zusammen,

habe die Artikel-Infos erfolgreich eingebastelt. Jetzt noch eine Frage:

Wie kann ich dieses Format des Datums 2007-09-15 13:42:20
in diese Form 15.09.2007
umwandeln?????


Sorry, bin kurzfristig auf Hilfe angewiesen. Meine Frage offenbart wohl auch, dass ich von PHP null Ahnung habe. Bin lediglich Gestalter und möchte eine ehrenamtliche Seite entwerfen für einen Verein.

Thx im voraus

Gesperrt