aboutsummaryrefslogtreecommitdiff
path: root/engine/classes/ElggWidget.php
diff options
context:
space:
mode:
Diffstat (limited to 'engine/classes/ElggWidget.php')
-rw-r--r--engine/classes/ElggWidget.php45
1 files changed, 41 insertions, 4 deletions
diff --git a/engine/classes/ElggWidget.php b/engine/classes/ElggWidget.php
index e703b84cb..66191bf47 100644
--- a/engine/classes/ElggWidget.php
+++ b/engine/classes/ElggWidget.php
@@ -7,6 +7,11 @@
*
* @package Elgg.Core
* @subpackage Widgets
+ *
+ * @property-read string $handler internal, do not use
+ * @property-read string $column internal, do not use
+ * @property-read string $order internal, do not use
+ * @property-read string $context internal, do not use
*/
class ElggWidget extends ElggObject {
@@ -116,6 +121,7 @@ class ElggWidget extends ElggObject {
'type' => 'object',
'subtype' => 'widget',
'container_guid' => $this->container_guid,
+ 'limit' => false,
'private_setting_name_value_pairs' => array(
array('name' => 'context', 'value' => $this->getContext()),
array('name' => 'column', 'value' => $column)
@@ -130,11 +136,26 @@ class ElggWidget extends ElggObject {
usort($widgets, create_function('$a,$b','return (int)$a->order > (int)$b->order;'));
+ // remove widgets from inactive plugins
+ $widget_types = elgg_get_widget_types($this->context);
+ $inactive_widgets = array();
+ foreach ($widgets as $index => $widget) {
+ if (!array_key_exists($widget->handler, $widget_types)) {
+ $inactive_widgets[] = $widget;
+ unset($widgets[$index]);
+ }
+ }
+
+ $bottom_rank = count($widgets);
+ if ($column == $this->column) {
+ $bottom_rank--;
+ }
+
if ($rank == 0) {
// top of the column
- $this->order = $widgets[0]->order - 10;
- } elseif ($rank == (count($widgets) - 1)) {
- // bottom of the column
+ $this->order = reset($widgets)->order - 10;
+ } elseif ($rank == $bottom_rank) {
+ // bottom of the column of active widgets
$this->order = end($widgets)->order + 10;
} else {
// reorder widgets
@@ -146,7 +167,7 @@ class ElggWidget extends ElggObject {
}
}
- // split the array in two and recombine with the moved array in middle
+ // split the array in two and recombine with the moved widget in middle
$before = array_slice($widgets, 0, $rank);
array_push($before, $this);
$after = array_slice($widgets, $rank);
@@ -158,6 +179,22 @@ class ElggWidget extends ElggObject {
$order += 10;
}
}
+
+ // put inactive widgets at the bottom
+ if ($inactive_widgets) {
+ $bottom = 0;
+ foreach ($widgets as $widget) {
+ if ($widget->order > $bottom) {
+ $bottom = $widget->order;
+ }
+ }
+ $bottom += 10;
+ foreach ($inactive_widgets as $widget) {
+ $widget->order = $bottom;
+ $bottom += 10;
+ }
+ }
+
$this->column = $column;
}