From 7201eca540ec8f9036e02d9b48d4c008d6b03f1a Mon Sep 17 00:00:00 2001
From: Gregor Gawol <gawol@ub.uni-leipzig.de>
Date: Mon, 29 Apr 2019 17:21:02 +0200
Subject: [PATCH] parent 8b696067d3684b2adfc3098588f61b061ced3f4a author Gregor
 Gawol <gawol@ub.uni-leipzig.de> 1556551262 +0200 committer Dorian Merz
 <merz@ub.uni-leipzig.de> 1558002326 +0200

refs #14878 [fid_bbi]  modified record detail view

* set kxp shard solr
* added module fid_bbi
* toggle isbn
* some translations
* link rvk-, bk- and ddc-notation
* changed tab order
* added permalink
* added publisher link
* added missing ini file
* deactivated fid core module
* fixed some vufind 5 bugs
---
 config/application.config.php                 |  16 +-
 fid_bbi/alpha/config/vufind/searches.ini      |   2 +-
 fid_bbi/config/vufind/finc-fid-core-api.ini   |   2 +
 fid_bbi/config/vufind/searches.ini            |  17 -
 fid_bbi/languages/de.ini                      |  10 +-
 fid_bbi/languages/en.ini                      |   6 +
 module/fid_bbi/Module.php                     |  92 +++
 module/fid_bbi/config/module.config.php       | 111 +++
 .../src/fid_bbi/RecordDriver/Factory.php      |   0
 .../Root/RecordDataFormatterFactory.php       | 715 ++++++++++++++++++
 .../RecordDriver/SolrDefault/core.phtml       |  56 ++
 .../RecordDriver/SolrDefault/data-isbn.phtml  |  20 +
 .../SolrDefault/data-publicationDetails.phtml |  27 +
 .../RecordDriver/SolrDefault/link-bk.phtml    |   1 +
 .../RecordDriver/SolrDefault/link-ddc.phtml   |   1 +
 .../SolrDefault/link-publisher.phtml          |   1 +
 .../RecordDriver/SolrDefault/toolbar.phtml    |  71 ++
 .../RecordDriver/SolrMarc/core.phtml          |  60 ++
 .../RecordDriver/SolrMarc/data-bk.phtml       |  10 +
 .../RecordDriver/SolrMarc/data-ddc.phtml      |  10 +
 .../RecordDriver/SolrMarc/data-rvk.phtml      |  10 +
 themes/fid_bbi/theme.config.php               |   6 +
 22 files changed, 1217 insertions(+), 27 deletions(-)
 create mode 100644 fid_bbi/config/vufind/finc-fid-core-api.ini
 create mode 100644 module/fid_bbi/Module.php
 create mode 100644 module/fid_bbi/config/module.config.php
 create mode 100644 module/fid_bbi/src/fid_bbi/RecordDriver/Factory.php
 create mode 100644 module/fid_bbi/src/fid_bbi/View/Helper/Root/RecordDataFormatterFactory.php
 create mode 100644 themes/fid_bbi/templates/RecordDriver/SolrDefault/core.phtml
 create mode 100644 themes/fid_bbi/templates/RecordDriver/SolrDefault/data-isbn.phtml
 create mode 100644 themes/fid_bbi/templates/RecordDriver/SolrDefault/data-publicationDetails.phtml
 create mode 100644 themes/fid_bbi/templates/RecordDriver/SolrDefault/link-bk.phtml
 create mode 100644 themes/fid_bbi/templates/RecordDriver/SolrDefault/link-ddc.phtml
 create mode 100644 themes/fid_bbi/templates/RecordDriver/SolrDefault/link-publisher.phtml
 create mode 100644 themes/fid_bbi/templates/RecordDriver/SolrDefault/toolbar.phtml
 create mode 100644 themes/fid_bbi/templates/RecordDriver/SolrMarc/core.phtml
 create mode 100644 themes/fid_bbi/templates/RecordDriver/SolrMarc/data-bk.phtml
 create mode 100644 themes/fid_bbi/templates/RecordDriver/SolrMarc/data-ddc.phtml
 create mode 100644 themes/fid_bbi/templates/RecordDriver/SolrMarc/data-rvk.phtml

diff --git a/config/application.config.php b/config/application.config.php
index c5548282a49..2958a246021 100644
--- a/config/application.config.php
+++ b/config/application.config.php
@@ -1,12 +1,10 @@
 <?php
 
 // Set up modules:
-$modules = [
-    'Zend\Form', 'Zend\Router', 'ZfcRbac',
-    'VuFindTheme', 'VuFindSearch', 'VuFind', 'VuFindAdmin', 'VuFindApi'
-];
-if (PHP_SAPI == 'cli' && APPLICATION_ENV !== 'testing') {
-    $modules[] = 'Zend\Mvc\Console';
+$modules = array(
+    'ZfcRbac', 'VuFindTheme', 'VuFindSearch', 'VuFind', 'VuFindAdmin', 'VuFindApi'
+);
+if (PHP_SAPI == 'cli' && !defined('VUFIND_PHPUNIT_RUNNING')) {
     $modules[] = 'VuFindConsole';
 }
 if (APPLICATION_ENV == 'development') {
@@ -21,6 +19,10 @@ if ($localModules = getenv('VUFIND_LOCAL_MODULES')) {
         }
     }
 }
+// Append custom modules.
+array_push($modules, ...[
+    'fid_bbi'
+]);
 
 /** Begin of temporarily necessary adjustments. */
 shell_exec('php devops/composer/themes.php');
@@ -31,7 +33,7 @@ array_push($modules, ...[
     'finc',
     'finc\VuFindHttpPsrCompat',
     'finc\SymfonySerializerZendBridge',
-    'finc\Fid\Core',
+//    'finc\Fid\Core',
 ]);
 /** End of temporarily necessary adjustments. */
 
diff --git a/fid_bbi/alpha/config/vufind/searches.ini b/fid_bbi/alpha/config/vufind/searches.ini
index 69edfb4bd11..ccbcfdbbc09 100644
--- a/fid_bbi/alpha/config/vufind/searches.ini
+++ b/fid_bbi/alpha/config/vufind/searches.ini
@@ -22,7 +22,7 @@ relative_path = ../../../config/vufind/searches.ini
 ;####################################################################
 
 [IndexShards]
-finc-live = 172.18.113.250:8080/solr/biblio
+finc-live = 172.18.113.26:8080/solr/biblio
 ;finc-nonlive = 172.18.113.250:8081/solr/biblio
 ;solr4entw = 172.18.85.142:8085/solr/biblio
 ;solr5entwickler = "172.18.85.142:8983/solr/biblio"
diff --git a/fid_bbi/config/vufind/finc-fid-core-api.ini b/fid_bbi/config/vufind/finc-fid-core-api.ini
new file mode 100644
index 00000000000..f6d95ea6ad5
--- /dev/null
+++ b/fid_bbi/config/vufind/finc-fid-core-api.ini
@@ -0,0 +1,2 @@
+[Client]
+baseUrl = http://172.18.113.133/fid-92a9e94c
\ No newline at end of file
diff --git a/fid_bbi/config/vufind/searches.ini b/fid_bbi/config/vufind/searches.ini
index e932bc94fcb..47e439b95ba 100644
--- a/fid_bbi/config/vufind/searches.ini
+++ b/fid_bbi/config/vufind/searches.ini
@@ -1,37 +1,20 @@
 ;####################################################################
-
 ;##################### DO NOT DELETE THIS HEADER ####################
-
 ;################### Leipzig University Library © 2015 ##############
