<?php namespace SHServ\Entities; use \SHServ\Models\Favourites; use \SHServ\Models\Keywords; use \SHServ\Containers\KeywordsContainer; use \SHServ\Containers\ImgsContainer; use \SHServ\Containers\UAdPostStatistics; use \SHServ\Containers\Registration\UAdPostsContainer; use \SHServ\Entities\User; use \SHServ\Entities\Favorite; class UAdPost extends \SHServ\Middleware\Entity { public static $table_name = "uadposts"; protected static $fields = [ "id", "uid", "state", "alias", "rating", "factor", "title", "content", "price", "single_price", "currency", "exchange_flag", "condition_used", "images_number", "location_lat", "location_lng", "country_ru", "country_en", "region_ru", "region_en", "city_ru", "city_en", "create_at", "update_at" ]; protected $favorite_state_for_current_user = null; protected $imgs_container = null; protected UAdPostStatistics $statistics; protected User $user; protected ?Favorite $favorite = null; public function __construct(Int $id, Array $data = []) { parent::__construct(self::$table_name, $id, $data); UAdPostsContainer::add_entity_item($this); $this -> statistics = new UAdPostStatistics($id); $this -> imgs_container = new ImgsContainer($id, "UAdPost"); } public function get_images(): Array { if(!$this -> imgs_container -> was_filled()) { $this -> imgs_container -> fill_container(); } return $this -> imgs_container -> get_imgs(); } public function get_first_image(): ?Image { return $this -> imgs_container -> get_first_img(); } public function has_images(): Bool { return count($this -> get_images()) != 0; } public function fill(Array $data = []) { parent::fill($data); $this -> user = new User($this -> uid); } public function user(): User { if(!$this -> was_filled()) { $this -> fill(); } return $this -> user; } public function statistics(): UAdPostStatistics { return $this -> statistics; } public function favorite(): ?Favorite { if(app() -> sessions -> is_auth() and !$this -> favorite and is_null($this -> favorite_state_for_current_user)) { $this -> favorite = (new Favourites()) -> get_one_by( $this -> id(), "UAdPost", app() -> sessions -> auth_user() -> id() ); } $this -> set_favorite_state_for_current_user(!is_null($this -> favorite)); return $this -> favorite; } public function set_favorite(Favorite $favorite): ?Favorite { $this -> favorite = $favorite; return $this -> favorite(); } public function get_url(): String { return app() -> routes -> urlto("UAdPostController@view_page", [ "alias" => "{$this -> alias}.html" ]); } public function get_formatted_timestamp(): String { return app() -> utils -> formatted_timestamp($this -> create_at); } public function get_formatted_price(): String { $price = number_format($this -> price, 2, ",", " "); return $price; } public function get_price_particles(): Array { list($banknotes, $coins) = explode(",", $this -> get_formatted_price()) ; return compact("banknotes", "coins"); } public function get_single_price_particles(): Array { list($banknotes, $coins) = explode(",", number_format($this -> single_price, 2, ",", " ")); return compact("banknotes", "coins"); } public function get_formatted_currency(String $currency = ""): String { $t = [ "UAH" => "грн", "EUR" => "€", "USD" => "$" ]; return $t[ strlen($currency) ? $currency : $this -> currency ]; } public function remove(): Void { if($this -> has_images()) { $imgs = $this -> get_images(); foreach($imgs as $img) { $img -> remove(); } } if($this -> state == "published") { $this -> deactivate(); } $this -> statistics() -> clear_all_fields(); $this -> remove_entity(); } public function make_removed(): Void { if($this -> state == "published") { $this -> deactivate(); } $this -> state = "removed"; $this -> update(); } public function deactivate(): Void { $this -> state = "unpublished"; $this -> update(); $this -> user() -> statistics() -> total_published_uadposts_decrease(); $this -> remove_keywords(); (new Favourites()) -> remove_for_assignment_unit($this -> id(), "UAdPost"); } public function activate(): Void { $this -> state = "published"; $this -> update(); $this -> user() -> statistics() -> total_published_uadposts_increase(); $this -> refresh_keywords(); } public function is_favorite_for_current_user(): Bool { if(is_null($this -> favorite_state_for_current_user)) { $this -> favorite(); } return $this -> favorite_state_for_current_user; } public function set_favorite_state_for_current_user(Bool $state): void { $this -> favorite_state_for_current_user = $state; } public function generate_keywords(): Array { $keywords = (new Keywords) -> create_keywords_by_content( "{$this -> title}", $this -> id ); $keywords_reload_url = FCONF["services"]["keywords"]["keywords_reload"]; if($keywords_reload_url) { @file_get_contents($keywords_reload_url); } return $keywords; } public function remove_keywords(): Mixed { $res = (new Keywords) -> remove_keywords_by_uap_id($this -> id); $keywords_reload_url = FCONF["services"]["keywords"]["keywords_reload"]; if($keywords_reload_url) { @file_get_contents($keywords_reload_url); } return $res; } public function refresh_keywords(): Array { if(!$this -> remove_keywords()) { return []; } return $this -> generate_keywords(); } public function keywords(): KeywordsContainer { return $this -> get_pet_instance( "KeywordsContainer", fn() => (new Keywords) -> get_keywords_by_uap_id($this -> id) ); } }