Seite 1 von 1

last_login

Verfasst: Fr 11. Feb 2005, 22:16
von Darth-Vader
Hallo Contenido-Community,

nachdem ich mich schon lange nicht mehr hier hab blicken lassen ( außer um meine "Fanpost" zu beantworten... ;) :roll: ), hab ich gedacht ich lasse euch ma wieder was zu Gute kommen.

Das kleine Modul nennt sich "last-login" und es zeigt, wie der Name schon sagt, das Datum und die Uhrzeit des letzten login in das Contenido-Backend.

Diese Angabe kann man dann seinen Besuchern schön als "Letzte Änderung" bzw. "Last Change" auf seiner Seite in irgendeiner Ecke "verkaufen"! ;) :lol:
(Denn nur weil man sich eingeloggt hat, heisst noch lange nicht, dass man die Seite auf dem neuesten Stand hält... *fg*)


Ich habe das Feature auf meine Seite einbauen wollen und dazu in der Contenido-FAQ und hier im Contenido-Forum gesucht, aber nichts gefunden. Falls sowas schon existiert ignoriert meinen Beitrag einfach, da ich in dem Fall zu inkompetent und zu Faul war die Suchfunktion korrekt zu benutzen! ;) :lol:


Hier also der OUTPUT des Moduls, INPUT wird also nicht benötigt. :idea:


Code: Alles auswählen

<?php

/*******************************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname      :  last-login
* Author         :  Darth-Vader <lars@forseth.de>
* Copyright      :  Darth-Vader
* Created        :  Feb 11th 2005
********************************************************/


/* initialize db-object */
$db = new DB_Contenido;


/* set sql-query  */
$sql = "SELECT logtimestamp AS time FROM ".$cfg["tab"]["actionlog"]." WHERE idaction=330 ORDER BY time DESC LIMIT 1;";


/* execute sql-query */
$db->query($sql);


/* get resulting row and number of total rows from db */
$db->next_record();
$nr = $db->num_rows();
 

/* only give an output if there was a suitable line found, ergo a timestamp of the last login */
if ($nr == 1) {
    $time = strftime("%d.%m.%Y %H:%M:%S",strtotime($db->f("time")));
    echo "<div class=\"last_login\">Last Change: ".$time."</div>";
} // end if


?>


H i n w e i s:

Dieses Modul funktioniert so nur, wenn euer Tabellenprefix "con" lautet. Solltet ihr also Fehlermeldungen erhalten bezüglich nicht existenten Tabellen, dann passt das SQL-Query bitte an euren Tabellenprefix an! ;)



Wie ihr schlauen Füchse wohl auf den ersten Blick erkannt habt, hab ich die tatsächliche Ausgabe einfach in einen div der CSS-Klasse namens "last_login" gepackt.

Mit anderen Worten:
Wer will, dass das Ganze halbwegs gut aussieht, der sollte eine entsprechende CSS-Klasse in sein CSS-file aufnehmen (normalerweise heisst diese Datei "format.css", falls ihr sie seit der Installation von Contenido nicht umbenannt habt!).

Meine entsprechende CSS-Klasse aus "format.css" sieht folgendermaßen aus:

Code: Alles auswählen

.last_login {
    font-family: Verdana;
    font-size: 12px;
    background-color: #C7D0A6;
    color: black;
    padding: 10px;
    padding-top: 30px;
    border-right: 1px solid #EEF2D9;
    border-left: 1px solid #EEF2D9;
    width: 142px;
}




so long,

Darth. :twisted:

Verfasst: Fr 11. Feb 2005, 22:23
von HerrB
Faulpelz :wink:

Schön, mal wieder was von Dir zu lesen.

Mit dieser Zeile gehts auch mit dem Nachbarn (bzw. ohne con-Prefix):

Code: Alles auswählen

$sql = "SELECT logtimestamp AS time FROM ".$cfg["tab"]["actionlog"]." WHERE idaction=330 ORDER BY time DESC LIMIT 1;";
Gruß
HerrB

