diff options
Diffstat (limited to 'engine/lib/sites.php')
| -rw-r--r-- | engine/lib/sites.php | 882 |
1 files changed, 245 insertions, 637 deletions
diff --git a/engine/lib/sites.php b/engine/lib/sites.php index e310c2c93..3de0eccc2 100644 --- a/engine/lib/sites.php +++ b/engine/lib/sites.php @@ -1,648 +1,256 @@ -<?php
-
- /**
- * Elgg sites
- * Functions to manage multiple or single sites in an Elgg install
- *
- * @package Elgg
- * @subpackage Core
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd
- * @copyright Curverider Ltd 2008
- * @link http://elgg.org/
- */
+<?php +/** + * Elgg sites + * Functions to manage multiple or single sites in an Elgg install + * + * @package Elgg.Core + * @subpackage DataModel.Site + */ - - /** - * @class ElggSite - * This class represents an elgg site. - * @author Marcus Povey <marcus@dushka.co.uk> - */ - class ElggSite - { - - /** - * This contains the site's main properties (id, etc) - * @var array - */ - private $attributes; - - /** - * Construct a new site object, optionally from a given id value. - * - * @param mixed $id - */ - function __construct($id = null) - { - $this->attributes = array(); - - if (!empty($id)) { - - $site = null; - - if ($id instanceof stdClass) { - $site = $id; // This is a db row, so serialise directly - - } else if ($id instanceof ElggSite) { - //$site = $id; - $site = new stdClass; - foreach ($id->attributes as $k => $v) - $site->$k = $v; - - error_log("**** 2"); - } else if (strpos($id, "http") !== false) { - $site = get_site_byurl($id); - error_log("**** 3"); - } else { - $tmp = get_site((int)$id); // This is an integer ID - $site = new stdClass; - foreach ($tmp->attributes as $k => $v) - $site->$k = $v; +/** + * Get an ElggSite entity (default is current site) + * + * @param int $site_guid Optional. Site GUID. + * + * @return ElggSite + * @since 1.8.0 + */ +function elgg_get_site_entity($site_guid = 0) { + global $CONFIG; - } - - if ($site) { - $objarray = (array) $site; - - foreach($objarray as $key => $value) { - $this->attributes[$key] = $value; - error_log("$key => $value"); - } - } - else - throw new IOException("Could not create ElggSite object"); - } - } - - function __get($name) { - if (isset($this->attributes[$name])) { - return $this->attributes[$name]; - } - return null; - } - - function __set($name, $value) { - $this->attributes[$name] = $value; - return true; - } - - /** - * Return the owner of this site. - * - * @return mixed - */ - function getOwner() { return get_user($this->owner_id); } - - /** - * Return a list of users using this site. - * - * @param int $limit - * @param int $offset - * @return array of ElggUsers - */ - function getMembers($limit, $offset) { return get_site_users($this->id, $limit, $offset); } - - /** - * Get an array of member ElggObjects. - * - * @param string $type - * @param int $limit - * @param int $offset - */ - function getObjects($type="", $limit = 10, $offset = 0) { return get_site_objects($this->id, $type, $limit, $offset); } - - /** - * Get the collections associated with a site. - * - * @param string $type - * @param int $limit - * @param int $offset - * @return unknown - */ - function getCollections($type="", $limit = 10, $offset = 0) { return get_site_collections($this->id, $type, $limit, $offset); } - - /** - * Add a user to the site. - * - * @param int $user_id - */ - function addUser($user_id) { return add_site_user($this->id, $user_id); } - - /** - * Remove a site user. - * - * @param int $user_id - */ - function removeUser($user_id) { return remove_site_user($this->id, $user_id); } - - /** - * Set the meta data. - * - * @param string $name - * @param string $value - * @param int $access_id - * @param string $vartype - */ - function setMetadata($name, $value, $access_id = 0, $vartype = "") { return set_site_metadata($name, $value, $access_id, $this->id, $vartype); } - - /** - * Get the metadata for a site. - * - * @param string $name - */ - function getMetadata($name) { return get_site_metadata($name, $this->id); } - - /** - * Clear the metadata for a given site. - * - * @param string $name - */ - function clearMetadata($name = "") { return remove_site_metadata($this->id, $name); } - - /** - * Adds an annotation to a site. By default, the type is detected automatically; however, - * it can also be set. Note that by default, annotations are private. - * - * @param string $name - * @param string $value - * @param int $access_id - * @param int $owner_id - * @param string $vartype - */ - function annotate($name, $value, $access_id = 0, $owner_id = 0, $vartype = "") { return add_site_annotation($name, $value, $access_id, $owner_id, $this->id, $vartype); } - - /** - * Get the annotations for a site. - * - * @param string $name - * @param int $limit - * @param int $offset - */ - function getAnnotations($name, $limit = 50, $offset = 0) { return get_site_annotations($name, $this->id, $limit, $offset); } - - /** - * Return the annotations for the site. - * - * @param string $name The type of annotation. - */ - function countAnnotations($name) { return count_site_annotations($name, $this->id); } - - /** - * Get the average of an integer type annotation. - * - * @param string $name - */ - function getAnnotationsAvg($name) { return get_site_annotations_avg($name, $this->id); } - - /** - * Get the sum of integer type annotations of a given type. - * - * @param string $name - */ - function getAnnotationsSum($name) { return get_site_annotations_sum($name, $this->id); } - - /** - * Get the minimum of integer type annotations of given type. - * - * @param string $name - */ - function getAnnotationsMin($name) { return get_site_annotations_min($name, $this->id); } - - /** - * Get the maximum of integer type annotations of a given type. - * - * @param string $name - */ - function getAnnotationsMax($name) { return get_site_annotations_max($name, $this->id); } - - /** - * Remove all annotations or all annotations of a given site. - * - * @param string $name - */ - function removeAnnotations($name = "") { return remove_site_annotations($this->id, $name); } - - /** - * Saves or updates the site to the db depending on whether or not id is specified. - */ - function save() - { - if ($this->id > 0) - return update_site($this->id, $this->title, $this->description, $this->url, $this->owner_id, $this->access_id); // ID Specified, update ID - else - { - $this->id = create_site($this->title, $this->description, $this->url, $this->owner_id, $this->access_id); // Create a site - if (!$this->id) throw new IOException("Unable to save new ElggSite"); - - return $this->id; - } - } - - /** - * Delete a given site. - */ - function delete() { return delete_site($this->id); } - } - - /** - * Convert a database row to a new ElggSite - * - * @param stdClass $row - * @return stdClass or ElggSite - */ - function row_to_elggsite($row) - { - if (!($row instanceof stdClass)) - return $row; - - return new ElggSite($row); - } - - /** - * Enter description here... - * - * @param int $user_id - * @param string $type - * @param string $metadata_type - * @param string $metadata_value - * @param string $order_by - * @param int $limit - * @param int $offset - */ - function get_sites($user_id = 0, $type = "", $metadata_type = "", $metadata_value = "", $order_by = "created desc", $limit = 10, $offset = 0) - { - // TODO : Writeme - throw new NotImplementedException("Writeme!"); - } - - /** - * Retrieves details about a site, if the current user is allowed to see it - * - * @param int $object_id The ID of the object to load - * @return object A database representation of the object - */ - function get_site($site_id) { - - global $CONFIG; - - $site_id = (int) $site_id; - $access = get_access_list(); - - return row_to_elggsite(get_data_row("select * from {$CONFIG->dbprefix}sites where id=$site_id and (access_id in {$access} or (access_id = 0 and owner_id = {$_SESSION['id']}))")); - } - - /** - * Retrieve details about a site via its URL, if the current user is allowed to see it - * - * @param string $url - * @return object A database representation of the object - */ - function get_site_byurl($url) - { - global $CONFIG; - - $url = sanitise_string(trim($url)); - $access = get_access_list(); - - return row_to_elggsite(get_data_row("select * from {$CONFIG->dbprefix}sites where url='$url' and (access_id in {$access} or (access_id = 0 and owner_id = {$_SESSION['id']}))")); - - } - - /** - * Get a list of users using a given site. - * - * @param int $site_id - * @param int $limit - * @param int $offset - */ - function get_site_users($site_id, $limit, $offset) - { - // TODO : Writeme - throw new NotImplementedException("Writeme!"); - } - - /** - * Get the objects for a given site - * - * @param int $site_id - * @param string $type - * @param int $limit - * @param int $offset - */ - function get_site_objects($site_id, $type = "", $limit = 10, $offset = 0) - { - // TODO : Writeme - throw new NotImplementedException("Writeme!"); - } - - /** - * Get the collections associated with this site. - * - * @param int $site_id - * @param string $type - * @param int $limit - * @param int $offset - */ - function get_site_collections($site_id, $type = "", $limit = 10, $offset = 0) - { - // TODO : Writeme - throw new NotImplementedException("Writeme!"); - } - - /** - * Add a site user. - * - * @param int $site_id - * @param int $user_id - */ - function add_site_user($site_id, $user_id) - { - // TODO : Writeme - throw new NotImplementedException("Writeme!"); - } - - /** - * Remove a site user. - * - * @param int $site_id - * @param int $user_id - */ - function remove_site_user($site_id, $user_id) - { - // TODO : Writeme - throw new NotImplementedException("Writeme!"); - } - - /** - * Set the site metadata. - * - * @param string $name - * @param string $value - * @param int $access_id - * @param int $site_id - * @param string $vartype - */ - function set_site_metadata($name, $value, $access_id, $site_id, $vartype = "") - { - $name = sanitise_string($name); - $value = sanitise_string($value); - $access_id = (int)$access_id; - $site_id = (int)$site_id; - $vartype = sanitise_string($vartype); - $owner_id = $_SESSION['id']; - - $id = create_metadata($site_id, 'site', $name, $value, $vartype, $owner_id, $access_id); - return $id; - } - - /** - * Get the site metadata. - * - * @param string $name - * @param int $site_id - */ - function get_site_metadata($name, $site_id) - { - $name = sanitise_string($name); - $site_id = (int)$site_id; - - return get_metadatas($site_id, 'site'); - } - - /** - * Remove site metadata - * - * @param int $site_id - * @param string $name - */ - function remove_site_metadata($site_id, $name) - { - // TODO : Writeme - throw new NotImplementedException("Writeme!"); - } - - /** - * Adds an annotation to a site. By default, the type is detected automatically; - * however, it can also be set. Note that by default, annotations are private. - * - * @param string $name - * @param string $value - * @param int $access_id - * @param int $owner_id - * @param int $site_id - * @param string $vartype - */ - function add_site_annotation($name, $value, $access_id, $owner_id, $site_id, $vartype) - { - $name = sanitise_string($name); - $value = sanitise_string($value); - $access_id = (int)$access_id; - $owner_id = (int)$owner_id; if ($owner_id==0) $owner_id = $_SESSION['id']; - $site_id = (int)$site_id; - $vartype = sanitise_string($vartype); - - $id = create_annotation($site_id, 'site', $name, $value, $vartype, $owner_id, $access_id); - - return $id; - } - - /** - * Get the annotations for a site. - * - * @param string $name - * @param int $site_id - * @param int $limit - * @param int $offset - */ - function get_site_annotations($name, $site_id, $limit, $offset) - { - $name = sanitise_string($name); - $site_id = (int)$site_id; - $limit = (int)$limit; - $offset = (int)$offset; - $owner_id = (int)$owner_id; if ($owner_id==0) $owner_id = $_SESSION['id']; // Consider adding the option to change in param? - - return get_annotations($site_id, 'site', "","", $owner_id, "created desc", $limit, $offset); - } - - /** - * Count the site annotations for a site of a given type. - * - * @param string $name - * @param int $site_id - */ - function count_site_annotations($name, $site_id) - { - return count_annotations($site_id, 'site', $name); - } - - /** - * Get the average of an integer type annotation. - * - * @param string $name - * @param int $site_id - */ - function get_site_annotations_avg($name, $site_id) - { - // TODO : Writeme - throw new NotImplementedException("Writeme!"); - } - - /** - * Get the sum of integer type annotations of a given type. - * - * @param string $name - * @param int $site_id - */ - function get_site_annotations_sum($name, $site_id) - { - // TODO : Writeme - throw new NotImplementedException("Writeme!"); - } + $result = false; - /** - * Get the min of integer type annotations of a given type. - * - * @param string $name - * @param int $site_id - */ - function get_site_annotations_min($name, $site_id) - { - // TODO : Writeme - throw new NotImplementedException("Writeme!"); + if ($site_guid == 0) { + $site = $CONFIG->site; + } else { + $site = get_entity($site_guid); } - /** - * Get the max of integer type annotations of a given type. - * - * @param string $name - * @param int $site_id - */ - function get_site_annotations_max($name, $site_id) - { - // TODO : Writeme - throw new NotImplementedException("Writeme!"); + if ($site instanceof ElggSite) { + $result = $site; } - - /** - * Remove all site annotations, or site annotations of a given type. - * - * @param int $site_id - * @param string $name - */ - function remove_site_annotations($site_id, $name) - { - $annotations = get_annotations($site_id, 'site', $name); - - if($annotations) - { - foreach ($annotations as $a) - { - delete_annotation($a->id); + + return $result; +} + +/** + * Return the site specific details of a site by a row. + * + * @param int $guid The site GUID + * + * @return mixed + * @access private + */ +function get_site_entity_as_row($guid) { + global $CONFIG; + + $guid = (int)$guid; + return get_data_row("SELECT * from {$CONFIG->dbprefix}sites_entity where guid=$guid"); +} + +/** + * Create or update the entities table for a given site. + * Call create_entity first. + * + * @param int $guid Site GUID + * @param string $name Site name + * @param string $description Site Description + * @param string $url URL of the site + * + * @return bool + * @access private + */ +function create_site_entity($guid, $name, $description, $url) { + global $CONFIG; + + $guid = (int)$guid; + $name = sanitise_string($name); + $description = sanitise_string($description); + $url = sanitise_string($url); + + $row = get_entity_as_row($guid); + + if ($row) { + // Exists and you have access to it + $query = "SELECT guid from {$CONFIG->dbprefix}sites_entity where guid = {$guid}"; + if ($exists = get_data_row($query)) { + $query = "UPDATE {$CONFIG->dbprefix}sites_entity + set name='$name', description='$description', url='$url' where guid=$guid"; + $result = update_data($query); + + if ($result != false) { + // Update succeeded, continue + $entity = get_entity($guid); + if (elgg_trigger_event('update', $entity->type, $entity)) { + return $guid; + } else { + $entity->delete(); + //delete_entity($guid); + } + } + } else { + // Update failed, attempt an insert. + $query = "INSERT into {$CONFIG->dbprefix}sites_entity + (guid, name, description, url) values ($guid, '$name', '$description', '$url')"; + $result = insert_data($query); + + if ($result !== false) { + $entity = get_entity($guid); + if (elgg_trigger_event('create', $entity->type, $entity)) { + return $guid; + } else { + $entity->delete(); + //delete_entity($guid); + } } - - return true; } - - return false; } - - /** - * Create a site. - * - * @param string $title - * @param string $description - * @param string $url - * @param int $owner_id - * @param int $access_id - */ - function create_site($title, $description, $url, $owner_id = 0, $access_id = 0) - { - global $CONFIG; - - $title = sanitise_string($title); - $description = sanitise_string($description); - $url = sanitise_string($url); - $owner_id = (int)$owner_id; - $access_id = (int)$access_id; - $time = time(); - - return insert_data("INSERT into {$CONFIG->dbprefix}sites (name, description, url, owner_id, created, last_updated, access_id) VALUES ('$title','$description','$url',$owner_id,'$time','$time', $access_id)"); - } - - /** - * Saves or updates the site to the db depending on whether or not id is specified - * - * @param int $id - * @param string $title - * @param string $description - * @param string $url - * @param int $owner_id - * @param int $access_id - */ - function update_site($id, $title, $description, $url, $owner_id, $access_id) - { - global $CONFIG; - - $id = (int)$id; - $title = sanitise_string($title); - $description = sanitise_string($description); - $url = sanitise_string($url); - $owner_id = (int)$owner_id; - $access_id = (int)$access_id; - $time = time(); - - $access = get_access_list(); - - return update_data("UPDATE {$CONFIG->dbprefix}sites set name='$title', description='$description', url='$url', last_updated='$time', owner_id=$owner_id, access_id=$access_id WHERE id=$id and (access_id in {$access} or (access_id = 0 and owner_id = {$_SESSION['id']}))"); + + return false; +} + +/** + * Add a user to a site. + * + * @param int $site_guid Site guid + * @param int $user_guid User guid + * + * @return bool + */ +function add_site_user($site_guid, $user_guid) { + $site_guid = (int)$site_guid; + $user_guid = (int)$user_guid; + + return add_entity_relationship($user_guid, "member_of_site", $site_guid); +} + +/** + * Remove a user from a site. + * + * @param int $site_guid Site GUID + * @param int $user_guid User GUID + * + * @return bool + */ +function remove_site_user($site_guid, $user_guid) { + $site_guid = (int)$site_guid; + $user_guid = (int)$user_guid; + + return remove_entity_relationship($user_guid, "member_of_site", $site_guid); +} + +/** + * Add an object to a site. + * + * @param int $site_guid Site GUID + * @param int $object_guid Object GUID + * + * @return mixed + */ +function add_site_object($site_guid, $object_guid) { + $site_guid = (int)$site_guid; + $object_guid = (int)$object_guid; + + return add_entity_relationship($object_guid, "member_of_site", $site_guid); +} + +/** + * Remove an object from a site. + * + * @param int $site_guid Site GUID + * @param int $object_guid Object GUID + * + * @return bool + */ +function remove_site_object($site_guid, $object_guid) { + $site_guid = (int)$site_guid; + $object_guid = (int)$object_guid; + + return remove_entity_relationship($object_guid, "member_of_site", $site_guid); +} + +/** + * Get the objects belonging to a site. + * + * @param int $site_guid Site GUID + * @param string $subtype Subtype + * @param int $limit Limit + * @param int $offset Offset + * + * @return mixed + */ +function get_site_objects($site_guid, $subtype = "", $limit = 10, $offset = 0) { + $site_guid = (int)$site_guid; + $limit = (int)$limit; + $offset = (int)$offset; + + return elgg_get_entities_from_relationship(array( + 'relationship' => 'member_of_site', + 'relationship_guid' => $site_guid, + 'inverse_relationship' => TRUE, + 'type' => 'object', + 'subtype' => $subtype, + 'limit' => $limit, + 'offset' => $offset + )); +} + +/** + * Return the site via a url. + * + * @param string $url The URL of a site + * + * @return mixed + */ +function get_site_by_url($url) { + global $CONFIG; + + $url = sanitise_string($url); + + $row = get_data_row("SELECT * from {$CONFIG->dbprefix}sites_entity where url='$url'"); + + if ($row) { + return get_entity($row->guid); } - - /** - * Delete a given site. - * - * @param int $site_id - */ - function delete_site($site_id) - { - global $CONFIG; - - $site_id = (int)$site_id; - - return delete_data("DELETE from {$CONFIG->dbprefix}sites where id=$site_id"); + + return false; +} + +/** + * Retrieve a site and return the domain portion of its url. + * + * @param int $guid ElggSite GUID + * + * @return string + */ +function get_site_domain($guid) { + $guid = (int)$guid; + + $site = get_entity($guid); + if ($site instanceof ElggSite) { + $breakdown = parse_url($site->url); + return $breakdown['host']; } -
- /**
- * Initialise site handling
- *
- * Called at the beginning of system running, to set the ID of the current site.
- * This is 0 by default, but plugins may alter this behaviour by attaching functions
- * to the sites init event and changing $CONFIG->site_id.
- *
- * @uses $CONFIG
- * @param string $event Event API required parameter
- * @param string $object_type Event API required parameter
- * @param null $object Event API required parameter
- * @return true
- */
- function sites_init($event, $object_type, $object) {
- global $CONFIG;
-
- $CONFIG->site_id = 1;
-
- trigger_event('init','sites');
-
- if ($site = get_data_row("select * from {$CONFIG->dbprefix}sites where id = 1")) {
- if (!empty($site->name))
- $CONFIG->sitename = $site->name;
- if (!empty($site->domain))
- $CONFIG->wwwroot = $site->domain;
- }
-
- return true;
- }
-
- // Register event handlers
-
- register_event_handler('init','system','sites_init',0);
-
-?>
\ No newline at end of file + + return false; +} + +/** + * Unit tests for sites + * + * @param string $hook unit_test + * @param string $type system + * @param mixed $value Array of tests + * @param mixed $params Params + * + * @return array + * @access private + */ +function sites_test($hook, $type, $value, $params) { + global $CONFIG; + $value[] = "{$CONFIG->path}engine/tests/objects/sites.php"; + return $value; +} + +// Register with unit test +elgg_register_plugin_hook_handler('unit_test', 'system', 'sites_test'); |
