Adding an Institution Field to authors
Contents
Note to admin people: move this to the appropriate place, I can't work out how to add it
I wanted to have an institution associated with each author, however the same thing applies whatever the field would be
Adding the field to the database
Add it to the list of fields
- Edit <EPROOT>/archives/<ARCHIVE_ID>/cfg/cfg.d/eprint_fields.pl
- Add in the field you want for each of the people-type fields:
{
'name' => 'creators',
'type' => 'compound',
'multiple' => 1,
'fields' => [
{
'sub_name' => 'name',
'type' => 'name',
'hide_honourific' => 1,
'hide_lineage' => 1,
'family_first' => 1,
},
{
'sub_name' => 'id',
'type' => 'text',
'input_cols' => 20,
'allow_null' => 1,
},
{
'sub_name' => 'institution',
'type' => 'text',
'input_cols' => 20,
}
],
'input_boxes' => 4,
},
- Update the database: <EPROOT>/bin/epadmin update_database_structure <ARCHIVE_ID>
altering the lookup script
The name fields come with an auto-completer, which (obviously) doesn't know about your new field.
use EPrints;
use strict;
my $session = EPrints::Session->new();
# security?
my $content = "text/xml";
$session->send_http_header( content_type=>$content );
my $family = $session->param( "_name_family" );
my $given = $session->param( "_name_given" );
my $id = $session->param( "_id" );
my $institution = $session->param( "_institution" );
my $database = $session->get_database;
my $dataset = $session->get_repository->get_dataset( "eprint" );
my $name_field = $dataset->get_field( "creators_name" );
my $id_field = $dataset->get_field( "creators_id" );
my $institution_field = $dataset->get_field( "creators_institution" );
my @fields = ($name_field->get_sql_names, $id_field->get_sql_names, $institution_field->get_sql_names);
my $Q_table = $database->quote_identifier($dataset->get_sql_table_name);
my $Q_name_table = $database->quote_identifier($dataset->get_sql_sub_table_name($name_field));
my $Q_id_table = $database->quote_identifier($dataset->get_sql_sub_table_name($id_field));
my $Q_institution_table = $database->quote_identifier($dataset->get_sql_sub_table_name($institution_field));
my $Q_eprintid = $database->quote_identifier( "eprintid" );
my $Q_pos = $database->quote_identifier( "pos" );
my $Q_num_matches = $database->quote_identifier( "num_matches" );
my $Q_eprint_status = $database->quote_identifier( "eprint_status" );
my $sql = "SELECT COUNT($Q_table.$Q_eprintid) AS $Q_num_matches,".
join(",", map { $database->quote_identifier($_) } @fields).
" FROM $Q_table".
" LEFT JOIN $Q_name_table".
" ON $Q_table.$Q_eprintid=$Q_name_table.$Q_eprintid".
" LEFT JOIN $Q_id_table".
" ON $Q_name_table.$Q_eprintid=$Q_id_table.$Q_eprintid ".
" AND $Q_name_table.$Q_pos=$Q_id_table.$Q_pos ".
" LEFT JOIN $Q_institution_table".
" ON $Q_institution_table.$Q_pos = $Q_id_table.$Q_pos".
" AND $Q_institution_table.$Q_eprintid = $Q_id_table.$Q_eprintid ".
" WHERE ".
" $Q_table.$Q_eprint_status=".$database->quote_value( "archive" );
if( EPrints::Utils::is_set( $family ) )
{
$sql .= " AND ".$database->quote_identifier("creators_name_family")
." ILIKE "
.$database->quote_value( '%' . EPrints::Database::prep_like_value($family).'%');
}
if( EPrints::Utils::is_set( $given ) )
{
$sql .= " AND ".$database->quote_identifier("creators_name_given")
." ILIKE "
.$database->quote_value( '%' . EPrints::Database::prep_like_value($given).'%');
}
if( EPrints::Utils::is_set( $id ) )
{
$sql .= " AND ".$database->quote_identifier("creators_id")
." ILIKE "
.$database->quote_value( '%' . EPrints::Database::prep_like_value($id).'%');
}
$sql .= "GROUP BY ".join(",",map { $database->quote_identifier($_) } @fields) .
" ORDER BY $Q_num_matches DESC," .
$database->quote_identifier("creators_name_family").",".
$database->quote_identifier("creators_name_given");
my @rows;
my $sth = $session->get_database->prepare_select( $sql, 'limit' => 40 );
$session->get_database->execute( $sth , $sql );
while( my @row = $sth->fetchrow_array )
{
my $cnt = shift @row;
my $name = $name_field->value_from_sql_row( $session, \@row );
my $id = $id_field->value_from_sql_row( $session, \@row );
my $institution = $institution_field->value_from_sql_row( $session, \@row );
my $item = {};
push @rows, $item;
my $frag = $session->make_doc_fragment;
$frag->appendChild( $name_field->render_single_value( $session, $name ) );
if( EPrints::Utils::is_set( $id ) )
{
$frag->appendChild( $session->make_text( " " ) );
$frag->appendChild( $id_field->render_single_value( $session, $id ) );
}
my $small = $session->make_element( "small" );
$frag->appendChild( $small );
if( EPrints::Utils::is_set( $institution ) )
{
$small->appendChild( $session->make_text( " [" ) );
$small->appendChild( $id_field->render_single_value( $session, $institution ) );
$small->appendChild( $session->make_text( "] " ) );
}
$small->appendChild( $session->make_text( " (author of ".$cnt." item".($cnt>1?"s":"")." in this repository)" ) );
$item->{xhtml} = $frag;
$item->{values} = [
"for:value:relative:_name_family" => $name->{family},
"for:value:relative:_name_given" => $name->{given},
"for:value:relative:_name_honourific" => $name->{honourific},
"for:value:relative:_name_lineage" => $name->{lineage},
"for:value:relative:_id" => $id,
"for:value:relative:_institution" => $institution,
];
}
$sth->finish();
my $ul = EPrints::Extras::render_lookup_list( $session, \@rows );
$session->send_http_header( content_type => "text/xml; charset=UTF-8" );
binmode(STDOUT,":utf8");
print <<END;
<?xml version="1.0" encoding="UTF-8" ?>
END
print EPrints::XML::to_string( $ul, "utf-8", 1 );
EPrints::XML::dispose( $ul );
$session->terminate;