no_results or
$post->user->id == $visitor->id
)
return;
View::add(
post_id:$context["post"]->id,
user_id:$visitor->id
);
}
public function manage_posts_column_header(): string {
return '
'.
__("View Count", "post_views").
' | ';
}
public function manage_posts_column($post): string {
$text = _f("Download view count for “%s”", $post->title(), "post_views");
if ($post->view_count > 0)
return ''.
'id).
'" title="'.
fix($text, true).
'">'.
$post->view_count.
' | ';
else
return ''.$post->view_count.' | ';
}
public function user($user): void {
$user->has_many[] = "views";
}
public function post($post): void {
$post->has_many[] = "views";
}
public function post_options($fields, $post = null): array {
if (isset($post))
$fields[] = array(
"attr" => "reset_views",
"label" => __("Reset View Count?", "post_views"),
"type" => "checkbox",
"checked" => false
);
return $fields;
}
public function update_post($post): void {
if (isset($_POST['reset_views']))
SQL::current()->delete(
table:"views",
conds:array("post_id" => $post->id)
);
}
public function delete_post($post): void {
SQL::current()->delete(
table:"views",
conds:array("post_id" => $post->id)
);
}
public function admin_download_views(): void {
if (empty($_GET['id']) or !is_numeric($_GET['id']))
error(
__("No ID Specified"),
__("An ID is required to download a view count.", "post_views"),
code:400
);
$post = new Post($_GET['id'], array("drafts" => true));
if ($post->no_results)
show_404(
__("Not Found"),
__("Post not found.")
);
if (!$post->editable() and !$post->deletable())
show_403(
__("Access Denied"),
__("You do not have sufficient privileges to download this view count.", "post_views")
);
$data = View::find(
array("where" => array("post_id" => $post->id))
);
$filename = sanitize(
camelize($post->title()),
false,
true
)."_View_Count_".date("Y-m-d");
$filedata = "id,post_id,user_id,created_at\r\n";
foreach ($data as $datum)
$filedata.= $datum->id.",".
$datum->post_id.",".
$datum->user_id.",".
$datum->created_at."\r\n";
file_attachment($filedata, $filename.".csv");
}
private function get_post_view_count($post_id): int {
if (!isset($this->caches["post_view_counts"])) {
$counts = SQL::current()->select(
tables:"views",
fields:array("COUNT(post_id) AS total", "post_id AS post_id"),
group:"post_id"
)->fetchAll();
$this->caches["post_view_counts"] = array();
foreach ($counts as $count) {
$id = $count["post_id"];
$total = (int) $count["total"];
$this->caches["post_view_counts"][$id] = $total;
}
}
return fallback($this->caches["post_view_counts"][$post_id], 0);
}
public function post_view_count_attr($attr, $post): int {
if ($post->no_results)
return 0;
return $this->get_post_view_count($post->id);
}
private function get_user_view_count($user_id): int {
if (!isset($this->caches["user_view_counts"])) {
$counts = SQL::current()->select(
tables:"views",
fields:array("COUNT(user_id) AS total", "user_id AS user_id"),
group:"user_id"
)->fetchAll();
$this->caches["user_view_counts"] = array();
foreach ($counts as $count) {
$id = $count["user_id"];
$total = (int) $count["total"];
$this->caches["user_view_counts"][$id] = $total;
}
}
return fallback($this->caches["user_view_counts"][$user_id], 0);
}
public function user_view_count_attr($attr, $user): int {
if ($user->no_results)
return 0;
return $this->get_user_view_count($user->id);
}
public function visitor_view_count_attr($attr, $visitor): int {
return ($visitor->id == 0) ?
0 :
$this->user_view_count_attr($attr, $visitor) ;
}
public function import_chyrp_post($entry, $post): void {
$chyrp = $entry->children("http://chyrp.net/export/1.0/");
if (!isset($chyrp->view))
return;
foreach ($chyrp->view as $view) {
$created_at = $view->children(
"http://www.w3.org/2005/Atom"
)->published;
$login = $view->children(
"http://chyrp.net/export/1.0/"
)->login;
$user = new User(
array("login" => unfix((string) $login))
);
View::add(
post_id:$post->id,
user_id:(!$user->no_results) ? $user->id : 0,
created_at:datetime((string) $created_at),
);
}
}
public function posts_export($atom, $post): string {
$views = View::find(
array("where" => array("post_id" => $post->id))
);
foreach ($views as $view) {
$atom.= ''."\n".
''.
fix($view->user->login, false, true).
''."\n".
''.
when(DATE_ATOM, $view->created_at).
''."\n".
''.
fix($view->etag(), false, true).
''."\n".
''."\n";
}
return $atom;
}
}