diff --git a/VKAPI/Handlers/Wall.php b/VKAPI/Handlers/Wall.php index b90ebeac..cf8e8fcf 100644 --- a/VKAPI/Handlers/Wall.php +++ b/VKAPI/Handlers/Wall.php @@ -49,10 +49,12 @@ final class Wall extends VKAPIRequestHandler $cnt = $posts->getPostCountOnUserWall($owner_id); break; case "owner": - $this->fail(42, "Not implemented"); + $iteratorv = $posts->getOwnersPostsFromWall($owner_id, 1, $count, $offset); + $cnt = $posts->getOwnersCountOnUserWall($owner_id); break; case "others": - $this->fail(42, "Not implemented"); + $iteratorv = $posts->getOthersPostsFromWall($owner_id, 1, $count, $offset); + $cnt = $posts->getOthersCountOnUserWall($owner_id); break; case "postponed": $this->fail(42, "Postponed posts are not implemented."); diff --git a/Web/Models/Repositories/Posts.php b/Web/Models/Repositories/Posts.php index 4cde11a5..89ee58ea 100644 --- a/Web/Models/Repositories/Posts.php +++ b/Web/Models/Repositories/Posts.php @@ -67,6 +67,50 @@ class Posts foreach($sel as $post) yield new Post($post); } + + function getOwnersPostsFromWall(int $user, int $page = 1, ?int $perPage = NULL, ?int $offset = NULL): \Traversable + { + $perPage ??= OPENVK_DEFAULT_PER_PAGE; + $offset ??= $perPage * ($page - 1); + + $sel = $this->posts->where([ + "wall" => $user, + "deleted" => false, + "suggested" => 0, + ]); + + if($user > 0) + $sel->where("owner", $user); + else + $sel->where("flags !=", 0); + + $sel->order("created DESC")->limit($perPage, $offset); + + foreach($sel as $post) + yield new Post($post); + } + + function getOthersPostsFromWall(int $user, int $page = 1, ?int $perPage = NULL, ?int $offset = NULL): \Traversable + { + $perPage ??= OPENVK_DEFAULT_PER_PAGE; + $offset ??= $perPage * ($page - 1); + + $sel = $this->posts->where([ + "wall" => $user, + "deleted" => false, + "suggested" => 0, + ]); + + if($user > 0) + $sel->where("owner !=", $user); + else + $sel->where("flags", 0); + + $sel->order("created DESC")->limit($perPage, $offset); + + foreach($sel as $post) + yield new Post($post); + } function getPostsByHashtag(string $hashtag, int $page = 1, ?int $perPage = NULL): \Traversable { @@ -147,6 +191,22 @@ class Posts return sizeof($this->posts->where(["wall" => $user, "deleted" => 0, "suggested" => 0])); } + function getOwnersCountOnUserWall(int $user): int + { + if($user > 0) + return sizeof($this->posts->where(["wall" => $user, "deleted" => 0, "owner" => $user])); + else + return sizeof($this->posts->where(["wall" => $user, "deleted" => 0, "suggested" => 0])->where("flags !=", 0)); + } + + function getOthersCountOnUserWall(int $user): int + { + if($user > 0) + return sizeof($this->posts->where(["wall" => $user, "deleted" => 0])->where("owner !=", $user)); + else + return sizeof($this->posts->where(["wall" => $user, "deleted" => 0, "suggested" => 0])->where("flags", 0)); + } + function getSuggestedPosts(int $club, int $page = 1, ?int $perPage = NULL, ?int $offset = NULL): \Traversable { $perPage ??= OPENVK_DEFAULT_PER_PAGE; diff --git a/Web/Presenters/WallPresenter.php b/Web/Presenters/WallPresenter.php index b8e94298..9ea18453 100644 --- a/Web/Presenters/WallPresenter.php +++ b/Web/Presenters/WallPresenter.php @@ -66,11 +66,32 @@ final class WallPresenter extends OpenVKPresenter $this->template->oObj = $owner; if($user < 0) $this->template->club = $owner; + + $iterator = NULL; + $count = 0; + $type = $this->queryParam("type") ?? "all"; + + switch($type) { + default: + case "all": + $iterator = $this->posts->getPostsFromUsersWall($user, (int) ($_GET["p"] ?? 1)); + $count = $this->posts->getPostCountOnUserWall($user); + break; + case "owners": + $iterator = $this->posts->getOwnersPostsFromWall($user, (int) ($_GET["p"] ?? 1)); + $count = $this->posts->getOwnersCountOnUserWall($user); + break; + case "others": + $iterator = $this->posts->getOthersPostsFromWall($user, (int) ($_GET["p"] ?? 1)); + $count = $this->posts->getOthersCountOnUserWall($user); + break; + } $this->template->owner = $user; $this->template->canPost = $canPost; - $this->template->count = $this->posts->getPostCountOnUserWall($user); - $this->template->posts = iterator_to_array($this->posts->getPostsFromUsersWall($user, (int) ($_GET["p"] ?? 1))); + $this->template->count = $count; + $this->template->type = $type; + $this->template->posts = iterator_to_array($iterator); $this->template->paginatorConf = (object) [ "count" => $this->template->count, "page" => (int) ($_GET["p"] ?? 1), diff --git a/Web/Presenters/templates/Wall/Wall.xml b/Web/Presenters/templates/Wall/Wall.xml index a9f8845f..516d5b8f 100644 --- a/Web/Presenters/templates/Wall/Wall.xml +++ b/Web/Presenters/templates/Wall/Wall.xml @@ -15,7 +15,19 @@ {block content}