This is the first in a series of articles about handling the user-related fields of a resource (createdby
, publishedby
, editedby
, deletedby
). Each field holds the ID of the user who performed the action. In this article, we'll look at how to get the full name of the users who performed the action for the current page (and the full name of the current user as well).
You can use an output modifier to get the full name, but it's a fairly slow and inefficient process. First, the output modifier will have to be parsed. Then MODX will get the user object (which you don't actually need), and then it will get the user profile object (which you also don't need if all you want is the fullname
field). In this article, we'll see a much faster way to do it, which requires no parsing and skips getting either the modUser
or the modUserProfile
object.
In all the cases, we'll use the $modx->getValue()
method for fast database access.
The secret to all these methods is that the user's ID is in the internalKey
field of the modUserProfile
object. That means we can reference the profile directly without having or getting the user object.
Full Name of Current User
This method takes advantage of the fact that the current user object is always available as $modx->user
. Put this tag where you want the full name to appear:
[[!CurrentUserFullname:tag]]
Create a snippet called CurrentUserFullname
with this code:
/* CurrentUserFullname snippet */
$userId = $modx->user->get('id');
$query = $modx->newQuery('modUserProfile', array('internalKey' => $userId));
$query->select('fullname');
return $modx->getValue($query->prepare());
The code queries the user profile based on the user's ID and returns the value of the fullname
field without retrieving the full modUser
object. It also doesn't retrieve the modUserProfile
object. It just grabs the fullname
field's value.
Note that if a user has no full name listed in their profile, the snippet will return nothing. If this might be an issue, you can use the username as a backup by replacing the last line with this code:
$output = $modx->getValue($query->prepare());
if (empty($output)) {
$output = $modx->user->get('username');
}
return $output;
It won't slow the snippet down by much, because if the full name is found, the extra code won't execute. This technique will also work in the snippets below. Note that if the page is public, and available to everyone, you may not want to have it display usernames.
Full Name of User who Created the Current Page
This is just as easy as the last one, because the ID of the user who created the current page is in the createdby
field of the current resource.
[[!FullnameCreatedby]]
Create a snippet called FullnameCreatedby
with this code:
/* FullnameCreatedby snippet */
$userId = $modx->resource->get('createdby');
$query = $modx->newQuery('modUserProfile', array('internalKey' => $userId));
$query->select('fullname');
return $modx->getValue($query->prepare());
Notice that the query and return part is the same as the first snippet. The only thing changed is the method for getting the user's ID.
Other User-related Fields
The code above can be used to get the full name for the user who created, published, edited, or deleted the resource (though the last one isn't much use). Just change createdby
in the code to publishedby
, editedby
, or deletedby
. All three hold the ID of the user who performed the named action. The "username" backup will work here as well. Remember that those fields could be empty. For example, if the resource is unpublished or has never been edited or deleted.
Coming Up
What if you want a more general-purpose snippet that will get a full name for any of the user-related fields? We'll see how to do that in the next article.
Bob Ray is the author of the MODX: The Official Guide and dozens of MODX Extras including QuickEmail, NewsPublisher, SiteCheck, GoRevo, Personalize, EZfaq, MyComponent and many more. His website is Bob’s Guides. It not only includes a plethora of MODX tutorials but there are some really great bread recipes there, as well.