diff options
-rw-r--r-- | actions/widgets/add.php | 26 | ||||
-rw-r--r-- | engine/lib/widgets.php | 126 | ||||
-rw-r--r-- | js/lib/ui.widgets.js | 20 |
3 files changed, 149 insertions, 23 deletions
diff --git a/actions/widgets/add.php b/actions/widgets/add.php index c57e3596a..78f73e267 100644 --- a/actions/widgets/add.php +++ b/actions/widgets/add.php @@ -13,21 +13,21 @@ $column = get_input('column', 1); $guid = false; if (!empty($user_guid)) { - if ($user = get_entity($user_guid)) { - if ($user->canEdit()) { - $guid = add_widget($user->getGUID(), $handler, $context, 0, $column); - } - } -} + $user = get_entity($user_guid); + if ($user && $user->canEdit()) { + $guid = elgg_add_widget($user->getGUID(), $handler); + if ($guid) { + $widget = get_entity($guid); + elgg_prepend_widget($widget, $context, $column); -if ($guid) { - system_message(elgg_echo('widgets:add:success')); + // send widget html for insertion + echo elgg_view_entity($widget); - // send widget html for insertion - $widget = get_entity($guid); - echo elgg_view_entity($widget); -} else { - register_error(elgg_echo('widgets:add:failure')); + system_message(elgg_echo('widgets:add:success')); + forward(REFERER); + } + } } +register_error(elgg_echo('widgets:add:failure')); forward(REFERER);
\ No newline at end of file diff --git a/engine/lib/widgets.php b/engine/lib/widgets.php index 5d6a7fcc1..724e098a7 100644 --- a/engine/lib/widgets.php +++ b/engine/lib/widgets.php @@ -150,8 +150,8 @@ function get_widgets($user_guid, $context, $column) { * * @param int $user_guid The owner user GUID * @param string $context The context (profile, dashboard, etc) - * * @return array|false An array of widget ElggObjects, or false + * @since 1.8.0 */ function elgg_get_widgets($user_guid, $context) { $options = array( @@ -175,18 +175,124 @@ function elgg_get_widgets($user_guid, $context) { } foreach ($sorted_widgets as $col => $widgets) { - ksort($sorted_widgets[$col]); + krsort($sorted_widgets[$col]); } return $sorted_widgets; } /** - * @deprecated 1.8 + * 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 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 */ -function display_widget(ElggObject $widget) { - elgg_deprecated_notice("display_widget() was been deprecated. Use elgg_view_entity().", 1.8); - return elgg_view_entity($widget); +function elgg_add_widget($owner_guid, $handler, $access_id = null) { + if (empty($owner_guid) || empty($handler) || !widget_type_exists($handler)) { + return false; + } + + $owner = get_entity($owner_guid); + if (!$owner) { + return false; + } + + $widget = new ElggWidget; + $widget->owner_guid = $owner_guid; + $widget->container_guid = $owner_guid; // @todo - will this work for group widgets + if (isset($access_id)) { + $widget->access_id = $access_id; + } else { + $widget->access_id = get_default_access(); + } + + if (!$widget->save()) { + return false; + } + + // private settings cannot be set until ElggWidget saved + $widget->handler = $handler; + + return $widget->getGUID(); +} + +/** + * Prepend a widget to a column + * + * @param ElggWidget $widget The widget object + * @param string $context The widget context + * @param int $column The column index (default is 1) + * @return none + * @since 1.8.0 + */ +function elgg_prepend_widget($widget, $context, $column = 1) { + $options = array( + 'type' => 'object', + 'subtype' => 'widget', + 'private_setting_name_value_pairs' => array( + array('name' => 'context', 'value' => $context), + array('name' => 'column', 'value' => $column) + ) + ); + $widgets = elgg_get_entities_from_private_settings($options); + $max_order = -10; + foreach ($widgets as $column_widget) { + if ($column_widget->order > $max_order) { + $max_order = $column_widget->order; + } + } + + $widget->order = $max_order + 10; + $widget->context = $context; + $widget->column = $column; +} + +/** + * Move a widget to a new location in a layout + * + * @param ElggWidget $widget The widget to move + * @param int $column The widget column + * @param int $rank Zero-based rank from the bottom of the column + * @return none + * @since 1.8.0 + */ +function elgg_move_widget($widget, $column, $rank) { + $options = array( + 'type' => 'object', + 'subtype' => 'widget', + 'private_setting_name_value_pairs' => array( + array('name' => 'context', 'value' => $widget->context), + array('name' => 'column', 'value' => $column) + ) + ); + $widgets = elgg_get_entities_from_private_settings($options); + if (!$widgets) { + $widget->column = $column; + $widget->order = 0; + return; + } + + usort($widgets, create_function('$a,$b','return $a->order > $b->order;')); + + if ($rank == 0) { + // bottom of the column + $widget->order = $widgets[0]->order - 10; + } elseif ($rank == count($widgets)) { + // top of the column + $widget->order = end($widgets)->order + 10; + } else { + // reorder widgets that are above + $widget->order = $widgets[$rank]->order; + for ($index = $rank; $index < count($widgets); $index++) { + if ($widgets[$index]->guid != $widget->guid) { + $widgets[$index]-> order += 10; + } + } + } + $widget->column = $column; } /** @@ -530,6 +636,14 @@ function elgg_can_edit_widgets($user_guid = 0) { } /** + * @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); +} + +/** * Regsiter entity of object, widget as ElggWidget objects * * @return void diff --git a/js/lib/ui.widgets.js b/js/lib/ui.widgets.js index b1e7b2a99..507a1a1a8 100644 --- a/js/lib/ui.widgets.js +++ b/js/lib/ui.widgets.js @@ -1,7 +1,7 @@ elgg.provide('elgg.ui.widgets');
elgg.ui.widgets.init = function() {
- $(".widget_column" ).sortable({
+ $(".widget_column").sortable({
items: 'div.widget',
connectWith: '.widget_column',
handle: 'div.drag_handle',
@@ -27,11 +27,23 @@ elgg.ui.widgets.init = function() { });
event.preventDefault();
});
+
+ elgg.ui.widgets.equalHeight(".widget_column");
};
// insert a widget into the layout
elgg.ui.widgets.insert = function(html) {
- $('.widget_first_col').prepend(html);
+ $('.widget_col_1').prepend(html);
+}
+
+elgg.ui.widgets.equalHeight = function(selector) {
+ var maxHeight = 0;
+ $(selector).each(function() {
+ if ($(this).height() > maxHeight) {
+ maxHeight = $(this).height();
+ }
+ })
+ $(selector).css('min-height', maxHeight);
}
//List active widgets for each page column
@@ -85,7 +97,7 @@ elgg.ui.widgets.toggleContent = function(e) { // set cookie for widget panel open-state
thisWidgetName = $(this.parentNode.parentNode.parentNode).attr('id');
- elgg.session.cookie(thisWidgetName, 'expanded', {expires: 365 });
+ elgg.session.cookie(thisWidgetName, 'expanded', {expires: 365});
} else {
targetContent.slideUp(400);
@@ -96,7 +108,7 @@ elgg.ui.widgets.toggleContent = function(e) { // set cookie for widget panel closed-state
thisWidgetName = $(this.parentNode.parentNode.parentNode).attr('id');
- elgg.session.cookie(thisWidgetName, 'collapsed', { expires: 365 });
+ elgg.session.cookie(thisWidgetName, 'collapsed', {expires: 365});
}
return false;
};
|