diff --git a/modules/islandora_breadcrumbs/islandora_breadcrumbs.install b/modules/islandora_breadcrumbs/islandora_breadcrumbs.install
index 2c220801..2ca9ada6 100644
--- a/modules/islandora_breadcrumbs/islandora_breadcrumbs.install
+++ b/modules/islandora_breadcrumbs/islandora_breadcrumbs.install
@@ -15,4 +15,4 @@ function islandora_breadcrumbs_update_8001() {
$config->clear('referenceField');
$config->save();
return "Updated referenceFields config.";
-}
\ No newline at end of file
+}
diff --git a/modules/islandora_breadcrumbs/islandora_breadcrumbs.links.menu.yml b/modules/islandora_breadcrumbs/islandora_breadcrumbs.links.menu.yml
new file mode 100644
index 00000000..d198060b
--- /dev/null
+++ b/modules/islandora_breadcrumbs/islandora_breadcrumbs.links.menu.yml
@@ -0,0 +1,5 @@
+system.islandora_breadcrumbs_settings:
+ title: 'Breadcrumbs Settings'
+ parent: system.admin_config_islandora
+ route_name: system.islandora_breadcrumbs_settings
+ description: 'Configure Islandora breadcrumb settings'
\ No newline at end of file
diff --git a/modules/islandora_breadcrumbs/islandora_breadcrumbs.routing.yml b/modules/islandora_breadcrumbs/islandora_breadcrumbs.routing.yml
new file mode 100644
index 00000000..e9fd9ac1
--- /dev/null
+++ b/modules/islandora_breadcrumbs/islandora_breadcrumbs.routing.yml
@@ -0,0 +1,7 @@
+system.islandora_breadcrumbs_settings:
+ path: '/admin/config/islandora/breadcrumbs'
+ defaults:
+ _form: 'Drupal\islandora_breadcrumbs\Form\IslandoraBreadcrumbsSettingsForm'
+ _title: 'Islandora Breadcrumbs Settings'
+ requirements:
+ _permission: 'administer site configuration'
diff --git a/modules/islandora_breadcrumbs/src/Form/IslandoraBreadcrumbsSettingsForm.php b/modules/islandora_breadcrumbs/src/Form/IslandoraBreadcrumbsSettingsForm.php
new file mode 100644
index 00000000..bdaa84ef
--- /dev/null
+++ b/modules/islandora_breadcrumbs/src/Form/IslandoraBreadcrumbsSettingsForm.php
@@ -0,0 +1,132 @@
+config(static::SETTINGS);
+
+ $form['maxDepth'] = [
+ '#type' => 'number',
+ '#default_value' => $config->get('maxDepth'),
+ '#min' => -1,
+ '#step' => 1,
+ '#title' => $this->t('Maximum number of breadcrumbs'),
+ '#description' => $this->t("Stop adding parent references to the breadrumbs at this number of items. The default value, '-1' disables this feature."),
+ ];
+
+ $form['includeSelf'] = [
+ '#type' => 'checkbox',
+ '#title' => $this->t('Include the current node in the breadcrumbs?'),
+ '#default_value' => $config->get('includeSelf'),
+ ];
+
+ // Using the textarea instead of a select so the site maintainer can
+ // provide an ordered list of items rather than simply selecting from a
+ // list which enforces it's own order.
+ $form['referenceFields'] = [
+ '#type' => 'textarea',
+ '#title' => $this->t('Entity Reference fields to follow'),
+ '#default_value' => implode("\n", $config->get('referenceFields')),
+ '#description' => $this->t("Entity Reference field machine names to follow when building the breadcrumbs.
One per line.
Valid options: @options",
+ [
+ "@options" => implode(", ", static::getNodeEntityReferenceFields()),
+ ]
+ ),
+ '#element_validate' => [[get_class($this), 'validateReferenceFields']],
+
+ ];
+
+ return parent::buildForm($form, $form_state);
+ }
+
+ /**
+ * Returns a list of node entity reference field machine names.
+ *
+ * We use this for building the form field description and for
+ * validating the reference fields value.
+ */
+ protected static function getNodeEntityReferenceFields() {
+ return array_keys(\Drupal::service('entity_field.manager')->getFieldMapByFieldType('entity_reference')['node']);
+ }
+
+ /**
+ * Turns a text area into an array of values.
+ *
+ * Used for validating the field reference text area
+ * and saving the form state.
+ */
+ protected static function textToArray($string) {
+ return array_filter(array_map('trim', explode("\n", $string)), 'strlen');
+ }
+
+ /**
+ * Callback for settings form.
+ *
+ * @param array $element
+ * An associative array containing the properties and children of the
+ * generic form element.
+ * @param \Drupal\Core\Form\FormStateInterface $form_state
+ * The current state of the form for the form this element belongs to.
+ *
+ * @see \Drupal\Core\Render\Element\FormElement::processPattern()
+ */
+ public static function validateReferenceFields(array $element, FormStateInterface $form_state) {
+
+ $valid_fields = static::getNodeEntityReferenceFields();
+
+ foreach (static::textToArray($element['#value']) as $value) {
+ if (!in_array($value, $valid_fields)) {
+ $form_state->setError($element, t('"@field" is not a valid entity reference field!', ["@field" => $value]));
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function submitForm(array &$form, FormStateInterface $form_state) {
+ $this->configFactory->getEditable(static::SETTINGS)
+ ->set('referenceFields', static::textToArray($form_state->getValue('referenceFields')))
+ ->set('maxDepth', $form_state->getValue('maxDepth'))
+ ->set('includeSelf', $form_state->getValue('includeSelf'))
+ ->save();
+
+ parent::submitForm($form, $form_state);
+ }
+
+}
diff --git a/modules/islandora_breadcrumbs/src/IslandoraBreadcrumbBuilder.php b/modules/islandora_breadcrumbs/src/IslandoraBreadcrumbBuilder.php
index 23d3ff3c..d84b8c3c 100644
--- a/modules/islandora_breadcrumbs/src/IslandoraBreadcrumbBuilder.php
+++ b/modules/islandora_breadcrumbs/src/IslandoraBreadcrumbBuilder.php
@@ -64,7 +64,14 @@ class IslandoraBreadcrumbBuilder implements BreadcrumbBuilderInterface {
$nid = $attributes->getRawParameters()->get('node');
if (!empty($nid)) {
$node = $this->nodeStorage->load($nid);
- return (!empty($node) && $node->hasField($this->config->get('referenceField')));
+ if (empty($node)) {
+ return FALSE;
+ }
+ foreach ($this->config->get('referenceFields') as $field) {
+ if ($node->hasField($field)) {
+ return TRUE;
+ }
+ }
}
}
@@ -86,7 +93,7 @@ class IslandoraBreadcrumbBuilder implements BreadcrumbBuilderInterface {
return $link !== $nid;
});
if ($this->config->get('includeSelf')) {
- array_push($chain, $node);
+ array_push($chain, $nid);
}
$breadcrumb->addCacheableDependency($node);