diff --git a/includes/breadcrumb.inc b/includes/breadcrumb.inc index dd8544a8..6fdf9e4a 100644 --- a/includes/breadcrumb.inc +++ b/includes/breadcrumb.inc @@ -25,13 +25,8 @@ * drupal_set_breadcrumb(). */ function islandora_get_breadcrumbs($object) { - $breadcrumbs = array(); - islandora_get_breadcrumbs_recursive($object->id, $breadcrumbs, $object->repository); - if (isset($breadcrumbs[0])) { - // Remove the actual object. - unset($breadcrumbs[0]); - } - $breadcrumbs = array_reverse($breadcrumbs); + $breadcrumbs = islandora_get_breadcrumbs_recursive($object->id, $object->repository); + array_pop($breadcrumbs); return $breadcrumbs; } @@ -40,30 +35,32 @@ function islandora_get_breadcrumbs($object) { * * @todo Make fully recursive... * - * @todo Could use some clean up, can't be called multiple times safely due to - * the use of static variables. - * * @param string $pid - * THe object id whose parent will be fetched for the next link. - * @param array $breadcrumbs - * The list of existing bread-crumb links in reverse order. + * The object id whose parent will be fetched for the next link. * @param FedoraRepository $repository * The fedora repository. + * @param array $context + * An associative array of context for internal use when recursing. Currently + * only used to track a single value: + * - level: The number of child-parent relationships to follow. Defaults to + * 10. + * + * @return array + * An array of links representing the breadcrumb trail, "root" first. */ -function islandora_get_breadcrumbs_recursive($pid, array &$breadcrumbs, FedoraRepository $repository) { +function islandora_get_breadcrumbs_recursive($pid, FedoraRepository $repository, array &$context = NULL) { // Before executing the query, we have a base case of accessing the top-level // collection. - static $max_level = 10; - static $level = -1; - - if (count($breadcrumbs) === 0) { - $level = $max_level; + if ($context === NULL) { + $context['level'] = 10; } $root = variable_get('islandora_repository_pid', 'islandora:root'); if ($pid == $root) { - $breadcrumbs[] = l(menu_get_active_title(), 'islandora'); - $breadcrumbs[] = l(t('Home'), ''); + return array( + l(t('Home'), ''), + l(menu_get_active_title(), 'islandora'), + ); } else { $query_string = 'select $parentObject $title $content from <#ri> @@ -82,7 +79,7 @@ function islandora_get_breadcrumbs_recursive($pid, array &$breadcrumbs, FedoraRe order by $title desc'; $results = $repository->ri->itqlQuery($query_string); - if (count($results) > 0 && $level > 0) { + if (count($results) > 0 && $context['level'] > 0) { $parent = $results[0]['parentObject']['value']; $this_title = $results[0]['title']['value']; @@ -90,16 +87,23 @@ function islandora_get_breadcrumbs_recursive($pid, array &$breadcrumbs, FedoraRe $this_title = t('-'); } - $breadcrumbs[] = l($this_title, "islandora/object/$pid"); - - $level--; - islandora_get_breadcrumbs_recursive($parent, $breadcrumbs, $repository); + $context['level']--; + return array_merge( + islandora_get_breadcrumbs_recursive($parent, $repository, $context), + array( + l($this_title, "islandora/object/$pid"), + ) + ); } else { - // Add an non-link, as we don't know how to get back to the root. - $breadcrumbs[] = '...'; - // And render the last two links and break (on the next pass). - islandora_get_breadcrumbs_recursive($root, $breadcrumbs, $repository); + // Add an non-link, as we don't know how to get back to the root, and + // render the last two links and break (on the next pass). + return array_merge( + islandora_get_breadcrumbs_recursive($root, $repository, $context), + array( + '...', + ) + ); } } } diff --git a/islandora.api.php b/islandora.api.php index 5e976194..d1d58f4f 100644 --- a/islandora.api.php +++ b/islandora.api.php @@ -45,11 +45,24 @@ function hook_CMODEL_PID_islandora_view_object($object) { * @param FedoraObject $object * A Tuque FedoraObject being operated on. * @param array $rendered - * An arr of rendered views. + * The array of rendered views. */ function hook_islandora_view_object_alter(&$object, &$rendered) { } +/** + * Alter display output if the object has the given model. + * + * @see hook_islandora_view_object_alter() + * + * @param FedoraObject $object + * A Tuque FedoraObject being operated on. + * @param array $rendered + * The array of rendered views. + */ +function hook_CMODEL_PID_islandora_view_object_alter(&$object, &$rendered) { +} + /** * Generate an object's management display. * diff --git a/islandora.module b/islandora.module index d7ac4684..a4552379 100644 --- a/islandora.module +++ b/islandora.module @@ -676,7 +676,8 @@ function islandora_view_object(FedoraObject $object) { $page_number = (empty($_GET['page'])) ? '1' : $_GET['page']; $page_size = (empty($_GET['pagesize'])) ? '10' : $_GET['pagesize']; $output = array(); - foreach (islandora_build_hook_list(ISLANDORA_VIEW_HOOK, $object->models) as $hook) { + $hooks = islandora_build_hook_list(ISLANDORA_VIEW_HOOK, $object->models); + foreach ($hooks as $hook) { // @todo Remove page number and size from this hook, implementers of the // hook should use drupal page handling directly. $temp = module_invoke_all($hook, $object, $page_number, $page_size); @@ -689,7 +690,7 @@ function islandora_view_object(FedoraObject $object) { $output = islandora_default_islandora_view_object($object); } arsort($output); - drupal_alter(ISLANDORA_VIEW_HOOK, $object, $output); + drupal_alter($hooks, $object, $output); return implode('', $output); }