aboutsummaryrefslogtreecommitdiff
path: root/engine/lib
diff options
context:
space:
mode:
Diffstat (limited to 'engine/lib')
-rw-r--r--engine/lib/elgglib.php112
1 files changed, 87 insertions, 25 deletions
diff --git a/engine/lib/elgglib.php b/engine/lib/elgglib.php
index cb736f418..b6b603e79 100644
--- a/engine/lib/elgglib.php
+++ b/engine/lib/elgglib.php
@@ -172,7 +172,7 @@ function forward($location = "", $reason = 'system') {
* @return bool
* @since 1.8.0
*/
-function elgg_register_js($name, $url, $location = 'head', $priority = 500) {
+function elgg_register_js($name, $url, $location = 'head', $priority = null) {
return elgg_register_external_file('js', $name, $url, $location, $priority);
}
@@ -225,7 +225,7 @@ function elgg_get_loaded_js($location = 'head') {
* @return bool
* @since 1.8.0
*/
-function elgg_register_css($name, $url, $priority = 500) {
+function elgg_register_css($name, $url, $priority = null) {
return elgg_register_external_file('css', $name, $url, 'head', $priority);
}
@@ -278,7 +278,7 @@ function elgg_get_loaded_css() {
* @return bool
* @since 1.8.0
*/
-function elgg_register_external_file($type, $name, $url, $location, $priority = 500) {
+function elgg_register_external_file($type, $name, $url, $location, $priority = null) {
global $CONFIG;
if (empty($name) || empty($url)) {
@@ -292,26 +292,35 @@ function elgg_register_external_file($type, $name, $url, $location, $priority =
$CONFIG->externals = array();
}
- if (!isset($CONFIG->externals[$type])) {
- $CONFIG->externals[$type] = array();
+ if (!$CONFIG->externals[$type] instanceof ElggPriorityList) {
+ $CONFIG->externals[$type] = new ElggPriorityList();
}
$name = trim(strtolower($name));
+ $priority = max((int)$priority, 0);
- if (isset($CONFIG->externals[$type][$name])) {
- // update a registered item
- $item = $CONFIG->externals[$type][$name];
+ $index = elgg_get_external_file_priority($name, $type);
+
+ if ($index !== false) {
+ // updating a registered item
+ $item = $CONFIG->externals[$type][$index];
+ $item->url = $url;
+ $item->location = $location;
+ // remove old saved priority
+ elgg_remove_external_file_priority($name, $type);
+ $priority = $CONFIG->externals[$type]->move($index, $priority);
} else {
$item = new stdClass();
$item->loaded = false;
- }
+ $item->url = $url;
+ $item->location = $location;
- $item->url = $url;
- $item->priority = max((int)$priority, 0);
- $item->location = $location;
+ $priority = $CONFIG->externals[$type]->add($item, $priority);
+ }
- $CONFIG->externals[$type][$name] = $item;
+ // save priority map so we can update if added again
+ elgg_save_external_file_priority($priority, $name, $type);
return true;
}
@@ -332,14 +341,17 @@ function elgg_unregister_external_file($type, $name) {
return false;
}
- if (!isset($CONFIG->externals[$type])) {
+ if (!$CONFIG->externals[$type] instanceof ElggPriorityList) {
return false;
}
$name = trim(strtolower($name));
- if (array_key_exists($name, $CONFIG->externals[$type])) {
- unset($CONFIG->externals[$type][$name]);
+ $priority = elgg_get_external_file_priority($name, $type);
+
+ if ($priority !== false) {
+ elgg_remove_external_file_priority($name, $type);
+ unset($CONFIG->externals[$type][$priority]);
return true;
}
@@ -362,24 +374,75 @@ function elgg_load_external_file($type, $name) {
$CONFIG->externals = array();
}
- if (!isset($CONFIG->externals[$type])) {
- $CONFIG->externals[$type] = array();
+ if (!$CONFIG->externals[$type] instanceof ElggPriorityList) {
+ $CONFIG->externals[$type] = new ElggPriorityList();
}
$name = trim(strtolower($name));
- if (isset($CONFIG->externals[$type][$name])) {
+ $priority = elgg_get_external_file_priority($name, $type);
+
+ if ($priority !== false) {
// update a registered item
- $CONFIG->externals[$type][$name]->loaded = true;
+ $CONFIG->externals[$type][$priority]->loaded = true;
} else {
$item = new stdClass();
$item->loaded = true;
$item->url = '';
$item->location = '';
- $item->priority = 500;
- $CONFIG->externals[$type][$name] = $item;
+ $priority = $CONFIG->externals[$type]->add($item);
+ elgg_save_external_file_priority($priority, $name, $type);
+ }
+}
+
+/**
+ * Gets the priority of an external by name and type.
+ *
+ * @param type $name
+ * @param type $type
+ * @return type
+ */
+function elgg_get_external_file_priority($name, $type) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->externals_priorities[$type][$name])) {
+ return false;
+ }
+
+ return $CONFIG->externals_priorities[$type][$name];
+}
+
+function elgg_save_external_file_priority($priority, $name, $type) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->externals_priorities)) {
+ $CONFIG->externals_priorities = array();
+ }
+
+ if (!isset($CONFIG->externals_priorities[$type])) {
+ $CONFIG->externals_priorities[$type] = array();
+ }
+
+ $CONFIG->externals_priorities[$type][$name] = $priority;
+
+ return true;
+}
+
+function elgg_remove_external_file_priority($name, $type) {
+ global $CONFIG;
+
+ if (!isset($CONFIG->externals_priorities)) {
+ $CONFIG->externals_priorities = array();
}
+
+ if (!isset($CONFIG->externals_priorities[$type])) {
+ $CONFIG->externals_priorities[$type] = array();
+ }
+
+ unset($CONFIG->externals_priorities[$type][$name]);
+
+ return true;
}
/**
@@ -394,13 +457,12 @@ function elgg_load_external_file($type, $name) {
function elgg_get_loaded_external_files($type, $location) {
global $CONFIG;
- if (isset($CONFIG->externals) && isset($CONFIG->externals[$type])) {
- $items = array_values($CONFIG->externals[$type]);
+ if (isset($CONFIG->externals) && $CONFIG->externals[$type] instanceof ElggPriorityList) {
+ $items = $CONFIG->externals[$type]->getElements();
$callback = "return \$v->loaded == true && \$v->location == '$location';";
$items = array_filter($items, create_function('$v', $callback));
if ($items) {
- usort($items, create_function('$a,$b','return $a->priority >= $b->priority;'));
array_walk($items, create_function('&$v,$k', '$v = $v->url;'));
}
return $items;