id, $object->repository); array_pop($breadcrumbs); $context = 'islandora'; drupal_alter('islandora_breadcrumbs', $breadcrumbs, $context, $object); return $breadcrumbs; } /** * Builds an array of drupal links for use in breadcrumbs. * * @todo Make fully recursive... * * @param string $pid * 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, FedoraRepository $repository, array &$context = NULL) { // Before executing the query, we have a base case of accessing the top-level // collection. if ($context === NULL) { $context['level'] = 10; } $root = variable_get('islandora_repository_pid', 'islandora:root'); if ($pid == $root) { $title = 'Islandora Repository'; $mlid = db_select('menu_links', 'ml') ->condition('ml.link_path', 'islandora') ->fields('ml', array('mlid')) ->execute() ->fetchField(); if ($mlid) { $link = menu_link_load($mlid); $title = (isset($link['title']) ? $link['title'] : $title); } return array( l(t('Home'), ''), l($title, 'islandora'), ); } else { $query = << PREFIX fedora-rels-ext: SELECT DISTINCT ?object ?label FROM <#ri> WHERE { ?collection_predicate ?object; ?label . ?object . !optionals !filters } !order EOQ; $query_optionals = (array) module_invoke('islandora_xacml_api', 'islandora_basic_collection_get_query_optionals', 'view'); $query_filters = (array) module_invoke('islandora_xacml_api', 'islandora_basic_collection_get_query_filters'); $filter_map = function ($filter) { return "FILTER($filter)"; }; $collection_predicate_filters = "sameTerm(?collection_predicate, )"; $collection_predicate_filters .= " || sameTerm(?collection_predicate, ) || sameTerm(?collection_predicate, )"; $query_filters[] = $collection_predicate_filters; $query_order = "ORDER BY DESC(?label)"; $query = format_string($query, array( '!optionals' => !empty($query_optionals) ? ('OPTIONAL {{' . implode('} UNION {', $query_optionals) . '}}') : '', '!filters' => implode(' ', array_map($filter_map, $query_filters)), '!order' => $query_order, )); $query = format_string($query, array( '!pid' => $pid, )); $results = $repository->ri->sparqlQuery($query, 'unlimited'); if (count($results) > 0 && $context['level'] > 0) { $parent = $results[0]['object']['value']; $this_label = $results[0]['label']['value']; if (empty($this_label)) { $this_label = t('-'); } $context['level']--; return array_merge(islandora_get_breadcrumbs_recursive($parent, $repository, $context), array( l($this_label, "islandora/object/$pid"), )); } else { // 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('...') ); } } }