aboutsummaryrefslogtreecommitdiff
path: root/engine/lib/widgets.php
diff options
context:
space:
mode:
Diffstat (limited to 'engine/lib/widgets.php')
-rw-r--r--engine/lib/widgets.php557
1 files changed, 139 insertions, 418 deletions
diff --git a/engine/lib/widgets.php b/engine/lib/widgets.php
index f4cb8765b..699462a1b 100644
--- a/engine/lib/widgets.php
+++ b/engine/lib/widgets.php
@@ -11,12 +11,12 @@
* Get widgets for a particular context
*
* The widgets are ordered for display and grouped in columns.
- * $widgets = elgg_get_widgets(get_loggedin_userid(), 'dashboard');
+ * $widgets = elgg_get_widgets(elgg_get_logged_in_user_guid(), 'dashboard');
* $first_column_widgets = $widgets[1];
*
* @param int $user_guid The owner user GUID
* @param string $context The context (profile, dashboard, etc)
- *
+ *
* @return array An 2D array of ElggWidget objects
* @since 1.8.0
*/
@@ -26,7 +26,8 @@ function elgg_get_widgets($user_guid, $context) {
'subtype' => 'widget',
'owner_guid' => $user_guid,
'private_setting_name' => 'context',
- 'private_setting_value' => $context
+ 'private_setting_value' => $context,
+ 'limit' => 0
);
$widgets = elgg_get_entities_from_private_settings($options);
if (!$widgets) {
@@ -51,12 +52,13 @@ function elgg_get_widgets($user_guid, $context) {
/**
* Create a new widget instance
*
- * @param int $entity_guid GUID of entity that owns this widget
- * @param string $handler The handler for this widget
- * @param int $access_id If not specified, it is set to the default access level
- *
+ * @param int $owner_guid GUID of entity that owns this widget
+ * @param string $handler The handler for this widget
+ * @param string $context The context for this widget
+ * @param int $access_id If not specified, it is set to the default access level
+ *
* @return int|false Widget GUID or false on failure
- * @since 1.8
+ * @since 1.8.0
*/
function elgg_create_widget($owner_guid, $handler, $context, $access_id = null) {
if (empty($owner_guid) || empty($handler) || !elgg_is_widget_type($handler)) {
@@ -103,11 +105,11 @@ function elgg_can_edit_widget_layout($context, $user_guid = 0) {
$user = get_entity((int)$user_guid);
if (!$user) {
- $user = get_loggedin_user();
+ $user = elgg_get_logged_in_user_entity();
}
$return = false;
- if (isadminloggedin()) {
+ if (elgg_is_admin_logged_in()) {
$return = true;
}
if (elgg_get_page_owner_guid() == $user->guid) {
@@ -117,7 +119,7 @@ function elgg_can_edit_widget_layout($context, $user_guid = 0) {
$params = array(
'user' => $user,
'context' => $context,
- 'page_owner' => elgg_get_page_owner()
+ 'page_owner' => elgg_get_page_owner_entity()
);
return elgg_trigger_plugin_hook('permissions_check', 'widget_layout', $params, $return);
}
@@ -134,7 +136,7 @@ function elgg_can_edit_widget_layout($context, $user_guid = 0) {
* widget is allowed (default: 'all')
* @param bool $multiple Whether or not multiple instances of this widget
* are allowed in a single layout (default: false)
- *
+ *
* @return bool
* @since 1.8.0
*/
@@ -168,7 +170,7 @@ function elgg_register_widget_type($handler, $name, $description, $context = "al
* Remove a widget type
*
* @param string $handler The identifier for the widget
- *
+ *
* @return void
* @since 1.8.0
*/
@@ -192,7 +194,7 @@ function elgg_unregister_widget_type($handler) {
* Has a widget type with the specified handler been registered
*
* @param string $handler The widget handler identifying string
- *
+ *
* @return bool Whether or not that widget type exists
* @since 1.8.0
*/
@@ -215,12 +217,13 @@ function elgg_is_widget_type($handler) {
*
* The widget types are stdClass objects.
*
- * @param string context The widget context or empty string for current context
- *
+ * @param string $context The widget context or empty string for current context
+ * @param bool $exact Only return widgets registered for this context (false)
+ *
* @return array
* @since 1.8.0
*/
-function elgg_get_widget_types($context = "") {
+function elgg_get_widget_types($context = "", $exact = false) {
global $CONFIG;
if (empty($CONFIG->widgets) ||
@@ -236,8 +239,14 @@ function elgg_get_widget_types($context = "") {
$widgets = array();
foreach ($CONFIG->widgets->handlers as $key => $handler) {
- if (in_array('all', $handler->context) || in_array($context, $handler->context)) {
- $widgets[$key] = $handler;
+ if ($exact) {
+ if (in_array($context, $handler->context)) {
+ $widgets[$key] = $handler;
+ }
+ } else {
+ if (in_array('all', $handler->context) || in_array($context, $handler->context)) {
+ $widgets[$key] = $handler;
+ }
}
}
@@ -248,6 +257,7 @@ function elgg_get_widget_types($context = "") {
* Regsiter entity of object, widget as ElggWidget objects
*
* @return void
+ * @access private
*/
function elgg_widget_run_once() {
add_subtype("object", "widget", "ElggWidget");
@@ -257,443 +267,154 @@ function elgg_widget_run_once() {
* Function to initialize widgets functionality
*
* @return void
+ * @access private
*/
function elgg_widgets_init() {
- register_action('widgets/save');
- register_action('widgets/add');
- register_action('widgets/move');
- register_action('widgets/delete');
+ elgg_register_action('widgets/save');
+ elgg_register_action('widgets/add');
+ elgg_register_action('widgets/move');
+ elgg_register_action('widgets/delete');
+ elgg_register_action('widgets/upgrade', '', 'admin');
run_function_once("elgg_widget_run_once");
}
-elgg_register_event_handler('init', 'system', 'elgg_widgets_init');
-
-
-
-/**
- * When given a widget entity and a new requested location, saves the new location
- * and also provides a sensible ordering for all widgets in that column
- *
- * @param ElggObject $widget The widget entity
- * @param int $order The order within the column
- * @param int $column The column (1, 2 or 3)
- *
- * @return bool Depending on success
- * @deprecated 1.8 use ElggWidget::move()
- */
-function save_widget_location(ElggObject $widget, $order, $column) {
- elgg_deprecated_notice('save_widget_location() is deprecated', 1.8);
- if ($widget instanceof ElggObject) {
- if ($widget->subtype == "widget") {
- // If you can't move the widget, don't save a new location
- if (!$widget->draggable) {
- return false;
- }
-
- // Sanitise the column value
- if ($column != 1 || $column != 2 || $column != 3) {
- $column = 1;
- }
-
- $widget->column = (int) $column;
-
- $ordertmp = array();
- $params = array(
- 'context' => $widget->context,
- 'column' => $column,
- );
-
- if ($entities = get_entities_from_metadata_multi($params, 'object', 'widget')) {
- foreach ($entities as $entity) {
- $entityorder = $entity->order;
- if ($entityorder < $order) {
- $ordertmp[$entityorder] = $entity;
- }
- if ($entityorder >= $order) {
- $ordertmp[$entityorder + 10000] = $entity;
- }
- }
- }
-
- $ordertmp[$order] = $widget;
- ksort($ordertmp);
-
- $orderticker = 10;
- foreach ($ordertmp as $orderval => $entity) {
- $entity->order = $orderticker;
- $orderticker += 10;
- }
-
- return true;
- } else {
- register_error($widget->subtype);
- }
-
- }
-
- return false;
-}
-
-/**
- * Get widgets for a particular context and column, in order of display
- *
- * @param int $user_guid The owner user GUID
- * @param string $context The context (profile, dashboard etc)
- * @param int $column The column (1 or 2)
- *
- * @return array|false An array of widget ElggObjects, or false
- * @deprecated 1.8 Use elgg_get_widgets()
- */
-function get_widgets($user_guid, $context, $column) {
- elgg_deprecated_notice('get_widgets is depecated for elgg_get_widgets', 1.8);
- $params = array(
- 'column' => $column,
- 'context' => $context
- );
- $widgets = get_entities_from_private_setting_multi($params, "object",
- "widget", $user_guid, "", 10000);
-
- if ($widgets) {
- $widgetorder = array();
- foreach ($widgets as $widget) {
- $order = $widget->order;
- while (isset($widgetorder[$order])) {
- $order++;
- }
- $widgetorder[$order] = $widget;
- }
-
- ksort($widgetorder);
-
- return $widgetorder;
- }
-
- return false;
-}
-
/**
- * Add a new widget instance
- *
- * @param int $entity_guid GUID of entity that owns this widget
- * @param string $handler The handler for this widget
- * @param string $context The page context for this widget
- * @param int $order The order to display this widget in
- * @param int $column The column to display this widget in (1, 2 or 3)
- * @param int $access_id If not specified, it is set to the default access level
- *
- * @return int|false Widget GUID or false on failure
- * @deprecated 1.8 use elgg_create_widget()
- */
-function add_widget($entity_guid, $handler, $context, $order = 0, $column = 1, $access_id = null) {
- elgg_deprecated_notice('add_widget has been deprecated for elgg_create_widget', 1.8);
- if (empty($entity_guid) || empty($context) || empty($handler) || !widget_type_exists($handler)) {
- return false;
- }
-
- if ($entity = get_entity($entity_guid)) {
- $widget = new ElggWidget;
- $widget->owner_guid = $entity_guid;
- $widget->container_guid = $entity_guid;
- if (isset($access_id)) {
- $widget->access_id = $access_id;
- } else {
- $widget->access_id = get_default_access();
- }
-
- $guid = $widget->save();
-
- // private settings cannot be set until ElggWidget saved
- $widget->handler = $handler;
- $widget->context = $context;
- $widget->column = $column;
- $widget->order = $order;
-
- return $guid;
- }
-
- return false;
-}
-
-/**
- * Define a new widget type
- *
- * @param string $handler The identifier for the widget handler
- * @param string $name The name of the widget type
- * @param string $description A description for the widget type
- * @param string $context A comma-separated list of contexts where this
- * widget is allowed (default: 'all')
- * @param bool $multiple Whether or not multiple instances of this widget
- * are allowed on a single dashboard (default: false)
- * @param string $positions A comma-separated list of positions on the page
- * (side or main) where this widget is allowed (default: "side,main")
- *
- * @return bool Depending on success
- * @deprecated 1.8 Use elgg_register_widget_type
- */
-function add_widget_type($handler, $name, $description, $context = "all",
-$multiple = false, $positions = "side,main") {
- elgg_deprecated_notice("add_widget_type deprecated for elgg_register_widget_type", 1.8);
-
- return elgg_register_widget_type($handler, $name, $description, $context, $multiple);
-}
-
-/**
- * Remove a widget type
- *
- * @param string $handler The identifier for the widget handler
+ * Gets a list of events to create default widgets for and
+ * register menu items for default widgets with the admin section.
+ *
+ * A plugin that wants to register a new context for default widgets should
+ * register for the plugin hook 'get_list', 'default_widgets'. The handler
+ * can register the new type of default widgets by adding an associate array to
+ * the return value array like this:
+ * array(
+ * 'name' => elgg_echo('profile'),
+ * 'widget_context' => 'profile',
+ * 'widget_columns' => 3,
+ *
+ * 'event' => 'create',
+ * 'entity_type' => 'user',
+ * 'entity_subtype' => ELGG_ENTITIES_ANY_VALUE,
+ * );
+ *
+ * The first set of keys define information about the new type of default
+ * widgets and the second set determine what event triggers the creation of the
+ * new widgets.
*
* @return void
- * @since 1.7.1
- * @deprecated 1.8 Use elgg_unregister_widget_type
- */
-function remove_widget_type($handler) {
- elgg_deprecated_notice("remove_widget_type deprecated for elgg_unregister_widget_type", 1.8);
- return elgg_unregister_widget_type($handler);
-}
-
-/**
- * Determines whether or not widgets with the specified handler have been defined
- *
- * @param string $handler The widget handler identifying string
- *
- * @return bool Whether or not those widgets exist
- * @deprecated 1.8 Use elgg_is_widget_type
- */
-function widget_type_exists($handler) {
- elgg_deprecated_notice("widget_type_exists deprecated for elgg_is_widget_type", 1.8);
- return elgg_is_widget_type($handler);
-}
-
-/**
- * Returns an array of stdClass objects representing the defined widget types
- *
- * @return array A list of types defined (if any)
- * @deprecated 1.8 Use elgg_get_widget_types
- */
-function get_widget_types() {
- elgg_deprecated_notice("get_widget_types deprecrated for elgg_get_widget_types", 1.8);
- return elgg_get_widget_types();
-}
-
-/**
- * Saves a widget's settings (by passing an array of
- * (name => value) pairs to save_{$handler}_widget)
- *
- * @param int $widget_guid The GUID of the widget we're saving to
- * @param array $params An array of name => value parameters
- *
- * @return bool
- * @deprecated 1.8 Use elgg_save_widget_settings
+ * @access private
*/
-function save_widget_info($widget_guid, $params) {
- elgg_deprecated_notice("save_widget_info() is deprecated for elgg_save_widget_settings", 1.8);
- if ($widget = get_entity($widget_guid)) {
+function elgg_default_widgets_init() {
+ global $CONFIG;
+ $default_widgets = elgg_trigger_plugin_hook('get_list', 'default_widgets', null, array());
- $subtype = $widget->getSubtype();
+ $CONFIG->default_widget_info = $default_widgets;
- if ($subtype != "widget") {
- return false;
- }
- $handler = $widget->handler;
- if (empty($handler) || !widget_type_exists($handler)) {
- return false;
- }
+ if ($default_widgets) {
+ elgg_register_admin_menu_item('configure', 'default_widgets', 'appearance');
- if (!$widget->canEdit()) {
- return false;
- }
+ // override permissions for creating widget on logged out / just created entities
+ elgg_register_plugin_hook_handler('container_permissions_check', 'object', 'elgg_default_widgets_permissions_override');
- // Save the params to the widget
- if (is_array($params) && sizeof($params) > 0) {
- foreach ($params as $name => $value) {
-
- if (!empty($name) && !in_array($name, array(
- 'guid', 'owner_guid', 'site_guid'
- ))) {
- if (is_array($value)) {
- // @todo Handle arrays securely
- $widget->setMetaData($name, $value, "", true);
- } else {
- $widget->$name = $value;
- }
- }
- }
- $widget->save();
+ // only register the callback once per event
+ $events = array();
+ foreach ($default_widgets as $info) {
+ $events[$info['event'] . ',' . $info['entity_type']] = $info;
}
-
- $function = "save_{$handler}_widget";
- if (is_callable($function)) {
- return $function($params);
+ foreach ($events as $info) {
+ elgg_register_event_handler($info['event'], $info['entity_type'], 'elgg_create_default_widgets');
}
-
- return true;
}
-
- return false;
}
/**
- * Reorders the widgets from a widget panel
+ * Creates default widgets
*
- * @param string $panelstring1 String of guids of ElggWidget objects separated by ::
- * @param string $panelstring2 String of guids of ElggWidget objects separated by ::
- * @param string $panelstring3 String of guids of ElggWidget objects separated by ::
- * @param string $context Profile or dashboard
- * @param int $owner Owner guid
+ * This plugin hook handler is registered for events based on what kinds of
+ * default widgets have been registered. See elgg_default_widgets_init() for
+ * information on registering new default widget contexts.
*
+ * @param string $event The event
+ * @param string $type The type of object
+ * @param ElggEntity $entity The entity being created
* @return void
- * @deprecated 1.8
+ * @access private
*/
-function reorder_widgets_from_panel($panelstring1, $panelstring2, $panelstring3, $context, $owner) {
- elgg_deprecated_notice("reorder_widgets_from_panel() is deprecated", 1.8);
- $return = true;
-
- $mainwidgets = explode('::', $panelstring1);
- $sidewidgets = explode('::', $panelstring2);
- $rightwidgets = explode('::', $panelstring3);
-
- $handlers = array();
- $guids = array();
-
- if (is_array($mainwidgets) && sizeof($mainwidgets) > 0) {
- foreach ($mainwidgets as $widget) {
-
- $guid = (int) $widget;
-
- if ("{$guid}" == "{$widget}") {
- $guids[1][] = $widget;
- } else {
- $handlers[1][] = $widget;
- }
- }
- }
- if (is_array($sidewidgets) && sizeof($sidewidgets) > 0) {
- foreach ($sidewidgets as $widget) {
-
- $guid = (int) $widget;
+function elgg_create_default_widgets($event, $type, $entity) {
+ $default_widget_info = elgg_get_config('default_widget_info');
- if ("{$guid}" == "{$widget}") {
- $guids[2][] = $widget;
- } else {
- $handlers[2][] = $widget;
- }
-
- }
- }
- if (is_array($rightwidgets) && sizeof($rightwidgets) > 0) {
- foreach ($rightwidgets as $widget) {
-
- $guid = (int) $widget;
-
- if ("{$guid}" == "{$widget}") {
- $guids[3][] = $widget;
- } else {
- $handlers[3][] = $widget;
- }
-
- }
+ if (!$default_widget_info || !$entity) {
+ return;
}
- // Reorder existing widgets or delete ones that have vanished
- foreach (array(1, 2, 3) as $column) {
- if ($dbwidgets = get_widgets($owner, $context, $column)) {
-
- foreach ($dbwidgets as $dbwidget) {
- if (in_array($dbwidget->getGUID(), $guids[1])
- || in_array($dbwidget->getGUID(), $guids[2]) || in_array($dbwidget->getGUID(), $guids[3])) {
-
- if (in_array($dbwidget->getGUID(), $guids[1])) {
- $pos = array_search($dbwidget->getGUID(), $guids[1]);
- $col = 1;
- } else if (in_array($dbwidget->getGUID(), $guids[2])) {
- $pos = array_search($dbwidget->getGUID(), $guids[2]);
- $col = 2;
- } else {
- $pos = array_search($dbwidget->getGUID(), $guids[3]);
- $col = 3;
- }
- $pos = ($pos + 1) * 10;
- $dbwidget->column = $col;
- $dbwidget->order = $pos;
- } else {
- $dbguid = $dbwidget->getGUID();
- if (!$dbwidget->delete()) {
- $return = false;
- } else {
- // Remove state cookie
- setcookie('widget' + $dbguid, null);
+ $type = $entity->getType();
+ $subtype = $entity->getSubtype();
+
+ // event is already guaranteed by the hook registration.
+ // need to check subtype and type.
+ foreach ($default_widget_info as $info) {
+ if ($info['entity_type'] == $type) {
+ if ($info['entity_subtype'] == ELGG_ENTITIES_ANY_VALUE || $info['entity_subtype'] == $subtype) {
+
+ // need to be able to access everything
+ $old_ia = elgg_set_ignore_access(true);
+ elgg_push_context('create_default_widgets');
+
+ // pull in by widget context with widget owners as the site
+ // not using elgg_get_widgets() because it sorts by columns and we don't care right now.
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => 'widget',
+ 'owner_guid' => elgg_get_site_entity()->guid,
+ 'private_setting_name' => 'context',
+ 'private_setting_value' => $info['widget_context'],
+ 'limit' => 0
+ );
+
+ $widgets = elgg_get_entities_from_private_settings($options);
+ /* @var ElggWidget[] $widgets */
+
+ foreach ($widgets as $widget) {
+ // change the container and owner
+ $new_widget = clone $widget;
+ $new_widget->container_guid = $entity->guid;
+ $new_widget->owner_guid = $entity->guid;
+
+ // pull in settings
+ $settings = get_all_private_settings($widget->guid);
+
+ foreach ($settings as $name => $value) {
+ $new_widget->$name = $value;
}
- }
- }
- }
- // Add new ones
- if (sizeof($guids[$column]) > 0) {
- foreach ($guids[$column] as $key => $guid) {
- if ($guid == 0) {
- $pos = ($key + 1) * 10;
- $handler = $handlers[$column][$key];
- if (!add_widget($owner, $handler, $context, $pos, $column)) {
- $return = false;
- }
+ $new_widget->save();
}
+
+ elgg_set_ignore_access($old_ia);
+ elgg_pop_context();
}
}
}
-
- return $return;
-}
-
-/**
- * Register a particular context for use with widgets.
- *
- * @param string $context The context we wish to enable context for
- *
- * @return void
- * @deprecated 1.8
- */
-function use_widgets($context) {
- elgg_deprecated_notice("use_widgets is deprecated", 1.8);
- global $CONFIG;
-
- if (!isset($CONFIG->widgets)) {
- $CONFIG->widgets = new stdClass;
- }
-
- if (!isset($CONFIG->widgets->contexts)) {
- $CONFIG->widgets->contexts = array();
- }
-
- if (!empty($context)) {
- $CONFIG->widgets->contexts[] = $context;
- }
}
/**
- * Determines whether or not the current context is using widgets
- *
- * @return bool Depending on widget status
- * @deprecated 1.8
+ * Overrides permissions checks when creating widgets for logged out users.
+ *
+ * @param string $hook The permissions hook.
+ * @param string $type The type of entity being created.
+ * @param string $return Value
+ * @param mixed $params Params
+ * @return true|null
+ * @access private
*/
-function using_widgets() {
- elgg_deprecated_notice("using_widgets is deprecated", 1.8);
- global $CONFIG;
-
- $context = elgg_get_context();
- if (isset($CONFIG->widgets->contexts) && is_array($CONFIG->widgets->contexts)) {
- if (in_array($context, $CONFIG->widgets->contexts)) {
- return true;
- }
+function elgg_default_widgets_permissions_override($hook, $type, $return, $params) {
+ if ($type == 'object' && $params['subtype'] == 'widget') {
+ return elgg_in_context('create_default_widgets') ? true : null;
}
- return false;
+ return null;
}
-/**
- * @deprecated 1.8
- */
-function display_widget(ElggObject $widget) {
- elgg_deprecated_notice("display_widget() was been deprecated. Use elgg_view_entity().", 1.8);
- return elgg_view_entity($widget);
-}
+elgg_register_event_handler('init', 'system', 'elgg_widgets_init');
+// register default widget hooks from plugins
+elgg_register_event_handler('ready', 'system', 'elgg_default_widgets_init');