*/ class Page extends Model { public $belongs_to = array("user", "parent" => array("model" => "page")); public $has_many = array("children" => array("model" => "page", "by" => "parent")); /** * Function: __construct * See Also: * */ public function __construct($page_id, $options = array()) { if (!isset($page_id) and empty($options)) return; parent::grab($this, $page_id, $options); if ($this->no_results) return false; $this->slug = $this->url; $this->filtered = !isset($options["filter"]) or $options["filter"]; $trigger = Trigger::current(); $trigger->filter($this, "page"); if ($this->filtered) { $this->title_unfiltered = $this->title; $this->body_unfiltered = $this->body; $trigger->filter($this->title, array("markup_title", "markup_page_title"), $this); $trigger->filter($this->body, array("markup_text", "markup_page_text"), $this); $trigger->filter($this, "filter_page"); } } /** * Function: find * See Also: * */ static function find($options = array(), $options_for_object = array()) { return parent::search(get_class(), $options, $options_for_object); } /** * Function: add * Adds a page to the database. * * Calls the @add_page@ trigger with the new . * * Parameters: * $title - The Title for the new page. * $body - The Body for the new page. * $user - The or of the page's author. * $parent_id - The ID of the new page's parent page (0 for none). * $show_in_list - Whether or not to show it in the pages list. * $list_order - The order of the page in the list. * $clean - The clean URL. * $url - The unique URL. * $created_at - The new page's "created" timestamp. * $updated_at - The new page's "last updated" timestamp. * * Returns: * The newly created . * * See Also: * */ static function add($title, $body, $user = null, $parent_id = 0, $show_in_list = true, $list_order = 0, $clean = "", $url = "", $created_at = null, $updated_at = null) { $user_id = ($user instanceof User) ? $user->id : $user ; $sql = SQL::current(); $visitor = Visitor::current(); $trigger = Trigger::current(); $new_values = array("title" => $title, "body" => $body, "user_id" => oneof($user_id, $visitor->id), "parent_id" => oneof($parent_id, 0), "show_in_list" => oneof($show_in_list, true), "list_order" => oneof($list_order, 0), "clean" => oneof($clean, sanitize($title)), "url" => oneof($url, self::check_url($clean)), "created_at" => oneof($created_at, datetime()), "updated_at" => oneof($updated_at, "0000-00-00 00:00:00")); $trigger->filter($new_values, "before_add_page"); $sql->insert("pages", $new_values); $page = new self($sql->latest("pages")); $trigger->call("add_page", $page); return $page; } /** * Function: update * Updates the page. * * Calls the @update_page@ trigger with the updated and the original . * * Parameters: * $title - The new Title. * $body - The new Body. * $user - The or of the page's author. * $parent_id - The new parent ID. * $show_in_list - Whether or not to show it in the pages list. * $clean - The page's clean URL. * $url - The page's unique URL. * $created_at - The page's "created" timestamp. * $updated_at - The page's "last updated" timestamp. */ public function update($title = null, $body = null, $user = null, $parent_id = null, $show_in_list = null, $list_order = null, $clean = null, $url = null, $created_at = null, $updated_at = null) { if ($this->no_results) return false; $user_id = ($user instanceof User) ? $user->id : $user ; $sql = SQL::current(); $trigger = Trigger::current(); $old = clone $this; foreach (array("title", "body", "user_id", "parent_id", "show_in_list", "list_order", "clean", "url", "created_at", "updated_at") as $attr) if ($attr == "updated_at" and $$attr === null) $this->$attr = $$attr = datetime(); else $this->$attr = $$attr = ($$attr !== null ? $$attr : $this->$attr); $new_values = array("title" => $title, "body" => $body, "user_id" => $user_id, "parent_id" => $parent_id, "show_in_list" => $show_in_list, "list_order" => $list_order, "clean" => $clean, "url" => $url, "created_at" => $created_at, "updated_at" => $updated_at); $trigger->filter($new_values, "before_update_page"); $sql->update("pages", array("id" => $this->id), $new_values); $trigger->call("update_page", $this, $old); } /** * Function: delete * Deletes the given page. * * Calls the @delete_page@ trigger with the to delete. * * Parameters: * $page_id - The page to delete. * $recursive - Should the page's children be deleted? (default: false) */ static function delete($page_id, $recursive = false) { if ($recursive) { $page = new self($page_id); foreach ($page->children as $child) self::delete($child->id); } parent::destroy(get_class(), $page_id); } /** * Function: exists * Checks if a page exists. * * Parameters: * $page_id - The page ID to check */ static function exists($page_id) { return SQL::current()->count("pages", array("id" => $page_id)) == 1; } /** * Function: check_url * Checks if a given clean URL is already being used as another page's URL. * * Parameters: * $clean - The clean URL to check. * * Returns: * The unique version of the passed clean URL. If it's not used, it's the same as $clean. If it is, a number is appended. */ static function check_url($clean) { $count = SQL::current()->count("pages", array("clean" => $clean)); return (!$count or empty($clean)) ? $clean : $clean."-".($count + 1) ; } /** * Function: url * Returns a page's URL. */ public function url() { if ($this->no_results) return false; $config = Config::current(); if (!$config->clean_urls) return $config->url."/?action=page&url=".urlencode($this->url); $url = array("", urlencode($this->url)); $page = $this; while (isset($page->parent_id) and $page->parent_id) { $url[] = urlencode($page->parent->url); $page = $page->parent; } return url("page/".implode("/", array_reverse($url)), MainController::current()); } /** * Function: parent * Returns a page's parent. Example: $page->parent()->parent()->title * * !! DEPRECATED AFTER 2.0 !! */ public function parent() { if ($this->no_results or !$this->parent_id) return false; return new self($this->parent_id); } /** * Function: children * Returns a page's children. * * !! DEPRECATED AFTER 2.0 !! */ public function children() { if ($this->no_results) return false; return self::find(array("where" => array("parent_id" => $this->id))); } /** * Function: user * Returns a page's creator. Example: $page->user->full_name * * !! DEPRECATED AFTER 2.0 !! */ public function user() { if ($this->no_results) return false; return new User($this->user_id); } }