-
 ;
-
 ; This is the default DEV-INI-file and inherits
-
 ; all the settings from the INI-file defined in [Parent_Config] which
-
 ; points to the default INI-file located in the folder vufind2/de_zwi2
-
 ;
-
 [Parent_Config]
-
 relative_path = ../../../local/config/vufind/searches.ini
-
 ; A comma-separated list of config sections from the parent which should be
-
 ; completely overwritten by the equivalent sections in this configuration;
-
 ; any sections not listed here will be merged on a section-by-section basis.
-
 ;override_full_sections = "Languages,AlphaBrowse_Types"
-
 ;
-
 ;       Add DEV-specific customization after this header.
-
 ;
-
 ;##################### DO NOT DELETE THIS HEADER ####################
 ;####################################################################
 
diff --git a/fid_bbi/languages/de.ini b/fid_bbi/languages/de.ini
index 03d48561dc2..8a8ff3b1377 100644
--- a/fid_bbi/languages/de.ini
+++ b/fid_bbi/languages/de.ini
@@ -1852,7 +1852,7 @@ Dates of publication = "Erscheinungsverlauf"
 external_access = "Dieser Titel ist verfügbar in"
 
 # 8918
-Authors/Corporations = "Personen und Körperschaften"
+Authors/Corporations = "verantwortlich"
 rda_original_title = "Werktitel"
 non_rda_original_title = "Originaltitel"
 
@@ -1875,4 +1875,10 @@ Subject Actor = "Motiv"
 Time of origin = "Entstehungszeit"
 
 ; #14758
-Login = "Mein BBI"
\ No newline at end of file
+Login = "Mein BBI"
+
+; #14878
+BK = "BK-Notation"
+DDC = "DDC-Notation"
+Holdings = "Verfügbarkeit"
+Permalink = "Permalink kopieren"
diff --git a/fid_bbi/languages/en.ini b/fid_bbi/languages/en.ini
index 9f3d7781855..bcdb215b5ce 100644
--- a/fid_bbi/languages/en.ini
+++ b/fid_bbi/languages/en.ini
@@ -1817,3 +1817,9 @@ Time of origin = "Time of origin"
 
 ; #14758
 Login = "My BBI"