Verfasst: Fr 11. Feb 2005, 22:30
von Darth-Vader
HerrB hat geschrieben:Faulpelz :wink:

Schön, mal wieder was von Dir zu lesen.

Mit dieser Zeile gehts auch mit dem Nachbarn (bzw. ohne con-Prefix):

was heisst hier faulpelz, ich hab einiges zu tun, glaub mir! ;)

ich wohn ja jetzt seit sept. 2004 in stuttgart und bin BA-Student bei IBM (see: http://www-05.ibm.com/employment/de/sch ... index.html) . Außerdem schrieb ich nächste Woche 4 Klausuren und am Montag drauf geht es direkt weiter in der IBM mit Schulungen. Is net wie bei normalem Studium mit Rumgammeln in den Semesterferien, da es sowas garnet gibt bei uns! ;)


thx, hab ich garnet dran gedacht. hab das gleich mal oben im code abgeändert. :)



wer das modul übrigens mal in action sehen will guckt am besten einfach mal bei mir auf der homepage (see: http://www.forseth.de) am rechten rand am ende der "kästen" nach... ;) 8)

Verfasst: Fr 11. Feb 2005, 22:41
von HerrB
Ich glaub' Dir, war nur'n Scherz... :wink:

So, so, BAler. Viel Erfolg! Uuuh, IBM, die haben ganz kompetente *hust* Consultants *hust*, denen kannste noch was beibringen... :lol:

Gruß
HerrB

Verfasst: Fr 11. Feb 2005, 22:44
von Darth-Vader
:lol: da sach ich jetzt ma nix zu! *HerrB nochmal davon kommen lässt*


btw wenn es interessiert, ich hab en FAQ-Artikel zu dem Modul gemacht:
http://www.thilo-sommer.de/PHPMyFAQ/ind ... 39&lang=de

Verfasst: Sa 12. Feb 2005, 11:19
von swelpot
Hi,

ohne jetzt eine krieg der module vom zaun brechen zu wollen ;-):
hab da auch noch was in der richtung. "für ehrliche" ;-)
zeigt das wahre datum der letzten änderung an...

alle aus meiner sicht "wirklichen" änderungen (actions) sind am modulanfang in einem array mit erläuterung und können somit bei bedarf auskommentiert oder erweitert werden

Modul-Output

Code: Alles auswählen

<?php
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* LastUpdate
*
* Gibt das Datum der letzten relevanten Änderung aus
*
* Author      :     Stefan Welpot
* Created     :     2004-10-06
* Modified		:			2005-02-12
************************************************/

