Populating a select field using values from a metadata class
Managed by | Updated .
Background
This article outlines how to create advanced search form fields that provide dropdowns containing values sourced from a metadata field in the search index.
Process
Step 1. Extract list of metadata values
Create a shell script that extracts the list of unique metadata values as a post-swap operation.
The list_meta_vals.sh script below implements this for Linux. Save this file into a folder called @workflow under the collection's configuration folder. (e.g. save this to $SEARCH_HOME/conf/mycollection/@workflow/list_meta_vals.sh).
#!/bin/bash
#
#list_meta_vals.sh
#
# AUTHOR: Peter Levan 16 Apr 2013
#
# Takes a collection name and metaedata class as a parameter and writes out a meta_<CLASS>.txt file containing each unique metadata value defined
# in the index for the specified class, sorted alphabetically, into the conf folder of the specified collection.
#
if [ $# -ne 2 ]
then
echo "Error in $0 - Invalid Argument Count"
echo "Syntax: $0 collection_name metadata_class"
exit 1
fi
COLLECTION=$1
METACLASS=$2
# Check SEARCH_HOME is defined
[ "$SEARCH_HOME" ] || { echo -e "\n$0: Error: \$SEARCH_HOME environment variable is not defined, cannot continue.\n" >&2; exit 1; }
echo "Generating metadata listing for field $METACLASS"
CMD="$SEARCH_HOME/bin/padre-di $SEARCH_HOME/data/$COLLECTION/live/idx/index -meta | grep '^$METACLASS:' | sed -e 's/$METACLASS: //g' -e '\$d'| tr '|' '\n' | sort -u > $SEARCH_HOME/conf/$COLLECTION/meta_$METACLASS.txt"
echo $CMD
eval $CMD
exit 0
Step 2. Ensure the collection workflow runs the script as a post swap operation.
e.g. generate a list of author metadata for mycollection. In the collection.cfg:
post_swap_command=$SEARCH_HOME/conf/mycollection/@workflow/list_meta_vals.sh mycollection a
Step 3. Add the values to the data model
Add the values to the data model using a hookpostprocess.groovy script.
e.g.
// read in meta value lists to populate drop downs.
def metaA_file = "/opt/funnelback/conf/mycollection/meta_A.txt";
def metaA = new File(metaA_file).readLines();
transaction.response.customData["metaA"] = [""] + metaA;
Step 4. Add the values to the dropdown
Edit the freemarker template to display the values from the list.
e.g.
<ul>
<li>Author: <@s.Select name="meta_a_phrase_sand" options=response.customData["metaA"]/></li>
</ul>