silverstripe-framework/docs/en/02_Developer_Guides/05_Extending/How_Tos/03_Track_member_logins.md
2017-10-27 12:45:26 +13:00

1.8 KiB

Howto: Track Member Logins

Sometimes its good to know how active your users are, and when they last visited the site (and logged on). A simple LastVisited property on the Member record with some hooks into the login process can achieve this. In addition, a NumVisit property will tell us how often the member has visited. Or more specifically, how often he has started a browser session, either through explicitly logging in or by invoking the "remember me" functionality.

    use SilverStripe\Forms\ReadonlyField;
    use SilverStripe\Security\Security;
    use SilverStripe\ORM\DB;
    use SilverStripe\ORM\DataExtension;

    class MyMemberExtension extends DataExtension 
    {
        private static $db = [
            'LastVisited' => 'Datetime',
            'NumVisit' => 'Int',
        ];

        public function memberLoggedIn() 
        {
            $this->logVisit();
        }

        public function memberAutoLoggedIn() 
        {
            $this->logVisit();
        }

        public function updateCMSFields(FieldList $fields) 
        {
            $fields->addFieldsToTab('Root.Main', [
                ReadonlyField::create('LastVisited', 'Last visited'),
                ReadonlyField::create('NumVisit', 'Number of visits')
            ]);
        }

        protected function logVisit() 
        {
            if(!Security::database_is_ready()) return;
            
            DB::query(sprintf(
                'UPDATE "Member" SET "LastVisited" = %s, "NumVisit" = "NumVisit" + 1 WHERE "ID" = %d',
                DB::get_conn()->now(),
                $this->owner->ID
            ));
        }
    }

Now you just need to apply this extension through your config:

    SilverStripe\Security\Member:
        extensions:
            - MyMemberExtension