Memberlist_XH: Addon für Memberpages und Register

Ein CMSimple Support Forum für deutsch sprechende Nutzer und Entwickler
cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Memberlist_XH: Addon für Memberpages und Register

Post by cmb » Sat Jan 19, 2013 1:47 pm

Hallo Zusammen,

Memberlist_XH ist ein Addon für Memberpages und Register, das es ermöglicht eine Liste der aktuell aktiven Mitglieder anzuzeigen. Das ist nützlich für Plugins wie Chat_XH oder Forum_XH.

Installation
Fügt den Code, den Ihr unten findet, in userfuncs.php ein, und passt die Einstellungen in der CONFIGURATION SECTION an.

Verwendung
Anzeige der Mitgliederliste auf einer Seite:

Code: Select all

{{{PLUGIN:memberlist();}}}
Anzeige der Mitgliederliste im Template:

Code: Select all

<?php echo memberlist();?>
Um die Mitglieder in regelmäßigen Intervall zu aktualisieren, einfach memberlist(true) aufrufen. Dies ist besonders sinnvoll für die Mitgliederliste für Chat_XH. Zu beachten: in jedem Fall darf höchstens eine Mitgliederliste pro Seite angezeigt werden.

Code: Select all

<?php

/**
 * Memberlist_XH
 *
 * Addon for Memberpages_XH and Register_XH to display a list of currently
 * active members.
 *
 * @package   Memberlist
 * @copyright Copyright (c) 2013 Christoph M. Becker <http://3-magi.net/>
 * @license   http://www.gnu.org/licenses/gpl-3.0.en.html GNU GPLv3
 * @version   1beta2
 */


/*
 * BEGIN of CONFIGURATION SECTION
 */


/**
 * The path to the memberlist file.
 */
// use 1 of the following
//define('MEMBERLIST_PATH', $pth['folder']['plugins'] . 'memberpages/logfile/members.dat');
define('MEMBERLIST_PATH', $pth['folder']['plugins'] . 'register/logfile/members.dat');
//define('MEMBERLIST_PATH', $pth['folder']['base'] . 'path/relative/to/cmsimple/root/members.dat'); // change the path to an existing folder!


/**
 * The session variable to access for the user name.
 */
// use 1 of the following
//define('MEMBERLIST_VAR', 'Name'); // Memberpages < 3.0
define('MEMBERLIST_VAR', 'username'); // Memberpages >= 3.0 and Register
//define('MEMBERLIST_VAR', 'fullname'); // Register only: use Full Name


/**
 * The function value for the member's logout.
 */
// use 1 of the following
//define('MEMBERLIST_LOGOUT', 'memberslogout'); // Memberpages
define('MEMBERLIST_LOGOUT', 'registerlogout'); // Register


/**
 * The max. inactivity (in seconds) for still counting a member as active.
 */
define('MEMBERLIST_PERIOD', 300);


/**
 * The intervall in seconds between to automatic updates of the memberlist.
 */
define('MEMBERLIST_INTERVAL', 5);


/**
 * The separator for the (X)HTML view of the memberlist.
 */
define('MEMBERLIST_SEPARATOR', ', ');


/*
 * END of CONFIGURATION SECTION
 */


/**
 * The modell of memberlists.
 *
 * Use as singleton by calling Memberlist::instance().
 *
 * @package Memberlist
 */
class Memberlist
{
    /**
     * The list of members.
     *
     * @access private
     *
     * @var array
     */
    var $members;

    /**
     * The file handle for locking.
     *
     * @access private
     *
     * @var resource
     */
    var $lock;

    /**
     * Constructs a new Memberlist.
     *
     * @access private.
     *
     * @return void.
     */
    function Memberlist() {}

    /**
     * Returns the unique instance of the class.
     *
     * @access public
     * @static
     *
     * @return object
     */
    function instance()
    {
        static $instance = null;

        if (!isset($instance)) {
            $instance = new Memberlist();
        }
        return $instance;
    }

    /**
     * Locks resp. unlocks the memberlist file.
     *
     * @access private
     *
     * @return void
     */
    function lock($op)
    {
        $fn = MEMBERLIST_PATH;
        if (!file_exists($fn)) {
            touch($fn);
        }
        if (!isset($this->lock)) {
            $this->lock = fopen($fn, 'r');
        }
        flock($this->lock, $op);
        if ($op = LOCK_UN) {
            fclose($this->lock);
            unset($this->lock);
        }

    }

    /**
     * Returns the memberlist.
     *
     * @access private
     *
     * @return array
     */
    function read()
    {
        if (!isset($this->members)) {
            $fn = MEMBERLIST_PATH;
            $members = file_get_contents($fn);
            if ($members !== false) {
                $members = unserialize($members);
            }
            if ($members === false) {
                $members = array();
            }
            $this->members = $members;
        }
        return $this->members;
    }

