leilukin-tumbleblog/includes/model/Visitor.php

118 lines
3.2 KiB
PHP

<?php
/**
* Class: Visitor
* The model for the currently browsing <User>.
*
* Notes:
* Group falls back to whatever group is set as the "Guest Group".
*
* See Also:
* <User>
*/
class Visitor extends User {
/**
* Function: __construct
* Checks if a valid user is logged in.
*/
private function __construct() {
# The user ID of the current visitor. 0 if not logged in.
$this->id = 0;
if (!empty($_SESSION['user_id']))
parent::__construct($_SESSION['user_id']);
Trigger::current()->filter($this, "visitor");
}
/**
* Function: __get
* A detour around belongs_to "group" to account for the default Guest group.
*/
public function &__get($name): mixed {
if ($name == "group") {
$this->data["group"] = isset($this->group_id) ?
new Group($this->group_id) :
new Group(Config::current()->guest_group) ;
return $this->data["group"];
}
return parent::__get($name);
}
/**
* Function: find
*
* See Also:
* <Model::search>
*/
public static function find(
$options = array(),
$options_for_object = array()
): array {
fallback($options["order"], "id ASC");
return parent::search(
"user",
$options,
$options_for_object
);
}
/**
* Function: logged_in
* Returns whether or not the visitor is logged in.
*/
public static function logged_in(): bool {
return (
isset(Visitor::current()->id) and
Visitor::current()->id != 0
);
}
/**
* Function: log_in
* Logs in a visitor as a registered user.
*
* Parameters:
* $user - The <User> to log in.
*
* Notes:
* A redirect() is required after calling this method.
*/
public static function log_in($user): bool {
if ($user->no_results)
return false;
$_SESSION['user_id'] = $user->id;
Trigger::current()->call("user_logged_in", $user);
return true;
}
/**
* Function: log_out
* Logs out a registered user.
*
* Notes:
* A redirect() is required after calling this method.
*/
public static function log_out(): void {
$user = new User($_SESSION['user_id']);
session_destroy();
session();
Trigger::current()->call("user_logged_out", $user);
if (!headers_sent())
header('Clear-Site-Data: "storage"');
}
/**
* Function: current
* Returns a singleton reference to the current visitor.
*/
public static function & current(): self {
static $instance = null;
$instance = (empty($instance)) ? new self() : $instance ;
return $instance;
}
}