$array_relevantActions = array(
// Artikel-Actions
   "Startartikel festlegen"								=> $perm->getIDForAction("con_makestart"),
   "Artikel online setzen"								=> $perm->getIDForAction("con_makeonline"),
   "Artikel löschen"											=> $perm->getIDForAction("con_deleteart"),
   "Kategorie schützen"										=> $perm->getIDForAction("con_makepublic"),
   "Template-Konfiguration bearbeiten"		=> $perm->getIDForAction("con_tplcfg_edit"),
   "Kategorie online setzen"							=> $perm->getIDForAction("con_makecatonline"),
   "Template wechseln"										=> $perm->getIDForAction("con_changetemplate"),
   "Artikel syncronisieren"								=> $perm->getIDForAction("con_syncarticle"),
   "Kategorie syncronisieren"							=> $perm->getIDForAction("con_synccat"),
   "Artikel kopieren"											=> $perm->getIDForAction("con_duplicate"),
   "Artikel bearbeiten"										=> $perm->getIDForAction("con_editart"),
   "Artikeleigenschaften bearbeiten"			=> $perm->getIDForAction("con_edit"),
   "Neuen Artikel erstellen"							=> $perm->getIDForAction("con_newart"),
//Kategorie-Actions
   "Neuen Baum anlegen"										=> $perm->getIDForAction("str_newtree"),
   "Neue Kategorie"												=> $perm->getIDForAction("str_newcat"),
   "Kategorie umbenennen"									=> $perm->getIDForAction("str_renamecat"),
   "Kategorie on- oder offline setzen"		=> $perm->getIDForAction("str_makevisible"),
   "Kategorie schützen"										=> $perm->getIDForAction("str_makepublic"),
   "Kategorie löschen"										=> $perm->getIDForAction("str_deletecat"),
   "Eine Kategorie nach oben verschieben"	=> $perm->getIDForAction("str_moveupcat"),
   "Kategorie verschieben"								=> $perm->getIDForAction("str_movesubtree"),
   "Kategorie kopieren"										=> $perm->getIDForAction("str_duplicate"),
   "Kategorie konfigurieren"							=> $perm->getIDForAction("str_tplcfg"),
//Upload-Actions
   "Dateien hochladen"										=> $perm->getIDForAction("upl_upload"),
   "Dateien löschen"											=> $perm->getIDForAction("upl_delete"),
   "Verzeichnis umbenennen"								=> $perm->getIDForAction("upl_renamedir"),
   "Datei modifizieren"										=> $perm->getIDForAction("upl_modify_file"),
   "Datei umbenennen"											=> $perm->getIDForAction("upl_renamefile"),
   "Dateien auf einmal löschen"						=> $perm->getIDForAction("upl_multidelete"),
//Layout-Actions
   "Layout bearbeiten"										=> $perm->getIDForAction("lay_edit"),
//Modul-Actions
   "Modul bearbeiten"											=> $perm->getIDForAction("mod_edit"),
   "Modul übersetzen"											=> $perm->getIDForAction("mod_translation_save"),
   "Modulübersetzung importieren/exportieren" => $perm->getIDForAction("mod_importexport_translation"),
//Style-Actions
   "Modify CSS"														=> $perm->getIDForAction("style_edit")
);




$tpl = new Template();

/* Start Output buffer */
ob_start();


$db = new DB_Contenido;
$sql =   "SELECT " .
         "MAX(logtimestamp) AS maxTimeStamp " .
      "FROM ".
         $cfg["tab"]["actionlog"];

//where-bedingung zusammenbauen
if(count($array_relevantActions) > 0) {
   $sql .= " WHERE";
   foreach($array_relevantActions as $idaction) {
      $sql .= " idaction = " . $idaction . " OR";
   }
   
   $sql = substr($sql, 0, strlen($sql) - 3);
}

$db->query($sql);


if($db->next_record()) {
   $tpl->set('s', "LASTUPDATE", date("d.m.Y", strtotime($db->f("maxTimeStamp"))));
} // end if
else {
   $tpl->set('s', "LASTUPDATE", "");
}


$tpl->generate("templates/lastupdate.html", false, false);

/* Read out buffer */
$html = ob_get_contents();

/* Clean buffer */
ob_end_clean();

/* Output buffer-contents */
echo $html;
?>
einfaches template dazu für "cms/templates":
lastupdate.html

Code: Alles auswählen

Letzte Aktualisierung:<br>
{LASTUPDATE}

//edit:
liegt auch als zip auf:
http://www.swelpot.de/temp/lastUpdate.zip

Verfasst: Sa 12. Feb 2005, 11:56
von emergence
@swelpot
die feste angabe der id halte ich für keine gute idee...
wenn sich da ne id ändert müsstest du jedesmal nachbessern...

an deiner stelle würde ich $perm->getIDForAction("con_makestart"); verwenden um die id zu bekommen...

ich spiel mich gerade mit einer option für die setup routine die darauf rücksicht nimmt, wenn sich ids ändern... mir ist das ganze nämlich ne spur zu unflexibel...

Verfasst: Sa 12. Feb 2005, 12:03
von swelpot
hi emergence,

fühle mich damit auch nicht so wohl. deine mglk. kannte ich noch nicht.
dachte allerdings, dass die bisherigen ids erstmal bleiben...
danke für den hinweis ;-)