    /**
     * Saves the new members and returns whether that succeeded.
     *
     * @access private
     *
     * @return bool
     */
    function write()
    {
        $fn = MEMBERLIST_PATH;
        $ok = ($fh = fopen($fn, 'w')) !== false
            && fwrite($fh, serialize($this->members)) !== false;
        if ($fh !== false) {
            fclose($fh);
        }
        return $ok;
    }

    /**
     * Updates the memberlist according to the currently logged in user.
     * Returns whether that succeeded.
     *
     * @access public
     *
     * @global string  The "function" GET or POST parameter.
     * @return void
     */
    function update()
    {
        global $function;

        $this->lock(LOCK_EX);
        $members = $this->read();
        if ($function == MEMBERLIST_LOGOUT) {
            unset($members[$_SESSION[MEMBERLIST_VAR]]);
        } else {
            $members[$_SESSION[MEMBERLIST_VAR]] = time();
        }
        $this->members = $members;
        $ok = $this->write();
        $this->lock(LOCK_UN);
        return $ok;
    }

    /**
     * Returns the currently active members.
     *
     * @access public
     *
     * @return array
     */
    function active()
    {
        $this->lock(LOCK_SH);
        $members = $this->read();
        $this->lock(LOCK_UN);
        $time = time();
        $active = array();
        foreach ($members as $member => $t0) {
            if ($t0 >= $time - MEMBERLIST_PERIOD) {
                $active[] = $member;
            }
        }
        natcasesort($active);
        return $active;
    }
}


/**
 * Returns the (X)HTML view of the currently active members.
 *
 * @access private
 *
 * @return string
 */
function Memberlist_list()
{
    $members = Memberlist::instance()->active();
    $members = array_map('htmlspecialchars', $members);
    return implode(MEMBERLIST_SEPARATOR, $members);
}


/**
 * Returns the (X)HTML view of the currently active members
 * enclosed in a <div id="memberlist">. If $update is true,
 * it polls automatically for changes via Ajax.
 *
 * @access public
 *
 * @global string $sn  The name of the site.
 * @global string $su  The GET variable of the current page.
 * @param  bool $update  Whether the memberlist should automatically update.
 * @return string
 */
function memberlist($update = false)
{
    global $sn, $su;

    $o = '<div id="memberlist">' . Memberlist_list() . '</div>';
    if ($update) {
        $interval = MEMBERLIST_INTERVAL;
        $o .= <<<EOS
<script type="text/javascript">
if (typeof window.XMLHttpRequest != 'undefined') {
    window.setInterval(function() {
        var request = new XMLHttpRequest();
        request.open("GET", "$sn?$su&memberlist_ajax");
        request.onreadystatechange = function() {
            if (request.readyState == 4 && request.status == 200) {
                document.getElementById("memberlist").innerHTML =
                    request.responseText;
            }
        }
        request.send(null);
    }, 1000 * $interval);
}
</script>
EOS;
    }
    return $o;
}


/*
 * Start the session.
 */
if (session_id() == '') {
    session_start();
}

/*
 * Update the memberlist, if the user is currently logged in.
 */
if (isset($_SESSION[MEMBERLIST_VAR])) {
    if (!Memberlist::instance()->update()) {
        e('cntsave', 'file', MEMBERLIST_PATH);
    }
}


/*
 * Handle Ajax request.
 */
if (isset($memberlist_ajax)) {
    echo Memberlist_list();
    exit;
} 
Christoph
Last edited by cmb on Sat Jan 19, 2013 10:25 pm, edited 3 times in total.
Reason: fixed link to userfunc.php documentation; fixed plugin call; updated to 1beta2
Christoph M. Becker – Plugins for CMSimple_XH

Cyberbob
Posts: 15
Joined: Thu Nov 22, 2012 9:33 am
Contact:

Re: Memberlist_XH: Addon für Memberpages und Register

Post by Cyberbob » Sat Jan 19, 2013 2:48 pm

Hallo Christoph,

ich habe jetzt die php Datei userfuncs.php mit dem oben genannten Inhalt erstellt!

Aber in welchen Ordner muss ich die hochladen?

Gruß
Frank

Tata
Posts: 3588
Joined: Tue May 20, 2008 5:34 am
Location: Slovakia
Contact:

Re: Memberlist_XH: Addon für Memberpages und Register

Post by Tata » Sat Jan 19, 2013 3:35 pm

Die Datei gehört unter ./cmsimple, wo die cms.php, functions.php u.a. stehen.
CMSimple.sk
It's no shame to ask for an answer if all efforts failed.
But it's awful to ask without any effort to find the answer yourself.

Cyberbob
Posts: 15
Joined: Thu Nov 22, 2012 9:33 am
Contact:

Re: Memberlist_XH: Addon für Memberpages und Register

Post by Cyberbob » Sat Jan 19, 2013 3:46 pm

Vielen Dank,