+
+; #14878
+BK = "BK Notation"
+DDC = "DDC Notation"
+Holdings = "Availability"
+Permalink = "Copy Permalink"
diff --git a/module/fid_bbi/Module.php b/module/fid_bbi/Module.php
new file mode 100644
index 00000000000..32ed3793898
--- /dev/null
+++ b/module/fid_bbi/Module.php
@@ -0,0 +1,92 @@
+<?php
+/**
+ * Template for ZF2 module for storing local overrides.
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Leipzig University Library 2014.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * @category VuFind
+ * @package  Module
+ * @author   André Lahmann <lahmann@ub.uni-leipzig.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     https://github.com/dmj/vf2-proxy
+ */
+namespace fid_bbi;
+use Zend\ModuleManager\ModuleManager,
+    Zend\Mvc\MvcEvent;
+
+/**
+ * Template for ZF2 module for storing local overrides.
+ *
+ * @category VuFind
+ * @package  Module
+ * @author   André Lahmann <lahmann@ub.uni-leipzig.de>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     https://github.com/dmj/vf2-proxy
+ */
+class Module
+{
+    /**
+     * Get module configuration
+     *
+     * @return array
+     */
+    public function getConfig()
+    {
+        return include __DIR__ . '/config/module.config.php';
+    }
+
+    /**
+     * Get autoloader configuration
+     *
+     * @return array
+     */
+    public function getAutoloaderConfig()
+    {
+        return [
+            'Zend\Loader\StandardAutoloader' => [
+                'namespaces' => [
+                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
+                ],
+            ],
+        ];
+    }
+
+    /**
+     * Initialize the module
+     *
+     * @param ModuleManager $m Module manager
+     *
+     * @return void
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function init(ModuleManager $m)
+    {
+    }
+
+    /**
+     * Bootstrap the module
+     *
+     * @param MvcEvent $e Event
+     *
+     * @return void
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function onBootstrap(MvcEvent $e)
+    {
+    }
+}
diff --git a/module/fid_bbi/config/module.config.php b/module/fid_bbi/config/module.config.php
new file mode 100644
index 00000000000..054e266e438
--- /dev/null
+++ b/module/fid_bbi/config/module.config.php
@@ -0,0 +1,111 @@
+<?php
+namespace fid_bbi\Module\Configuration;
+
+$config = [
+    'vufind' => [
+        'plugin_managers' => [
+            'recorddriver' => [
+                'factories' => [
+                    'solrdefault' => 'finc\RecordDriver\Factory::getSolrDefault',
+                    'solrmarc' => 'finc\RecordDriver\Factory::getSolrMarc',
+                    'solrmarcfinc' => 'finc\RecordDriver\Factory::getSolrMarcFinc',
+                    'solrmarcfincpda' => 'finc\RecordDriver\Factory::getSolrMarcFincPDA',
+                    'solrmarcremote' => 'finc\RecordDriver\Factory::getSolrMarcRemote',
+                    'solrmarcremotefinc' => 'finc\RecordDriver\Factory::getSolrMarcRemoteFinc',
+                    'solrai' => 'finc\RecordDriver\Factory::getSolrAI',
+                    'solris' => 'finc\RecordDriver\Factory::getSolrIS',
+                    'solrlido' => 'finc\RecordDriver\Factory::getSolrLido',
+                    'solrlidondl' => 'finc\RecordDriver\Factory::getSolrLidoNdl'
+                ],
+            ],
+            'recordtab' => [
+                'factories' => [
+                    'hierarchytree' => 'finc\RecordTab\Factory::getHierarchyTree',
+                ],
+                'invokables' => [
+                    'staffviewai' => 'finc\RecordTab\StaffViewAI',
+                    'acquisitionpda' => 'finc\RecordTab\AcquisitionPDA',
+                    'topics' => 'finc\RecordTab\Topics',
+                    'descriptionlido' => 'finc\RecordTab\DescriptionLido'
+                ],
+            ],
+        ],
+        'recorddriver_tabs' => [
+            'finc\RecordDriver\SolrDefault' => [
+                'tabs' => [
+                    'Description' => 'Description', 'Holdings' => 'HoldingsILS',
+                    'TOC' => 'TOC', 'UserComments' => 'UserComments',
+                    'Reviews' => 'Reviews', 'Excerpt' => 'Excerpt',
+                    'Preview' => 'preview',
+                    'HierarchyTree' => 'HierarchyTree', 'Map' => 'Map',
+                    'Similar' => null,
+                    'Details' => 'StaffViewArray',
+                ],
+                'defaultTab' => null,
+            ],
+            'fid_bbi\RecordDriver\SolrMarcFinc' => [
+                'tabs' => [
+                    'Description' => 'Description', 'Holdings' => 'HoldingsILS',
+                    'TOC' => 'TOC', 'UserComments' => 'UserComments',
+                    'Reviews' => 'Reviews', 'Excerpt' => 'Excerpt',
+                    'Preview' => 'preview',
+                    'HierarchyTree' => 'HierarchyTree', 'Map' => 'Map',
+                    'Similar' => null,
+                    'Details' => 'StaffViewMARC',
+                ],
+                'defaultTab' => null,
+            ],
+            'finc\RecordDriver\SolrAI' => [
+                'tabs' => [
+                    'Description' => 'Description', 'Holdings' => 'HoldingsILS',
+                    'TOC' => 'TOC', 'UserComments' => 'UserComments',
+                    'Reviews' => 'Reviews', 'Excerpt' => 'Excerpt',
+                    'Preview' => 'preview',
+                    'HierarchyTree' => 'HierarchyTree', 'Map' => 'Map',
+                    'Similar' => null,
+                    'Details' => 'StaffViewAI',
+                ],
+                'defaultTab' => null,
+            ],
+        ],
+        'recorddriver_collection_tabs' => [
+            'VuFind\RecordDriver\AbstractBase' => [
+                'tabs' => [
+                    'CollectionList' => 'CollectionList',
+                    'HierarchyTree' => 'CollectionHierarchyTree',
+                    'Details' => 'StaffViewArray',
+                ],
+                'defaultTab' => null,
+            ],
+        ],
+    ],
+];
+
+$nonTabRecordActions = [
+    'PDA', 'EmailHold', 'ReportErrors'
+];
+
+
+// Define record view routes -- route name => controller
+// Define record view routes once again to add new nonTabRecordActions
+$recordRoutes = [
+    'record' => 'Record',
+    'export' => 'Export',
+    'resources' => 'Resources'
+];
+
+
+// Define static routes -- Controller/Action strings
+$staticRoutes = [
+    'MyResearch/Acquisition',
+    'MyResearch/ResetPassword',
+    'dds/Home',
+    'dds/Email',
+    'Record/EblLink'
+];
+
+$routeGenerator = new \VuFind\Route\RouteGenerator($nonTabRecordActions);
+$routeGenerator->addRecordRoutes($config, $recordRoutes);
+$routeGenerator->addStaticRoutes($config, $staticRoutes);
+
+return $config;
diff --git a/module/fid_bbi/src/fid_bbi/RecordDriver/Factory.php b/module/fid_bbi/src/fid_bbi/RecordDriver/Factory.php
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/module/fid_bbi/src/fid_bbi/View/Helper/Root/RecordDataFormatterFactory.php b/module/fid_bbi/src/fid_bbi/View/Helper/Root/RecordDataFormatterFactory.php
new file mode 100644
index 00000000000..8316f8f0668
--- /dev/null
+++ b/module/fid_bbi/src/fid_bbi/View/Helper/Root/RecordDataFormatterFactory.php
@@ -0,0 +1,715 @@
+<?php
+/**
+ * Factory for record driver data formatting view helper
+ *
+ * PHP version 5
+ *
+ * Copyright (C) Villanova University 2016.
+ * Copyright (C) The National Library of Finland 2017.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * @category VuFind
+ * @package  View_Helpers
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @author   Konsta Raunio <konsta.raunio@helsinki.fi>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     https://vufind.org/wiki/development:architecture:record_data_formatter
+ * Wiki
+ */
+namespace fid_bbi\View\Helper\Root;
+
+use VuFind\View\Helper\Root\RecordDataFormatter;
+
+/**
+ * Factory for record driver data formatting view helper
+ *
+ * @category VuFind
+ * @package  View_Helpers
+ * @author   Demian Katz <demian.katz@villanova.edu>
+ * @author   Konsta Raunio <konsta.raunio@helsinki.fi>
+ * @license  http://opensource.org/licenses/gpl-2.0.php GNU General Public License
+ * @link     https://vufind.org/wiki/development:architecture:record_data_formatter
+ * Wiki
+ */
+class RecordDataFormatterFactory
+{
+    /**
+     * Create the helper.
+     *
+     * @return RecordDataFormatter
+     */
+    public function __invoke()
+    {
+        $helper = new RecordDataFormatter();
+
+        $helper->setDefaults(
+            'collection-info', [$this, 'getDefaultCollectionInfoSpecs']
+        );
+        $helper->setDefaults(
+            'collection-record', [$this, 'getDefaultCollectionRecordSpecs']
+        );
+        $helper->setDefaults('core', [$this, 'getDefaultCoreSpecs']);
+        $helper->setDefaults(
+            'description', [$this, 'getDefaultDescriptionSpecs']
+        );
+
+        $helper->setDefaults('core-ai', [$this, 'getAiCoreSpecs']);
+
+        $helper->setDefaults('core-lido', [$this, 'getLidoCoreSpecs']);
+        $helper->setDefaults(
+            'description-lido', [$this, 'getLidoDescriptionSpecs']
+        );
+
+        $helper->setDefaults('core-marc', [$this, 'getMarcCoreSpecs']);
+        return $helper;
+    }
+
+    /**
+     * Get default specifications for displaying data in core metadata.
+     *
+     * @return array
+     */
+    public function getAiCoreSpecs()
+    {
+        $spec = new RecordDataFormatter\SpecBuilder();
+        $spec->setTemplateLine(
+            'Journal Title', 'getContainerTitle', 'data-containerTitle.phtml'
+        );
+        $spec->setTemplateLine(
+            'Authors/Corporations',
+            'getDeduplicatedAuthors',
+            'data-authors.phtml',
+            [
+                'useCache' => true,
+                'context' => [
+                    'requiredDataFields' => [
+                        ['name' => 'role', 'prefix' => 'CreatorRoles::']
+                    ]
+                ]
+            ]
+        );
+        $spec->setLine(
+            'Edition', 'getEdition', null,
+            ['prefix' => '<span property="bookEdition">', 'suffix' => '</span>']
+        );
+        $spec->setTemplateLine(
+            'In',
+            'getJTitle',
+            'data-jTitle.phtml'
+        );
+        $spec->setLine(
+            'Format', 'getFormats', 'RecordHelper',
+            ['helperMethod' => 'getFormatList']
+        );
+        $spec->setTemplateLine(
+            'Language', 'getLanguages', 'data-transEscCommaSepLang.phtml'
+        );
+        $spec->setTemplateLine(
+            'Published',
+            'getPublicationDetails',
+            'data-publicationDetails.phtml'
+        );
+        $spec->setLine(
+            'Series', 'getSeries', null, ['recordLink' => 'series']
+        );
+        $spec->setTemplateLine(
+            'Subjects', 'getAllSubjectHeadings', 'data-allSubjectHeadings.phtml'
+        );
+        $spec->setTemplateLine(
+            'child_records', 'getChildRecordCount', 'data-childRecords.phtml',
+            ['allowZero' => false]
+        );
+        /* finc: remove 'Online Access' in record-details #13770 - VE */
+        /* $spec->setTemplateLine('Online Access', true, 'data-onlineAccess.phtml'); */
+        $spec->setTemplateLine(
+            'Related Items', 'getAllRecordLinks', 'data-allRecordLinks.phtml'
+        );
+        $spec->setTemplateLine('Tags', true, 'data-tags.phtml');
+        return $spec->getArray();
+    }
+
+    /**
+     * Get default specifications for displaying data in collection-info metadata.
+     *
+     * @return array
+     */
+    public function getDefaultCollectionInfoSpecs()
+    {
+        $spec = new RecordDataFormatter\SpecBuilder();
+        $spec->setTemplateLine(
+            'Title', 'getTitleDetails', 'data-titleDetails.phtml'
+        );
+        $spec->setTemplateLine(
+            'Authors/Corporations',
+            'getDeduplicatedAuthors',
+            'data-authors.phtml',
+            [
+                'useCache' => true,
+                'context' => [
+                    'requiredDataFields' => [
+                        ['name' => 'role', 'prefix' => 'CreatorRoles::']
+                    ]
+                ]
+            ]
+        );
+        $spec->setTemplateLine(
+            'Dates of publication', 'getDateSpan', 'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Summary', 'getSummary', 'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Published', 'getPublicationDetails', 'data-publicationDetails.phtml'
+        );
+        $spec->setLine(
+            'Edition', 'getEdition', null,
+            ['prefix' => '<span property="bookEdition">', 'suffix' => '</span>']
+        );
+        $spec->setTemplateLine(
+            'Subjects', 'getAllSubjectHeadings', 'data-allSubjectHeadings.phtml'
+        );
+        /* finc: remove 'Online Access' in record-details #13770 - VE */
+        /* $spec->setTemplateLine('Online Access', true, 'data-onlineAccess.phtml'); */
+        $spec->setTemplateLine(
+            'Item Description', 'getGeneralNotes', 'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Production Credits',
+            'getProductionCredits',
+            'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Set Multipart',
+            'getHierarchyParentTitle',
+            'data-hierarchyParentTitle.phtml'
+        );
+        $spec->setTemplateLine(
+            'ISBN', 'getISBNs', 'data-isbn.phtml'
+        );
+        $spec->setTemplateLine(
+            'ISSN', 'getISSNs', 'data-issn.phtml'
+        );
+        $spec->setTemplateLine(
+            'Notes',
+            'getAdditionalNotes',
+            'data-escapeHtml.phtml',
+            [
+                'useCache' => true
+            ]
+        );
+        $spec->setLine(
+            'Format', 'getFormats', 'RecordHelper',
+            ['helperMethod' => 'getFormatList']
+        );
+        $spec->setTemplateLine(
+            'Language', 'getLanguages', 'data-transEscCommaSepLang.phtml'
+        );
+        $spec->setTemplateLine(
+            'Additionals',
+            'getAdditionals',
+            'data-additionals.phtml',
+            [
+                'labelFunction' => function() { return null; }
+            ]
+        );
+        return $spec->getArray();
+    }
+
+    /**
+     * Get default specifications for displaying data in collection-record metadata.
+     *
+     * @return array
+     */
+    public function getDefaultCollectionRecordSpecs()
+    {
+        $spec = new RecordDataFormatter\SpecBuilder();
+        $spec->setLine('Summary', 'getSummary');
+        $spec->setTemplateLine(
+            'Authors/Corporations',
+            'getDeduplicatedAuthors',
+            'data-authors.phtml',
+            [
+                'useCache' => true,
+                'context' => [
+                    'requiredDataFields' => [
+                        ['name' => 'role', 'prefix' => 'CreatorRoles::']
+                    ]
+                ]
+            ]
+        );
+        $spec->setTemplateLine(
+            'Language', 'getLanguages', 'data-transEscCommaSepLang.phtml'
+        );
+        $spec->setLine(
+            'Format', 'getFormats', 'RecordHelper',
+            ['helperMethod' => 'getFormatList']
+        );
+        $spec->setTemplateLine(
+            'Access', 'getAccessRestrictions', 'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Related Items', 'getRelationshipNotes', 'data-escapeHtml.phtml'
+        );
+        return $spec->getArray();
+    }
+
+    /**
+     * Get default specifications for displaying data in core metadata.
+     *
+     * @return array
+     */
+    public function getDefaultCoreSpecs()
+    {
+        $spec = new RecordDataFormatter\SpecBuilder();
+        $spec->setTemplateLine(
+            'Published in', 'getContainerTitle', 'data-containerTitle.phtml'
+        );
+        $spec->setLine(
+            'New Title', 'getNewerTitles', null, ['recordLink' => 'title']
+        );
+        $spec->setLine(
+            'Previous Title', 'getPreviousTitles', null, ['recordLink' => 'title']
+        );
+        $spec->setTemplateLine(
+            'Title', 'getTitleDetails', 'data-titleDetails.phtml'
+        );
+        $spec->setTemplateLine(
+            'Authors/Corporations', 'getDeduplicatedAuthors', 'data-authors.phtml',
+            [
+                'useCache' => true,
+                'context' => [
+                    'requiredDataFields' => [
+                        ['name' => 'role', 'prefix' => 'CreatorRoles::']
+                    ]
+                ]
+            ]
+        );
+        $spec->setTemplateLine(
+            'Title Uniform', 'getTitleUniform', 'data-titleUniform.phtml',
+            [
+                'labelFunction' => function() { return null; }
+            ]
+        );
+        $spec->setLine(
+            'Edition', 'getEdition', null,
+            ['prefix' => '<span property="bookEdition">', 'suffix' => '</span>']
+        );
+        $spec->setLine(
+            'Dissertation Note',
+            'getDissertationNote',
+            'data-escapeHtmlCommaSep.phtml'
+        );
+        $spec->setLine(
+            'Format', 'getFormats', 'RecordHelper',
+            ['helperMethod' => 'getFormatList']
+        );
+        $spec->setTemplateLine(
+            'Language', 'getLanguages', 'data-transEscCommaSepLang.phtml'
+        );
+        $spec->setTemplateLine(
+            'Published',
+            'getPublicationDetails',
+            'data-publicationDetails.phtml'
+        );
+        $spec->setTemplateLine(
+            'Set Multipart',
+            'getHierarchyParentTitle',
+            'data-hierarchyParentTitle.phtml'
+        );
+        $spec->setTemplateLine(
+            'Subjects', 'getAllSubjectHeadings', 'data-allSubjectHeadings.phtml'
+        );
+        $spec->setTemplateLine(
+            'child_records', 'getChildRecordCount', 'data-childRecords.phtml',
+            ['allowZero' => false]
+        );
+        /* finc: remove 'Online Access' in record-details #13770 - VE */
+        /* $spec->setTemplateLine('Online Access', true, 'data-onlineAccess.phtml'); */
+        $spec->setTemplateLine(
+            'Related Items', 'getAllRecordLinks', 'data-allRecordLinks.phtml'
+        );
+        $spec->setTemplateLine(
+            'Additionals',
+            'getAdditionals',
+            'data-additionals.phtml',
+            [
+                'labelFunction' => function() { return null; }
+            ]
+        );
+        $spec->setTemplateLine(
+            'Source',
+            'getMegaCollection',
+            'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            null,
+            'getOtherRelationshipEntry',
+            'data-otherRelationshipEntry.phtml',
+            [
+
+            ]
+        );
+        $spec->setTemplateLine(
+            'Notes',
+            'getAdditionalNotes',
+            'data-escapeHtml.phtml',
+            [
+                'useCache' => true
+            ]
+        );
+        $spec->setTemplateLine('Tags', true, 'data-tags.phtml');
+        return $spec->getArray();
+    }
+
+    /**
+     * Get default specifications for displaying data in the description tab.
+     *
+     * @return array
+     */
+    public function getDefaultDescriptionSpecs()
+    {
+        $spec = new RecordDataFormatter\SpecBuilder();
+        $spec->setTemplateLine(
+            'Summary', 'getSummary', 'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Dates of publication', 'getDateSpan', 'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Item Description', 'getGeneralNotes', 'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Physical Description',
+            'getPhysicalDescriptions',
+            'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Publication Frequency',
+            'getPublicationFrequency',
+            'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Playing Time', 'getPlayingTimes', 'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Format', 'getSystemDetails', 'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Audience', 'getTargetAudienceNotes', 'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Awards', 'getAwards', 'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Production Credits',
+            'getProductionCredits',
+            'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Language', 'getLanguages', 'data-transEscCommaSepLang.phtml'
+        );
+        $spec->setTemplateLine(
+            'Subjects', 'getAllSubjectHeadings', 'data-allSubjectHeadings.phtml'
+        );
+        $spec->setTemplateLine(
+            'RVK', 'getRVK', 'data-rvk.phtml'
+        );
+        $spec->setTemplateLine(
+            'BK', 'getBK', 'data-bk.phtml'
+        );
+        $spec->setTemplateLine(
+            'DDC', 'getDDC', 'data-ddc.phtml'
+        );
+        $spec->setTemplateLine(
+            'Bibliography', 'getBibliographyNotes', 'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'ISBN', 'getISBNs', 'data-isbn.phtml'
+        );
+        $spec->setTemplateLine(
+            'ISSN', 'getISSNs', 'data-issn.phtml'
+        );
+        $spec->setTemplateLine(
+            'DOI', 'getCleanDOI', 'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'EISSN', 'getEISSNs', 'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Related Items', 'getRelationshipNotes', 'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Access', 'getAccessRestrictions', 'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Finding Aid', 'getFindingAids', 'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Publication_Place',
+            'getHierarchicalPlaceNames',
+            'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine(
+            'Author Notes', true, 'data-authorNotes.phtml'
+        );
+        $spec->setTemplateLine(
+            'Call Number',
+            'getLocalSignature',
+            'data-localSignature.phtml'
+        );
+        $spec->setTemplateLine(
+            'Notes',
+            'getAdditionalNotes',
+            'data-escapeHtml.phtml',
+            [
+                'useCache' => true
+            ]
+        );
+        return $spec->getArray();
+    }
+
+    /**
+     * Get default specifications for displaying data in collection-info metadata.
+     *
+     * @return array
+     */
+    public function getLidoCoreSpecs()
+    {
+        $spec = new RecordDataFormatter\SpecBuilder();
+        $spec->setTemplateLine(
+            'Originators', 'getDeduplicatedAuthors', 'data-authors.phtml',
+            [
+                'useCache' => true,
+                'labelFunction' => function ($data) {
+                    return count($data['main']) > 1
+                        ? 'Originators' : 'Originator';
+                },
+                'context' => [
+                    'type' => 'main',
+                    'schemaLabel' => 'author',
+                    'requiredDataFields' => [
+                        ['name' => 'role', 'prefix' => 'CreatorRoles::']
+                    ]
+                ],
+            ]
+        );
+        $spec->setTemplateLine(
+            'Corporate Originator', 'getDeduplicatedAuthors', 'data-authors.phtml',
+            [
+                'useCache' => true,
+                'labelFunction' => function ($data) {
+                    return count($data['corporate']) > 1
+                        ? 'Corporate Originators' : 'Corporate Originator';
+                },
+                'context' => [
+                    'type' => 'corporate',
+                    'schemaLabel' => 'creator',
+                    'requiredDataFields' => [
+                        ['name' => 'role', 'prefix' => 'CreatorRoles::']
+                    ]
+                ],
+            ]
+        );
+        $spec->setTemplateLine(
+            'Other Originators', 'getDeduplicatedAuthors', 'data-authors.phtml',
+            [
+                'useCache' => true,
+                'context' => [
+                    'type' => 'secondary',
+                    'schemaLabel' => 'contributor',
+                    'requiredDataFields' => [
+                        ['name' => 'role', 'prefix' => 'CreatorRoles::']
+                    ]
+                ],
+            ]
+        );
+        $spec->setTemplateLine(
+            'Subject Detail', 'getSubjectDetails', 'data-escapeHtml.phtml',
+            [
+                'context' => ['class' => 'recordSubjects']
+            ]
+        );
+        $spec->setTemplateLine(
+            'Subject Place', 'getSubjectPlaces', 'data-escapeHtml.phtml',
+            [
+                'context' => ['class' => 'recordSubjects']
+            ]
+        );
+        $spec->setTemplateLine(
+            'Subject Date', 'getSubjectDates', 'data-escapeHtml.phtml',
+            [
+                'context' => ['class' => 'recordSubjects']
+            ]
+        );
+
+        $spec->setTemplateLine(
+            'Subject Actor', 'getSubjectActors', 'data-escapeHtml.phtml',
+            [
+                'context' => ['class' => 'recordSubjects']
+            ]
+        );
+        $spec->setTemplateLine(
+            'Institution', 'getInstitutions', 'data-institutions.phtml',
+            [
+                'context' => ['class' => 'recordInstitution']
+            ]
+        );
+        $spec->setTemplateLine(
+            'Inventory ID', 'getIdentifier', 'data-escapeHtml.phtml',
+            [
+                'context' => ['class' => 'recordIdentifier']
+            ]
+        );
+        $spec->setTemplateLine(
+            'Inventory ID', 'getIdentifier', 'data-escapeHtml.phtml',
+            [
+                'context' => ['class' => 'recordIdentifier']
+            ]
+        );
+        $spec->setTemplateLine(
+            'Measurements', 'getMeasurements', 'data-escapeHtml.phtml',
+            [
+                'context' => ['class' => 'recordMeasurements']
+            ]
+        );
+        $spec->setTemplateLine(
+            'Measurements',
+            'getMeasurementsDescription',
+            'data-escapeHtml.phtml',
+            [
+                'context' => ['class' => 'recordMeasurements']
+            ]
+        );
+        $spec->setTemplateLine(
+            'Collection', 'getCollections', 'data-escapeHtml.phtml',
+            [
+                'context' => ['class' => 'recordCollection']
+            ]
+        );
+        $spec->setLine(
+            'Object type', 'getFormats', 'RecordHelper',
+            ['helperMethod' => 'getFormatList']
+        );
+        $spec->setTemplateLine(
+            'Other Classification',
+            'getFormatClassifications',
+            'data-escapeHtml.phtml',
+            [
+                'context' => ['class' => 'recordClassifications']
+            ]
+        );
+        $spec->setTemplateLine(
+            'Other ID', 'getLocalIdentifiers', 'data-escapeHtml.phtml',
+            [
+                'context' => ['class' => 'recordIdentifiers']
+            ]
+        );
+        $spec->setTemplateLine(
+            'Events', true, 'data-events.phtml',
+            [
+                'labelFunction' => function() { return null; }
+            ]
+        );
+        // , context: "recordEvents"
+        $spec->setTemplateLine(
+            'Language', 'getLanguages','data-transEscCommaSepLang.phtml'
+        );
+        $spec->setTemplateLine(
+            'Time of origin', 'getDateSpan', 'data-dateSpan.phtml'
+        );
+        $spec->setTemplateLine('Edition', 'getEdition', 'data-escapeHtml.phtml',
+            [
+                'prefix' => '<span property="bookEdition">',
+                'suffix' => '</span>'
+            ]
+        );
+        $spec->setTemplateLine(
+            'Subjects', 'getAllSubjectHeadings', 'data-allSubjectHeadings.phtml'
+        );
+        /* finc: remove 'Online Access' in record-details #13770 -VE */
+        /* $spec->setTemplateLine('Online Access', true, 'data-onlineAccess.phtml'); */
+        $spec->setTemplateLine(
+            'Related Items', 'getAllRecordLinks', 'data-allRecordLinks.phtml'
+        );
+        return $spec->getArray();
+    }
+
+    /**
+     * Get default specifications for displaying data in collection-record metadata.
+     *
+     * @return array
+     */
+    public function getLidoDescriptionSpecs()
+    {
+        $spec = new RecordDataFormatter\SpecBuilder();
+        $spec->setTemplateLine(
+            'Time of origin', 'getDateSpan', 'data-dateSpan.phtml'
+        );
+        $spec->setTemplateLine(
+            'Access', 'getAccessNote','data-accessNote.phtml'
+        );
+        return $spec->getArray();
+    }
+
+    /**
+     * Get marc specifications for displaying data in core metadata.
+     *
+     * @return array
+     */
+    public function getMarcCoreSpecs()
+    {
+        $spec = new RecordDataFormatter\SpecBuilder();
+        $spec->setTemplateLine(
+            'Title', 'getTitleDetails', 'data-titleDetails.phtml'
+        );
+        $spec->setTemplateLine(
+            'Title Uniform', 'getTitleUniform', 'data-titleUniform.phtml',
+            [
+                'labelFunction' => function() { return null; }
+            ]
+        );
+        $spec->setTemplateLine(
+            'Authors/Corporations',
+            'getDeduplicatedAuthors',
+            'data-authors.phtml',
+            [
+                'useCache' => true,
+                'context' => [
+                    'requiredDataFields' => [
+                        ['name' => 'role', 'prefix' => 'CreatorRoles::']
+                    ]
+                ]
+            ]
+        );
+        $spec->setTemplateLine(
+            'Published',
+            'getPublicationDetails',
+            'data-publicationDetails.phtml'
+        );
+        $spec->setLine(
+            'Format', 'getFormats', 'RecordHelper',
+            ['helperMethod' => 'getFormatList']
+        );
+        $spec->setTemplateLine(
+            'Source',
+            'getMegaCollection',
+            'data-escapeHtml.phtml'
+        );
+        $spec->setTemplateLine('Tags', true, 'data-tags.phtml');
+        return $spec->getArray();
+    }
+
+
+}
diff --git a/themes/fid_bbi/templates/RecordDriver/SolrDefault/core.phtml b/themes/fid_bbi/templates/RecordDriver/SolrDefault/core.phtml
new file mode 100644
index 00000000000..abab08107c9
--- /dev/null
+++ b/themes/fid_bbi/templates/RecordDriver/SolrDefault/core.phtml
@@ -0,0 +1,56 @@
+<!-- finc: RecordDriver - solrDefault - core -->
+<div class="media" vocab="http://schema.org/" resource="#record" typeof="<?=$this->driver->getSchemaOrgFormats()?> Product">
+  <?
+  $QRCode = $this->record($this->driver)->getQRCode("core");
+  $coverDetails = $this->record($this->driver)->getCoverDetails('core', 'medium', $this->record($this->driver)->getThumbnail('large'));
+  $cover = $coverDetails['html'];
+  $preview = $this->record($this->driver)->getPreviews();
+  ?>
+  <? if ($QRCode || $cover || $preview): ?>
+  <div class="media-left <?=$this->escapeHtmlAttr($coverDetails['size'])?> img-col">
+    <? /* #14878: remove cover - GG */ ?>
+  </div>
+  <? endif; ?>
+  <div class="media-body">
+
+    <? /* finc: We want to get rid of trailing special chars in the title and limit its length to 100 chars
+          remove schema name tag here but keept in description, CK
+       */
+    ?>
+      <? /* finc: add schema tags for title #13850 - VE */ ?>
+      <h3 property="name"><?=$this->escapeHtml(preg_replace('/(\s[\/\.:]\s*)*$/', '', $this->truncate($this->driver->getShortTitle() . ' ' . $this->driver->getSubtitle() . ' ' . $this->driver->getTitleSection(), 100)))?></h3>
+
+    <? $summary = $this->driver->getSummary(); $summary = isset($summary[0]) ? $this->escapeHtml($summary[0]) : false; ?>
+    <? if ($summary): ?>
+      <p><?=$this->truncate($summary, 300)?></p>
+
+      <? if(strlen($summary) > 300): ?>
+        <p><a href='<?=$this->recordLink()->getTabUrl($this->driver, 'Description')?>#tabnav'><?=$this->transEsc('Full description')?></a></p>
+      <? endif; ?>
+    <? endif; ?>
+
+    <? if ($this->userlist()->getMode() !== 'disabled'): ?>
+      <? /* Display the lists that this record is saved to */ ?>
+      <div class="savedLists hidden alert alert-info">
+        <strong><?=$this->transEsc("Saved in")?>:</strong>
+      </div>
+    <? endif; ?>
+
+    <?/* Display Main Details */?>
+    <?
+    $formatter = $this->recordDataFormatter();
+    $coreFields = $formatter->getData($driver, $formatter->getDefaults('core'));
+    ?>
+    <? if (!empty($coreFields)): ?>
+      <table class="table table-striped">
+        <? /* Table summary not supported in html 5, finc-specific solution, CK */ ?>
+        <caption class="sr-only"><?=$this->transEsc('Bibliographic Details')?></caption>
+        <? foreach ($coreFields as $key => $current): ?>
+          <tr><th><?=$this->transEsc($key)?>:</th><td><?=$current['value']?></td></tr>
+         <? endforeach; ?>
+      </table>
+    <? endif; ?>
+    <?/* End Main Details */?>
+  </div>
+</div>
+<!-- finc: RecordDriver - solrDefault - core - END -->
diff --git a/themes/fid_bbi/templates/RecordDriver/SolrDefault/data-isbn.phtml b/themes/fid_bbi/templates/RecordDriver/SolrDefault/data-isbn.phtml
new file mode 100644
index 00000000000..58012798d36
--- /dev/null
+++ b/themes/fid_bbi/templates/RecordDriver/SolrDefault/data-isbn.phtml
@@ -0,0 +1,20 @@
+<!-- fid_bbi: RecordDriver - SolrDefault - data-isbn -->
+<? if (!empty($data)): ?>
+<? if (is_array($data)): ?>
+        <span property="isbn">
+            <? if (count($data) > 0): ?>
+                <?=$this->escapeHtml($data[0])?>
+                <? if (count($data) > 1): ?> ;
+                    <a class="isbn-toggle" data-toggle="collapse" data-target="#isbn-toggle">...</a>
+                    <div id="isbn-toggle" class="collapse">
+                        <? unset($data[0]); ?>
+                        <?=implode('<br/>', array_map(array($this, 'escapeHtml'), $data))?>
+                    </div>
+                <? endif; ?>
+            <? endif; ?>
+        </span>
+<? else: ?>
+<?=$this->escapeHtml($data)?>
+<? endif; ?>
+<? endif; ?>
+<!-- fid_bbi: RecordDriver - SolrDefault - data-isbn - END -->
diff --git a/themes/fid_bbi/templates/RecordDriver/SolrDefault/data-publicationDetails.phtml b/themes/fid_bbi/templates/RecordDriver/SolrDefault/data-publicationDetails.phtml
new file mode 100644
index 00000000000..785286d965d
--- /dev/null
+++ b/themes/fid_bbi/templates/RecordDriver/SolrDefault/data-publicationDetails.phtml
@@ -0,0 +1,27 @@
+<!-- fid_bbi: RecordDriver - solrDefault - data-publicationDetails -->
+<? if (!empty($data)): ?>
+<div itemscope itemtype="http://schema.org/publisher">
+    <? foreach ($data as $field): ?>
+    <span property="publisher" typeof="Organization">
+        <? $pubPlace = $field->getPlace(); if (!empty($pubPlace)): ?>
+          <span property="location" typeof="Place">
+            <span property="name"><?=$this->escapeHtml($pubPlace)?></span>
+          </span>
+        <? endif; ?>
+        <? $pubName = $field->getName(); if (!empty($pubName)): ?>
+          <span property="name"><a href="<?=$this->record($this->driver)->getLink('publisher', $pubName)?>"><?=$this->escapeHtml($pubName)?></a></span>
+        <? endif; ?>
+    </span>
+    <span property="datePublished">
+        <? /* do not show solr publish date #13993 - GG */ ?>
+    <? /*$pubDateSort = $this->driver->tryMethod('getPublishDateSort');*/ ?>
+    <? $pubDate = $field->getDate(); if (!empty($pubDate)): ?>
+        <?=$this->escapeHtml($pubDate)?>
+    <? /*else: ?>
+        <?=$this->escapeHtml($pubDateSort)*/?></span>
+    <? endif; ?>
+    </span><br/>
+    <? endforeach; ?>
+</div>
+<? endif ?>
+<!-- fid_bbi: RecordDriver - solrDefault - data-publicationDetails - END -->
diff --git a/themes/fid_bbi/templates/RecordDriver/SolrDefault/link-bk.phtml b/themes/fid_bbi/templates/RecordDriver/SolrDefault/link-bk.phtml
new file mode 100644
index 00000000000..178be2e908f
--- /dev/null
+++ b/themes/fid_bbi/templates/RecordDriver/SolrDefault/link-bk.phtml
@@ -0,0 +1 @@
+<?=$this->url('search-results')?>?lookfor=%22<?=urlencode($this->lookfor)?>%22&amp;type=bk
\ No newline at end of file
diff --git a/themes/fid_bbi/templates/RecordDriver/SolrDefault/link-ddc.phtml b/themes/fid_bbi/templates/RecordDriver/SolrDefault/link-ddc.phtml
new file mode 100644
index 00000000000..d45ff49637d
--- /dev/null
+++ b/themes/fid_bbi/templates/RecordDriver/SolrDefault/link-ddc.phtml
@@ -0,0 +1 @@
+<?=$this->url('search-results')?>?lookfor=%22<?=urlencode($this->lookfor)?>%22&amp;type=ddc
\ No newline at end of file
diff --git a/themes/fid_bbi/templates/RecordDriver/SolrDefault/link-publisher.phtml b/themes/fid_bbi/templates/RecordDriver/SolrDefault/link-publisher.phtml
new file mode 100644
index 00000000000..f50e920bb57
--- /dev/null
+++ b/themes/fid_bbi/templates/RecordDriver/SolrDefault/link-publisher.phtml
@@ -0,0 +1 @@
+<?=$this->url('search-results')?>?lookfor=%22<?=urlencode($this->lookfor)?>%22&amp;type=publisher
\ No newline at end of file
diff --git a/themes/fid_bbi/templates/RecordDriver/SolrDefault/toolbar.phtml b/themes/fid_bbi/templates/RecordDriver/SolrDefault/toolbar.phtml
new file mode 100644
index 00000000000..05a0b7ad9f6
--- /dev/null
+++ b/themes/fid_bbi/templates/RecordDriver/SolrDefault/toolbar.phtml
@@ -0,0 +1,71 @@
+<!-- finc: recordDriver - solrDefault - toolbar -->
+<?
+    $addThis = $this->addThis();
+    if (!empty($addThis)) {
+      $this->headScript()->appendFile('https://s7.addthis.com/js/250/addthis_widget.js?pub=' . urlencode($addThis));
+    }
+
+// Set up some variables for convenience:
+$cart = $this->cart();
+$cartId = $this->driver->getSourceIdentifier() . '|' . $this->driver->getUniqueId();
+?>
+
+<? /* #14878: use original toolbar - GG */ ?>
+<ul class="record-nav nav nav-pills hidden-print">
+  <? /* finc: we use the sr-only description, CK */ ?>
+  <li class="sr-only"><?=$this->transEsc('Toolbar')?></li>
+    <? if ($this->userlist()->getMode() !== 'disabled'): ?>
+        <? /* finc: we use title, CK */ ?>
+      <li>
+          <?if ($this->permission()->allowDisplay('feature.Favorites')): ?>
+            <a class="save-record" data-lightbox href="<?=$this->recordLink()->getActionUrl($this->driver, 'Save')?>" title="<?=$this->transEsc('Add to favorites')?>" rel="nofollow"><i class="fa fa-star" aria-hidden="true"></i> <?=$this->transEsc('Add to favorites')?>
+            </a>
+          <? elseif ($block = $this->permission()->getAlternateContent('feature.Favorites')): ?>
+              <?=$block?>
+          <? endif; ?>
+      </li>
+    <? endif; ?>
+  <? /* finc: we don't use sms, CK */ ?>
+  <? /*
+  <? if ($this->accountCapabilities()->getSmsSetting() !== 'disabled'): ?>
+    <li><a class="sms-record" data-lightbox href="<?=$this->recordLink()->getActionUrl($this->driver, 'SMS')?>" rel="nofollow"><i class="fa fa-mobile" aria-hidden="true"></i> <?=$this->transEsc('Text this')?></a></li>
+  <? endif; ?>
+  */ ?>
+  <li>
+    <a class="mail-record" data-lightbox href="<?=$this->recordLink()->getActionUrl($this->driver, 'Email')?>" rel="nofollow"><i class="fa fa-envelope"    aria-hidden="true"></i> <?=$this->transEsc('Email this')?></a>
+  </li>
+
+  <? $exportFormats = $this->export()->getFormatsForRecord($this->driver); ?>
+  <? if (count($exportFormats) > 0): ?>
+    <li class="dropdown">
+      <a class="export-toggle dropdown-toggle" data-toggle="dropdown" href="<?=$this->recordLink()->getActionUrl($this->driver, 'Export')?>" rel="nofollow"><i class="fa fa-list-alt" aria-hidden="true"></i> <?=$this->transEsc('Export Record')?>
+      </a>
+      <ul class="dropdown-menu" role="menu">
+        <? foreach ($exportFormats as $exportFormat): ?>
+          <li>
+            <a <? if ($this->export()->needsRedirect($exportFormat)): ?>target="<?=$this->escapeHtmlAttr($exportFormat)?>Main"
+               <? endif; ?>href="<?=$this->recordLink()->getActionUrl($this->driver, 'Export')?>?style=<?=$this->escapeHtmlAttr($exportFormat)?>"
+               rel="nofollow"><?=$this->transEsc('Export to')?><?=$this->transEsc($this->export()->getLabelForFormat($exportFormat))?></a>
+          </li>
+        <? endforeach; ?>
+      </ul>
+    </li>
+  <? endif; ?>
+  <? if (!empty($addThis)): ?>
+    <li>
+      <a class="addThis addthis_button" href="https://www.addthis.com/bookmark.php?v=250&amp;pub=<?=urlencode($addThis)?>"><i class="fa fa-bookmark"  aria-hidden="true"></i> <?=$this->transEsc('Bookmark')?></a>
+    </li>
+  <? endif; ?>
+  <li class="bookbag-menu">
+  <?=$this->render('record/cart-buttons.phtml', ['id' => $this->driver->getUniqueId(), 'source' => $this->driver->getSourceIdentifier()]); ?>
+  </li>
+    <? if (count($this->driver->getCitationFormats()) > 0): ?>
+      <li>
+        <a class="cite-record" data-lightbox href="<?=$this->recordLink()->getActionUrl($this->driver, 'Cite')?>" rel="nofollow"><i class="fa fa-asterisk" aria-hidden="true"></i> <?=$this->transEsc('Cite this')?></a>
+      </li>
+    <? endif; ?>
+  <li>
+    <a href="<?=$this->url('record', ['action' => 'record', 'id' => $this->driver->getUniqueId()], ['force_canonical' => true])?>"><i class="fa fa-copy" aria-hidden="true"></i> <?=$this->transEsc('Permalink')?></a>
+  </li>
+</ul>
+<!-- finc: recordDriver - solrDefault - toolbar - END -->
diff --git a/themes/fid_bbi/templates/RecordDriver/SolrMarc/core.phtml b/themes/fid_bbi/templates/RecordDriver/SolrMarc/core.phtml
new file mode 100644
index 00000000000..ac20e7f5a98
--- /dev/null
+++ b/themes/fid_bbi/templates/RecordDriver/SolrMarc/core.phtml
@@ -0,0 +1,60 @@
+<!-- finc: RecordDriver - solrMarc - core -->
+<div class="media" vocab="http://schema.org/" resource="#record" typeof="<?=$this->driver->getSchemaOrgFormats()?> Product">
+  <?
+  $QRCode = $this->record($this->driver)->getQRCode("core");
+  $coverDetails = $this->record($this->driver)->getCoverDetails('core', 'medium', $this->record($this->driver)->getThumbnail('large'));
+  $cover = $coverDetails['html'];
+  $preview = $this->record($this->driver)->getPreviews();
+  ?>
+  <? if ($QRCode || $cover || $preview): ?>
+  <div class="media-left <?=$this->escapeHtmlAttr($coverDetails['size'])?> img-col">
+    <? /* #14878: remove cover - GG */ ?>
+  </div>
+  <? endif; ?>
+  <div class="media-body">
+
+    <? /* finc: We want to get rid of trailing special chars in the title and limit its length to 100 chars
+          remove schema name tag here but keept in description, CK
+       */
+    ?>
+      <? /* finc: add schema tags for title #13850 - VE */ ?>
+      <? /*<h3 property="name"><?=$this->escapeHtml(preg_replace('/(\s[\/\.:]\s*)*$/', '', $this->truncate($this->driver->getShortTitle() . ' ' . $this->driver->getSubtitle() . ' ' . $this->driver->getTitleSection(), 100)))?></h3> */ ?>
+
+      <? $summary = $this->driver->getSummary(); $summary = isset($summary[0]) ? $this->escapeHtml($summary[0]) : false; ?>
+      <? if ($summary): ?>
+        <p><?=$this->truncate($summary, 300)?></p>
+
+        <? if(strlen($summary) > 300): ?>
+          <p><a href='<?=$this->recordLink()->getTabUrl($this->driver, 'Description')?>#tabnav'><?=$this->transEsc('Full description')?></a></p>
+        <? endif; ?>
+      <? endif; ?>
+
+      <? if ($this->userlist()->getMode() !== 'disabled'): ?>
+        <? /* Display the lists that this record is saved to */ ?>
+      <div class="savedLists hidden alert alert-info">
+          <strong><?=$this->transEsc("Saved in")?>:</strong>
+        </div>
+      <? endif; ?>
+
+      <?/* Display Main Details */?>
+      <?
+      $formatter = $this->recordDataFormatter();
+      $coreFields = $formatter->getData($driver, $formatter->getDefaults('core-marc'));
+      ?>
+      <? if (!empty($coreFields)): ?>
+        <table class="table table-striped">
+          <? /* Table summary not supported in html 5, finc-specific solution, CK */ ?>
+          <caption class="sr-only"><?=$this->transEsc('Bibliographic Details')?></caption>
+          <? foreach ($coreFields as $key => $current): ?>
+            <? if ($key == null): ?>
+              <?=$current['value']?>
+            <? else: ?>
+              <tr><th><?=$this->transEsc($key)?>:</th><td><?=$current['value']?></td></tr>
+            <? endif; ?>
+          <? endforeach; ?>
+        </table>
+      <? endif; ?>
+      <?/* End Main Details */?>
+    </div>
+  </div>
+<!-- finc: RecordDriver - solrMarc - core - END -->
diff --git a/themes/fid_bbi/templates/RecordDriver/SolrMarc/data-bk.phtml b/themes/fid_bbi/templates/RecordDriver/SolrMarc/data-bk.phtml
new file mode 100644
index 00000000000..7ec5c36a781
--- /dev/null
+++ b/themes/fid_bbi/templates/RecordDriver/SolrMarc/data-bk.phtml
@@ -0,0 +1,10 @@
+<!-- fid_bbi: RecordDriver - solrMarc - data-bk -->
+<? if (!(empty($data))): ?>
+<? $i = 0; foreach ($data as $bk): ?>
+    <?= ($i++ == 0) ? '' : ' ; '; ?>
+    <a title="<?=$this->escapeHtmlAttr($bk)?>" href="<?=$this->record($this->driver)->getLink('bk', $bk)?>" rel="nofollow">
+        <?=trim($this->escapeHtml($bk))?>
+    </a>
+<? endforeach; ?>
+<? endif; ?>
+<!-- fid_bbi: RecordDriver - solrMarc - data-bk - END -->
diff --git a/themes/fid_bbi/templates/RecordDriver/SolrMarc/data-ddc.phtml b/themes/fid_bbi/templates/RecordDriver/SolrMarc/data-ddc.phtml
new file mode 100644
index 00000000000..ca54a70b817
--- /dev/null
+++ b/themes/fid_bbi/templates/RecordDriver/SolrMarc/data-ddc.phtml
@@ -0,0 +1,10 @@
+<!-- fid_bbi: RecordDriver - solrMarc - data-ddc -->
+<? if (!(empty($data))): ?>
+<? $i = 0; foreach ($data as $ddc): ?>
+    <?= ($i++ == 0) ? '' : ' ; '; ?>
+    <a title="<?=$this->escapeHtmlAttr($ddc)?>" href="<?=$this->record($this->driver)->getLink('ddc', $ddc)?>" rel="nofollow">
+        <?=trim($this->escapeHtml($ddc))?>
+    </a>
+<? endforeach; ?>
+<? endif; ?>
+<!-- fid_bbi: RecordDriver - solrMarc - data-ddc - END -->
diff --git a/themes/fid_bbi/templates/RecordDriver/SolrMarc/data-rvk.phtml b/themes/fid_bbi/templates/RecordDriver/SolrMarc/data-rvk.phtml
new file mode 100644
index 00000000000..9fb0d80eb97
--- /dev/null
+++ b/themes/fid_bbi/templates/RecordDriver/SolrMarc/data-rvk.phtml
@@ -0,0 +1,10 @@
+<!-- fid_bbi: RecordDriver - solrMarc - data-rvk -->
+<? if (!(empty($data))): ?>
+<? $i = 0; foreach ($data as $rvk): ?>
+    <?= ($i++ == 0) ? '' : ' ; '; ?>
+    <a title="<?=$this->escapeHtmlAttr($rvk)?>" href="<?=$this->record($this->driver)->getLink('rvk', $rvk)?>" rel="nofollow">
+        <?=trim($this->escapeHtml($rvk))?>
+    </a>
+<? endforeach; ?>
+<? endif; ?>
+<!-- fid_bbi: RecordDriver - solrMarc - data-rvk - END -->
diff --git a/themes/fid_bbi/theme.config.php b/themes/fid_bbi/theme.config.php
index dbb7aeebc2e..a707cb8ee91 100644
--- a/themes/fid_bbi/theme.config.php
+++ b/themes/fid_bbi/theme.config.php
@@ -2,4 +2,10 @@
 return [
     'extends' => 'finc',
     //'favicon' => 'favicon.ico',
+    'helpers' => array(
+        'factories' => array(
+            'VuFind\View\Helper\Root\RecordDataFormatter' =>
+                'fid_bbi\View\Helper\Root\RecordDataFormatterFactory',
+        ),
+    ),
 ];
-- 
GitLab