It started life with the purpose of checking the logged in user’s groups, and returning a chunk if they were a member of the passed in groups. It wound up being rewritten by Jason as a demonstration of how to do some pretty cool stuff as a real class... I’ll let him handle the details on that. This is VERY handy for custom web applications and makes it easier to implement conditional "blocks" like in some other CMSes. I suppose it could be adapted to check sessions, cookies or some other prameter too, but I created it to render admin menus for custom web apps. I think it merits distribution in 0.9.1 as a new default snippet.
#::::::::::::::::::::::::::::::::::::::::
# Snippet name: MemberCheck
# Short Desc: checks logged in groups and displays a chunk
# Version: 1.0
# Created By Ryan Thrash (vertexworks.com)
# Sanitized By Jason Coward (opengeek.com)
#
# Date: November 29, 2005
#
# Changelog:
# Nov 29, 05 -- initial release
#
#::::::::::::::::::::::::::::::::::::::::
# Description:
# Checks to see if users belong to a certain group and
# displays the specified chunk if they do. Performs several
# sanity checks and allows to be used multiple times on a page.
#
# Params:
# &groups [array] (REQUIRED)
# array of webuser group-names to check against
#
# &chunk [string] (REQUIRED)
# name of the chunk to use if passes the check
#
# &ph [string] (optional)
# name of the placeholder to set instead of directly retuning chunk
#
# &debug [boolean] (optional | false)
# turn on debug mode for extra troubleshooting
#
# Example Usage:
#
# [[MemberCheck? &groups=`siteadmin, registered users` &chunk=`privateSiteNav` &ph=`MemberMenu` &debug=`true`]]
#
# This would place the 'members-only' navigation store in the chunk 'privateSiteNav'
# into a placeholder (called 'MemberMenu'). It will only do this as long as the user
# is logged in as a webuser and is a member of the 'siteadmin' or the 'registered users'
# groups. The optional debug parameter can be used to display informative error messages
# when configuring this snippet for your site. For example, if the developer had
# mistakenly typed 'siteowners' for the first group, and none existed with debug mode on,
# it would have returned the error message: The group siteowners could not be found....
#
#::::::::::::::::::::::::::::::::::::::::
# debug parameter
$debug = isset($debug)? $debug: false;
# check if inside manager
if ($m = $modx->insideManager()) {
return ''; # don't go any further when inside manager
}
if(!isset($groups)) {
return $debug? '<p>Error: No Group Specified</p>': '';
}
if(!isset($chunk)) { return $debug? '<p>Error: No Chunk Specified</p>': ''; }
# turn comma-delimited list of groups into an array
$groups = explode(',', $groups);
if (!class_exists('MemberCheck')) {
class MemberCheck {
static $instance = NULL;
var $allGroups = NULL;
var $debug;
function getInstance($debug=false) {
global $modx;
if (self::$instance == NULL) {
self::$instance= new MemberCheck($debug);
}
return self::$instance;
}
function MemberCheck($debug=false) {
global $modx;
$this->debug= $debug;
if ($debug) {
$this->allGroups= array();
$tableName= $modx->getFullTableName('webgroup_names');
$sql= "SELECT name FROM $tableName";
if ($rs= $modx->db->query($sql)) {
while ($row= $modx->db->getRow($rs)) {
array_push($this->allGroups, stripslashes($row['name']));
}
}
}
}
function isValidGroup($groupName) {
$isValid = !(array_search($groupName, $this->allGroups)===false);
return $isValid;
}
function getMemberChunk(&$groups,$chunk) {
global $modx;
$o= '';
if (is_array($groups)) {
for ($i=0; $i<count($groups); $i++) {
$groups[$i]= trim($groups[$i]);
if ($this->debug) {
if (!$this->isValidGroup($groups[$i])) return "<p>The group <strong>" . $groups[$i] . "</strong> could not be found...</p>";
}
}
$check = $modx->isMemberOfWebGroup($groups);
$chunkcheck = $modx->getChunk($chunk);
$o.= ($check && $chunkcheck)? $chunkcheck : '';
if (!$chunkcheck) $o.= $this->debug? "<p>The chunk <strong>$chunk</strong> not found...</p>": '';
} else {
$o.= "<p>No valid group names were specified!</p>";
}
return $o;
}
}
}
$memberCheck= MemberCheck::getInstance($debug);
return $memberCheck->getMemberChunk($groups, $chunk);
Let’s test it and see what happens... feedback appreciated.