hatte ich auch gerade rausgefunden, man sollte doch öfters die Forum Suche benutzen :roll:

Cyberbob
Posts: 15
Joined: Thu Nov 22, 2012 9:33 am
Contact:

Re: Memberlist_XH: Addon für Memberpages und Register

Post by Cyberbob » Sat Jan 19, 2013 4:02 pm

So ich habe es jetzt mal in meiner Testseite eingebunden!

Es funktioniert gut, aber einen Fehler habe ich.

Wenn ich mich an oder Abmelde erscheint bei mir nur eine leere Seite d.h. ich muss die Website danach jedes Mal neu aufrufen.

Woran kann das liegen?

Gruß
Frank

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Memberlist_XH: Addon für Memberpages und Register

Post by cmb » Sat Jan 19, 2013 4:19 pm

Hallo Frank,
Cyberbob wrote:Wenn ich mich an oder Abmelde erscheint bei mir nur eine leere Seite
Hmm, schwer zu sagen. Hast Du's mal mit dem Debug-Modus versucht? Wird da etwas gemeldet?

Christoph
Christoph M. Becker – Plugins for CMSimple_XH

Cyberbob
Posts: 15
Joined: Thu Nov 22, 2012 9:33 am
Contact:

Re: Memberlist_XH: Addon für Memberpages und Register

Post by Cyberbob » Sat Jan 19, 2013 4:35 pm

cmb wrote:Hallo Frank,
Hmm, schwer zu sagen. Hast Du's mal mit dem Debug-Modus versucht? Wird da etwas gemeldet?
Dort wird folgendes gemeldet!

• WARNING: 2 session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /cmsimple/userfuncs.php:1)
/cmsimple/userfuncs.php:248
• NOTICE: A session had already been started - ignoring session_start()
/plugins/comments/index.php:600

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Memberlist_XH: Addon für Memberpages und Register

Post by cmb » Sat Jan 19, 2013 5:06 pm

Hallo Frank,

da ist vermutlich ein BOM in Deiner userfuncs.php, siehe http://www.cmsimple-xh.org/wiki/doku.ph ... bearbeiten. Oder aber, die Datei hat vor dem <?php noch irgendwelche Leerzeichen oder Zeilenumbrüche, was nicht sein darf.

Christoph

PS: Welche Version von CMSimple verwendest Du denn?
Last edited by cmb on Sat Jan 19, 2013 5:07 pm, edited 1 time in total.
Reason: PS hinzugefügt
Christoph M. Becker – Plugins for CMSimple_XH

Cyberbob
Posts: 15
Joined: Thu Nov 22, 2012 9:33 am
Contact:

Re: Memberlist_XH: Addon für Memberpages und Register

Post by Cyberbob » Sat Jan 19, 2013 5:18 pm

cmb wrote:Hallo Frank,

Oder aber, die Datei hat vor dem <?php noch irgendwelche Leerzeichen oder Zeilenumbrüche, was nicht sein darf.
Ich senke meine Kopf und schäme mich, es war ein Leerzeichen vor dem <?php
Vielen Dank für die Hilfe.
So jetzt muss ich aber schnell los zur Arbeit, habe Nachtschicht

lck
Posts: 2973
Joined: Wed Mar 23, 2011 11:43 am
Contact:

Re: Memberlist_XH: Addon für Memberpages und Register

Post by lck » Sat Jan 19, 2013 8:13 pm

Servus Christoph,
besten Dank für das Plugin. Habs auch schon eingebaut und getestet (mit Opera 11.64, IRON 18, FF 17 und IE 9) und es läuft.

Ergänzend dazu möchte ich erwähnen
Hier fehlen die 3 geschweiften Klammern am Ende
cmb wrote:{{{PLUGIN:memberlist();
sollte so sein

Code: Select all

{{{PLUGIN:memberList();}}}
In der userfuncs.php hab ich noch ein

Code: Select all

<?php 
/* utf8-marker = äöü */
vorangestellt und als UTF-8 ohne BOM abgespeichert.

Soweit in Ordnung, aber ;) wenn zum Bsp. schon 2 Mitglieder eingeloggt sind (nennen wir sie A und B) und sich ein drittes Mitglied C eingeloggt, sieht
C alle drei. also A+B+C (da sich beim Einloggen die Seite neu lädt).
B sieht A+B
A sieht nur A
auch nach Ablauf der voreingestellten 300 Sekunden und auch nachdem eine Nachricht gepostet wurde, bleibt das so!
?Irgendwie fehlt ein automatischer Reload der memberlist, erst mit F5 (Browserseite neu laden) erscheinen die neuen Mitglieder in der Liste. Genauso ist es, wenn sich jemand ausloggt.

Gruß Ludwig
„Bevor du den Pfeil der Wahrheit abschießt, tauche die Spitze in Honig!“   👉 Ludwig's XH-Templates for MultiPage & OnePage

Post Reply