Verfasst: Sa 12. Feb 2005, 12:14
von emergence
swelpot hat geschrieben:dachte allerdings, dass die bisherigen ids erstmal bleiben...
sie sollten ja so bleiben, mir gefällts trotzdem nicht...
der grund ist ein simpler... sollte sich wirklich mal aus versehen was ändern wären einträge im con_actionlog und con_rights einfach nur schrott... das ist nur ne vorbeugende maßnahme meinerseits...

Verfasst: Sa 12. Feb 2005, 12:25
von swelpot
ja, ist mir klar...
nur mangels erfahrungen mit $perm gab für meinen horizont leider keine andere möglichkeit. :?
deswegen ja auch der dank :D

hab es jetzt nochmal geändert und auch im ersten post editiert.
denke, dass das so o.k. ist...

wobei ich jetzt nur noch bedenken hätte (vielleicht auch nur mangels wissen):
werden alle actionids in der $perm-instanz vorgehalten oder führt getIDForAction(actionname) jedesmal eine query aus?
dann fände ich das bei all den actions in diesem konkreten fall nicht so doll.

ich werde mal nachsehen...

Verfasst: Sa 12. Feb 2005, 12:43
von emergence
swelpot hat geschrieben:wobei ich jetzt nur noch bedenken hätte (vielleicht auch nur mangels wissen):
werden alle actionids in der $perm-instanz vorgehalten oder führt getIDForAction(actionname) jedesmal eine query aus?
dann fände ich das bei all den actions in diesem konkreten fall nicht so doll.
ach den teil kannst du dir sparen, das hab ich schon umgebaut...

in der klasse perm.inc hab ich mir selbst folgendes reingebaut...

Code: Alles auswählen

	function Contenido_Perm() {

		global $cfg;

		// init
		$this->db = new DB_Contenido;

		// create area cache
		$sql = "SELECT
					name, idarea
				FROM
					".$cfg["tab"]["area"];

		$this->db->query($sql);

		while ($this->db->next_record()) {
			$this->areacache[$this->db->f("name")] = $this->db->f("idarea");
		}

		// create action cache
		$sql = "SELECT
					name, idaction
				FROM
					".$cfg["tab"]["actions"];
		$this->db->query($sql);

		while ($this->db->next_record()) {
			$this->actioncache[$this->db->f("name")] = $this->db->f("idaction");
		}

	}
damit wird beim erstmaligen aufruf der areacache und actioncache erzeugt... und zusätzlich eine db klasse initialisiert...

sämtliche
$db_perm = new DB_Contenido;
$db = new DB_Contenido;

und die $db in global können gelöscht werden...

anschließend einfach alle

$db_perm durch $this->db
$db durch $this->db

ersetzen...

wichtig ist einfach nur in genau der reihenfolge...

getestet hab ich das mit dem perm.inc der 4.4.5 und CVS_Head

ansonsten ist es so das beinahe bei jeden zugriff auf die $perm klasse eine db instanz initialisiert wird... das ganze sollte dann etwas schneller sein...

Verfasst: Do 2. Jun 2005, 14:19
von timo
emergence hat geschrieben: ansonsten ist es so das beinahe bei jeden zugriff auf die $perm klasse eine db instanz initialisiert wird... das ganze sollte dann etwas schneller sein...
Das Problem sind hierbei geschachtelte Funktionen -> dadurch können unerwünschte Effekte entstehen, z.b. eine Methode ruft innerhalb einer $this->db->next_record-Schleife eine Unterfunktion auf, die selbst wiederum das $this->db Objekt verwendet...ich kann es aber im Moment nicht verifizieren ob das wirklich der Fall ist

Verfasst: Do 2. Jun 2005, 14:35
von emergence
die sache hier ist nicht so dringend...

soweit ich das verifiziert habe (ich setze es momentan bei zwei größeren projekten bis in etwa 20 user ein) gabs bis jetzt noch kein einziges problem...