<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.eprints.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Cjg</id>
	<title>EPrints Documentation - User contributions [en-gb]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.eprints.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Cjg"/>
	<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/Special:Contributions/Cjg"/>
	<updated>2026-04-22T01:28:04Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.8</generator>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Talk:GDPR&amp;diff=12799</id>
		<title>Talk:GDPR</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Talk:GDPR&amp;diff=12799"/>
		<updated>2018-06-01T11:18:42Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I'm kind of torn between the two methods - John's has the advantage that it isn't dependent upon the mechanism by which someone creates a login ticket so should be more universal (e.g. for us), but Will's has the advantage that it's perhaps easier to understand for the less specialist eprints dev / admin.  I.e. it doesn't use the magic of triggers, and it uses a date format that can be easily read rather than epoch timestamp (which apparently not everyone tracks on a daily basis) - Alan (2018-04-25 14:12:30z+01:00)&lt;br /&gt;
&lt;br /&gt;
== Code queries ==&lt;br /&gt;
&lt;br /&gt;
John, Are you deliberately storing just the expiry date of the login ticket rather than the specific login time?  Grand scheme I don't suppose it makes a lot of difference if there's an extra 7 days in the delete check. &lt;br /&gt;
&lt;br /&gt;
- Alan&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
No real reason - I was thinking that the retention period would be e.g. a year or so - and was trying to make things as least impactful as possible - so reusing a value that was already set.&lt;br /&gt;
The problem with this is that if a repository has set a long expiry time, it could be bad (so maybe Will's suggestion is better).&lt;br /&gt;
&lt;br /&gt;
I initially looked at using a commit trigger on the login ticket - but this changes every time you do anything - so introduces a lot of 'churn' on the system.&lt;br /&gt;
&lt;br /&gt;
Thinking about it again, a simple `time` call might be better (storing it as seconds).&lt;br /&gt;
In the cleanup scripts, you can then calculate the '1-year-ago' seconds and do a 'last_login &amp;lt; 1_YEAR_AGO'.&lt;br /&gt;
&lt;br /&gt;
- JLRS (John)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
I prefer the trigger to using user_login.pl was going to suggest using the trigger + localtime (like Will's done), but int timestamps do make date maths less onerous as John points out&lt;br /&gt;
&lt;br /&gt;
- RM (Rory)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt; &amp;gt;date maths less onerous&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
And 1 DB field rather than 3 or 6 - simpler queries, more efficient&lt;br /&gt;
&lt;br /&gt;
Also, rather than using the 'expiry' field, there is a 'time' field - which makes more sense (I think)&lt;br /&gt;
&lt;br /&gt;
- JLRS&lt;br /&gt;
&lt;br /&gt;
The logic of the weird time fields in EPrints is to distinguish between vague dates eg. year only. In retrospect using a timestamp and a &amp;quot;resolution indicator&amp;quot; would have been better. Sigh. [[User:Cjg|Cjg]] ([[User talk:Cjg|talk]]) 11:18, 1 June 2018 (UTC)&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=GDPR&amp;diff=12798</id>
		<title>GDPR</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=GDPR&amp;diff=12798"/>
		<updated>2018-06-01T10:34:17Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* Request a copy Dataset */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page has been created to gather information and share code snippets to help EPrints repositories handle GDPR responsibilities.  Some of the issues around GDPR will be specific to a repository contents, but others are quite generic. nb. We're not lawyers!&lt;br /&gt;
&lt;br /&gt;
As a general rule of thumb, this is about people's rights and privacy. Imagine a worst case scenario where the entire filesystem and database is made entirely public -- it's not a great situation, but consider what steps you could take to reduce the damage if that did happen - don't store any information about people that you don't actually need.&lt;br /&gt;
&lt;br /&gt;
=== Areas of GDPR that may be relevant to EPrints repositories ===&lt;br /&gt;
* Giving people a clear privacy policy about how you will use data you gather about them&lt;br /&gt;
* Gaining consent for storing and processing data you gather about them&lt;br /&gt;
* Defining and enforcing a retention policy to remove information about people that is no longer required &lt;br /&gt;
* &amp;quot;Subject Access Requests&amp;quot; where someone wants to know everything you know about them&lt;br /&gt;
* &amp;quot;Right to Erasure&amp;quot; where people may request you remove information about them, but there are exceptions to this.&lt;br /&gt;
&lt;br /&gt;
=== Information about people ===&lt;br /&gt;
EPrints potentially stores information about people in a number of places.&lt;br /&gt;
* Users Dataset&lt;br /&gt;
* EPrints Metadata &lt;br /&gt;
** In the revision XML files storing old versions of metadata.&lt;br /&gt;
* In actual documents&lt;br /&gt;
* In the &amp;quot;request a copy&amp;quot; Dataset&lt;br /&gt;
* Web access logs&lt;br /&gt;
** In the History Dataset&lt;br /&gt;
** In the Apache logs in the operating system (this will not be dealt with on this page, but should not be forgotten)&lt;br /&gt;
&lt;br /&gt;
== Users Dataset ==&lt;br /&gt;
This dataset is either populated with a web based sign up form, or in many cases, it is automatically built from an institutional accounts system. These cases need to be addressed in different ways.&lt;br /&gt;
&lt;br /&gt;
=== Imported users Dataset ===&lt;br /&gt;
&lt;br /&gt;
First of all, stop importing any fields you don't actually need and remove those fields from EPrints. nb. Removing the field in the config may not remove it from the database (citation required.. how the hell does that work?)&lt;br /&gt;
&lt;br /&gt;
Next stop importing any users you just don't need -- if they can't do anything while logged in they should never exist in the Users dataset.&lt;br /&gt;
&lt;br /&gt;
Next implement a data retention policy. This will be a script that removes or blanks the data of users that match a criteria. eg. have not appeared in the import script for more than 90 days and never made a deposit.&lt;br /&gt;
&lt;br /&gt;
=== Web signup users Dataset ===&lt;br /&gt;
&lt;br /&gt;
You should ensure that the privacy policy is up to date and in line with GDPR best practice.&lt;br /&gt;
&lt;br /&gt;
Stop collecting any information you don't actually need, and remove those fields from the database.&lt;br /&gt;
&lt;br /&gt;
Next implement a data retention policy. This will be a script that removes or blanks the data of users that match a criteria. eg. accounts more than a year old that have never made a deposit.&lt;br /&gt;
&lt;br /&gt;
=== Removing vs Blanking ===&lt;br /&gt;
&lt;br /&gt;
In some cases it may be more desirable to remove all the personal metadata from a record in the Users dataset rather than delete it completely. This has pros and cons.&lt;br /&gt;
&lt;br /&gt;
If you remove a user entirely who has deposited EPrints you may wish to reassign those deposits to an admin user, or a fake user called &amp;quot;left&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Last Login Time===&lt;br /&gt;
Storing the last login time of a user can be useful to identify which users are active and which are not to help ensure data is not being stored longer than is necessary.&lt;br /&gt;
&lt;br /&gt;
See [[GDPR/Last Login Time]]&lt;br /&gt;
&lt;br /&gt;
===Non-Active Users Report ===&lt;br /&gt;
TODO&lt;br /&gt;
worth having a count of items linked with the user on the report, along with their statuses?&lt;br /&gt;
&lt;br /&gt;
===Delete User Action===&lt;br /&gt;
*Suggestion* Cron job to select all user accounts which have been inactive over a certain time threshold, check those users for affiliation to a publication (creator, editor, depositor etc.) which is either archive or buffer status and, where no connection exists, remove those user accounts.&lt;br /&gt;
&lt;br /&gt;
Admin will be able to select user accounts from the report to delete (within the report or individually?)&lt;br /&gt;
&lt;br /&gt;
Could be similar to: &amp;lt;tt&amp;gt;EPrints::DataObj::LoginTicket::expire_all&amp;lt;/tt&amp;gt; - but with an &amp;lt;tt&amp;gt;$c-&amp;gt;{'account_retention_time'}&amp;lt;/tt&amp;gt; param taken away from the &amp;lt;tt&amp;gt;time()&amp;lt;/tt&amp;gt; call?&lt;br /&gt;
&lt;br /&gt;
Need to check logintickets too?&lt;br /&gt;
Someone may not have actually logged in for ages, but maintained a browser session/cookies for a long time?&lt;br /&gt;
(currently our longest 'active' login is ~20 days).&lt;br /&gt;
&lt;br /&gt;
==Add 'Agree to privacy and data statement' checkbox on registration or request forms==&lt;br /&gt;
TODO - should be 'versioned' - so if the statement changes, the version that was agreed to can be shown.&lt;br /&gt;
Possibly a set/namedset, with the available options limited to only one when rendered to a user?&lt;br /&gt;
&lt;br /&gt;
Chris Gutteridge has written a blog post on GDPR with a few comments about the EPrints Request a Copy feature: http://blog.soton.ac.uk/webteam/2018/05/10/gdpr-preperations/#post-content-1793;char=5429-7155&lt;br /&gt;
&lt;br /&gt;
==EPrints Metadata==&lt;br /&gt;
TODO&lt;br /&gt;
==In actual documents==&lt;br /&gt;
TODO&lt;br /&gt;
==Request a copy Dataset==&lt;br /&gt;
This collects an email address and a reason for requesting the document. Without intervention this can be stored indefinitely.&lt;br /&gt;
&lt;br /&gt;
You should add a privacy statement to the form to say what you'll do with the information, add a reminder to the email sent to the authors that they shouldn't misuse the contact info, define a retention policy, automate the enforcement of the retention policy.&lt;br /&gt;
&lt;br /&gt;
===Adding a Privacy Statement===&lt;br /&gt;
TODO&lt;br /&gt;
===Altering the email to authors===&lt;br /&gt;
TODO&lt;br /&gt;
===Automating the removal of old requests===&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
==History dataset (used for access stats)==&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=GDPR&amp;diff=12797</id>
		<title>GDPR</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=GDPR&amp;diff=12797"/>
		<updated>2018-06-01T10:33:36Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page has been created to gather information and share code snippets to help EPrints repositories handle GDPR responsibilities.  Some of the issues around GDPR will be specific to a repository contents, but others are quite generic. nb. We're not lawyers!&lt;br /&gt;
&lt;br /&gt;
As a general rule of thumb, this is about people's rights and privacy. Imagine a worst case scenario where the entire filesystem and database is made entirely public -- it's not a great situation, but consider what steps you could take to reduce the damage if that did happen - don't store any information about people that you don't actually need.&lt;br /&gt;
&lt;br /&gt;
=== Areas of GDPR that may be relevant to EPrints repositories ===&lt;br /&gt;
* Giving people a clear privacy policy about how you will use data you gather about them&lt;br /&gt;
* Gaining consent for storing and processing data you gather about them&lt;br /&gt;
* Defining and enforcing a retention policy to remove information about people that is no longer required &lt;br /&gt;
* &amp;quot;Subject Access Requests&amp;quot; where someone wants to know everything you know about them&lt;br /&gt;
* &amp;quot;Right to Erasure&amp;quot; where people may request you remove information about them, but there are exceptions to this.&lt;br /&gt;
&lt;br /&gt;
=== Information about people ===&lt;br /&gt;
EPrints potentially stores information about people in a number of places.&lt;br /&gt;
* Users Dataset&lt;br /&gt;
* EPrints Metadata &lt;br /&gt;
** In the revision XML files storing old versions of metadata.&lt;br /&gt;
* In actual documents&lt;br /&gt;
* In the &amp;quot;request a copy&amp;quot; Dataset&lt;br /&gt;
* Web access logs&lt;br /&gt;
** In the History Dataset&lt;br /&gt;
** In the Apache logs in the operating system (this will not be dealt with on this page, but should not be forgotten)&lt;br /&gt;
&lt;br /&gt;
== Users Dataset ==&lt;br /&gt;
This dataset is either populated with a web based sign up form, or in many cases, it is automatically built from an institutional accounts system. These cases need to be addressed in different ways.&lt;br /&gt;
&lt;br /&gt;
=== Imported users Dataset ===&lt;br /&gt;
&lt;br /&gt;
First of all, stop importing any fields you don't actually need and remove those fields from EPrints. nb. Removing the field in the config may not remove it from the database (citation required.. how the hell does that work?)&lt;br /&gt;
&lt;br /&gt;
Next stop importing any users you just don't need -- if they can't do anything while logged in they should never exist in the Users dataset.&lt;br /&gt;
&lt;br /&gt;
Next implement a data retention policy. This will be a script that removes or blanks the data of users that match a criteria. eg. have not appeared in the import script for more than 90 days and never made a deposit.&lt;br /&gt;
&lt;br /&gt;
=== Web signup users Dataset ===&lt;br /&gt;
&lt;br /&gt;
You should ensure that the privacy policy is up to date and in line with GDPR best practice.&lt;br /&gt;
&lt;br /&gt;
Stop collecting any information you don't actually need, and remove those fields from the database.&lt;br /&gt;
&lt;br /&gt;
Next implement a data retention policy. This will be a script that removes or blanks the data of users that match a criteria. eg. accounts more than a year old that have never made a deposit.&lt;br /&gt;
&lt;br /&gt;
=== Removing vs Blanking ===&lt;br /&gt;
&lt;br /&gt;
In some cases it may be more desirable to remove all the personal metadata from a record in the Users dataset rather than delete it completely. This has pros and cons.&lt;br /&gt;
&lt;br /&gt;
If you remove a user entirely who has deposited EPrints you may wish to reassign those deposits to an admin user, or a fake user called &amp;quot;left&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Last Login Time===&lt;br /&gt;
Storing the last login time of a user can be useful to identify which users are active and which are not to help ensure data is not being stored longer than is necessary.&lt;br /&gt;
&lt;br /&gt;
See [[GDPR/Last Login Time]]&lt;br /&gt;
&lt;br /&gt;
===Non-Active Users Report ===&lt;br /&gt;
TODO&lt;br /&gt;
worth having a count of items linked with the user on the report, along with their statuses?&lt;br /&gt;
&lt;br /&gt;
===Delete User Action===&lt;br /&gt;
*Suggestion* Cron job to select all user accounts which have been inactive over a certain time threshold, check those users for affiliation to a publication (creator, editor, depositor etc.) which is either archive or buffer status and, where no connection exists, remove those user accounts.&lt;br /&gt;
&lt;br /&gt;
Admin will be able to select user accounts from the report to delete (within the report or individually?)&lt;br /&gt;
&lt;br /&gt;
Could be similar to: &amp;lt;tt&amp;gt;EPrints::DataObj::LoginTicket::expire_all&amp;lt;/tt&amp;gt; - but with an &amp;lt;tt&amp;gt;$c-&amp;gt;{'account_retention_time'}&amp;lt;/tt&amp;gt; param taken away from the &amp;lt;tt&amp;gt;time()&amp;lt;/tt&amp;gt; call?&lt;br /&gt;
&lt;br /&gt;
Need to check logintickets too?&lt;br /&gt;
Someone may not have actually logged in for ages, but maintained a browser session/cookies for a long time?&lt;br /&gt;
(currently our longest 'active' login is ~20 days).&lt;br /&gt;
&lt;br /&gt;
==Add 'Agree to privacy and data statement' checkbox on registration or request forms==&lt;br /&gt;
TODO - should be 'versioned' - so if the statement changes, the version that was agreed to can be shown.&lt;br /&gt;
Possibly a set/namedset, with the available options limited to only one when rendered to a user?&lt;br /&gt;
&lt;br /&gt;
Chris Gutteridge has written a blog post on GDPR with a few comments about the EPrints Request a Copy feature: http://blog.soton.ac.uk/webteam/2018/05/10/gdpr-preperations/#post-content-1793;char=5429-7155&lt;br /&gt;
&lt;br /&gt;
==EPrints Metadata==&lt;br /&gt;
TODO&lt;br /&gt;
==In actual documents==&lt;br /&gt;
TODO&lt;br /&gt;
==Request a copy Dataset==&lt;br /&gt;
This collects an email address and a reason for requesting the document. Without intervention this can be stored indefinitely.&lt;br /&gt;
&lt;br /&gt;
You should add a privacy statement to the form to say what you'll do with the information, add a reminder to the email sent to the authors that they shouldn't misuse the contact info, define a retention policy, automate the enforcement of the retention policy.&lt;br /&gt;
&lt;br /&gt;
===Adding a Privacy Statement===&lt;br /&gt;
&lt;br /&gt;
==History dataset (used for access stats)==&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=GDPR&amp;diff=12796</id>
		<title>GDPR</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=GDPR&amp;diff=12796"/>
		<updated>2018-06-01T10:28:45Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page has been created to gather information and share code snippets to help EPrints repositories handle GDPR responsibilities.  Some of the issues around GDPR will be specific to a repository contents, but others are quite generic. nb. We're not lawyers!&lt;br /&gt;
&lt;br /&gt;
As a general rule of thumb, this is about people's rights and privacy. Imagine a worst case scenario where the entire filesystem and database is made entirely public -- it's not a great situation, but consider what steps you could take to reduce the damage if that did happen - don't store any information about people that you don't actually need.&lt;br /&gt;
&lt;br /&gt;
=== Areas of GDPR that may be relevant to EPrints repositories ===&lt;br /&gt;
* Giving people a clear privacy policy about how you will use data you gather about them&lt;br /&gt;
* Gaining consent for storing and processing data you gather about them&lt;br /&gt;
* Defining and enforcing a retention policy to remove information about people that is no longer required &lt;br /&gt;
* &amp;quot;Subject Access Requests&amp;quot; where someone wants to know everything you know about them&lt;br /&gt;
* &amp;quot;Right to Erasure&amp;quot; where people may request you remove information about them, but there are exceptions to this.&lt;br /&gt;
&lt;br /&gt;
=== Information about people ===&lt;br /&gt;
EPrints potentially stores information about people in a number of places.&lt;br /&gt;
* Users Dataset&lt;br /&gt;
* EPrints Metadata &lt;br /&gt;
** In the revision XML files storing old versions of metadata.&lt;br /&gt;
* In actual documents&lt;br /&gt;
* In the &amp;quot;request a copy&amp;quot; Dataset&lt;br /&gt;
* Web access logs&lt;br /&gt;
** In the History Dataset&lt;br /&gt;
** In the Apache logs in the operating system&lt;br /&gt;
&lt;br /&gt;
== Users Dataset ==&lt;br /&gt;
This dataset is either populated with a web based sign up form, or in many cases, it is automatically built from an institutional accounts system. These cases need to be addressed in different ways.&lt;br /&gt;
&lt;br /&gt;
=== Imported users Dataset ===&lt;br /&gt;
&lt;br /&gt;
First of all, stop importing any fields you don't actually need and remove those fields from EPrints. nb. Removing the field in the config may not remove it from the database (citation required.. how the hell does that work?)&lt;br /&gt;
&lt;br /&gt;
Next stop importing any users you just don't need -- if they can't do anything while logged in they should never exist in the Users dataset.&lt;br /&gt;
&lt;br /&gt;
Next implement a data retention policy. This will be a script that removes or blanks the data of users that match a criteria. eg. have not appeared in the import script for more than 90 days and never made a deposit.&lt;br /&gt;
&lt;br /&gt;
=== Web signup users Dataset ===&lt;br /&gt;
&lt;br /&gt;
You should ensure that the privacy policy is up to date and in line with GDPR best practice.&lt;br /&gt;
&lt;br /&gt;
Stop collecting any information you don't actually need, and remove those fields from the database.&lt;br /&gt;
&lt;br /&gt;
Next implement a data retention policy. This will be a script that removes or blanks the data of users that match a criteria. eg. accounts more than a year old that have never made a deposit.&lt;br /&gt;
&lt;br /&gt;
=== Removing vs Blanking ===&lt;br /&gt;
&lt;br /&gt;
In some cases it may be more desirable to remove all the personal metadata from a record in the Users dataset rather than delete it completely. This has pros and cons.&lt;br /&gt;
&lt;br /&gt;
If you remove a user entirely who has deposited EPrints you may wish to reassign those deposits to an admin user, or a fake user called &amp;quot;left&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Last Login Time===&lt;br /&gt;
Storing the last login time of a user can be useful to identify which users are active and which are not to help ensure data is not being stored longer than is necessary.&lt;br /&gt;
&lt;br /&gt;
See [[GDPR/Last Login Time]]&lt;br /&gt;
&lt;br /&gt;
===Non-Active Users Report ===&lt;br /&gt;
TODO&lt;br /&gt;
worth having a count of items linked with the user on the report, along with their statuses?&lt;br /&gt;
&lt;br /&gt;
===Delete User Action===&lt;br /&gt;
*Suggestion* Cron job to select all user accounts which have been inactive over a certain time threshold, check those users for affiliation to a publication (creator, editor, depositor etc.) which is either archive or buffer status and, where no connection exists, remove those user accounts.&lt;br /&gt;
&lt;br /&gt;
Admin will be able to select user accounts from the report to delete (within the report or individually?)&lt;br /&gt;
&lt;br /&gt;
Could be similar to: &amp;lt;tt&amp;gt;EPrints::DataObj::LoginTicket::expire_all&amp;lt;/tt&amp;gt; - but with an &amp;lt;tt&amp;gt;$c-&amp;gt;{'account_retention_time'}&amp;lt;/tt&amp;gt; param taken away from the &amp;lt;tt&amp;gt;time()&amp;lt;/tt&amp;gt; call?&lt;br /&gt;
&lt;br /&gt;
Need to check logintickets too?&lt;br /&gt;
Someone may not have actually logged in for ages, but maintained a browser session/cookies for a long time?&lt;br /&gt;
(currently our longest 'active' login is ~20 days).&lt;br /&gt;
&lt;br /&gt;
==Add 'Agree to privacy and data statement' checkbox on registration or request forms==&lt;br /&gt;
TODO - should be 'versioned' - so if the statement changes, the version that was agreed to can be shown.&lt;br /&gt;
Possibly a set/namedset, with the available options limited to only one when rendered to a user?&lt;br /&gt;
&lt;br /&gt;
Chris Gutteridge has written a blog post on GDPR with a few comments about the EPrints Request a Copy feature: http://blog.soton.ac.uk/webteam/2018/05/10/gdpr-preperations/#post-content-1793;char=5429-7155&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=GDPR&amp;diff=12795</id>
		<title>GDPR</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=GDPR&amp;diff=12795"/>
		<updated>2018-06-01T10:27:18Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page has been created to gather information and share code snippets to help EPrints repositories handle GDPR responsibilities.  Some of the issues around GDPR will be specific to a repository contents, but others are quite generic. nb. We're not lawyers!&lt;br /&gt;
&lt;br /&gt;
As a general rule of thumb, this is about people's rights and privacy. Imagine a worst case scenario where the entire filesystem and database is made entirely public -- it's not a great situation, but consider what steps you could take to reduce the damage if that did happen - don't store any information about people that you don't actually need.&lt;br /&gt;
&lt;br /&gt;
=== Areas of GDPR that may be relevant to EPrints repositories ===&lt;br /&gt;
* Giving people a clear privacy policy about how you will use data you gather about them&lt;br /&gt;
* Gaining consent for storing and processing data you gather about them&lt;br /&gt;
* Defining and enforcing a retention policy to remove information about people that is no longer required &lt;br /&gt;
* &amp;quot;Subject Access Requests&amp;quot; where someone wants to know everything you know about them&lt;br /&gt;
* &amp;quot;Right to Erasure&amp;quot; where people may request you remove information about them, but there are exceptions to this.&lt;br /&gt;
&lt;br /&gt;
=== Information about people ===&lt;br /&gt;
EPrints potentially stores information about people in a number of places.&lt;br /&gt;
* Users Dataset&lt;br /&gt;
* EPrints Metadata &lt;br /&gt;
** In the revision XML files storing old versions of metadata.&lt;br /&gt;
* In actual documents&lt;br /&gt;
* In the &amp;quot;request a copy&amp;quot; Dataset&lt;br /&gt;
* Web access logs&lt;br /&gt;
** In the History Dataset&lt;br /&gt;
** In the Apache logs in the operating system&lt;br /&gt;
&lt;br /&gt;
== Users Dataset ==&lt;br /&gt;
This dataset is either populated with a web based sign up form, or in many cases, it is automatically built from an institutional accounts system. These cases need to be addressed in different ways.&lt;br /&gt;
&lt;br /&gt;
=== Imported users Dataset ===&lt;br /&gt;
&lt;br /&gt;
First of all, stop importing any fields you don't actually need and remove those fields from EPrints. nb. Removing the field in the config may not remove it from the database (citation required.. how the hell does that work?)&lt;br /&gt;
&lt;br /&gt;
Next stop importing any users you just don't need -- if they can't do anything while logged in they should never exist in the Users dataset.&lt;br /&gt;
&lt;br /&gt;
Next implement a data retention policy. This will be a script that removes or blanks the data of users that match a criteria. eg. have not appeared in the import script for more than 90 days and never made a deposit.&lt;br /&gt;
&lt;br /&gt;
=== Web signup users Dataset ===&lt;br /&gt;
&lt;br /&gt;
You should ensure that the privacy policy is up to date and in line with GDPR best practice.&lt;br /&gt;
&lt;br /&gt;
Stop collecting any information you don't actually need, and remove those fields from the database.&lt;br /&gt;
&lt;br /&gt;
Next implement a data retention policy. This will be a script that removes or blanks the data of users that match a criteria. eg. accounts more than a year old that have never made a deposit.&lt;br /&gt;
&lt;br /&gt;
=== Removing vs Blanking ===&lt;br /&gt;
&lt;br /&gt;
In some cases it may be more desirable to remove all the personal metadata from a record in the Users dataset rather than delete it completely. This has pros and cons.&lt;br /&gt;
&lt;br /&gt;
If you remove a user entirely who has deposited EPrints you may wish to reassign those deposits to an admin user, or a fake user called &amp;quot;left&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Last Login Time===&lt;br /&gt;
Storing the last login time of a user can be useful to identify which users are active and which are not to help ensure data is not being stored longer than is necessary.&lt;br /&gt;
&lt;br /&gt;
See [[GDPR/Last Login Time]]&lt;br /&gt;
&lt;br /&gt;
== Non-Active Users Report ==&lt;br /&gt;
TODO&lt;br /&gt;
worth having a count of items linked with the user on the report, along with their statuses?&lt;br /&gt;
&lt;br /&gt;
==Delete User Action==&lt;br /&gt;
*Suggestion* Cron job to select all user accounts which have been inactive over a certain time threshold, check those users for affiliation to a publication (creator, editor, depositor etc.) which is either archive or buffer status and, where no connection exists, remove those user accounts.&lt;br /&gt;
&lt;br /&gt;
Admin will be able to select user accounts from the report to delete (within the report or individually?)&lt;br /&gt;
&lt;br /&gt;
Could be similar to: &amp;lt;tt&amp;gt;EPrints::DataObj::LoginTicket::expire_all&amp;lt;/tt&amp;gt; - but with an &amp;lt;tt&amp;gt;$c-&amp;gt;{'account_retention_time'}&amp;lt;/tt&amp;gt; param taken away from the &amp;lt;tt&amp;gt;time()&amp;lt;/tt&amp;gt; call?&lt;br /&gt;
&lt;br /&gt;
Need to check logintickets too?&lt;br /&gt;
Someone may not have actually logged in for ages, but maintained a browser session/cookies for a long time?&lt;br /&gt;
(currently our longest 'active' login is ~20 days).&lt;br /&gt;
&lt;br /&gt;
==Add 'Agree to privacy and data statement' checkbox on registration or request forms==&lt;br /&gt;
TODO - should be 'versioned' - so if the statement changes, the version that was agreed to can be shown.&lt;br /&gt;
Possibly a set/namedset, with the available options limited to only one when rendered to a user?&lt;br /&gt;
&lt;br /&gt;
Chris Gutteridge has written a blog post on GDPR with a few comments about the EPrints Request a Copy feature: http://blog.soton.ac.uk/webteam/2018/05/10/gdpr-preperations/#post-content-1793;char=5429-7155&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=GDPR/Last_Login_Time&amp;diff=12794</id>
		<title>GDPR/Last Login Time</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=GDPR/Last_Login_Time&amp;diff=12794"/>
		<updated>2018-06-01T10:26:50Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Storing the last login time of a user can be useful to identify which users are active and which are not to help ensure data is not being stored longer than is necessary.&lt;br /&gt;
&lt;br /&gt;
First a new user field for storing the time is required in user_fields.pl&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
##user_fields.pl&lt;br /&gt;
&lt;br /&gt;
push @{$c-&amp;gt;{fields}-&amp;gt;{user}},&lt;br /&gt;
    {&lt;br /&gt;
        'name' =&amp;gt; 'last_login',&lt;br /&gt;
        'type' =&amp;gt; 'timestamp',&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And then add the following code to $c-&amp;gt;{check_user_password} in user_login.pl to store the time at which a user successfully logs in.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
##user_login.pl&lt;br /&gt;
&lt;br /&gt;
#get user from username&lt;br /&gt;
my $user = EPrints::DataObj::User::user_with_username( $repository, $username );&lt;br /&gt;
return 0 unless $user;&lt;br /&gt;
&lt;br /&gt;
#get time and compile a string&lt;br /&gt;
my( @local ) = localtime( time );&lt;br /&gt;
my ( $sec, $min, $hour, $day, $mon, $year ) = ( $local[0], $local[1], $local[2], $local[3], $local[4]+1, $local[5]+1900 );&lt;br /&gt;
my $loginTime = &amp;quot;$year-$mon-$day $hour:$min:$sec&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#store the value&lt;br /&gt;
$user-&amp;gt;set_value( &amp;quot;last_login&amp;quot;, $loginTime );&lt;br /&gt;
$user-&amp;gt;commit();&lt;br /&gt;
&lt;br /&gt;
#return user&lt;br /&gt;
return 1;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JLRS: An alternative approach (please discuss which is better) is to set the trigger on the loginticket dataset (different field spec from above - bigint):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
push @{$c-&amp;gt;{fields}-&amp;gt;{user}},&lt;br /&gt;
{&lt;br /&gt;
        name=&amp;gt;&amp;quot;last_login&amp;quot;,&lt;br /&gt;
        type=&amp;gt;&amp;quot;bigint&amp;quot;, #same as 'expires' field in EPrints::DataObj::LoginTicket&lt;br /&gt;
        required=&amp;gt;0,&lt;br /&gt;
        volatile=&amp;gt;1&lt;br /&gt;
}&lt;br /&gt;
;&lt;br /&gt;
$c-&amp;gt;add_dataset_trigger( 'loginticket', EPrints::Const::EP_TRIGGER_CREATED, sub&lt;br /&gt;
{&lt;br /&gt;
        my( %args ) = @_;&lt;br /&gt;
        my( $repo, $loginticket ) = @args{qw( repository dataobj )};&lt;br /&gt;
&lt;br /&gt;
        # trigger is global - check that current repository 'user' dataset has last_login field to be updated&lt;br /&gt;
        return unless $repo-&amp;gt;get_dataset( &amp;quot;user&amp;quot; )-&amp;gt;has_field( &amp;quot;last_login&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
        #update volatile field in user record&lt;br /&gt;
        my $user = EPrints::DataObj::User-&amp;gt;new( $repo, $loginticket-&amp;gt;get_value( &amp;quot;userid&amp;quot; ) );&lt;br /&gt;
        if( defined $user ){&lt;br /&gt;
                $user-&amp;gt;set_value( &amp;quot;last_login&amp;quot;, $loginticket-&amp;gt;get_value( &amp;quot;time&amp;quot; ) );&lt;br /&gt;
                $user-&amp;gt;commit();&lt;br /&gt;
        }&lt;br /&gt;
}, priority =&amp;gt; 100 );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=GDPR/Last_Login_Time&amp;diff=12793</id>
		<title>GDPR/Last Login Time</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=GDPR/Last_Login_Time&amp;diff=12793"/>
		<updated>2018-06-01T10:25:42Z</updated>

		<summary type="html">&lt;p&gt;Cjg: Created page with &amp;quot;test&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;test&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=GDPR&amp;diff=12792</id>
		<title>GDPR</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=GDPR&amp;diff=12792"/>
		<updated>2018-06-01T10:24:47Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page has been created to gather information and share code snippets to help EPrints repositories handle GDPR responsibilities.  Some of the issues around GDPR will be specific to a repository contents, but others are quite generic. nb. We're not lawyers!&lt;br /&gt;
&lt;br /&gt;
As a general rule of thumb, this is about people's rights and privacy. Imagine a worst case scenario where the entire filesystem and database is made entirely public -- it's not a great situation, but consider what steps you could take to reduce the damage if that did happen - don't store any information about people that you don't actually need.&lt;br /&gt;
&lt;br /&gt;
=== Areas of GDPR that may be relevant to EPrints repositories ===&lt;br /&gt;
* Giving people a clear privacy policy about how you will use data you gather about them&lt;br /&gt;
* Gaining consent for storing and processing data you gather about them&lt;br /&gt;
* Defining and enforcing a retention policy to remove information about people that is no longer required &lt;br /&gt;
* &amp;quot;Subject Access Requests&amp;quot; where someone wants to know everything you know about them&lt;br /&gt;
* &amp;quot;Right to Erasure&amp;quot; where people may request you remove information about them, but there are exceptions to this.&lt;br /&gt;
&lt;br /&gt;
=== Information about people ===&lt;br /&gt;
EPrints potentially stores information about people in a number of places.&lt;br /&gt;
* Users Dataset&lt;br /&gt;
* EPrints Metadata &lt;br /&gt;
** In the revision XML files storing old versions of metadata.&lt;br /&gt;
* In actual documents&lt;br /&gt;
* In the &amp;quot;request a copy&amp;quot; Dataset&lt;br /&gt;
* Web access logs&lt;br /&gt;
** In the History Dataset&lt;br /&gt;
** In the Apache logs in the operating system&lt;br /&gt;
&lt;br /&gt;
== Users Dataset ==&lt;br /&gt;
This dataset is either populated with a web based sign up form, or in many cases, it is automatically built from an institutional accounts system. These cases need to be addressed in different ways.&lt;br /&gt;
&lt;br /&gt;
=== Imported users Dataset ===&lt;br /&gt;
&lt;br /&gt;
First of all, stop importing any fields you don't actually need and remove those fields from EPrints. nb. Removing the field in the config may not remove it from the database (citation required.. how the hell does that work?)&lt;br /&gt;
&lt;br /&gt;
Next stop importing any users you just don't need -- if they can't do anything while logged in they should never exist in the Users dataset.&lt;br /&gt;
&lt;br /&gt;
Next implement a data retention policy. This will be a script that removes or blanks the data of users that match a criteria. eg. have not appeared in the import script for more than 90 days and never made a deposit.&lt;br /&gt;
&lt;br /&gt;
=== Web signup users Dataset ===&lt;br /&gt;
&lt;br /&gt;
You should ensure that the privacy policy is up to date and in line with GDPR best practice.&lt;br /&gt;
&lt;br /&gt;
Stop collecting any information you don't actually need, and remove those fields from the database.&lt;br /&gt;
&lt;br /&gt;
Next implement a data retention policy. This will be a script that removes or blanks the data of users that match a criteria. eg. accounts more than a year old that have never made a deposit.&lt;br /&gt;
&lt;br /&gt;
=== Removing vs Blanking ===&lt;br /&gt;
&lt;br /&gt;
In some cases it may be more desirable to remove all the personal metadata from a record in the Users dataset rather than delete it completely. This has pros and cons.&lt;br /&gt;
&lt;br /&gt;
If you remove a user entirely who has deposited EPrints you may wish to reassign those deposits to an admin user, or a fake user called &amp;quot;left&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Last Login Time===&lt;br /&gt;
Storing the last login time of a user can be useful to identify which users are active and which are not to help ensure data is not being stored longer than is necessary.&lt;br /&gt;
&lt;br /&gt;
First a new user field for storing the time is required in user_fields.pl&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
##user_fields.pl&lt;br /&gt;
&lt;br /&gt;
push @{$c-&amp;gt;{fields}-&amp;gt;{user}},&lt;br /&gt;
    {&lt;br /&gt;
        'name' =&amp;gt; 'last_login',&lt;br /&gt;
        'type' =&amp;gt; 'timestamp',&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And then add the following code to $c-&amp;gt;{check_user_password} in user_login.pl to store the time at which a user successfully logs in.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
##user_login.pl&lt;br /&gt;
&lt;br /&gt;
#get user from username&lt;br /&gt;
my $user = EPrints::DataObj::User::user_with_username( $repository, $username );&lt;br /&gt;
return 0 unless $user;&lt;br /&gt;
&lt;br /&gt;
#get time and compile a string&lt;br /&gt;
my( @local ) = localtime( time );&lt;br /&gt;
my ( $sec, $min, $hour, $day, $mon, $year ) = ( $local[0], $local[1], $local[2], $local[3], $local[4]+1, $local[5]+1900 );&lt;br /&gt;
my $loginTime = &amp;quot;$year-$mon-$day $hour:$min:$sec&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#store the value&lt;br /&gt;
$user-&amp;gt;set_value( &amp;quot;last_login&amp;quot;, $loginTime );&lt;br /&gt;
$user-&amp;gt;commit();&lt;br /&gt;
&lt;br /&gt;
#return user&lt;br /&gt;
return 1;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JLRS: An alternative approach (please discuss which is better) is to set the trigger on the loginticket dataset (different field spec from above - bigint):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
push @{$c-&amp;gt;{fields}-&amp;gt;{user}},&lt;br /&gt;
{&lt;br /&gt;
        name=&amp;gt;&amp;quot;last_login&amp;quot;,&lt;br /&gt;
        type=&amp;gt;&amp;quot;bigint&amp;quot;, #same as 'expires' field in EPrints::DataObj::LoginTicket&lt;br /&gt;
        required=&amp;gt;0,&lt;br /&gt;
        volatile=&amp;gt;1&lt;br /&gt;
}&lt;br /&gt;
;&lt;br /&gt;
$c-&amp;gt;add_dataset_trigger( 'loginticket', EPrints::Const::EP_TRIGGER_CREATED, sub&lt;br /&gt;
{&lt;br /&gt;
        my( %args ) = @_;&lt;br /&gt;
        my( $repo, $loginticket ) = @args{qw( repository dataobj )};&lt;br /&gt;
&lt;br /&gt;
        # trigger is global - check that current repository 'user' dataset has last_login field to be updated&lt;br /&gt;
        return unless $repo-&amp;gt;get_dataset( &amp;quot;user&amp;quot; )-&amp;gt;has_field( &amp;quot;last_login&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
        #update volatile field in user record&lt;br /&gt;
        my $user = EPrints::DataObj::User-&amp;gt;new( $repo, $loginticket-&amp;gt;get_value( &amp;quot;userid&amp;quot; ) );&lt;br /&gt;
        if( defined $user ){&lt;br /&gt;
                $user-&amp;gt;set_value( &amp;quot;last_login&amp;quot;, $loginticket-&amp;gt;get_value( &amp;quot;time&amp;quot; ) );&lt;br /&gt;
                $user-&amp;gt;commit();&lt;br /&gt;
        }&lt;br /&gt;
}, priority =&amp;gt; 100 );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Non-Active Users Report ==&lt;br /&gt;
TODO&lt;br /&gt;
worth having a count of items linked with the user on the report, along with their statuses?&lt;br /&gt;
&lt;br /&gt;
==Delete User Action==&lt;br /&gt;
*Suggestion* Cron job to select all user accounts which have been inactive over a certain time threshold, check those users for affiliation to a publication (creator, editor, depositor etc.) which is either archive or buffer status and, where no connection exists, remove those user accounts.&lt;br /&gt;
&lt;br /&gt;
Admin will be able to select user accounts from the report to delete (within the report or individually?)&lt;br /&gt;
&lt;br /&gt;
Could be similar to: &amp;lt;tt&amp;gt;EPrints::DataObj::LoginTicket::expire_all&amp;lt;/tt&amp;gt; - but with an &amp;lt;tt&amp;gt;$c-&amp;gt;{'account_retention_time'}&amp;lt;/tt&amp;gt; param taken away from the &amp;lt;tt&amp;gt;time()&amp;lt;/tt&amp;gt; call?&lt;br /&gt;
&lt;br /&gt;
Need to check logintickets too?&lt;br /&gt;
Someone may not have actually logged in for ages, but maintained a browser session/cookies for a long time?&lt;br /&gt;
(currently our longest 'active' login is ~20 days).&lt;br /&gt;
&lt;br /&gt;
==Add 'Agree to privacy and data statement' checkbox on registration or request forms==&lt;br /&gt;
TODO - should be 'versioned' - so if the statement changes, the version that was agreed to can be shown.&lt;br /&gt;
Possibly a set/namedset, with the available options limited to only one when rendered to a user?&lt;br /&gt;
&lt;br /&gt;
Chris Gutteridge has written a blog post on GDPR with a few comments about the EPrints Request a Copy feature: http://blog.soton.ac.uk/webteam/2018/05/10/gdpr-preperations/#post-content-1793;char=5429-7155&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=How_to_contribute&amp;diff=9841</id>
		<title>How to contribute</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=How_to_contribute&amp;diff=9841"/>
		<updated>2011-03-30T16:45:21Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* Report bugs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Contribute]]&lt;br /&gt;
''Contributing to EPrints development''&lt;br /&gt;
&lt;br /&gt;
There's a number of different ways you can contribute to the EPrints project. This page covers all the ones we can think of...&lt;br /&gt;
&lt;br /&gt;
Always make an entry on http://files.eprints.org/ for your contribution, even if you don't upload the files. This will make it the one-stop shop for people to find EPrints extensions.&lt;br /&gt;
&lt;br /&gt;
== Writing EPrints Code ==&lt;br /&gt;
&lt;br /&gt;
=== EPrints Core API ===&lt;br /&gt;
&lt;br /&gt;
Documentation describing the EPrints API is available from this Wiki at [[:Category:API|API]]. This is generated from the inline comments in the source code.&lt;br /&gt;
&lt;br /&gt;
=== Coding Style ===&lt;br /&gt;
&lt;br /&gt;
There is a definite ''style'' that eprints is written in. Please read the [[StyleGuide]] and follow it.&lt;br /&gt;
&lt;br /&gt;
=== IDE-based Development ===&lt;br /&gt;
&lt;br /&gt;
[[EclipseEpicPerlDebug|How to set up EPrints in Eclipse using EPIC and the Perl Debugger]]&lt;br /&gt;
&lt;br /&gt;
=== Core Committers ===&lt;br /&gt;
&lt;br /&gt;
We run two mailing lists for committers: eprints-devel and eprints-changes. To receive changes to our tickets and repository, subscribe to eprints-changes (read only). eprint-devel is a lower-traffic discussion of commits (questions will probably be ignored - use ep-tech instead).&lt;br /&gt;
&lt;br /&gt;
To subscribe to the lists, send a mail with one of the following lines in the message body to [mailto:majordomo@ecs.soton.ac.uk majordomo@ecs.soton.ac.uk]&lt;br /&gt;
&lt;br /&gt;
 subscribe eprints-devel&lt;br /&gt;
 subscribe eprints-changes&lt;br /&gt;
&lt;br /&gt;
WARNING: eprints-changes is HIGH traffic (every ticket and commit gets posted).&lt;br /&gt;
&lt;br /&gt;
The list of tickets and commits is accessible via the Web on our [http://trac.eprints.org/ Trac].&lt;br /&gt;
&lt;br /&gt;
== Write a Plugin ==&lt;br /&gt;
&lt;br /&gt;
The plugin system for EPrints 3 has been developed to make it easy and share the most common extensions to the code without having to hack the core system (and causing yourself problems with upgrades etc.)&lt;br /&gt;
&lt;br /&gt;
When the system loads, it automatically loads all modules in the perl_lib/EPrints/Plugin/ directory, so for simple plugins you just drop them in that directory and you're done!&lt;br /&gt;
&lt;br /&gt;
When a plugin is loaded it has a registration method which is called which tells the core EPrints system what this plugin does. EPrints then makes it available as appropriate.&lt;br /&gt;
&lt;br /&gt;
Clever plugins can detect features they need and adapt to use the tools available, or disable themselves if they are missing required tools (rather than crash the system). Some specialised plugins are disabled in their default state and must be enabled in the repository configuration.&lt;br /&gt;
&lt;br /&gt;
Another cool thing is that plugins are Perl Objects, which means you can subclass them. Here's an real-world example: We have a research group which uses BibTeX but over the years standardised within the group on an extra field. This is not a valid bibtex field, but are essential to their working because they have ancient and essential scripts which depend on it. To handle this we can subclass the default BibTeX Export plugin and override a single method (the data mapping one). We then just call the original parent plugins mapping method to do all the heavy lifting, then just add our non-standard extra field. Total code required: less than one screen. Number of happy researchers: none (they are never satisfied and will just demand the moon on the stick because you've already given them this nice new feature), but number of researchers able to get their work done: lots. Don't believe me? [[BibTeX Extension Example|look here]]!&lt;br /&gt;
&lt;br /&gt;
* See also [[Extension Packages]] for how to add configuration and resource files to plugins.&lt;br /&gt;
&lt;br /&gt;
=== Types of Plugin ===&lt;br /&gt;
&lt;br /&gt;
There are a number of different kinds of plugin for EPrints... &lt;br /&gt;
&lt;br /&gt;
==== Export Plugin ====&lt;br /&gt;
&lt;br /&gt;
These are used to export the data in a variety of formats. They are quite easy to write, once you get started.&lt;br /&gt;
&lt;br /&gt;
==== Import Plugin ====&lt;br /&gt;
&lt;br /&gt;
These are used to import data into a repository. They can take datafiles directly, or they can take an ID of a record that can be retrieved in a known way, or a URL of a file, or... whatever.&lt;br /&gt;
&lt;br /&gt;
These are a bit trickier to write than export plugins as parsing data is harder than just &amp;quot;print&amp;quot;ing it, but they are still reasonably straight forward.&lt;br /&gt;
&lt;br /&gt;
==== Screen Plugin ====&lt;br /&gt;
&lt;br /&gt;
These handle (almost) all the user interface screens. Pages like &amp;quot;Review&amp;quot; and &amp;quot;Profile&amp;quot; are just built-in plugins. You can add your own very easily. &lt;br /&gt;
&lt;br /&gt;
Examples you could create...&lt;br /&gt;
* Birds Eye View - a view of various statistics on the database, all in one page.&lt;br /&gt;
* Spellchecking Tab - an additional tab in the item control page which checks the spelling on certain fields.&lt;br /&gt;
* Bulk Delete tool - a tool which takes a list of eprintid's and deletes them all in a fell swoop.&lt;br /&gt;
&lt;br /&gt;
Look at the existing Screen Plugins for an idea of how they work. They can be very simple.&lt;br /&gt;
&lt;br /&gt;
==== Input Component Plugin ====&lt;br /&gt;
&lt;br /&gt;
These handle how the workflow components are rendered. Built in components include the default (one field) component, the multiple fields component, the upload component, the subject component (which does pretty things to a field of type &amp;quot;subject&amp;quot;) and the XHTML component. You can add your own or sub-class existing ones.&lt;br /&gt;
&lt;br /&gt;
===== Convert Plugin =====&lt;br /&gt;
&lt;br /&gt;
These are used for two things, currently.&lt;br /&gt;
&lt;br /&gt;
* Converting the full text of documents into utf-8 text for search indexing&lt;br /&gt;
* Converting images and pdfs into thumbnails and previews&lt;br /&gt;
&lt;br /&gt;
Some examples you could create:&lt;br /&gt;
&lt;br /&gt;
* RTF to utf-8 to allow rich text documents to be indexed.&lt;br /&gt;
* Powerpoint to Thumbnail to allow thumbnail and previews of powerpoint slides&lt;br /&gt;
* Video to Thumbnail/Preview to make a still preview of a video file.&lt;br /&gt;
&lt;br /&gt;
== Write an Autocompleter script or data file ==&lt;br /&gt;
&lt;br /&gt;
If you created a useful data file for autocompletion, or even a new script!, other may gain from using it. They'll get ideas from just knowing it exists!&lt;br /&gt;
&lt;br /&gt;
* See [[Autocompletion]]&lt;br /&gt;
&lt;br /&gt;
== Write a Script ==&lt;br /&gt;
&lt;br /&gt;
There are any number of useful command-line and cgi-scripts which could be written using the EPrints API. &lt;br /&gt;
&lt;br /&gt;
== Write a new Theme ==&lt;br /&gt;
&lt;br /&gt;
EPrints supports &amp;quot;themes&amp;quot; for the basic layout. Creating a few variations will make the software more friendly to people using it for demos and provide some alternate starting points for peoples look and feel.&lt;br /&gt;
&lt;br /&gt;
== Translate EPrints into your language ==&lt;br /&gt;
&lt;br /&gt;
A number of translations for EPrints v2 exist on http://files.eprints.org/ but these need updating for EPrints 3. &lt;br /&gt;
&lt;br /&gt;
===How to add your Translation===&lt;br /&gt;
&lt;br /&gt;
If you have translated eprints into a new language please package up the translated files with a file containing the GPL license called COPYING, and a file called COPYRIGHT which describes who owns the copyright of the translation (this may be important if we choose to package translations in the core, later). &lt;br /&gt;
&lt;br /&gt;
You may also wish to add a README file adding additional details such as which files (if not all) were translated.&lt;br /&gt;
&lt;br /&gt;
These files (just those you have translated, not all!) should be stored in a .tgz archive, with a name in this format:&lt;br /&gt;
&lt;br /&gt;
 eprints-2.3.4-translation-fr.tgz&lt;br /&gt;
&lt;br /&gt;
To add the file, [http://files.eprints.org/perl/register register] on the EPrints Files repository - EPrints users should already know the rest!&lt;br /&gt;
&lt;br /&gt;
= Other neighbourly things to do =&lt;br /&gt;
&lt;br /&gt;
== Report bugs ==&lt;br /&gt;
&lt;br /&gt;
Oddly, we do like to hear about our mistakes. If you think you've found a bug then email the eprints-tech mailing list.&lt;br /&gt;
&lt;br /&gt;
Send all the information you have- what version of EPrints and instructions of how to recreate the problem. If you've figured it out, tell us how to fix it too!&lt;br /&gt;
&lt;br /&gt;
== Write How-to's ==&lt;br /&gt;
&lt;br /&gt;
* Done something new or unsual with EPrints? &lt;br /&gt;
* Installed it on a new platform or in an unusual way?&lt;br /&gt;
* Got annoyed figuring out how to do something, and wished there was a how-to?&lt;br /&gt;
&lt;br /&gt;
Add a [[How-to]] to this wiki! It doesn't need to spend hours working on perfect layout and grammer (we can always fix that later). Put up useful information and step-by-step guides which you feel will help the next guy (or gal).&lt;br /&gt;
&lt;br /&gt;
== Hire EPrints Services! ==&lt;br /&gt;
&lt;br /&gt;
We partly fund the development and support of the software through [http://eprints.org/services/ EPrints Services] which may be hired for custom configurations, hosting and creating new features (such as those described on this page). &lt;br /&gt;
&lt;br /&gt;
While EPrints will remain free software, we understand that different groups work in different ways. It's more economical for some to get us to add a new plugin or feature than to build it themselves. If so, great! Get in touch. Hiring EPrints Services benefits you, us (of course) and the entire community by supporting the project!&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=How_to_contribute&amp;diff=9840</id>
		<title>How to contribute</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=How_to_contribute&amp;diff=9840"/>
		<updated>2011-03-30T16:44:03Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* Translate EPrints into your language */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Contribute]]&lt;br /&gt;
''Contributing to EPrints development''&lt;br /&gt;
&lt;br /&gt;
There's a number of different ways you can contribute to the EPrints project. This page covers all the ones we can think of...&lt;br /&gt;
&lt;br /&gt;
Always make an entry on http://files.eprints.org/ for your contribution, even if you don't upload the files. This will make it the one-stop shop for people to find EPrints extensions.&lt;br /&gt;
&lt;br /&gt;
== Writing EPrints Code ==&lt;br /&gt;
&lt;br /&gt;
=== EPrints Core API ===&lt;br /&gt;
&lt;br /&gt;
Documentation describing the EPrints API is available from this Wiki at [[:Category:API|API]]. This is generated from the inline comments in the source code.&lt;br /&gt;
&lt;br /&gt;
=== Coding Style ===&lt;br /&gt;
&lt;br /&gt;
There is a definite ''style'' that eprints is written in. Please read the [[StyleGuide]] and follow it.&lt;br /&gt;
&lt;br /&gt;
=== IDE-based Development ===&lt;br /&gt;
&lt;br /&gt;
[[EclipseEpicPerlDebug|How to set up EPrints in Eclipse using EPIC and the Perl Debugger]]&lt;br /&gt;
&lt;br /&gt;
=== Core Committers ===&lt;br /&gt;
&lt;br /&gt;
We run two mailing lists for committers: eprints-devel and eprints-changes. To receive changes to our tickets and repository, subscribe to eprints-changes (read only). eprint-devel is a lower-traffic discussion of commits (questions will probably be ignored - use ep-tech instead).&lt;br /&gt;
&lt;br /&gt;
To subscribe to the lists, send a mail with one of the following lines in the message body to [mailto:majordomo@ecs.soton.ac.uk majordomo@ecs.soton.ac.uk]&lt;br /&gt;
&lt;br /&gt;
 subscribe eprints-devel&lt;br /&gt;
 subscribe eprints-changes&lt;br /&gt;
&lt;br /&gt;
WARNING: eprints-changes is HIGH traffic (every ticket and commit gets posted).&lt;br /&gt;
&lt;br /&gt;
The list of tickets and commits is accessible via the Web on our [http://trac.eprints.org/ Trac].&lt;br /&gt;
&lt;br /&gt;
== Write a Plugin ==&lt;br /&gt;
&lt;br /&gt;
The plugin system for EPrints 3 has been developed to make it easy and share the most common extensions to the code without having to hack the core system (and causing yourself problems with upgrades etc.)&lt;br /&gt;
&lt;br /&gt;
When the system loads, it automatically loads all modules in the perl_lib/EPrints/Plugin/ directory, so for simple plugins you just drop them in that directory and you're done!&lt;br /&gt;
&lt;br /&gt;
When a plugin is loaded it has a registration method which is called which tells the core EPrints system what this plugin does. EPrints then makes it available as appropriate.&lt;br /&gt;
&lt;br /&gt;
Clever plugins can detect features they need and adapt to use the tools available, or disable themselves if they are missing required tools (rather than crash the system). Some specialised plugins are disabled in their default state and must be enabled in the repository configuration.&lt;br /&gt;
&lt;br /&gt;
Another cool thing is that plugins are Perl Objects, which means you can subclass them. Here's an real-world example: We have a research group which uses BibTeX but over the years standardised within the group on an extra field. This is not a valid bibtex field, but are essential to their working because they have ancient and essential scripts which depend on it. To handle this we can subclass the default BibTeX Export plugin and override a single method (the data mapping one). We then just call the original parent plugins mapping method to do all the heavy lifting, then just add our non-standard extra field. Total code required: less than one screen. Number of happy researchers: none (they are never satisfied and will just demand the moon on the stick because you've already given them this nice new feature), but number of researchers able to get their work done: lots. Don't believe me? [[BibTeX Extension Example|look here]]!&lt;br /&gt;
&lt;br /&gt;
* See also [[Extension Packages]] for how to add configuration and resource files to plugins.&lt;br /&gt;
&lt;br /&gt;
=== Types of Plugin ===&lt;br /&gt;
&lt;br /&gt;
There are a number of different kinds of plugin for EPrints... &lt;br /&gt;
&lt;br /&gt;
==== Export Plugin ====&lt;br /&gt;
&lt;br /&gt;
These are used to export the data in a variety of formats. They are quite easy to write, once you get started.&lt;br /&gt;
&lt;br /&gt;
==== Import Plugin ====&lt;br /&gt;
&lt;br /&gt;
These are used to import data into a repository. They can take datafiles directly, or they can take an ID of a record that can be retrieved in a known way, or a URL of a file, or... whatever.&lt;br /&gt;
&lt;br /&gt;
These are a bit trickier to write than export plugins as parsing data is harder than just &amp;quot;print&amp;quot;ing it, but they are still reasonably straight forward.&lt;br /&gt;
&lt;br /&gt;
==== Screen Plugin ====&lt;br /&gt;
&lt;br /&gt;
These handle (almost) all the user interface screens. Pages like &amp;quot;Review&amp;quot; and &amp;quot;Profile&amp;quot; are just built-in plugins. You can add your own very easily. &lt;br /&gt;
&lt;br /&gt;
Examples you could create...&lt;br /&gt;
* Birds Eye View - a view of various statistics on the database, all in one page.&lt;br /&gt;
* Spellchecking Tab - an additional tab in the item control page which checks the spelling on certain fields.&lt;br /&gt;
* Bulk Delete tool - a tool which takes a list of eprintid's and deletes them all in a fell swoop.&lt;br /&gt;
&lt;br /&gt;
Look at the existing Screen Plugins for an idea of how they work. They can be very simple.&lt;br /&gt;
&lt;br /&gt;
==== Input Component Plugin ====&lt;br /&gt;
&lt;br /&gt;
These handle how the workflow components are rendered. Built in components include the default (one field) component, the multiple fields component, the upload component, the subject component (which does pretty things to a field of type &amp;quot;subject&amp;quot;) and the XHTML component. You can add your own or sub-class existing ones.&lt;br /&gt;
&lt;br /&gt;
===== Convert Plugin =====&lt;br /&gt;
&lt;br /&gt;
These are used for two things, currently.&lt;br /&gt;
&lt;br /&gt;
* Converting the full text of documents into utf-8 text for search indexing&lt;br /&gt;
* Converting images and pdfs into thumbnails and previews&lt;br /&gt;
&lt;br /&gt;
Some examples you could create:&lt;br /&gt;
&lt;br /&gt;
* RTF to utf-8 to allow rich text documents to be indexed.&lt;br /&gt;
* Powerpoint to Thumbnail to allow thumbnail and previews of powerpoint slides&lt;br /&gt;
* Video to Thumbnail/Preview to make a still preview of a video file.&lt;br /&gt;
&lt;br /&gt;
== Write an Autocompleter script or data file ==&lt;br /&gt;
&lt;br /&gt;
If you created a useful data file for autocompletion, or even a new script!, other may gain from using it. They'll get ideas from just knowing it exists!&lt;br /&gt;
&lt;br /&gt;
* See [[Autocompletion]]&lt;br /&gt;
&lt;br /&gt;
== Write a Script ==&lt;br /&gt;
&lt;br /&gt;
There are any number of useful command-line and cgi-scripts which could be written using the EPrints API. &lt;br /&gt;
&lt;br /&gt;
== Write a new Theme ==&lt;br /&gt;
&lt;br /&gt;
EPrints supports &amp;quot;themes&amp;quot; for the basic layout. Creating a few variations will make the software more friendly to people using it for demos and provide some alternate starting points for peoples look and feel.&lt;br /&gt;
&lt;br /&gt;
== Translate EPrints into your language ==&lt;br /&gt;
&lt;br /&gt;
A number of translations for EPrints v2 exist on http://files.eprints.org/ but these need updating for EPrints 3. &lt;br /&gt;
&lt;br /&gt;
===How to add your Translation===&lt;br /&gt;
&lt;br /&gt;
If you have translated eprints into a new language please package up the translated files with a file containing the GPL license called COPYING, and a file called COPYRIGHT which describes who owns the copyright of the translation (this may be important if we choose to package translations in the core, later). &lt;br /&gt;
&lt;br /&gt;
You may also wish to add a README file adding additional details such as which files (if not all) were translated.&lt;br /&gt;
&lt;br /&gt;
These files (just those you have translated, not all!) should be stored in a .tgz archive, with a name in this format:&lt;br /&gt;
&lt;br /&gt;
 eprints-2.3.4-translation-fr.tgz&lt;br /&gt;
&lt;br /&gt;
To add the file, [http://files.eprints.org/perl/register register] on the EPrints Files repository - EPrints users should already know the rest!&lt;br /&gt;
&lt;br /&gt;
= Other neighbourly things to do =&lt;br /&gt;
&lt;br /&gt;
== Report bugs ==&lt;br /&gt;
&lt;br /&gt;
Oddly, we do like to hear about our mistakes. If you think you've found a bug then email either the eprints-tech mailing list or Chris directly at cjg@ecs.soton.ac.uk (send to the list if you feel it's useful for other people to know about it and discuss it).&lt;br /&gt;
&lt;br /&gt;
Send all the information you have- what version of EPrints and instructions of how to recreate the problem. If you've figured it out, tell us how to fix it too!&lt;br /&gt;
&lt;br /&gt;
== Write How-to's ==&lt;br /&gt;
&lt;br /&gt;
* Done something new or unsual with EPrints? &lt;br /&gt;
* Installed it on a new platform or in an unusual way?&lt;br /&gt;
* Got annoyed figuring out how to do something, and wished there was a how-to?&lt;br /&gt;
&lt;br /&gt;
Add a [[How-to]] to this wiki! It doesn't need to spend hours working on perfect layout and grammer (we can always fix that later). Put up useful information and step-by-step guides which you feel will help the next guy (or gal).&lt;br /&gt;
&lt;br /&gt;
== Hire EPrints Services! ==&lt;br /&gt;
&lt;br /&gt;
We partly fund the development and support of the software through [http://eprints.org/services/ EPrints Services] which may be hired for custom configurations, hosting and creating new features (such as those described on this page). &lt;br /&gt;
&lt;br /&gt;
While EPrints will remain free software, we understand that different groups work in different ways. It's more economical for some to get us to add a new plugin or feature than to build it themselves. If so, great! Get in touch. Hiring EPrints Services benefits you, us (of course) and the entire community by supporting the project!&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Manual&amp;diff=9536</id>
		<title>Manual</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Manual&amp;diff=9536"/>
		<updated>2010-10-18T22:06:40Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Rubbish]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
See the [[Main Page]] for other areas of this wiki.&lt;br /&gt;
&lt;br /&gt;
* [[Introduction|Introduction to EPrints]] and [[History|History of EPrints]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table cellpadding=&amp;quot;10&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td width=&amp;quot;33%&amp;quot; valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Installation and First Steps =&lt;br /&gt;
&lt;br /&gt;
* [[Quick Server Install Guide (Debian / Ubuntu Server)]]&lt;br /&gt;
&lt;br /&gt;
== Releases ==&lt;br /&gt;
&lt;br /&gt;
{{releasenotes}}&lt;br /&gt;
* (see also the note on [[EPrints Version Numbering]])&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
{{Download}}&lt;br /&gt;
&lt;br /&gt;
== Installing EPrints From Binary ==&lt;br /&gt;
* [[Installing EPrints 3 via Redhat RPM]]&lt;br /&gt;
* [[Installing EPrints 3 via Fedora RPM]]&lt;br /&gt;
* [[Installing EPrints 3 via apt (Debian/Ubuntu)]]&lt;br /&gt;
&lt;br /&gt;
== Using EPrints in the Cloud ==&lt;br /&gt;
* [[EPrints EC2]] - Running both a vanilla and training repository!&lt;br /&gt;
&lt;br /&gt;
== Using the Live CD ==&lt;br /&gt;
* [[EPrints Live CD Help]]&lt;br /&gt;
* [[Building the Live CD]]&lt;br /&gt;
&lt;br /&gt;
== Installing EPrints From Source (.tar.gz) ==&lt;br /&gt;
&lt;br /&gt;
* [[Recommended Platforms]]&lt;br /&gt;
* [[Required software]]&lt;br /&gt;
* Install Guides&lt;br /&gt;
** [[Installing Eprints 3 on Fedora Core 7]] (also applicable to FC6)&lt;br /&gt;
** [[Installing EPrints 3 on RedHat Enterprise 4]]&lt;br /&gt;
** [[Installing EPrints 3 on OS X]]&lt;br /&gt;
** [[Debian from source | Installing EPrints 3 on Debian/Ubuntu - The Quick Way]]&lt;br /&gt;
** [[Installing EPrints 3 on Ubuntu 6.10]]&lt;br /&gt;
** [[Installing EPrints 3 on Debian]]&lt;br /&gt;
** [[Installing in a chroot Debian/Ubuntu]]&lt;br /&gt;
** [[:Category:Installation|Installing]] EPrints on various platforms.&lt;br /&gt;
* [[Https3 | Installing EPrints 3 with an https server]]&lt;br /&gt;
&lt;br /&gt;
==Post Installation==&lt;br /&gt;
&lt;br /&gt;
* [[Upgrading EPrints 3 versions | Upgrading from an earlier version of EPrints3]]&lt;br /&gt;
* [[Migration|Migrating from EPrints 2.3]]&lt;br /&gt;
&lt;br /&gt;
==Getting Started==&lt;br /&gt;
* [[Getting Started with EPrints 3|Getting Started]] &lt;br /&gt;
&lt;br /&gt;
* Maintenance &lt;br /&gt;
** [[Backups]]&lt;br /&gt;
** [[Generate Scripts]]&lt;br /&gt;
** [[Alerts]]&lt;br /&gt;
** [[Log Files]]&lt;br /&gt;
** [[Automating your maintenance]]&lt;br /&gt;
&lt;br /&gt;
* [[Troubleshooting]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td width=&amp;quot;33%&amp;quot; valign=&amp;quot;top&amp;quot; style=&amp;quot;border-left: solid 1px #ccc; border-right: solid 1px #ccc;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How-to Guides =&lt;br /&gt;
&lt;br /&gt;
''[http://en.wikipedia.org/wiki/Howto What is a how-to?]&lt;br /&gt;
&lt;br /&gt;
* Orientation &amp;lt;span style=&amp;quot;color: #f94; font-size: 130%&amp;quot;&amp;gt;(Start here)&amp;lt;/span&amp;gt;&lt;br /&gt;
** [[Configuration orientation|New to EPrints 3?]]  - ''before diving into the how-tos, take some time to read through this brief orientation guide and familiarise yourself with the EPrints configuration landscape...''&lt;br /&gt;
** [[EPrints_3_Configuration_orientation_for_EPrints_2_administrators|Migrated from EPrints 2?]] - ''this orientation guide is intended to help you re-orient yourselves in your new EPrints 3 set up...'' &lt;br /&gt;
* [[Front Page Warning | Removing the Front Page Warning]] - Your first go at branding&lt;br /&gt;
* [[Branding with confidence]] - ''one of the most common EPrints customisations is to add your own institution's branding and &amp;quot;look and feel&amp;quot; to the interface...''&lt;br /&gt;
** [[Branding, the next level]] - ''how to completely change the interface to your own design''&lt;br /&gt;
* [[OAI]]&lt;br /&gt;
* [[Adding new views]]&lt;br /&gt;
* Workflow&lt;br /&gt;
* Deposit Types&lt;br /&gt;
** [[Removing types]]&lt;br /&gt;
* Metadata&lt;br /&gt;
* Subjects (fold in with Organisation Hierarchy under &amp;quot;controled vocabularies&amp;quot;)&lt;br /&gt;
* [[EPrints_3_Organisation_Hierarchy|Organisation Hierarchy]] - ''how to put your own organisation's Hierarchy into EPrints 3''&lt;br /&gt;
* Searches&lt;br /&gt;
* [[Autocompletion and Authority Files (Romeo Autocomplete)]] - ''add autocomplete functionality to the Publication Title input field based on an authority file downloaded from EPrints Romeo...''&lt;br /&gt;
* [[Create Export Plugins]] - ''create a Perl Module that will export your data...''&lt;br /&gt;
* [[Login-Only Repository]] - ''require a username and password to access all pages (including search, browse, and the front page)...''&lt;br /&gt;
* [[Change Deposit Status in Bulk]] - ''move a large number of deposits from inbox to archive&lt;br /&gt;
* [[Demoprints Repository]] - ''How to set up and configure the demoprints.eprints.org repository.&lt;br /&gt;
* [[SWORD]] - ''How to configure the SWORD protocol on EPrints.&lt;br /&gt;
* [[:Category:Howto|more ...]]&lt;br /&gt;
&lt;br /&gt;
= How to contribute =&lt;br /&gt;
&lt;br /&gt;
There's a number of different ways you can contribute to the EPrints project. This section covers all the ones we can think of...&lt;br /&gt;
&lt;br /&gt;
Always make an entry on http://files.eprints.org/ for your contribution, even if you don't upload the files. This will make it the one-stop place for people to find EPrints extensions.&lt;br /&gt;
&lt;br /&gt;
* [[Contribute: Plugins | Plugins]]&lt;br /&gt;
* [[Contribute: Scripts | Scripts]]&lt;br /&gt;
* [[Contribute: Themes | Themes]]&lt;br /&gt;
* [[Contribute: Translations | Translations]]&lt;br /&gt;
* [[Contribute: Other | Other neighbourly things to do]]&lt;br /&gt;
* [[Extension Packages]]&lt;br /&gt;
&lt;br /&gt;
= Misc =&lt;br /&gt;
&lt;br /&gt;
* [[Preservation Support]] in EPrints 3&lt;br /&gt;
* [[:Category:Languages|Language support and translations]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot; width=&amp;quot;33%&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Technical Reference =&lt;br /&gt;
&lt;br /&gt;
* [[EPrints Directory Structure]] - will be linked somewhere better, later.&lt;br /&gt;
&lt;br /&gt;
* [[Metadata]] - configuring metadata fields.&lt;br /&gt;
* [[Archives/ARCHIVEID/cfg/|Repository Configuration]]&lt;br /&gt;
* [[XML Configuration]] Files&lt;br /&gt;
** [[EPScript]] - documentation for the EP3 Scripting language (for use in citations and workflow files).&lt;br /&gt;
** [[EPrints Control Format]] - the structure used to embed EPScript in an XML configuration file.&lt;br /&gt;
** [[Citation Format]]&lt;br /&gt;
** [[Workflow Format]] - the structure of the EP3 workflow files&lt;br /&gt;
** [[Phrase Format]]&lt;br /&gt;
** [[Template Format]]&lt;br /&gt;
** [[XPAGE Format]]&lt;br /&gt;
* [[XML Export Format]]&lt;br /&gt;
* EPrints data structure &lt;br /&gt;
** of the software&lt;br /&gt;
** of the database (relating the dataobjects to each other using eprints fields)&lt;br /&gt;
* [[Data Object]]s and data sets&lt;br /&gt;
** The [[EPrint Object]]&lt;br /&gt;
** The [[User Object]]&lt;br /&gt;
** The [[Document Object]]&lt;br /&gt;
** The [[Subject Object]]&lt;br /&gt;
** The [[Saved Search Object]]&lt;br /&gt;
** The [[History Object]]&lt;br /&gt;
** The [[Access Object]]&lt;br /&gt;
** The [[Request Object]]&lt;br /&gt;
* Plugins&lt;br /&gt;
** Import&lt;br /&gt;
** [[Export Plugins]]&lt;br /&gt;
** Components&lt;br /&gt;
** [[Screen Plugins]]&lt;br /&gt;
** Convert&lt;br /&gt;
* [[Autocompletion]]&lt;br /&gt;
** [[Understanding IDs in Workflow Forms]]&lt;br /&gt;
* [[API]]&lt;br /&gt;
* [[Dynamic Template System]]&lt;br /&gt;
* The [[EPM Specification]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Manual&amp;diff=9427</id>
		<title>Manual</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Manual&amp;diff=9427"/>
		<updated>2010-07-01T11:30:40Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Rubbish]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
See the [[Main Page]] for other areas of this wiki.&lt;br /&gt;
&lt;br /&gt;
* [[Introduction|Introduction to EPrints]] and [[History|History of EPrints]] &lt;br /&gt;
* New Features and upgrade notes: [[New Features in EPrints 3.1|3.1]], [[New Features in EPrints 3.2|3.2]], [[New Features in EPrints 3.2.1|3.2.1]] &lt;br /&gt;
* (see also the note on [[EPrints Version Numbering]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table cellpadding=&amp;quot;10&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td width=&amp;quot;33%&amp;quot; valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Installation and First Steps =&lt;br /&gt;
&lt;br /&gt;
* [[Quick Server Install Guide (Debian / Ubuntu Server)]]&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
{{Download}}&lt;br /&gt;
&lt;br /&gt;
== Installing EPrints From Binary ==&lt;br /&gt;
* [[Installing EPrints 3 via Redhat RPM]]&lt;br /&gt;
* [[Installing EPrints 3 via Fedora RPM]]&lt;br /&gt;
* [[Installing EPrints 3 via apt (Debian/Ubuntu)]]&lt;br /&gt;
&lt;br /&gt;
== Using the Live CD ==&lt;br /&gt;
* [[EPrints Live CD Help]]&lt;br /&gt;
* [[Building the Live CD]]&lt;br /&gt;
&lt;br /&gt;
== Installing EPrints From Source (.tar.gz) ==&lt;br /&gt;
&lt;br /&gt;
* [[Recommended Platforms]]&lt;br /&gt;
* [[Required software]]&lt;br /&gt;
* Install Guides&lt;br /&gt;
** [[Installing Eprints 3 on Fedora Core 7]] (also applicable to FC6)&lt;br /&gt;
** [[Installing EPrints 3 on RedHat Enterprise 4]]&lt;br /&gt;
** [[Installing EPrints 3 on OS X]]&lt;br /&gt;
** [[Debian from source | Installing EPrints 3 on Debian/Ubuntu - The Quick Way]]&lt;br /&gt;
** [[Installing EPrints 3 on Ubuntu 6.10]]&lt;br /&gt;
** [[Installing EPrints 3 on Debian]]&lt;br /&gt;
** [[Installing in a chroot Debian/Ubuntu]]&lt;br /&gt;
** [[:Category:Installation|Installing]] EPrints on various platforms.&lt;br /&gt;
* [[Https3 | Installing EPrints 3 with an https server]]&lt;br /&gt;
&lt;br /&gt;
==Post Installation==&lt;br /&gt;
&lt;br /&gt;
* [[Upgrading EPrints 3 versions | Upgrading from an earlier version of EPrints3]]&lt;br /&gt;
* [[Migration|Migrating from EPrints 2.3]]&lt;br /&gt;
&lt;br /&gt;
==Getting Started==&lt;br /&gt;
* [[Getting Started with EPrints 3|Getting Started]] &lt;br /&gt;
&lt;br /&gt;
* Maintenance &lt;br /&gt;
** [[Backups]]&lt;br /&gt;
** [[Generate Scripts]]&lt;br /&gt;
** [[Alerts]]&lt;br /&gt;
** [[Log Files]]&lt;br /&gt;
** [[Automating your maintenance]]&lt;br /&gt;
&lt;br /&gt;
* [[Troubleshooting]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td width=&amp;quot;33%&amp;quot; valign=&amp;quot;top&amp;quot; style=&amp;quot;border-left: solid 1px #ccc; border-right: solid 1px #ccc;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How-to Guides =&lt;br /&gt;
&lt;br /&gt;
''[http://en.wikipedia.org/wiki/Howto What is a how-to?]&lt;br /&gt;
&lt;br /&gt;
* Orientation &amp;lt;span style=&amp;quot;color: #f94; font-size: 130%&amp;quot;&amp;gt;(Start here)&amp;lt;/span&amp;gt;&lt;br /&gt;
** [[Configuration orientation|New to EPrints 3?]]  - ''before diving into the how-tos, take some time to read through this brief orientation guide and familiarise yourself with the EPrints configuration landscape...''&lt;br /&gt;
** [[EPrints_3_Configuration_orientation_for_EPrints_2_administrators|Migrated from EPrints 2?]] - ''this orientation guide is intended to help you re-orient yourselves in your new EPrints 3 set up...'' &lt;br /&gt;
* [[Front Page Warning | Removing the Front Page Warning]] - Your first go at branding&lt;br /&gt;
* [[Branding with confidence]] - ''one of the most common EPrints customisations is to add your own institution's branding and &amp;quot;look and feel&amp;quot; to the interface...''&lt;br /&gt;
** [[Branding, the next level]] - ''how to completely change the interface to your own design''&lt;br /&gt;
* [[OAI]]&lt;br /&gt;
* [[Adding new views]]&lt;br /&gt;
* Workflow&lt;br /&gt;
* Deposit Types&lt;br /&gt;
** [[Removing types]]&lt;br /&gt;
* Metadata&lt;br /&gt;
* Subjects (fold in with Organisation Hierarchy under &amp;quot;controled vocabularies&amp;quot;)&lt;br /&gt;
* [[EPrints_3_Organisation_Hierarchy|Organisation Hierarchy]] - ''how to put your own organisation's Hierarchy into EPrints 3''&lt;br /&gt;
* Searches&lt;br /&gt;
* [[Autocompletion and Authority Files (Romeo Autocomplete)]] - ''add autocomplete functionality to the Publication Title input field based on an authority file downloaded from EPrints Romeo...''&lt;br /&gt;
* [[Create Export Plugins]] - ''create a Perl Module that will export your data...''&lt;br /&gt;
* [[Login-Only Repository]] - ''require a username and password to access all pages (including search, browse, and the front page)...''&lt;br /&gt;
* [[Change Deposit Status in Bulk]] - ''move a large number of deposits from inbox to archive&lt;br /&gt;
* [[Demoprints Repository]] - ''How to set up and configure the demoprints.eprints.org repository.&lt;br /&gt;
* [[SWORD]] - ''How to configure the SWORD protocol on EPrints.&lt;br /&gt;
* [[:Category:Howto|more ...]]&lt;br /&gt;
&lt;br /&gt;
= How to contribute =&lt;br /&gt;
&lt;br /&gt;
There's a number of different ways you can contribute to the EPrints project. This section covers all the ones we can think of...&lt;br /&gt;
&lt;br /&gt;
Always make an entry on http://files.eprints.org/ for your contribution, even if you don't upload the files. This will make it the one-stop place for people to find EPrints extensions.&lt;br /&gt;
&lt;br /&gt;
* [[Contribute: Plugins | Plugins]]&lt;br /&gt;
* [[Contribute: Scripts | Scripts]]&lt;br /&gt;
* [[Contribute: Themes | Themes]]&lt;br /&gt;
* [[Contribute: Translations | Translations]]&lt;br /&gt;
* [[Contribute: Other | Other neighbourly things to do]]&lt;br /&gt;
* [[Extension Packages]]&lt;br /&gt;
&lt;br /&gt;
= Misc =&lt;br /&gt;
&lt;br /&gt;
* [[Preservation Support]] in EPrints 3&lt;br /&gt;
* [[:Category:Languages|Language support and translations]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot; width=&amp;quot;33%&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Technical Reference =&lt;br /&gt;
&lt;br /&gt;
* [[EPrints Directory Structure]] - will be linked somewhere better, later.&lt;br /&gt;
&lt;br /&gt;
* [[Metadata]] - configuring metadata fields.&lt;br /&gt;
* [[Archives/ARCHIVEID/cfg/|Repository Configuration]]&lt;br /&gt;
* [[XML Configuration]] Files&lt;br /&gt;
** [[EPScript]] - documentation for the EP3 Scripting language (for use in citations and workflow files).&lt;br /&gt;
** [[EPrints Control Format]] - the structure used to embed EPScript in an XML configuration file.&lt;br /&gt;
** [[Citation Format]]&lt;br /&gt;
** [[Workflow Format]] - the structure of the EP3 workflow files&lt;br /&gt;
** [[Phrase Format]]&lt;br /&gt;
** [[Template Format]]&lt;br /&gt;
** [[XPAGE Format]]&lt;br /&gt;
* [[XML Export Format]]&lt;br /&gt;
* EPrints data structure &lt;br /&gt;
** of the software&lt;br /&gt;
** of the database (relating the dataobjects to each other using eprints fields)&lt;br /&gt;
* [[Data Object]]s and data sets&lt;br /&gt;
** The [[EPrint Object]]&lt;br /&gt;
** The [[User Object]]&lt;br /&gt;
** The [[Document Object]]&lt;br /&gt;
** The [[Subject Object]]&lt;br /&gt;
** The [[Saved Search Object]]&lt;br /&gt;
** The [[History Object]]&lt;br /&gt;
** The [[Access Object]]&lt;br /&gt;
** The [[Request Object]]&lt;br /&gt;
* Plugins&lt;br /&gt;
** Import&lt;br /&gt;
** [[Export Plugins]]&lt;br /&gt;
** Components&lt;br /&gt;
** [[Screen Plugins]]&lt;br /&gt;
** Convert&lt;br /&gt;
* [[Autocompletion]]&lt;br /&gt;
** [[Understanding IDs in Workflow Forms]]&lt;br /&gt;
* [[API]]&lt;br /&gt;
* [[Dynamic Template System]]&lt;br /&gt;
* The [[EPM Specification]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Core_API&amp;diff=9315</id>
		<title>Core API</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Core_API&amp;diff=9315"/>
		<updated>2010-05-19T12:14:20Z</updated>

		<summary type="html">&lt;p&gt;Cjg: Undo revision 9314 by Cjg (Talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{API}}&lt;br /&gt;
[[Category:API]]&lt;br /&gt;
&lt;br /&gt;
The core API was introduced in EPrints 3.2.0 and is intended to provide a clean and consistent programming interface to the EPrints system. &lt;br /&gt;
&lt;br /&gt;
Not all essential functionality is yet available in the new API, as we've only included functions which we are confident we can keep stable for a number of versions. &lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
 use EPrints;&lt;br /&gt;
 my $ep = EPrints-&amp;gt;new();&lt;br /&gt;
 my $repo = $ep-&amp;gt;repository( &amp;quot;myrepo&amp;quot; );&lt;br /&gt;
 my $an_eprint = $repo-&amp;gt;eprint( 23 );&lt;br /&gt;
&lt;br /&gt;
=== EPrints ===&lt;br /&gt;
 $ep = EPrints-&amp;gt;new();&lt;br /&gt;
 @ids = $ep-&amp;gt;repository_ids; # list active repository ids&lt;br /&gt;
 $repo = $ep-&amp;gt;repository( &amp;quot;devel&amp;quot;, noise=&amp;gt;1 );&lt;br /&gt;
 $repo = $ep-&amp;gt;current_repository(); # from Apache::Request URI&lt;br /&gt;
 EPrints-&amp;gt;abort( $message );&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
 $xml = $repo-&amp;gt;xml;&lt;br /&gt;
 $dataset = $repo-&amp;gt;dataset( &amp;quot;user&amp;quot; );&lt;br /&gt;
 $user = $repo-&amp;gt;current_user;&lt;br /&gt;
 $query = $repo-&amp;gt;query;&lt;br /&gt;
 $current_page_url = $repo-&amp;gt;current_url( host =&amp;gt; 1, path =&amp;gt; 1, query =&amp;gt; 1, etc. );&lt;br /&gt;
 $config_element = $repo-&amp;gt;config( $key, [@subkeys] );&lt;br /&gt;
 $repository-&amp;gt;log( $message ); &lt;br /&gt;
 $string = $repo-&amp;gt;query-&amp;gt;param( &amp;quot;X&amp;quot; );&lt;br /&gt;
 $repo-&amp;gt;redirect( $url );&lt;br /&gt;
 $eprint = $repo-&amp;gt;eprint( 23 );&lt;br /&gt;
 $user = $repo-&amp;gt;user( 23 );&lt;br /&gt;
 $user = $repo-&amp;gt;user_by_username( &amp;quot;cjg&amp;quot; );&lt;br /&gt;
 $user = $repo-&amp;gt;user_by_email( 'cjg@ecs.soton.ac.uk' );&lt;br /&gt;
&lt;br /&gt;
=== Dataset ===&lt;br /&gt;
 $dataset = $repo-&amp;gt;dataset( &amp;quot;eprint&amp;quot; )&lt;br /&gt;
 $string = $dataset-&amp;gt;base_id; # eprint&lt;br /&gt;
 $string = $dataset-&amp;gt;id; # inbox&lt;br /&gt;
 &lt;br /&gt;
 $repo = $dataobj-&amp;gt;repository;&lt;br /&gt;
 &lt;br /&gt;
 $dataobj = $dataset-&amp;gt;create_dataobj( $data );&lt;br /&gt;
 $user = $dataset-&amp;gt;dataobj( 23 );&lt;br /&gt;
 &lt;br /&gt;
 $search = $dataset-&amp;gt;prepare_search( %options );&lt;br /&gt;
 $list = $dataset-&amp;gt;search( %options ); # prepare_search( %options )-&amp;gt;execute&lt;br /&gt;
 $list = $dataset-&amp;gt;search; # match ALL&lt;br /&gt;
 &lt;br /&gt;
 $metafield = $dataset-&amp;gt;field( $fieldname );&lt;br /&gt;
 $metafield = $dataset-&amp;gt;key_field;&lt;br /&gt;
 @metafields = $dataset-&amp;gt;fields; &lt;br /&gt;
 &lt;br /&gt;
 $dataset-&amp;gt;search-&amp;gt;map( sub {}, $ctx );&lt;br /&gt;
 $n = $dataset-&amp;gt;search-&amp;gt;count; &lt;br /&gt;
 $ids = $dataset-&amp;gt;search-&amp;gt;ids;&lt;br /&gt;
 $list = $dataset-&amp;gt;list( \@ids );&lt;br /&gt;
&lt;br /&gt;
=== list ===&lt;br /&gt;
 $n = $list-&amp;gt;count;&lt;br /&gt;
 $list-&amp;gt;map( sub {}, $ctx );&lt;br /&gt;
 $dataobj = $list-&amp;gt;item( offset );&lt;br /&gt;
 @dataobjs = $list-&amp;gt;slice( offset, length ); &lt;br /&gt;
 \@ids = $list-&amp;gt;ids;&lt;br /&gt;
&lt;br /&gt;
=== XML ===&lt;br /&gt;
 $doc = $xml-&amp;gt;parse_string( $string );&lt;br /&gt;
 $doc = $xml-&amp;gt;parse_file( $filename );&lt;br /&gt;
 $doc = $xml-&amp;gt;parse_url( $url );&lt;br /&gt;
 &lt;br /&gt;
 $utf8_string = $xml-&amp;gt;to_string( $dom_node, %opts );&lt;br /&gt;
 &lt;br /&gt;
 $dom_node = $xml-&amp;gt;clone( $dom_node ); # deep&lt;br /&gt;
 $dom_node = $xml-&amp;gt;clone_node( $dom_node ); # shallow&lt;br /&gt;
 &lt;br /&gt;
 $dom_node = $xml-&amp;gt;contents_of( $dom_node ); # clone and return child nodes&lt;br /&gt;
 $utf8_string = $xml-&amp;gt;text_contents_of( $dom_node ); # Return text child nodes as a string&lt;br /&gt;
 &lt;br /&gt;
 $dom_node = $xml-&amp;gt;create_element( $name, %attr );&lt;br /&gt;
 $dom_node = $xml-&amp;gt;create_text_node( $value );&lt;br /&gt;
 $dom_node = $xml-&amp;gt;create_comment( $value );&lt;br /&gt;
 $dom_node = $xml-&amp;gt;create_document_fragment;&lt;br /&gt;
 &lt;br /&gt;
 $bool = $xml-&amp;gt;is( $dom_node, &amp;quot;Text&amp;quot; );&lt;br /&gt;
 &lt;br /&gt;
 $xml-&amp;gt;dispose( $dom_node ); &lt;br /&gt;
&lt;br /&gt;
=== XHTML ===&lt;br /&gt;
 $xhtml = $repo-&amp;gt;xhtml;&lt;br /&gt;
 &lt;br /&gt;
 $utf8_string = $xhtml-&amp;gt;to_xhtml( $dom_node, %opts ); # remove NS prefixes, fix &amp;lt;script&amp;gt; etc.&lt;br /&gt;
 &lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;input_field( $name, $value, %opts ); # nb. type &amp;amp; noenter are now options.&lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;hidden_field( $name, $value, %opts ); # tdb: this is used *a lot* and is well defined&lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;text_area_field( $name, $value, %opts ); # tdb: value becomes a child text node &lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;form( $method, $url );&lt;br /&gt;
 &lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;data_element( $name, $value, %opts ); # tdb: render_data_element&lt;br /&gt;
 &lt;br /&gt;
 $page = $xhtml-&amp;gt;page( $map, %opts );&lt;br /&gt;
 &lt;br /&gt;
=== Page ===&lt;br /&gt;
 $page-&amp;gt;send( %options ); &lt;br /&gt;
 $page-&amp;gt;write_to_file( $filename );&lt;br /&gt;
&lt;br /&gt;
=== DataObj ===&lt;br /&gt;
&lt;br /&gt;
 $dataobj = $dataset-&amp;gt;dataobj( $id );&lt;br /&gt;
 $dataobj-&amp;gt;delete;&lt;br /&gt;
 $dataobj-&amp;gt;commit( $force );&lt;br /&gt;
 &lt;br /&gt;
 $dataset = $dataobj-&amp;gt;dataset;&lt;br /&gt;
 $repo = $dataobj-&amp;gt;repository;&lt;br /&gt;
 &lt;br /&gt;
 $id = $dataobj-&amp;gt;id;&lt;br /&gt;
 $dataobj-&amp;gt;set_value( $fieldname, $value );&lt;br /&gt;
 $value = $dataobj-&amp;gt;value( $fieldname );&lt;br /&gt;
 \@value = $dataobj-&amp;gt;value( $fieldname ); # multiple&lt;br /&gt;
 $boolean = $dataobj-&amp;gt;is_set( $fieldname );&lt;br /&gt;
 &lt;br /&gt;
 $xhtml = $dataobj-&amp;gt;render_value( $fieldname );&lt;br /&gt;
 $xhtml = $dataobj-&amp;gt;render_citation( $style, %opts );&lt;br /&gt;
 &lt;br /&gt;
 $uri = $dataobj-&amp;gt;uri;&lt;br /&gt;
 $url = $dataobj-&amp;gt;url;&lt;br /&gt;
 &lt;br /&gt;
 $string = $dataobj-&amp;gt;export( $plugin_id, %opts );&lt;br /&gt;
 $dataobj = $dataobj-&amp;gt;create_subobject( $fieldname, $epdata );&lt;br /&gt;
&lt;br /&gt;
=== MetaField ===&lt;br /&gt;
Now has a handle on both it's repository/session AND dataset.&lt;br /&gt;
&lt;br /&gt;
 my $field = $dataset-&amp;gt;field( $fieldname );&lt;br /&gt;
 &lt;br /&gt;
 $dataset = $field-&amp;gt;dataset;&lt;br /&gt;
 $repo = $field-&amp;gt;repository;&lt;br /&gt;
 &lt;br /&gt;
 $field-&amp;gt;set_property( $property, $value );&lt;br /&gt;
 $value = $field-&amp;gt;property( $property );&lt;br /&gt;
 &lt;br /&gt;
 $name = $field-&amp;gt;name;&lt;br /&gt;
 $type = $field-&amp;gt;type;&lt;br /&gt;
 &lt;br /&gt;
 $xhtml = $field-&amp;gt;render_name;&lt;br /&gt;
 $xhtml = $field-&amp;gt;render_help;&lt;br /&gt;
 $xhtml = $field-&amp;gt;render_value_label( $value );&lt;br /&gt;
 &lt;br /&gt;
 $values = $field-&amp;gt;all_values( %opts );&lt;br /&gt;
 $sorted_list = $field-&amp;gt;sort_values( $unsorted_list );&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Core_API&amp;diff=9314</id>
		<title>Core API</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Core_API&amp;diff=9314"/>
		<updated>2010-05-19T12:13:55Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:API]]&lt;br /&gt;
&lt;br /&gt;
The core API was introduced in EPrints 3.2.0 and is intended to provide a clean and consistent programming interface to the EPrints system. &lt;br /&gt;
&lt;br /&gt;
Not all essential functionality is yet available in the new API, as we've only included functions which we are confident we can keep stable for a number of versions. &lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
 use EPrints;&lt;br /&gt;
 my $ep = EPrints-&amp;gt;new();&lt;br /&gt;
 my $repo = $ep-&amp;gt;repository( &amp;quot;myrepo&amp;quot; );&lt;br /&gt;
 my $an_eprint = $repo-&amp;gt;eprint( 23 );&lt;br /&gt;
&lt;br /&gt;
=== EPrints ===&lt;br /&gt;
 $ep = EPrints-&amp;gt;new();&lt;br /&gt;
 @ids = $ep-&amp;gt;repository_ids; # list active repository ids&lt;br /&gt;
 $repo = $ep-&amp;gt;repository( &amp;quot;devel&amp;quot;, noise=&amp;gt;1 );&lt;br /&gt;
 $repo = $ep-&amp;gt;current_repository(); # from Apache::Request URI&lt;br /&gt;
 EPrints-&amp;gt;abort( $message );&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
 $xml = $repo-&amp;gt;xml;&lt;br /&gt;
 $dataset = $repo-&amp;gt;dataset( &amp;quot;user&amp;quot; );&lt;br /&gt;
 $user = $repo-&amp;gt;current_user;&lt;br /&gt;
 $query = $repo-&amp;gt;query;&lt;br /&gt;
 $current_page_url = $repo-&amp;gt;current_url( host =&amp;gt; 1, path =&amp;gt; 1, query =&amp;gt; 1, etc. );&lt;br /&gt;
 $config_element = $repo-&amp;gt;config( $key, [@subkeys] );&lt;br /&gt;
 $repository-&amp;gt;log( $message ); &lt;br /&gt;
 $string = $repo-&amp;gt;query-&amp;gt;param( &amp;quot;X&amp;quot; );&lt;br /&gt;
 $repo-&amp;gt;redirect( $url );&lt;br /&gt;
 $eprint = $repo-&amp;gt;eprint( 23 );&lt;br /&gt;
 $user = $repo-&amp;gt;user( 23 );&lt;br /&gt;
 $user = $repo-&amp;gt;user_by_username( &amp;quot;cjg&amp;quot; );&lt;br /&gt;
 $user = $repo-&amp;gt;user_by_email( 'cjg@ecs.soton.ac.uk' );&lt;br /&gt;
&lt;br /&gt;
=== Dataset ===&lt;br /&gt;
 $dataset = $repo-&amp;gt;dataset( &amp;quot;eprint&amp;quot; )&lt;br /&gt;
 $string = $dataset-&amp;gt;base_id; # eprint&lt;br /&gt;
 $string = $dataset-&amp;gt;id; # inbox&lt;br /&gt;
 &lt;br /&gt;
 $repo = $dataobj-&amp;gt;repository;&lt;br /&gt;
 &lt;br /&gt;
 $dataobj = $dataset-&amp;gt;create_dataobj( $data );&lt;br /&gt;
 $user = $dataset-&amp;gt;dataobj( 23 );&lt;br /&gt;
 &lt;br /&gt;
 $search = $dataset-&amp;gt;prepare_search( %options );&lt;br /&gt;
 $list = $dataset-&amp;gt;search( %options ); # prepare_search( %options )-&amp;gt;execute&lt;br /&gt;
 $list = $dataset-&amp;gt;search; # match ALL&lt;br /&gt;
 &lt;br /&gt;
 $metafield = $dataset-&amp;gt;field( $fieldname );&lt;br /&gt;
 $metafield = $dataset-&amp;gt;key_field;&lt;br /&gt;
 @metafields = $dataset-&amp;gt;fields; &lt;br /&gt;
 &lt;br /&gt;
 $dataset-&amp;gt;search-&amp;gt;map( sub {}, $ctx );&lt;br /&gt;
 $n = $dataset-&amp;gt;search-&amp;gt;count; &lt;br /&gt;
 $ids = $dataset-&amp;gt;search-&amp;gt;ids;&lt;br /&gt;
 $list = $dataset-&amp;gt;list( \@ids );&lt;br /&gt;
&lt;br /&gt;
=== list ===&lt;br /&gt;
 $n = $list-&amp;gt;count;&lt;br /&gt;
 $list-&amp;gt;map( sub {}, $ctx );&lt;br /&gt;
 $dataobj = $list-&amp;gt;item( offset );&lt;br /&gt;
 @dataobjs = $list-&amp;gt;slice( offset, length ); &lt;br /&gt;
 \@ids = $list-&amp;gt;ids;&lt;br /&gt;
&lt;br /&gt;
=== XML ===&lt;br /&gt;
 $doc = $xml-&amp;gt;parse_string( $string );&lt;br /&gt;
 $doc = $xml-&amp;gt;parse_file( $filename );&lt;br /&gt;
 $doc = $xml-&amp;gt;parse_url( $url );&lt;br /&gt;
 &lt;br /&gt;
 $utf8_string = $xml-&amp;gt;to_string( $dom_node, %opts );&lt;br /&gt;
 &lt;br /&gt;
 $dom_node = $xml-&amp;gt;clone( $dom_node ); # deep&lt;br /&gt;
 $dom_node = $xml-&amp;gt;clone_node( $dom_node ); # shallow&lt;br /&gt;
 &lt;br /&gt;
 $dom_node = $xml-&amp;gt;contents_of( $dom_node ); # clone and return child nodes&lt;br /&gt;
 $utf8_string = $xml-&amp;gt;text_contents_of( $dom_node ); # Return text child nodes as a string&lt;br /&gt;
 &lt;br /&gt;
 $dom_node = $xml-&amp;gt;create_element( $name, %attr );&lt;br /&gt;
 $dom_node = $xml-&amp;gt;create_text_node( $value );&lt;br /&gt;
 $dom_node = $xml-&amp;gt;create_comment( $value );&lt;br /&gt;
 $dom_node = $xml-&amp;gt;create_document_fragment;&lt;br /&gt;
 &lt;br /&gt;
 $bool = $xml-&amp;gt;is( $dom_node, &amp;quot;Text&amp;quot; );&lt;br /&gt;
 &lt;br /&gt;
 $xml-&amp;gt;dispose( $dom_node ); &lt;br /&gt;
&lt;br /&gt;
=== XHTML ===&lt;br /&gt;
 $xhtml = $repo-&amp;gt;xhtml;&lt;br /&gt;
 &lt;br /&gt;
 $utf8_string = $xhtml-&amp;gt;to_xhtml( $dom_node, %opts ); # remove NS prefixes, fix &amp;lt;script&amp;gt; etc.&lt;br /&gt;
 &lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;input_field( $name, $value, %opts ); # nb. type &amp;amp; noenter are now options.&lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;hidden_field( $name, $value, %opts ); # tdb: this is used *a lot* and is well defined&lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;text_area_field( $name, $value, %opts ); # tdb: value becomes a child text node &lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;form( $method, $url );&lt;br /&gt;
 &lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;data_element( $name, $value, %opts ); # tdb: render_data_element&lt;br /&gt;
 &lt;br /&gt;
 $page = $xhtml-&amp;gt;page( $map, %opts );&lt;br /&gt;
 &lt;br /&gt;
=== Page ===&lt;br /&gt;
 $page-&amp;gt;send( %options ); &lt;br /&gt;
 $page-&amp;gt;write_to_file( $filename );&lt;br /&gt;
&lt;br /&gt;
=== DataObj ===&lt;br /&gt;
&lt;br /&gt;
 $dataobj = $dataset-&amp;gt;dataobj( $id );&lt;br /&gt;
 $dataobj-&amp;gt;delete;&lt;br /&gt;
 $dataobj-&amp;gt;commit( $force );&lt;br /&gt;
 &lt;br /&gt;
 $dataset = $dataobj-&amp;gt;dataset;&lt;br /&gt;
 $repo = $dataobj-&amp;gt;repository;&lt;br /&gt;
 &lt;br /&gt;
 $id = $dataobj-&amp;gt;id;&lt;br /&gt;
 $dataobj-&amp;gt;set_value( $fieldname, $value );&lt;br /&gt;
 $value = $dataobj-&amp;gt;value( $fieldname );&lt;br /&gt;
 \@value = $dataobj-&amp;gt;value( $fieldname ); # multiple&lt;br /&gt;
 $boolean = $dataobj-&amp;gt;is_set( $fieldname );&lt;br /&gt;
 &lt;br /&gt;
 $xhtml = $dataobj-&amp;gt;render_value( $fieldname );&lt;br /&gt;
 $xhtml = $dataobj-&amp;gt;render_citation( $style, %opts );&lt;br /&gt;
 &lt;br /&gt;
 $uri = $dataobj-&amp;gt;uri;&lt;br /&gt;
 $url = $dataobj-&amp;gt;url;&lt;br /&gt;
 &lt;br /&gt;
 $string = $dataobj-&amp;gt;export( $plugin_id, %opts );&lt;br /&gt;
 $dataobj = $dataobj-&amp;gt;create_subobject( $fieldname, $epdata );&lt;br /&gt;
&lt;br /&gt;
=== MetaField ===&lt;br /&gt;
Now has a handle on both it's repository/session AND dataset.&lt;br /&gt;
&lt;br /&gt;
 my $field = $dataset-&amp;gt;field( $fieldname );&lt;br /&gt;
 &lt;br /&gt;
 $dataset = $field-&amp;gt;dataset;&lt;br /&gt;
 $repo = $field-&amp;gt;repository;&lt;br /&gt;
 &lt;br /&gt;
 $field-&amp;gt;set_property( $property, $value );&lt;br /&gt;
 $value = $field-&amp;gt;property( $property );&lt;br /&gt;
 &lt;br /&gt;
 $name = $field-&amp;gt;name;&lt;br /&gt;
 $type = $field-&amp;gt;type;&lt;br /&gt;
 &lt;br /&gt;
 $xhtml = $field-&amp;gt;render_name;&lt;br /&gt;
 $xhtml = $field-&amp;gt;render_help;&lt;br /&gt;
 $xhtml = $field-&amp;gt;render_value_label( $value );&lt;br /&gt;
 &lt;br /&gt;
 $values = $field-&amp;gt;all_values( %opts );&lt;br /&gt;
 $sorted_list = $field-&amp;gt;sort_values( $unsorted_list );&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Category:API&amp;diff=9313</id>
		<title>Category:API</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Category:API&amp;diff=9313"/>
		<updated>2010-05-19T12:04:28Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
EPrints is written in the [http://www.perl.org/ Perl language]. Sometimes you may need to write your own Perl code using the EPrints Application Programming Interface (API).&lt;br /&gt;
&lt;br /&gt;
Reasons you may need to write your own EPrints code:&lt;br /&gt;
&lt;br /&gt;
* customising the way the eprints summary pages are rendered&lt;br /&gt;
* writing your own command-line script to control EPrints in some way&lt;br /&gt;
* writing a new CGI script (dynamic web page)&lt;br /&gt;
* writing a plugin&lt;br /&gt;
&lt;br /&gt;
== Key Sections ==&lt;br /&gt;
* [[Core API]] provides a basic introduction to using the EPrints API. &lt;br /&gt;
* [[StyleGuide]] gives guidance on how to code in a compatible style.&lt;br /&gt;
* [[Modules]] discusses the framework for Plugins you write for the community.&lt;br /&gt;
&lt;br /&gt;
==Principle Modules==&lt;br /&gt;
&lt;br /&gt;
This is a list of the principle modules in the EPrints API. These modules are the primary means of connecting to and manipulating objects in the repository.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[API:EPrints/Repository|EPrints::Repository]]===&lt;br /&gt;
&lt;br /&gt;
An Repository is a eprints archive with it's own website configuration and data. One install of the eprints software can run serveral seperate repositories. Sharing code but with totally different configurations. Before EPrints 2.4 this was known as EPrints::Archive. This was changed to avoid confusion with the eprint status of &amp;quot;archive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===[[API:EPrints/Database|EPrints::Database]]===&lt;br /&gt;
&lt;br /&gt;
The connection to the MySQL back end. ''datasets'' are stored in the MySQL system, but you do not have to address it directly.&lt;br /&gt;
&lt;br /&gt;
===[[API:EPrints/DataSet|EPrints::DataSet]]===&lt;br /&gt;
&lt;br /&gt;
A dataset is a collection of ''items'' of the same type. It can be searched.&lt;br /&gt;
&lt;br /&gt;
Some datasets all have the same &amp;quot;config id&amp;quot;. The &amp;quot;config id&amp;quot; is used to get information about the dataset from the archive config - inbox, buffer, archive and deletion all have the same metadata fields and types.&lt;br /&gt;
&lt;br /&gt;
Core datasets are:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| DATASET ID &lt;br /&gt;
| COMMENT&lt;br /&gt;
|-&lt;br /&gt;
| eprint&lt;br /&gt;
| EPrint records are the core of the system.&lt;br /&gt;
|-&lt;br /&gt;
| user&lt;br /&gt;
| Users registered with the system.&lt;br /&gt;
|-&lt;br /&gt;
| subject&lt;br /&gt;
| The subject tree.&lt;br /&gt;
|-               &lt;br /&gt;
| document&lt;br /&gt;
| Documents belonging to EPrints. Every document is part of an EPrint record.&lt;br /&gt;
|-&lt;br /&gt;
| subscription&lt;br /&gt;
| Subscriptions made by users. Every subscription is a part of a Subscription record.&lt;br /&gt;
|-&lt;br /&gt;
| history&lt;br /&gt;
| Stores actions performed on records.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In addtion to these datasets are four virtual datasets: inbox, buffer, archive and deletion. These act just like &amp;quot;eprint&amp;quot; except that they are filtered to only contain records with those status.&lt;br /&gt;
  &lt;br /&gt;
Note that prior to 2.4 the &amp;quot;eprint&amp;quot; dataset was virtual, rather than &amp;quot;inbox&amp;quot;, &amp;quot;buffer&amp;quot; etc. The History dataset was introduced in 2.4.&lt;br /&gt;
&lt;br /&gt;
===[[API:EPrints/MetaField|EPrints::MetaField]]===&lt;br /&gt;
&lt;br /&gt;
A single field in a dataset. Each dataset has a few &amp;quot;system&amp;quot; fields which eprints uses to manage the system and then any number of ''archive'' specific fields which you may configure.&lt;br /&gt;
&lt;br /&gt;
===[[API:EPrints/DataObj|EPrints::DataObj]]===&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;super class&amp;quot; of ''subjects'', ''users'', ''eprints'' and ''documents'' etc. In the very core of the system these are all treated identically and much of the configuration and methods of these classes of &amp;quot;thing&amp;quot; are identical. We use the term ''item'' to speak about the general case.&lt;br /&gt;
&lt;br /&gt;
; '''type''' or '''user-type''' or '''eprint-type''' : ''users'', ''eprints'' and ''documents'' all have a &amp;quot;type&amp;quot;. This controls how they are &amp;quot;cited&amp;quot; and also for ''users'' and ''eprints'' it controls what ''fields'' may be edited, and which are required.&lt;br /&gt;
&lt;br /&gt;
====[[API:EPrints/DataObj/Document|EPrints::DataObj::Document]]====&lt;br /&gt;
&lt;br /&gt;
A document is a single format of an ''eprint'', eg. HTML, PDF, PS etc. It can contain more than one file, for example HTML may contain more than one html page + image files. The actual files are stored in the filesystem. Pre 2.4 this was known as EPrints::Document.&lt;br /&gt;
&lt;br /&gt;
====[[API:EPrints/DataObj/EPrint|EPrints::DataObj::EPrint]]====&lt;br /&gt;
&lt;br /&gt;
An eprint is a record in the system which has one or more ''documents'' and some ''metadata''. Usually, more than one ''document'' is to provide the same information in multiple formats, although this is not compulsory. Pre 2.4 this was known as EPrints::EPrint.&lt;br /&gt;
&lt;br /&gt;
====[[API:EPrints/DataObj/SavedSearch|EPrints::DataObj::SavedSearch]]====&lt;br /&gt;
&lt;br /&gt;
Some software refers to this concept as &amp;quot;alerts&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A stored search which is performed every day/week/month and any new results are the mailed to the user who owns the subscription.&lt;br /&gt;
&lt;br /&gt;
This diagram does not show &amp;quot;Subscription&amp;quot;. Subscription is a subclass of DataObj (like EPrint, User etc.). A Subscription is associated with one User. A User is associated with 0..n Subscription's.&lt;br /&gt;
&lt;br /&gt;
====[[API:EPrints/DataObj/Subject|EPrints::DataObj::Subject]]====&lt;br /&gt;
&lt;br /&gt;
A ''subject'' has an id and a list of who it's parents are. There is a build in ''subject'' with the id &amp;quot;ROOT&amp;quot; to act as the top level. A subject can have more than one parent to allow you to create a rich lattice, rather than just a tree, but loops are not allowed.&lt;br /&gt;
&lt;br /&gt;
====[[API:EPrints/DataObj/User|EPrints::DataObj::User]]====&lt;br /&gt;
&lt;br /&gt;
A user registered with the system. (NOT necesarily the author of the ''eprints'' they deposit). Pre 2.4 this was known as EPrints::User&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Core_API&amp;diff=9312</id>
		<title>Core API</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Core_API&amp;diff=9312"/>
		<updated>2010-05-19T12:02:18Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{API}}&lt;br /&gt;
[[Category:API]]&lt;br /&gt;
&lt;br /&gt;
The core API was introduced in EPrints 3.2.0 and is intended to provide a clean and consistent programming interface to the EPrints system. &lt;br /&gt;
&lt;br /&gt;
Not all essential functionality is yet available in the new API, as we've only included functions which we are confident we can keep stable for a number of versions. &lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
 use EPrints;&lt;br /&gt;
 my $ep = EPrints-&amp;gt;new();&lt;br /&gt;
 my $repo = $ep-&amp;gt;repository( &amp;quot;myrepo&amp;quot; );&lt;br /&gt;
 my $an_eprint = $repo-&amp;gt;eprint( 23 );&lt;br /&gt;
&lt;br /&gt;
=== EPrints ===&lt;br /&gt;
 $ep = EPrints-&amp;gt;new();&lt;br /&gt;
 @ids = $ep-&amp;gt;repository_ids; # list active repository ids&lt;br /&gt;
 $repo = $ep-&amp;gt;repository( &amp;quot;devel&amp;quot;, noise=&amp;gt;1 );&lt;br /&gt;
 $repo = $ep-&amp;gt;current_repository(); # from Apache::Request URI&lt;br /&gt;
 EPrints-&amp;gt;abort( $message );&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
 $xml = $repo-&amp;gt;xml;&lt;br /&gt;
 $dataset = $repo-&amp;gt;dataset( &amp;quot;user&amp;quot; );&lt;br /&gt;
 $user = $repo-&amp;gt;current_user;&lt;br /&gt;
 $query = $repo-&amp;gt;query;&lt;br /&gt;
 $current_page_url = $repo-&amp;gt;current_url( host =&amp;gt; 1, path =&amp;gt; 1, query =&amp;gt; 1, etc. );&lt;br /&gt;
 $config_element = $repo-&amp;gt;config( $key, [@subkeys] );&lt;br /&gt;
 $repository-&amp;gt;log( $message ); &lt;br /&gt;
 $string = $repo-&amp;gt;query-&amp;gt;param( &amp;quot;X&amp;quot; );&lt;br /&gt;
 $repo-&amp;gt;redirect( $url );&lt;br /&gt;
 $eprint = $repo-&amp;gt;eprint( 23 );&lt;br /&gt;
 $user = $repo-&amp;gt;user( 23 );&lt;br /&gt;
 $user = $repo-&amp;gt;user_by_username( &amp;quot;cjg&amp;quot; );&lt;br /&gt;
 $user = $repo-&amp;gt;user_by_email( 'cjg@ecs.soton.ac.uk' );&lt;br /&gt;
&lt;br /&gt;
=== Dataset ===&lt;br /&gt;
 $dataset = $repo-&amp;gt;dataset( &amp;quot;eprint&amp;quot; )&lt;br /&gt;
 $string = $dataset-&amp;gt;base_id; # eprint&lt;br /&gt;
 $string = $dataset-&amp;gt;id; # inbox&lt;br /&gt;
 &lt;br /&gt;
 $repo = $dataobj-&amp;gt;repository;&lt;br /&gt;
 &lt;br /&gt;
 $dataobj = $dataset-&amp;gt;create_dataobj( $data );&lt;br /&gt;
 $user = $dataset-&amp;gt;dataobj( 23 );&lt;br /&gt;
 &lt;br /&gt;
 $search = $dataset-&amp;gt;prepare_search( %options );&lt;br /&gt;
 $list = $dataset-&amp;gt;search( %options ); # prepare_search( %options )-&amp;gt;execute&lt;br /&gt;
 $list = $dataset-&amp;gt;search; # match ALL&lt;br /&gt;
 &lt;br /&gt;
 $metafield = $dataset-&amp;gt;field( $fieldname );&lt;br /&gt;
 $metafield = $dataset-&amp;gt;key_field;&lt;br /&gt;
 @metafields = $dataset-&amp;gt;fields; &lt;br /&gt;
 &lt;br /&gt;
 $dataset-&amp;gt;search-&amp;gt;map( sub {}, $ctx );&lt;br /&gt;
 $n = $dataset-&amp;gt;search-&amp;gt;count; &lt;br /&gt;
 $ids = $dataset-&amp;gt;search-&amp;gt;ids;&lt;br /&gt;
 $list = $dataset-&amp;gt;list( \@ids );&lt;br /&gt;
&lt;br /&gt;
=== list ===&lt;br /&gt;
 $n = $list-&amp;gt;count;&lt;br /&gt;
 $list-&amp;gt;map( sub {}, $ctx );&lt;br /&gt;
 $dataobj = $list-&amp;gt;item( offset );&lt;br /&gt;
 @dataobjs = $list-&amp;gt;slice( offset, length ); &lt;br /&gt;
 \@ids = $list-&amp;gt;ids;&lt;br /&gt;
&lt;br /&gt;
=== XML ===&lt;br /&gt;
 $doc = $xml-&amp;gt;parse_string( $string );&lt;br /&gt;
 $doc = $xml-&amp;gt;parse_file( $filename );&lt;br /&gt;
 $doc = $xml-&amp;gt;parse_url( $url );&lt;br /&gt;
 &lt;br /&gt;
 $utf8_string = $xml-&amp;gt;to_string( $dom_node, %opts );&lt;br /&gt;
 &lt;br /&gt;
 $dom_node = $xml-&amp;gt;clone( $dom_node ); # deep&lt;br /&gt;
 $dom_node = $xml-&amp;gt;clone_node( $dom_node ); # shallow&lt;br /&gt;
 &lt;br /&gt;
 $dom_node = $xml-&amp;gt;contents_of( $dom_node ); # clone and return child nodes&lt;br /&gt;
 $utf8_string = $xml-&amp;gt;text_contents_of( $dom_node ); # Return text child nodes as a string&lt;br /&gt;
 &lt;br /&gt;
 $dom_node = $xml-&amp;gt;create_element( $name, %attr );&lt;br /&gt;
 $dom_node = $xml-&amp;gt;create_text_node( $value );&lt;br /&gt;
 $dom_node = $xml-&amp;gt;create_comment( $value );&lt;br /&gt;
 $dom_node = $xml-&amp;gt;create_document_fragment;&lt;br /&gt;
 &lt;br /&gt;
 $bool = $xml-&amp;gt;is( $dom_node, &amp;quot;Text&amp;quot; );&lt;br /&gt;
 &lt;br /&gt;
 $xml-&amp;gt;dispose( $dom_node ); &lt;br /&gt;
&lt;br /&gt;
=== XHTML ===&lt;br /&gt;
 $xhtml = $repo-&amp;gt;xhtml;&lt;br /&gt;
 &lt;br /&gt;
 $utf8_string = $xhtml-&amp;gt;to_xhtml( $dom_node, %opts ); # remove NS prefixes, fix &amp;lt;script&amp;gt; etc.&lt;br /&gt;
 &lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;input_field( $name, $value, %opts ); # nb. type &amp;amp; noenter are now options.&lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;hidden_field( $name, $value, %opts ); # tdb: this is used *a lot* and is well defined&lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;text_area_field( $name, $value, %opts ); # tdb: value becomes a child text node &lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;form( $method, $url );&lt;br /&gt;
 &lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;data_element( $name, $value, %opts ); # tdb: render_data_element&lt;br /&gt;
 &lt;br /&gt;
 $page = $xhtml-&amp;gt;page( $map, %opts );&lt;br /&gt;
 &lt;br /&gt;
=== Page ===&lt;br /&gt;
 $page-&amp;gt;send( %options ); &lt;br /&gt;
 $page-&amp;gt;write_to_file( $filename );&lt;br /&gt;
&lt;br /&gt;
=== DataObj ===&lt;br /&gt;
&lt;br /&gt;
 $dataobj = $dataset-&amp;gt;dataobj( $id );&lt;br /&gt;
 $dataobj-&amp;gt;delete;&lt;br /&gt;
 $dataobj-&amp;gt;commit( $force );&lt;br /&gt;
 &lt;br /&gt;
 $dataset = $dataobj-&amp;gt;dataset;&lt;br /&gt;
 $repo = $dataobj-&amp;gt;repository;&lt;br /&gt;
 &lt;br /&gt;
 $id = $dataobj-&amp;gt;id;&lt;br /&gt;
 $dataobj-&amp;gt;set_value( $fieldname, $value );&lt;br /&gt;
 $value = $dataobj-&amp;gt;value( $fieldname );&lt;br /&gt;
 \@value = $dataobj-&amp;gt;value( $fieldname ); # multiple&lt;br /&gt;
 $boolean = $dataobj-&amp;gt;is_set( $fieldname );&lt;br /&gt;
 &lt;br /&gt;
 $xhtml = $dataobj-&amp;gt;render_value( $fieldname );&lt;br /&gt;
 $xhtml = $dataobj-&amp;gt;render_citation( $style, %opts );&lt;br /&gt;
 &lt;br /&gt;
 $uri = $dataobj-&amp;gt;uri;&lt;br /&gt;
 $url = $dataobj-&amp;gt;url;&lt;br /&gt;
 &lt;br /&gt;
 $string = $dataobj-&amp;gt;export( $plugin_id, %opts );&lt;br /&gt;
 $dataobj = $dataobj-&amp;gt;create_subobject( $fieldname, $epdata );&lt;br /&gt;
&lt;br /&gt;
=== MetaField ===&lt;br /&gt;
Now has a handle on both it's repository/session AND dataset.&lt;br /&gt;
&lt;br /&gt;
 my $field = $dataset-&amp;gt;field( $fieldname );&lt;br /&gt;
 &lt;br /&gt;
 $dataset = $field-&amp;gt;dataset;&lt;br /&gt;
 $repo = $field-&amp;gt;repository;&lt;br /&gt;
 &lt;br /&gt;
 $field-&amp;gt;set_property( $property, $value );&lt;br /&gt;
 $value = $field-&amp;gt;property( $property );&lt;br /&gt;
 &lt;br /&gt;
 $name = $field-&amp;gt;name;&lt;br /&gt;
 $type = $field-&amp;gt;type;&lt;br /&gt;
 &lt;br /&gt;
 $xhtml = $field-&amp;gt;render_name;&lt;br /&gt;
 $xhtml = $field-&amp;gt;render_help;&lt;br /&gt;
 $xhtml = $field-&amp;gt;render_value_label( $value );&lt;br /&gt;
 &lt;br /&gt;
 $values = $field-&amp;gt;all_values( %opts );&lt;br /&gt;
 $sorted_list = $field-&amp;gt;sort_values( $unsorted_list );&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Template:API&amp;diff=9311</id>
		<title>Template:API</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Template:API&amp;diff=9311"/>
		<updated>2010-05-19T12:01:48Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version|since=3.2}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: solid black 1px; text-align: center; background-color: #eee; padding-bottom: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
{{refLinks}}&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
'''[[API:EPrints|API]]:'''&lt;br /&gt;
[[Core API]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Template:RefLinks&amp;diff=9310</id>
		<title>Template:RefLinks</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Template:RefLinks&amp;diff=9310"/>
		<updated>2010-05-19T12:00:35Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''[[:Category:EPrints_3_Reference|EPrints 3 Reference]]:'''&lt;br /&gt;
[[:Category:EPrints Directory Structure|Directory Structure]] -&lt;br /&gt;
[[:Category:EPrints Metadata Fields|Metadata Fields]] -&lt;br /&gt;
[[Archives/ARCHIVEID/cfg/|Repository Configuration]] -&lt;br /&gt;
[[:Category:XML Configuration|XML Config Files]] -&lt;br /&gt;
[[XML Export Format]] -&lt;br /&gt;
EPrints data structure -&lt;br /&gt;
[[Core API]] -&lt;br /&gt;
[[:Category:Data Objects|Data Objects]]&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Template:RefLinks&amp;diff=9309</id>
		<title>Template:RefLinks</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Template:RefLinks&amp;diff=9309"/>
		<updated>2010-05-19T12:00:26Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''[[:Category:EPrints_3_Reference|EPrints 3 Reference]]:'''&lt;br /&gt;
[[:Category:EPrints Directory Structure|Directory Structure]] -&lt;br /&gt;
[[:Category:EPrints Metadata Fields|Metadata Fields]] -&lt;br /&gt;
[[Archives/ARCHIVEID/cfg/|Repository Configuration]] -&lt;br /&gt;
[[:Category:XML Configuration|XML Config Files]] -&lt;br /&gt;
[[XML Export Format]] -&lt;br /&gt;
EPrints data structure -&lt;br /&gt;
[[Core API]]&lt;br /&gt;
[[:Category:Data Objects|Data Objects]]&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Core_API&amp;diff=9308</id>
		<title>Core API</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Core_API&amp;diff=9308"/>
		<updated>2010-05-19T11:59:38Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:API]]&lt;br /&gt;
&lt;br /&gt;
The core API was introduced in EPrints 3.2.0 and is intended to provide a clean and consistent programming interface to the EPrints system. &lt;br /&gt;
&lt;br /&gt;
Not all essential functionality is yet available in the new API, as we've only included functions which we are confident we can keep stable for a number of versions. &lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
 use EPrints;&lt;br /&gt;
 my $ep = EPrints-&amp;gt;new();&lt;br /&gt;
 my $repo = $ep-&amp;gt;repository( &amp;quot;myrepo&amp;quot; );&lt;br /&gt;
 my $an_eprint = $repo-&amp;gt;eprint( 23 );&lt;br /&gt;
&lt;br /&gt;
=== EPrints ===&lt;br /&gt;
 $ep = EPrints-&amp;gt;new();&lt;br /&gt;
 @ids = $ep-&amp;gt;repository_ids; # list active repository ids&lt;br /&gt;
 $repo = $ep-&amp;gt;repository( &amp;quot;devel&amp;quot;, noise=&amp;gt;1 );&lt;br /&gt;
 $repo = $ep-&amp;gt;current_repository(); # from Apache::Request URI&lt;br /&gt;
 EPrints-&amp;gt;abort( $message );&lt;br /&gt;
&lt;br /&gt;
=== Repository ===&lt;br /&gt;
 $xml = $repo-&amp;gt;xml;&lt;br /&gt;
 $dataset = $repo-&amp;gt;dataset( &amp;quot;user&amp;quot; );&lt;br /&gt;
 $user = $repo-&amp;gt;current_user;&lt;br /&gt;
 $query = $repo-&amp;gt;query;&lt;br /&gt;
 $current_page_url = $repo-&amp;gt;current_url( host =&amp;gt; 1, path =&amp;gt; 1, query =&amp;gt; 1, etc. );&lt;br /&gt;
 $config_element = $repo-&amp;gt;config( $key, [@subkeys] );&lt;br /&gt;
 $repository-&amp;gt;log( $message ); &lt;br /&gt;
 $string = $repo-&amp;gt;query-&amp;gt;param( &amp;quot;X&amp;quot; );&lt;br /&gt;
 $repo-&amp;gt;redirect( $url );&lt;br /&gt;
 $eprint = $repo-&amp;gt;eprint( 23 );&lt;br /&gt;
 $user = $repo-&amp;gt;user( 23 );&lt;br /&gt;
 $user = $repo-&amp;gt;user_by_username( &amp;quot;cjg&amp;quot; );&lt;br /&gt;
 $user = $repo-&amp;gt;user_by_email( 'cjg@ecs.soton.ac.uk' );&lt;br /&gt;
&lt;br /&gt;
=== Dataset ===&lt;br /&gt;
 $dataset = $repo-&amp;gt;dataset( &amp;quot;eprint&amp;quot; )&lt;br /&gt;
 $string = $dataset-&amp;gt;base_id; # eprint&lt;br /&gt;
 $string = $dataset-&amp;gt;id; # inbox&lt;br /&gt;
 &lt;br /&gt;
 $repo = $dataobj-&amp;gt;repository;&lt;br /&gt;
 &lt;br /&gt;
 $dataobj = $dataset-&amp;gt;create_dataobj( $data );&lt;br /&gt;
 $user = $dataset-&amp;gt;dataobj( 23 );&lt;br /&gt;
 &lt;br /&gt;
 $search = $dataset-&amp;gt;prepare_search( %options );&lt;br /&gt;
 $list = $dataset-&amp;gt;search( %options ); # prepare_search( %options )-&amp;gt;execute&lt;br /&gt;
 $list = $dataset-&amp;gt;search; # match ALL&lt;br /&gt;
 &lt;br /&gt;
 $metafield = $dataset-&amp;gt;field( $fieldname );&lt;br /&gt;
 $metafield = $dataset-&amp;gt;key_field;&lt;br /&gt;
 @metafields = $dataset-&amp;gt;fields; &lt;br /&gt;
 &lt;br /&gt;
 $dataset-&amp;gt;search-&amp;gt;map( sub {}, $ctx );&lt;br /&gt;
 $n = $dataset-&amp;gt;search-&amp;gt;count; &lt;br /&gt;
 $ids = $dataset-&amp;gt;search-&amp;gt;ids;&lt;br /&gt;
 $list = $dataset-&amp;gt;list( \@ids );&lt;br /&gt;
&lt;br /&gt;
=== list ===&lt;br /&gt;
 $n = $list-&amp;gt;count;&lt;br /&gt;
 $list-&amp;gt;map( sub {}, $ctx );&lt;br /&gt;
 $dataobj = $list-&amp;gt;item( offset );&lt;br /&gt;
 @dataobjs = $list-&amp;gt;slice( offset, length ); &lt;br /&gt;
 \@ids = $list-&amp;gt;ids;&lt;br /&gt;
&lt;br /&gt;
=== XML ===&lt;br /&gt;
 $doc = $xml-&amp;gt;parse_string( $string );&lt;br /&gt;
 $doc = $xml-&amp;gt;parse_file( $filename );&lt;br /&gt;
 $doc = $xml-&amp;gt;parse_url( $url );&lt;br /&gt;
 &lt;br /&gt;
 $utf8_string = $xml-&amp;gt;to_string( $dom_node, %opts );&lt;br /&gt;
 &lt;br /&gt;
 $dom_node = $xml-&amp;gt;clone( $dom_node ); # deep&lt;br /&gt;
 $dom_node = $xml-&amp;gt;clone_node( $dom_node ); # shallow&lt;br /&gt;
 &lt;br /&gt;
 $dom_node = $xml-&amp;gt;contents_of( $dom_node ); # clone and return child nodes&lt;br /&gt;
 $utf8_string = $xml-&amp;gt;text_contents_of( $dom_node ); # Return text child nodes as a string&lt;br /&gt;
 &lt;br /&gt;
 $dom_node = $xml-&amp;gt;create_element( $name, %attr );&lt;br /&gt;
 $dom_node = $xml-&amp;gt;create_text_node( $value );&lt;br /&gt;
 $dom_node = $xml-&amp;gt;create_comment( $value );&lt;br /&gt;
 $dom_node = $xml-&amp;gt;create_document_fragment;&lt;br /&gt;
 &lt;br /&gt;
 $bool = $xml-&amp;gt;is( $dom_node, &amp;quot;Text&amp;quot; );&lt;br /&gt;
 &lt;br /&gt;
 $xml-&amp;gt;dispose( $dom_node ); &lt;br /&gt;
&lt;br /&gt;
=== XHTML ===&lt;br /&gt;
 $xhtml = $repo-&amp;gt;xhtml;&lt;br /&gt;
 &lt;br /&gt;
 $utf8_string = $xhtml-&amp;gt;to_xhtml( $dom_node, %opts ); # remove NS prefixes, fix &amp;lt;script&amp;gt; etc.&lt;br /&gt;
 &lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;input_field( $name, $value, %opts ); # nb. type &amp;amp; noenter are now options.&lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;hidden_field( $name, $value, %opts ); # tdb: this is used *a lot* and is well defined&lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;text_area_field( $name, $value, %opts ); # tdb: value becomes a child text node &lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;form( $method, $url );&lt;br /&gt;
 &lt;br /&gt;
 $xhtml_dom_node = $xhtml-&amp;gt;data_element( $name, $value, %opts ); # tdb: render_data_element&lt;br /&gt;
 &lt;br /&gt;
 $page = $xhtml-&amp;gt;page( $map, %opts );&lt;br /&gt;
 &lt;br /&gt;
=== Page ===&lt;br /&gt;
 $page-&amp;gt;send( %options ); &lt;br /&gt;
 $page-&amp;gt;write_to_file( $filename );&lt;br /&gt;
&lt;br /&gt;
=== DataObj ===&lt;br /&gt;
&lt;br /&gt;
 $dataobj = $dataset-&amp;gt;dataobj( $id );&lt;br /&gt;
 $dataobj-&amp;gt;delete;&lt;br /&gt;
 $dataobj-&amp;gt;commit( $force );&lt;br /&gt;
 &lt;br /&gt;
 $dataset = $dataobj-&amp;gt;dataset;&lt;br /&gt;
 $repo = $dataobj-&amp;gt;repository;&lt;br /&gt;
 &lt;br /&gt;
 $id = $dataobj-&amp;gt;id;&lt;br /&gt;
 $dataobj-&amp;gt;set_value( $fieldname, $value );&lt;br /&gt;
 $value = $dataobj-&amp;gt;value( $fieldname );&lt;br /&gt;
 \@value = $dataobj-&amp;gt;value( $fieldname ); # multiple&lt;br /&gt;
 $boolean = $dataobj-&amp;gt;is_set( $fieldname );&lt;br /&gt;
 &lt;br /&gt;
 $xhtml = $dataobj-&amp;gt;render_value( $fieldname );&lt;br /&gt;
 $xhtml = $dataobj-&amp;gt;render_citation( $style, %opts );&lt;br /&gt;
 &lt;br /&gt;
 $uri = $dataobj-&amp;gt;uri;&lt;br /&gt;
 $url = $dataobj-&amp;gt;url;&lt;br /&gt;
 &lt;br /&gt;
 $string = $dataobj-&amp;gt;export( $plugin_id, %opts );&lt;br /&gt;
 $dataobj = $dataobj-&amp;gt;create_subobject( $fieldname, $epdata );&lt;br /&gt;
&lt;br /&gt;
=== MetaField ===&lt;br /&gt;
Now has a handle on both it's repository/session AND dataset.&lt;br /&gt;
&lt;br /&gt;
 my $field = $dataset-&amp;gt;field( $fieldname );&lt;br /&gt;
 &lt;br /&gt;
 $dataset = $field-&amp;gt;dataset;&lt;br /&gt;
 $repo = $field-&amp;gt;repository;&lt;br /&gt;
 &lt;br /&gt;
 $field-&amp;gt;set_property( $property, $value );&lt;br /&gt;
 $value = $field-&amp;gt;property( $property );&lt;br /&gt;
 &lt;br /&gt;
 $name = $field-&amp;gt;name;&lt;br /&gt;
 $type = $field-&amp;gt;type;&lt;br /&gt;
 &lt;br /&gt;
 $xhtml = $field-&amp;gt;render_name;&lt;br /&gt;
 $xhtml = $field-&amp;gt;render_help;&lt;br /&gt;
 $xhtml = $field-&amp;gt;render_value_label( $value );&lt;br /&gt;
 &lt;br /&gt;
 $values = $field-&amp;gt;all_values( %opts );&lt;br /&gt;
 $sorted_list = $field-&amp;gt;sort_values( $unsorted_list );&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Workflow_Format&amp;diff=9307</id>
		<title>Workflow Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Workflow_Format&amp;diff=9307"/>
		<updated>2010-05-19T11:53:02Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{formats}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The EPrints 3 workflow configuration files are stored in the repository's [[EPrints_Directory_Structure/eprints3/archives/ARCHIVEID/cfg/workflows|workflows]] directory, within folders identifying the [[Data Object]]s to which they apply (e.g. eprint or user). Multiple workflows may be defined in each folder, although typically only the default.xml file will be necessary.&lt;br /&gt;
&lt;br /&gt;
== Structure ==&lt;br /&gt;
&lt;br /&gt;
At the centre of a workflow is a 'flow' description. This denotes the path through the workflow process from stage to stage. This may contain EPrints Control tags, allowing for the flow to vary depending on parameters of the data object (or other objects). For example, the flow may be different for users with certain roles. The flow is structured like so:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;flow&amp;gt;&lt;br /&gt;
   &amp;lt;stage ref=&amp;quot;type&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;stage ref=&amp;quot;files&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;stage ref=&amp;quot;core&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;stage ref=&amp;quot;subjects&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/flow&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The 'ref' attribute of the stage element refers to the individual stages. The stage elements describe the components within each screen of the process and, like flow, may contain EPrints Control tags. The 'name' attribute of the stage element is identical to that of the stage element in the 'flow' section.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;stage name=&amp;quot;core&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;component&amp;gt;&amp;lt;field ref=&amp;quot;title&amp;quot; required=&amp;quot;yes&amp;quot; /&amp;gt;&amp;lt;/component&amp;gt;&lt;br /&gt;
   &amp;lt;component&amp;gt;&amp;lt;field ref=&amp;quot;abstract&amp;quot;/&amp;gt;&amp;lt;/component&amp;gt;&lt;br /&gt;
 &amp;lt;/stage&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
&lt;br /&gt;
By default the &amp;quot;save&amp;quot; and &amp;quot;cancel&amp;quot; buttons appear at the top and bottom of each stage, but you can change this using the &amp;quot;action_buttons&amp;quot; attribute. Values are &amp;quot;top&amp;quot;, &amp;quot;bottom&amp;quot; or &amp;quot;both&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;stage name=&amp;quot;core&amp;quot; action_buttons=&amp;quot;bottom&amp;quot; &amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
&lt;br /&gt;
An EPrints component is responsible for the rendering of a graphical element in a workflow. This may be a text-box for title entry, a collection of fields in an appropriate grouping, or just a piece of XHTML. Six components are provided by default and, as they are plugins, it is straightforward to drop in new components when necessary. The type attribute of the component element corresponds to the plugin to be used.&lt;br /&gt;
&lt;br /&gt;
== Field-Related Components ==&lt;br /&gt;
&lt;br /&gt;
=== Field Element ===&lt;br /&gt;
&lt;br /&gt;
The majority of field-related components in EPrints 3 make use of the field element in their configuration. This provides a reference to a metafield and any attributes which may be relevant to rendering or operation. Several attributes are available to the element:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot; cellspacing='0'&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Attribute&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Values&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Description&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;ref&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;A string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(required) Refers to the name of the metafield this field represents&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;required&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;yes/no&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) Whether a value is required in this field before the workflow may complete&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;help&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;An XHTML block&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) A block of XHTML to be rendered as help for the field&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;title&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;An XHTML block&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) A block of XHTML to be rendered as the title for the field&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;input_lookup_url&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;A URL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) The location of an auto-lookup URL for the field&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;input_lookup_params&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;A string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) An &amp;amp;-separated list of parameters (e.g. sort=descending&amp;amp;number=3&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;top&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;A string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) Only useful on &amp;quot;subject&amp;quot; fields, this overrides the top node of the available subject tree. Useful to force certain records to only select from a sub tree.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;options&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;A string (comma separated values)&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) On a set (or named set) field this overrides the default options. Useful if you want a certain option to appear or disappear based on other metadata)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;input_boxes&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;An integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) Default number of rows to show by default in a multiple field. Overrides the field property.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;input_add_boxes&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;An integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) Number of rows to add to a multiple field if the &amp;quot;more rows&amp;quot; button is pressed. Zero disables the option to add more rows. Overrides the field setting.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;input_ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Boolean&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) 1 or 0. Overrides the field setting. If zero then a multiple field won't have the 1,2,3 on the left and reordering arrows on the right of the input, as ordering is considered irrelevant.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Field Component ===&lt;br /&gt;
&lt;br /&gt;
The default component, this renders the field title, an input box suitable for the field, a star if the field is required, and any help information. A single field element is required:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component&amp;gt;&amp;lt;field ref=&amp;quot;title&amp;quot; required=&amp;quot;yes&amp;quot; /&amp;gt;&amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiple Field Component ===&lt;br /&gt;
&lt;br /&gt;
The multiple field component is able to render several fields in a group, such as all fields related to a publication or an event. A title element and a help element may be provided that describe the group itself. One or many field elements are also required.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component type=&amp;quot;Field::Multi&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;title&amp;gt;Event Details&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;help&amp;gt;Enter information about your event here.&amp;lt;/help&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;event_title&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;event_type&amp;quot; required=&amp;quot;yes&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;event_location&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;event_dates&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Subject Component ===&lt;br /&gt;
&lt;br /&gt;
The subject component allows for the selection of one or more subjects from a subject tree. In this instance, the field element specifies the subject metafield.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component type=&amp;quot;Field::Subject&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;subjects&amp;quot; required=&amp;quot;yes&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Components ==&lt;br /&gt;
&lt;br /&gt;
=== Upload Component ===&lt;br /&gt;
&lt;br /&gt;
The upload component provides an interface for files to be uploaded to EPrints documents, and for new documents to be created/edited. It does not require any elements other than the component tag, but field elements to be rendered for each document may be added as in the example. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component type=&amp;quot;Upload&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;format&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;formatdesc&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;security&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;license&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;date_embargo&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XHTML Component ===&lt;br /&gt;
&lt;br /&gt;
This component inserts any contained nodes into the rendered document. As EPrints Control elements may be used, it is possible to insert phrases into the screen.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component type=&amp;quot;XHTML&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;epc:phrase ref=&amp;quot;Plugin/InputForm/Component/Upload:help&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Component Options ==&lt;br /&gt;
&lt;br /&gt;
A component normally is enclosed in a &amp;quot;default&amp;quot; surround, with a pop-up help &lt;br /&gt;
icon, and a title bar with the contents in a tinted box. The behaviour of the page around the component can be tweaked in a few ways.&lt;br /&gt;
&lt;br /&gt;
=== collapse ===&lt;br /&gt;
&lt;br /&gt;
The collapse option to the component defaults to &amp;quot;no&amp;quot; but may be set to &amp;quot;yes. If yes, the entire component is shown, by default, as &amp;quot;rolled up&amp;quot; so it must be clicked to unroll it. This is a good way to indicate that the fields, are not something for most users to worry about. It allows you to make the form less intimidating, while still having many options available for advanced users.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component collapse=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== show_help ===&lt;br /&gt;
&lt;br /&gt;
The default value is &amp;quot;toggle&amp;quot; but it can be set to &amp;quot;always&amp;quot; or &amp;quot;never&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;always&amp;quot; will remove the option to show help, and just always show it. &amp;quot;never&amp;quot; removes the toggle but does not show the help.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component show_help=&amp;quot;always&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== surround ===&lt;br /&gt;
&lt;br /&gt;
This controls the InputForm::Surround plugin used to render the component. The default option paints the standard box. Other options are &amp;quot;None&amp;quot; and &amp;quot;Light&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
None renders just the contents, and can be useful to combine with type=&amp;quot;XHTML&amp;quot; to embed HTML directly into the page.&lt;br /&gt;
&lt;br /&gt;
You may add your own Surround plugins if you wish. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component surround=&amp;quot;None&amp;quot; type=&amp;quot;XHTML&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Workflow_Format&amp;diff=9306</id>
		<title>Workflow Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Workflow_Format&amp;diff=9306"/>
		<updated>2010-05-19T11:51:01Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* Field Element */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{formats}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The EPrints 3 workflow configuration files are stored in the repository's [[EPrints_Directory_Structure/eprints3/archives/ARCHIVEID/cfg/workflows|workflows]] directory, within folders identifying the [[Data Object]]s to which they apply (e.g. eprint or user). Multiple workflows may be defined in each folder, although typically only the default.xml file will be necessary.&lt;br /&gt;
&lt;br /&gt;
== Structure ==&lt;br /&gt;
&lt;br /&gt;
At the centre of a workflow is a 'flow' description. This denotes the path through the workflow process from stage to stage. This may contain EPrints Control tags, allowing for the flow to vary depending on parameters of the data object (or other objects). For example, the flow may be different for users with certain roles. The flow is structured like so:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;flow&amp;gt;&lt;br /&gt;
   &amp;lt;stage ref=&amp;quot;type&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;stage ref=&amp;quot;files&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;stage ref=&amp;quot;core&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;stage ref=&amp;quot;subjects&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/flow&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The 'ref' attribute of the stage element refers to the individual stages. The stage elements describe the components within each screen of the process and, like flow, may contain EPrints Control tags. The 'name' attribute of the stage element is identical to that of the stage element in the 'flow' section.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;stage name=&amp;quot;core&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;component&amp;gt;&amp;lt;field ref=&amp;quot;title&amp;quot; required=&amp;quot;yes&amp;quot; /&amp;gt;&amp;lt;/component&amp;gt;&lt;br /&gt;
   &amp;lt;component&amp;gt;&amp;lt;field ref=&amp;quot;abstract&amp;quot;/&amp;gt;&amp;lt;/component&amp;gt;&lt;br /&gt;
 &amp;lt;/stage&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Components ==&lt;br /&gt;
&lt;br /&gt;
An EPrints component is responsible for the rendering of a graphical element in a workflow. This may be a text-box for title entry, a collection of fields in an appropriate grouping, or just a piece of XHTML. Six components are provided by default and, as they are plugins, it is straightforward to drop in new components when necessary. The type attribute of the component element corresponds to the plugin to be used.&lt;br /&gt;
&lt;br /&gt;
== Field-Related Components ==&lt;br /&gt;
&lt;br /&gt;
=== Field Element ===&lt;br /&gt;
&lt;br /&gt;
The majority of field-related components in EPrints 3 make use of the field element in their configuration. This provides a reference to a metafield and any attributes which may be relevant to rendering or operation. Several attributes are available to the element:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot; cellspacing='0'&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Attribute&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Values&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Description&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;ref&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;A string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(required) Refers to the name of the metafield this field represents&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;required&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;yes/no&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) Whether a value is required in this field before the workflow may complete&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;help&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;An XHTML block&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) A block of XHTML to be rendered as help for the field&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;title&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;An XHTML block&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) A block of XHTML to be rendered as the title for the field&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;input_lookup_url&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;A URL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) The location of an auto-lookup URL for the field&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;input_lookup_params&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;A string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) An &amp;amp;-separated list of parameters (e.g. sort=descending&amp;amp;number=3&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;top&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;A string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) Only useful on &amp;quot;subject&amp;quot; fields, this overrides the top node of the available subject tree. Useful to force certain records to only select from a sub tree.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;options&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;A string (comma separated values)&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) On a set (or named set) field this overrides the default options. Useful if you want a certain option to appear or disappear based on other metadata)&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;input_boxes&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;An integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) Default number of rows to show by default in a multiple field. Overrides the field property.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;input_add_boxes&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;An integer&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) Number of rows to add to a multiple field if the &amp;quot;more rows&amp;quot; button is pressed. Zero disables the option to add more rows. Overrides the field setting.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;input_ordered&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Boolean&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) 1 or 0. Overrides the field setting. If zero then a multiple field won't have the 1,2,3 on the left and reordering arrows on the right of the input, as ordering is considered irrelevant.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Field Component ===&lt;br /&gt;
&lt;br /&gt;
The default component, this renders the field title, an input box suitable for the field, a star if the field is required, and any help information. A single field element is required:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component&amp;gt;&amp;lt;field ref=&amp;quot;title&amp;quot; required=&amp;quot;yes&amp;quot; /&amp;gt;&amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiple Field Component ===&lt;br /&gt;
&lt;br /&gt;
The multiple field component is able to render several fields in a group, such as all fields related to a publication or an event. A title element and a help element may be provided that describe the group itself. One or many field elements are also required.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component type=&amp;quot;Field::Multi&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;title&amp;gt;Event Details&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;help&amp;gt;Enter information about your event here.&amp;lt;/help&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;event_title&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;event_type&amp;quot; required=&amp;quot;yes&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;event_location&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;event_dates&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Subject Component ===&lt;br /&gt;
&lt;br /&gt;
The subject component allows for the selection of one or more subjects from a subject tree. In this instance, the field element specifies the subject metafield.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component type=&amp;quot;Field::Subject&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;subjects&amp;quot; required=&amp;quot;yes&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Components ==&lt;br /&gt;
&lt;br /&gt;
=== Upload Component ===&lt;br /&gt;
&lt;br /&gt;
The upload component provides an interface for files to be uploaded to EPrints documents, and for new documents to be created/edited. It does not require any elements other than the component tag, but field elements to be rendered for each document may be added as in the example. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component type=&amp;quot;Upload&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;format&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;formatdesc&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;security&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;license&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;date_embargo&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XHTML Component ===&lt;br /&gt;
&lt;br /&gt;
This component inserts any contained nodes into the rendered document. As EPrints Control elements may be used, it is possible to insert phrases into the screen.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component type=&amp;quot;XHTML&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;epc:phrase ref=&amp;quot;Plugin/InputForm/Component/Upload:help&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Component Options ==&lt;br /&gt;
&lt;br /&gt;
A component normally is enclosed in a &amp;quot;default&amp;quot; surround, with a pop-up help &lt;br /&gt;
icon, and a title bar with the contents in a tinted box. The behaviour of the page around the component can be tweaked in a few ways.&lt;br /&gt;
&lt;br /&gt;
=== collapse ===&lt;br /&gt;
&lt;br /&gt;
The collapse option to the component defaults to &amp;quot;no&amp;quot; but may be set to &amp;quot;yes. If yes, the entire component is shown, by default, as &amp;quot;rolled up&amp;quot; so it must be clicked to unroll it. This is a good way to indicate that the fields, are not something for most users to worry about. It allows you to make the form less intimidating, while still having many options available for advanced users.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component collapse=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== show_help ===&lt;br /&gt;
&lt;br /&gt;
The default value is &amp;quot;toggle&amp;quot; but it can be set to &amp;quot;always&amp;quot; or &amp;quot;never&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;always&amp;quot; will remove the option to show help, and just always show it. &amp;quot;never&amp;quot; removes the toggle but does not show the help.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component show_help=&amp;quot;always&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== surround ===&lt;br /&gt;
&lt;br /&gt;
This controls the InputForm::Surround plugin used to render the component. The default option paints the standard box. Other options are &amp;quot;None&amp;quot; and &amp;quot;Light&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
None renders just the contents, and can be useful to combine with type=&amp;quot;XHTML&amp;quot; to embed HTML directly into the page.&lt;br /&gt;
&lt;br /&gt;
You may add your own Surround plugins if you wish. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component surround=&amp;quot;None&amp;quot; type=&amp;quot;XHTML&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Workflow_Format&amp;diff=9305</id>
		<title>Workflow Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Workflow_Format&amp;diff=9305"/>
		<updated>2010-05-19T11:45:52Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* Field Element */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{formats}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The EPrints 3 workflow configuration files are stored in the repository's [[EPrints_Directory_Structure/eprints3/archives/ARCHIVEID/cfg/workflows|workflows]] directory, within folders identifying the [[Data Object]]s to which they apply (e.g. eprint or user). Multiple workflows may be defined in each folder, although typically only the default.xml file will be necessary.&lt;br /&gt;
&lt;br /&gt;
== Structure ==&lt;br /&gt;
&lt;br /&gt;
At the centre of a workflow is a 'flow' description. This denotes the path through the workflow process from stage to stage. This may contain EPrints Control tags, allowing for the flow to vary depending on parameters of the data object (or other objects). For example, the flow may be different for users with certain roles. The flow is structured like so:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;flow&amp;gt;&lt;br /&gt;
   &amp;lt;stage ref=&amp;quot;type&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;stage ref=&amp;quot;files&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;stage ref=&amp;quot;core&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;stage ref=&amp;quot;subjects&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/flow&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The 'ref' attribute of the stage element refers to the individual stages. The stage elements describe the components within each screen of the process and, like flow, may contain EPrints Control tags. The 'name' attribute of the stage element is identical to that of the stage element in the 'flow' section.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;stage name=&amp;quot;core&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;component&amp;gt;&amp;lt;field ref=&amp;quot;title&amp;quot; required=&amp;quot;yes&amp;quot; /&amp;gt;&amp;lt;/component&amp;gt;&lt;br /&gt;
   &amp;lt;component&amp;gt;&amp;lt;field ref=&amp;quot;abstract&amp;quot;/&amp;gt;&amp;lt;/component&amp;gt;&lt;br /&gt;
 &amp;lt;/stage&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Components ==&lt;br /&gt;
&lt;br /&gt;
An EPrints component is responsible for the rendering of a graphical element in a workflow. This may be a text-box for title entry, a collection of fields in an appropriate grouping, or just a piece of XHTML. Six components are provided by default and, as they are plugins, it is straightforward to drop in new components when necessary. The type attribute of the component element corresponds to the plugin to be used.&lt;br /&gt;
&lt;br /&gt;
== Field-Related Components ==&lt;br /&gt;
&lt;br /&gt;
=== Field Element ===&lt;br /&gt;
&lt;br /&gt;
The majority of field-related components in EPrints 3 make use of the field element in their configuration. This provides a reference to a metafield and any attributes which may be relevant to rendering or operation. Several attributes are available to the element:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot; cellspacing='0'&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Attribute&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Values&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Description&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;ref&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;A string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(required) Refers to the name of the metafield this field represents&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;required&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;yes/no&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) Whether a value is required in this field before the workflow may complete&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;help&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;An XHTML block&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) A block of XHTML to be rendered as help for the field&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;title&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;An XHTML block&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) A block of XHTML to be rendered as the title for the field&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;input_lookup_url&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;A URL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) The location of an auto-lookup URL for the field&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;input_lookup_params&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;A string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) An &amp;amp;-separated list of parameters (e.g. sort=descending&amp;amp;number=3&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
top&lt;br /&gt;
options&lt;br /&gt;
input_boxes&lt;br /&gt;
input_add_boxes&lt;br /&gt;
input_ordered&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Field Component ===&lt;br /&gt;
&lt;br /&gt;
The default component, this renders the field title, an input box suitable for the field, a star if the field is required, and any help information. A single field element is required:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component&amp;gt;&amp;lt;field ref=&amp;quot;title&amp;quot; required=&amp;quot;yes&amp;quot; /&amp;gt;&amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiple Field Component ===&lt;br /&gt;
&lt;br /&gt;
The multiple field component is able to render several fields in a group, such as all fields related to a publication or an event. A title element and a help element may be provided that describe the group itself. One or many field elements are also required.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component type=&amp;quot;Field::Multi&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;title&amp;gt;Event Details&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;help&amp;gt;Enter information about your event here.&amp;lt;/help&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;event_title&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;event_type&amp;quot; required=&amp;quot;yes&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;event_location&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;event_dates&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Subject Component ===&lt;br /&gt;
&lt;br /&gt;
The subject component allows for the selection of one or more subjects from a subject tree. In this instance, the field element specifies the subject metafield.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component type=&amp;quot;Field::Subject&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;subjects&amp;quot; required=&amp;quot;yes&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Components ==&lt;br /&gt;
&lt;br /&gt;
=== Upload Component ===&lt;br /&gt;
&lt;br /&gt;
The upload component provides an interface for files to be uploaded to EPrints documents, and for new documents to be created/edited. It does not require any elements other than the component tag, but field elements to be rendered for each document may be added as in the example. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component type=&amp;quot;Upload&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;format&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;formatdesc&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;security&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;license&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;date_embargo&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XHTML Component ===&lt;br /&gt;
&lt;br /&gt;
This component inserts any contained nodes into the rendered document. As EPrints Control elements may be used, it is possible to insert phrases into the screen.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component type=&amp;quot;XHTML&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;epc:phrase ref=&amp;quot;Plugin/InputForm/Component/Upload:help&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Component Options ==&lt;br /&gt;
&lt;br /&gt;
A component normally is enclosed in a &amp;quot;default&amp;quot; surround, with a pop-up help &lt;br /&gt;
icon, and a title bar with the contents in a tinted box. The behaviour of the page around the component can be tweaked in a few ways.&lt;br /&gt;
&lt;br /&gt;
=== collapse ===&lt;br /&gt;
&lt;br /&gt;
The collapse option to the component defaults to &amp;quot;no&amp;quot; but may be set to &amp;quot;yes. If yes, the entire component is shown, by default, as &amp;quot;rolled up&amp;quot; so it must be clicked to unroll it. This is a good way to indicate that the fields, are not something for most users to worry about. It allows you to make the form less intimidating, while still having many options available for advanced users.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component collapse=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== show_help ===&lt;br /&gt;
&lt;br /&gt;
The default value is &amp;quot;toggle&amp;quot; but it can be set to &amp;quot;always&amp;quot; or &amp;quot;never&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;always&amp;quot; will remove the option to show help, and just always show it. &amp;quot;never&amp;quot; removes the toggle but does not show the help.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component show_help=&amp;quot;always&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== surround ===&lt;br /&gt;
&lt;br /&gt;
This controls the InputForm::Surround plugin used to render the component. The default option paints the standard box. Other options are &amp;quot;None&amp;quot; and &amp;quot;Light&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
None renders just the contents, and can be useful to combine with type=&amp;quot;XHTML&amp;quot; to embed HTML directly into the page.&lt;br /&gt;
&lt;br /&gt;
You may add your own Surround plugins if you wish. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component surround=&amp;quot;None&amp;quot; type=&amp;quot;XHTML&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Workflows/Workflow_Format&amp;diff=9304</id>
		<title>Workflows/Workflow Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Workflows/Workflow_Format&amp;diff=9304"/>
		<updated>2010-05-19T11:44:58Z</updated>

		<summary type="html">&lt;p&gt;Cjg: Redirected page to Workflow Format&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Workflow Format]]&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Workflows/Components&amp;diff=9303</id>
		<title>Workflows/Components</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Workflows/Components&amp;diff=9303"/>
		<updated>2010-05-19T11:44:49Z</updated>

		<summary type="html">&lt;p&gt;Cjg: Redirected page to Workflow Format&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Workflow Format]]&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Workflow_Format&amp;diff=9302</id>
		<title>Workflow Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Workflow_Format&amp;diff=9302"/>
		<updated>2010-05-19T11:41:59Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* XHTML Component */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{formats}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The EPrints 3 workflow configuration files are stored in the repository's [[EPrints_Directory_Structure/eprints3/archives/ARCHIVEID/cfg/workflows|workflows]] directory, within folders identifying the [[Data Object]]s to which they apply (e.g. eprint or user). Multiple workflows may be defined in each folder, although typically only the default.xml file will be necessary.&lt;br /&gt;
&lt;br /&gt;
== Structure ==&lt;br /&gt;
&lt;br /&gt;
At the centre of a workflow is a 'flow' description. This denotes the path through the workflow process from stage to stage. This may contain EPrints Control tags, allowing for the flow to vary depending on parameters of the data object (or other objects). For example, the flow may be different for users with certain roles. The flow is structured like so:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;flow&amp;gt;&lt;br /&gt;
   &amp;lt;stage ref=&amp;quot;type&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;stage ref=&amp;quot;files&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;stage ref=&amp;quot;core&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;stage ref=&amp;quot;subjects&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/flow&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The 'ref' attribute of the stage element refers to the individual stages. The stage elements describe the components within each screen of the process and, like flow, may contain EPrints Control tags. The 'name' attribute of the stage element is identical to that of the stage element in the 'flow' section.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;stage name=&amp;quot;core&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;component&amp;gt;&amp;lt;field ref=&amp;quot;title&amp;quot; required=&amp;quot;yes&amp;quot; /&amp;gt;&amp;lt;/component&amp;gt;&lt;br /&gt;
   &amp;lt;component&amp;gt;&amp;lt;field ref=&amp;quot;abstract&amp;quot;/&amp;gt;&amp;lt;/component&amp;gt;&lt;br /&gt;
 &amp;lt;/stage&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== Components ==&lt;br /&gt;
&lt;br /&gt;
An EPrints component is responsible for the rendering of a graphical element in a workflow. This may be a text-box for title entry, a collection of fields in an appropriate grouping, or just a piece of XHTML. Six components are provided by default and, as they are plugins, it is straightforward to drop in new components when necessary. The type attribute of the component element corresponds to the plugin to be used.&lt;br /&gt;
&lt;br /&gt;
== Field-Related Components ==&lt;br /&gt;
&lt;br /&gt;
=== Field Element ===&lt;br /&gt;
&lt;br /&gt;
The majority of field-related components in EPrints 3 make use of the field element in their configuration. This provides a reference to a metafield and any attributes which may be relevant to rendering or operation. Several attributes are available to the element:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Attribute&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Values&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Description&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;ref&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;A string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(required) Refers to the name of the metafield this field represents&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;required&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;yes/no&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) Whether a value is required in this field before the workflow may complete&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;help&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;An XHTML block&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) A block of XHTML to be rendered as help for the field&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;title&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;An XHTML block&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) A block of XHTML to be rendered as the title for the field&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;input_lookup_url&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;A URL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) The location of an auto-lookup URL for the field&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;input_lookup_params&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;A string&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;(optional) An &amp;amp;-separated list of parameters (e.g. sort=descending&amp;amp;number=3&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Field Component ===&lt;br /&gt;
&lt;br /&gt;
The default component, this renders the field title, an input box suitable for the field, a star if the field is required, and any help information. A single field element is required:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component&amp;gt;&amp;lt;field ref=&amp;quot;title&amp;quot; required=&amp;quot;yes&amp;quot; /&amp;gt;&amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multiple Field Component ===&lt;br /&gt;
&lt;br /&gt;
The multiple field component is able to render several fields in a group, such as all fields related to a publication or an event. A title element and a help element may be provided that describe the group itself. One or many field elements are also required.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component type=&amp;quot;Field::Multi&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;title&amp;gt;Event Details&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;help&amp;gt;Enter information about your event here.&amp;lt;/help&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;event_title&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;event_type&amp;quot; required=&amp;quot;yes&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;event_location&amp;quot;/&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;event_dates&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Subject Component ===&lt;br /&gt;
&lt;br /&gt;
The subject component allows for the selection of one or more subjects from a subject tree. In this instance, the field element specifies the subject metafield.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component type=&amp;quot;Field::Subject&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;subjects&amp;quot; required=&amp;quot;yes&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Components ==&lt;br /&gt;
&lt;br /&gt;
=== Upload Component ===&lt;br /&gt;
&lt;br /&gt;
The upload component provides an interface for files to be uploaded to EPrints documents, and for new documents to be created/edited. It does not require any elements other than the component tag, but field elements to be rendered for each document may be added as in the example. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component type=&amp;quot;Upload&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;format&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;formatdesc&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;security&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;license&amp;quot; /&amp;gt;&lt;br /&gt;
   &amp;lt;field ref=&amp;quot;date_embargo&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XHTML Component ===&lt;br /&gt;
&lt;br /&gt;
This component inserts any contained nodes into the rendered document. As EPrints Control elements may be used, it is possible to insert phrases into the screen.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component type=&amp;quot;XHTML&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;epc:phrase ref=&amp;quot;Plugin/InputForm/Component/Upload:help&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Component Options ==&lt;br /&gt;
&lt;br /&gt;
A component normally is enclosed in a &amp;quot;default&amp;quot; surround, with a pop-up help &lt;br /&gt;
icon, and a title bar with the contents in a tinted box. The behaviour of the page around the component can be tweaked in a few ways.&lt;br /&gt;
&lt;br /&gt;
=== collapse ===&lt;br /&gt;
&lt;br /&gt;
The collapse option to the component defaults to &amp;quot;no&amp;quot; but may be set to &amp;quot;yes. If yes, the entire component is shown, by default, as &amp;quot;rolled up&amp;quot; so it must be clicked to unroll it. This is a good way to indicate that the fields, are not something for most users to worry about. It allows you to make the form less intimidating, while still having many options available for advanced users.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component collapse=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== show_help ===&lt;br /&gt;
&lt;br /&gt;
The default value is &amp;quot;toggle&amp;quot; but it can be set to &amp;quot;always&amp;quot; or &amp;quot;never&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;always&amp;quot; will remove the option to show help, and just always show it. &amp;quot;never&amp;quot; removes the toggle but does not show the help.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component show_help=&amp;quot;always&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== surround ===&lt;br /&gt;
&lt;br /&gt;
This controls the InputForm::Surround plugin used to render the component. The default option paints the standard box. Other options are &amp;quot;None&amp;quot; and &amp;quot;Light&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
None renders just the contents, and can be useful to combine with type=&amp;quot;XHTML&amp;quot; to embed HTML directly into the page.&lt;br /&gt;
&lt;br /&gt;
You may add your own Surround plugins if you wish. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;component surround=&amp;quot;None&amp;quot; type=&amp;quot;XHTML&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &amp;lt;/component&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints_Control_Format&amp;diff=9301</id>
		<title>EPrints Control Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints_Control_Format&amp;diff=9301"/>
		<updated>2010-05-18T17:34:33Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* limit (3.2.0+) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{formats}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= EPrints Control =&lt;br /&gt;
&lt;br /&gt;
== Output Tags ==&lt;br /&gt;
&lt;br /&gt;
=== epc:print ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:print expr='expression' opt='key=value;key2=value2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;cite:citation xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;br /&gt;
           xmlns:cite=&amp;quot;http://eprints.org/ep3/citation&amp;quot;&lt;br /&gt;
           xmlns:epc=&amp;quot;http://eprints.org/ep3/control&amp;quot;&amp;amp;gt;&lt;br /&gt;
     &amp;amp;lt;epc:print expr=&amp;quot;$item.citation('default')&amp;quot; /&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/cite:citation&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
Outputs the result of the expression in the 'expr' attribute. &lt;br /&gt;
&lt;br /&gt;
Rendering options may be passed in the opt attribute using a key=value form, with semicolons separating multiple options.&lt;br /&gt;
&lt;br /&gt;
Any [[EPScript]] expression can be used. The most simple is just 'eprintid','title','creators' etc. You can also use values from the configuration files by using '$config{base_url}'.&lt;br /&gt;
&lt;br /&gt;
=== Print in attributes using {} ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you may wish to insert a value into an XML attribute. eg. the &amp;quot;href&amp;quot; part of an anchor. Rather than a complicated system, but correct XML, we decide to go for something a bit more readable. Any {} pair in an XML attribute will be treated as a epc:print.&lt;br /&gt;
&lt;br /&gt;
So you can do something like &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;a href=&amp;quot;http://eprints.badger.edu/cgi/myscript.pl?eprintid={eprintid}&amp;quot;&amp;gt;run myscript on this eprint&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epc:phrase ===&lt;br /&gt;
&lt;br /&gt;
simple:&lt;br /&gt;
 &amp;lt;epc:phrase ref='phraseid' /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with pins:&lt;br /&gt;
 &amp;lt;epc:phrase ref='phraseid'&amp;gt;&lt;br /&gt;
   &amp;lt;epc:param name='somepin'&amp;gt;Content&amp;lt;/epc:param&amp;gt;&lt;br /&gt;
 &amp;lt;/epc:phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outputs the content of the phrase refered to by 'ref'. Any necessary parameters may be set using the &amp;lt;epc:param&amp;gt; tag, with the contents inserted into the pin with the name corresponding to the name attribute.&lt;br /&gt;
&lt;br /&gt;
== Conditional Tags ==&lt;br /&gt;
&lt;br /&gt;
=== epc:if ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:if test='expr'&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outputs any XHTML content and evaluates any EPrints Control structures within the epc:if block if the expression in the test attribute is true.&lt;br /&gt;
&lt;br /&gt;
=== epc:choose, epc:when, epc:otherwise ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:choose&amp;gt;&lt;br /&gt;
   &amp;lt;epc:when test='expr'&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:when&amp;gt;&lt;br /&gt;
   &amp;lt;epc:when test='expr2'&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:when&amp;gt;&lt;br /&gt;
   &amp;lt;epc:otherwise&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:otherwise&amp;gt;&lt;br /&gt;
 &amp;lt;/epc:choose&amp;gt;&lt;br /&gt;
&lt;br /&gt;
epc:choose allows for the construction of a complex conditional. Each epc:when block's 'test' attribute is evaluated, and the content of the block is returned if the result is true. If no expressions return true, the optional epc:otherwise block is returned. Note that no subsequent epc:when blocks are evaluated once the first block to return true is reached.&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
Multiple values can be iterated over. For example.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot;&amp;gt;&lt;br /&gt;
    ( &amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt; )&lt;br /&gt;
  &amp;lt;/epc:foreach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== $index (3.2.0+) ===&lt;br /&gt;
&lt;br /&gt;
Within a foreach block you can use $index to find what iteration of the loop is on. The first value is zero.&lt;br /&gt;
&lt;br /&gt;
This can be used with the modulus &amp;quot;%&amp;quot; to add a strip effect, if wanted, eg.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;epc:if expr=&amp;quot;$index % 2&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr class='odd'&amp;gt;&amp;lt;td&amp;gt;&amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
    &amp;lt;epc:if expr=&amp;quot;!($index % 2)&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr class='even'&amp;gt;&amp;lt;td&amp;gt;&amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
  &amp;lt;/epc:foreach&amp;gt;&lt;br /&gt;
  &amp;lt;/table&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== limit (3.2.0+) ===&lt;br /&gt;
&lt;br /&gt;
You can set a limit of how many iterations to process using a &amp;quot;limit&amp;quot; attribute on the epc:foreach element. For example, &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot; limit=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== epc:debug (3.2.0+) ==&lt;br /&gt;
&lt;br /&gt;
The epc:debug element has identical syntax to epc:print, but the result is sent to the error log -- either the command line, or to the apache error log.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;epc:debug expr='expression' opt='key=value;key2=value2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== epc:set (3.2.0+) ==&lt;br /&gt;
&lt;br /&gt;
This allows a variable to be set for any print or if elements within the epc:set. This is useful if creating the value has a notable cost which you wish to minimise. &lt;br /&gt;
&lt;br /&gt;
$item.documents() requires some database access, and the results are not cached, so using this speeds things up.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;epc:set name='docs' expr='$item.documents()'&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints_Control_Format&amp;diff=9300</id>
		<title>EPrints Control Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints_Control_Format&amp;diff=9300"/>
		<updated>2010-05-18T17:21:52Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* limit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{formats}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= EPrints Control =&lt;br /&gt;
&lt;br /&gt;
== Output Tags ==&lt;br /&gt;
&lt;br /&gt;
=== epc:print ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:print expr='expression' opt='key=value;key2=value2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;cite:citation xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;br /&gt;
           xmlns:cite=&amp;quot;http://eprints.org/ep3/citation&amp;quot;&lt;br /&gt;
           xmlns:epc=&amp;quot;http://eprints.org/ep3/control&amp;quot;&amp;amp;gt;&lt;br /&gt;
     &amp;amp;lt;epc:print expr=&amp;quot;$item.citation('default')&amp;quot; /&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/cite:citation&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
Outputs the result of the expression in the 'expr' attribute. &lt;br /&gt;
&lt;br /&gt;
Rendering options may be passed in the opt attribute using a key=value form, with semicolons separating multiple options.&lt;br /&gt;
&lt;br /&gt;
Any [[EPScript]] expression can be used. The most simple is just 'eprintid','title','creators' etc. You can also use values from the configuration files by using '$config{base_url}'.&lt;br /&gt;
&lt;br /&gt;
=== Print in attributes using {} ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you may wish to insert a value into an XML attribute. eg. the &amp;quot;href&amp;quot; part of an anchor. Rather than a complicated system, but correct XML, we decide to go for something a bit more readable. Any {} pair in an XML attribute will be treated as a epc:print.&lt;br /&gt;
&lt;br /&gt;
So you can do something like &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;a href=&amp;quot;http://eprints.badger.edu/cgi/myscript.pl?eprintid={eprintid}&amp;quot;&amp;gt;run myscript on this eprint&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epc:phrase ===&lt;br /&gt;
&lt;br /&gt;
simple:&lt;br /&gt;
 &amp;lt;epc:phrase ref='phraseid' /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with pins:&lt;br /&gt;
 &amp;lt;epc:phrase ref='phraseid'&amp;gt;&lt;br /&gt;
   &amp;lt;epc:param name='somepin'&amp;gt;Content&amp;lt;/epc:param&amp;gt;&lt;br /&gt;
 &amp;lt;/epc:phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outputs the content of the phrase refered to by 'ref'. Any necessary parameters may be set using the &amp;lt;epc:param&amp;gt; tag, with the contents inserted into the pin with the name corresponding to the name attribute.&lt;br /&gt;
&lt;br /&gt;
== Conditional Tags ==&lt;br /&gt;
&lt;br /&gt;
=== epc:if ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:if test='expr'&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outputs any XHTML content and evaluates any EPrints Control structures within the epc:if block if the expression in the test attribute is true.&lt;br /&gt;
&lt;br /&gt;
=== epc:choose, epc:when, epc:otherwise ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:choose&amp;gt;&lt;br /&gt;
   &amp;lt;epc:when test='expr'&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:when&amp;gt;&lt;br /&gt;
   &amp;lt;epc:when test='expr2'&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:when&amp;gt;&lt;br /&gt;
   &amp;lt;epc:otherwise&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:otherwise&amp;gt;&lt;br /&gt;
 &amp;lt;/epc:choose&amp;gt;&lt;br /&gt;
&lt;br /&gt;
epc:choose allows for the construction of a complex conditional. Each epc:when block's 'test' attribute is evaluated, and the content of the block is returned if the result is true. If no expressions return true, the optional epc:otherwise block is returned. Note that no subsequent epc:when blocks are evaluated once the first block to return true is reached.&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
Multiple values can be iterated over. For example.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot;&amp;gt;&lt;br /&gt;
    ( &amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt; )&lt;br /&gt;
  &amp;lt;/epc:foreach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== $index (3.2.0+) ===&lt;br /&gt;
&lt;br /&gt;
Within a foreach block you can use $index to find what iteration of the loop is on. The first value is zero.&lt;br /&gt;
&lt;br /&gt;
This can be used with the modulus &amp;quot;%&amp;quot; to add a strip effect, if wanted, eg.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;epc:if expr=&amp;quot;$index % 2&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr class='odd'&amp;gt;&amp;lt;td&amp;gt;&amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
    &amp;lt;epc:if expr=&amp;quot;!($index % 2)&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr class='even'&amp;gt;&amp;lt;td&amp;gt;&amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
  &amp;lt;/epc:foreach&amp;gt;&lt;br /&gt;
  &amp;lt;/table&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== limit (3.2.0+) ===&lt;br /&gt;
&lt;br /&gt;
You can set a limit of how many iterations to process using a &amp;quot;limit&amp;quot; attribute on the epc:foreach element. For example, &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot; limit=&amp;quot;3&amp;quot;&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints_Control_Format&amp;diff=9299</id>
		<title>EPrints Control Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints_Control_Format&amp;diff=9299"/>
		<updated>2010-05-18T17:21:43Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* $index (3.2.0+) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{formats}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= EPrints Control =&lt;br /&gt;
&lt;br /&gt;
== Output Tags ==&lt;br /&gt;
&lt;br /&gt;
=== epc:print ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:print expr='expression' opt='key=value;key2=value2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;cite:citation xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;br /&gt;
           xmlns:cite=&amp;quot;http://eprints.org/ep3/citation&amp;quot;&lt;br /&gt;
           xmlns:epc=&amp;quot;http://eprints.org/ep3/control&amp;quot;&amp;amp;gt;&lt;br /&gt;
     &amp;amp;lt;epc:print expr=&amp;quot;$item.citation('default')&amp;quot; /&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/cite:citation&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
Outputs the result of the expression in the 'expr' attribute. &lt;br /&gt;
&lt;br /&gt;
Rendering options may be passed in the opt attribute using a key=value form, with semicolons separating multiple options.&lt;br /&gt;
&lt;br /&gt;
Any [[EPScript]] expression can be used. The most simple is just 'eprintid','title','creators' etc. You can also use values from the configuration files by using '$config{base_url}'.&lt;br /&gt;
&lt;br /&gt;
=== Print in attributes using {} ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you may wish to insert a value into an XML attribute. eg. the &amp;quot;href&amp;quot; part of an anchor. Rather than a complicated system, but correct XML, we decide to go for something a bit more readable. Any {} pair in an XML attribute will be treated as a epc:print.&lt;br /&gt;
&lt;br /&gt;
So you can do something like &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;a href=&amp;quot;http://eprints.badger.edu/cgi/myscript.pl?eprintid={eprintid}&amp;quot;&amp;gt;run myscript on this eprint&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epc:phrase ===&lt;br /&gt;
&lt;br /&gt;
simple:&lt;br /&gt;
 &amp;lt;epc:phrase ref='phraseid' /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with pins:&lt;br /&gt;
 &amp;lt;epc:phrase ref='phraseid'&amp;gt;&lt;br /&gt;
   &amp;lt;epc:param name='somepin'&amp;gt;Content&amp;lt;/epc:param&amp;gt;&lt;br /&gt;
 &amp;lt;/epc:phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outputs the content of the phrase refered to by 'ref'. Any necessary parameters may be set using the &amp;lt;epc:param&amp;gt; tag, with the contents inserted into the pin with the name corresponding to the name attribute.&lt;br /&gt;
&lt;br /&gt;
== Conditional Tags ==&lt;br /&gt;
&lt;br /&gt;
=== epc:if ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:if test='expr'&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outputs any XHTML content and evaluates any EPrints Control structures within the epc:if block if the expression in the test attribute is true.&lt;br /&gt;
&lt;br /&gt;
=== epc:choose, epc:when, epc:otherwise ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:choose&amp;gt;&lt;br /&gt;
   &amp;lt;epc:when test='expr'&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:when&amp;gt;&lt;br /&gt;
   &amp;lt;epc:when test='expr2'&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:when&amp;gt;&lt;br /&gt;
   &amp;lt;epc:otherwise&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:otherwise&amp;gt;&lt;br /&gt;
 &amp;lt;/epc:choose&amp;gt;&lt;br /&gt;
&lt;br /&gt;
epc:choose allows for the construction of a complex conditional. Each epc:when block's 'test' attribute is evaluated, and the content of the block is returned if the result is true. If no expressions return true, the optional epc:otherwise block is returned. Note that no subsequent epc:when blocks are evaluated once the first block to return true is reached.&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
Multiple values can be iterated over. For example.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot;&amp;gt;&lt;br /&gt;
    ( &amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt; )&lt;br /&gt;
  &amp;lt;/epc:foreach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== $index (3.2.0+) ===&lt;br /&gt;
&lt;br /&gt;
Within a foreach block you can use $index to find what iteration of the loop is on. The first value is zero.&lt;br /&gt;
&lt;br /&gt;
This can be used with the modulus &amp;quot;%&amp;quot; to add a strip effect, if wanted, eg.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;epc:if expr=&amp;quot;$index % 2&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr class='odd'&amp;gt;&amp;lt;td&amp;gt;&amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
    &amp;lt;epc:if expr=&amp;quot;!($index % 2)&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr class='even'&amp;gt;&amp;lt;td&amp;gt;&amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
  &amp;lt;/epc:foreach&amp;gt;&lt;br /&gt;
  &amp;lt;/table&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== limit ===&lt;br /&gt;
&lt;br /&gt;
You can set a limit of how many iterations to process using a &amp;quot;limit&amp;quot; attribute on the epc:foreach element. For example, &lt;br /&gt;
&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot; limit=&amp;quot;3&amp;quot;&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints_Control_Format&amp;diff=9298</id>
		<title>EPrints Control Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints_Control_Format&amp;diff=9298"/>
		<updated>2010-05-18T17:19:06Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* $index (3.2.0+) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{formats}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= EPrints Control =&lt;br /&gt;
&lt;br /&gt;
== Output Tags ==&lt;br /&gt;
&lt;br /&gt;
=== epc:print ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:print expr='expression' opt='key=value;key2=value2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;cite:citation xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;br /&gt;
           xmlns:cite=&amp;quot;http://eprints.org/ep3/citation&amp;quot;&lt;br /&gt;
           xmlns:epc=&amp;quot;http://eprints.org/ep3/control&amp;quot;&amp;amp;gt;&lt;br /&gt;
     &amp;amp;lt;epc:print expr=&amp;quot;$item.citation('default')&amp;quot; /&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/cite:citation&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
Outputs the result of the expression in the 'expr' attribute. &lt;br /&gt;
&lt;br /&gt;
Rendering options may be passed in the opt attribute using a key=value form, with semicolons separating multiple options.&lt;br /&gt;
&lt;br /&gt;
Any [[EPScript]] expression can be used. The most simple is just 'eprintid','title','creators' etc. You can also use values from the configuration files by using '$config{base_url}'.&lt;br /&gt;
&lt;br /&gt;
=== Print in attributes using {} ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you may wish to insert a value into an XML attribute. eg. the &amp;quot;href&amp;quot; part of an anchor. Rather than a complicated system, but correct XML, we decide to go for something a bit more readable. Any {} pair in an XML attribute will be treated as a epc:print.&lt;br /&gt;
&lt;br /&gt;
So you can do something like &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;a href=&amp;quot;http://eprints.badger.edu/cgi/myscript.pl?eprintid={eprintid}&amp;quot;&amp;gt;run myscript on this eprint&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epc:phrase ===&lt;br /&gt;
&lt;br /&gt;
simple:&lt;br /&gt;
 &amp;lt;epc:phrase ref='phraseid' /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with pins:&lt;br /&gt;
 &amp;lt;epc:phrase ref='phraseid'&amp;gt;&lt;br /&gt;
   &amp;lt;epc:param name='somepin'&amp;gt;Content&amp;lt;/epc:param&amp;gt;&lt;br /&gt;
 &amp;lt;/epc:phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outputs the content of the phrase refered to by 'ref'. Any necessary parameters may be set using the &amp;lt;epc:param&amp;gt; tag, with the contents inserted into the pin with the name corresponding to the name attribute.&lt;br /&gt;
&lt;br /&gt;
== Conditional Tags ==&lt;br /&gt;
&lt;br /&gt;
=== epc:if ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:if test='expr'&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outputs any XHTML content and evaluates any EPrints Control structures within the epc:if block if the expression in the test attribute is true.&lt;br /&gt;
&lt;br /&gt;
=== epc:choose, epc:when, epc:otherwise ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:choose&amp;gt;&lt;br /&gt;
   &amp;lt;epc:when test='expr'&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:when&amp;gt;&lt;br /&gt;
   &amp;lt;epc:when test='expr2'&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:when&amp;gt;&lt;br /&gt;
   &amp;lt;epc:otherwise&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:otherwise&amp;gt;&lt;br /&gt;
 &amp;lt;/epc:choose&amp;gt;&lt;br /&gt;
&lt;br /&gt;
epc:choose allows for the construction of a complex conditional. Each epc:when block's 'test' attribute is evaluated, and the content of the block is returned if the result is true. If no expressions return true, the optional epc:otherwise block is returned. Note that no subsequent epc:when blocks are evaluated once the first block to return true is reached.&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
Multiple values can be iterated over. For example.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot;&amp;gt;&lt;br /&gt;
    ( &amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt; )&lt;br /&gt;
  &amp;lt;/epc:foreach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== $index (3.2.0+) ===&lt;br /&gt;
&lt;br /&gt;
Within a foreach block you can use $index to find what iteration of the loop is on. The first value is zero.&lt;br /&gt;
&lt;br /&gt;
This can be used with the modulus &amp;quot;%&amp;quot; to add a strip effect, if wanted, eg.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;epc:if expr=&amp;quot;$index % 2&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr class='odd'&amp;gt;&amp;lt;td&amp;gt;&amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
    &amp;lt;epc:if expr=&amp;quot;!($index % 2)&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr class='even'&amp;gt;&amp;lt;td&amp;gt;&amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
  &amp;lt;/epc:foreach&amp;gt;&lt;br /&gt;
  &amp;lt;/table&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints_Control_Format&amp;diff=9297</id>
		<title>EPrints Control Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints_Control_Format&amp;diff=9297"/>
		<updated>2010-05-18T17:18:27Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* $index (3.2.0+) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{formats}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= EPrints Control =&lt;br /&gt;
&lt;br /&gt;
== Output Tags ==&lt;br /&gt;
&lt;br /&gt;
=== epc:print ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:print expr='expression' opt='key=value;key2=value2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;cite:citation xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;br /&gt;
           xmlns:cite=&amp;quot;http://eprints.org/ep3/citation&amp;quot;&lt;br /&gt;
           xmlns:epc=&amp;quot;http://eprints.org/ep3/control&amp;quot;&amp;amp;gt;&lt;br /&gt;
     &amp;amp;lt;epc:print expr=&amp;quot;$item.citation('default')&amp;quot; /&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/cite:citation&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
Outputs the result of the expression in the 'expr' attribute. &lt;br /&gt;
&lt;br /&gt;
Rendering options may be passed in the opt attribute using a key=value form, with semicolons separating multiple options.&lt;br /&gt;
&lt;br /&gt;
Any [[EPScript]] expression can be used. The most simple is just 'eprintid','title','creators' etc. You can also use values from the configuration files by using '$config{base_url}'.&lt;br /&gt;
&lt;br /&gt;
=== Print in attributes using {} ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you may wish to insert a value into an XML attribute. eg. the &amp;quot;href&amp;quot; part of an anchor. Rather than a complicated system, but correct XML, we decide to go for something a bit more readable. Any {} pair in an XML attribute will be treated as a epc:print.&lt;br /&gt;
&lt;br /&gt;
So you can do something like &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;a href=&amp;quot;http://eprints.badger.edu/cgi/myscript.pl?eprintid={eprintid}&amp;quot;&amp;gt;run myscript on this eprint&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epc:phrase ===&lt;br /&gt;
&lt;br /&gt;
simple:&lt;br /&gt;
 &amp;lt;epc:phrase ref='phraseid' /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with pins:&lt;br /&gt;
 &amp;lt;epc:phrase ref='phraseid'&amp;gt;&lt;br /&gt;
   &amp;lt;epc:param name='somepin'&amp;gt;Content&amp;lt;/epc:param&amp;gt;&lt;br /&gt;
 &amp;lt;/epc:phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outputs the content of the phrase refered to by 'ref'. Any necessary parameters may be set using the &amp;lt;epc:param&amp;gt; tag, with the contents inserted into the pin with the name corresponding to the name attribute.&lt;br /&gt;
&lt;br /&gt;
== Conditional Tags ==&lt;br /&gt;
&lt;br /&gt;
=== epc:if ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:if test='expr'&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outputs any XHTML content and evaluates any EPrints Control structures within the epc:if block if the expression in the test attribute is true.&lt;br /&gt;
&lt;br /&gt;
=== epc:choose, epc:when, epc:otherwise ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:choose&amp;gt;&lt;br /&gt;
   &amp;lt;epc:when test='expr'&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:when&amp;gt;&lt;br /&gt;
   &amp;lt;epc:when test='expr2'&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:when&amp;gt;&lt;br /&gt;
   &amp;lt;epc:otherwise&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:otherwise&amp;gt;&lt;br /&gt;
 &amp;lt;/epc:choose&amp;gt;&lt;br /&gt;
&lt;br /&gt;
epc:choose allows for the construction of a complex conditional. Each epc:when block's 'test' attribute is evaluated, and the content of the block is returned if the result is true. If no expressions return true, the optional epc:otherwise block is returned. Note that no subsequent epc:when blocks are evaluated once the first block to return true is reached.&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
Multiple values can be iterated over. For example.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot;&amp;gt;&lt;br /&gt;
    ( &amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt; )&lt;br /&gt;
  &amp;lt;/epc:foreach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== $index (3.2.0+) ===&lt;br /&gt;
&lt;br /&gt;
Within a foreach block you can use $index to find what iteration of the loop is on. The first value is zero.&lt;br /&gt;
&lt;br /&gt;
This can be used with the &amp;quot;%&amp;quot; to add a strip effect, if wanted, eg.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;epc:if expr=&amp;quot;$index % 2&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr class='odd'&amp;gt;&amp;lt;td&amp;gt;&amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
    &amp;lt;epc:if expr=&amp;quot;!($index % 2)&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr class='even'&amp;gt;&amp;lt;td&amp;gt;&amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
  &amp;lt;/epc:foreach&amp;gt;&lt;br /&gt;
  &amp;lt;/table&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints_Control_Format&amp;diff=9296</id>
		<title>EPrints Control Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints_Control_Format&amp;diff=9296"/>
		<updated>2010-05-18T17:18:18Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* $index (3.2.0+) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{formats}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= EPrints Control =&lt;br /&gt;
&lt;br /&gt;
== Output Tags ==&lt;br /&gt;
&lt;br /&gt;
=== epc:print ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:print expr='expression' opt='key=value;key2=value2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;cite:citation xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;br /&gt;
           xmlns:cite=&amp;quot;http://eprints.org/ep3/citation&amp;quot;&lt;br /&gt;
           xmlns:epc=&amp;quot;http://eprints.org/ep3/control&amp;quot;&amp;amp;gt;&lt;br /&gt;
     &amp;amp;lt;epc:print expr=&amp;quot;$item.citation('default')&amp;quot; /&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/cite:citation&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
Outputs the result of the expression in the 'expr' attribute. &lt;br /&gt;
&lt;br /&gt;
Rendering options may be passed in the opt attribute using a key=value form, with semicolons separating multiple options.&lt;br /&gt;
&lt;br /&gt;
Any [[EPScript]] expression can be used. The most simple is just 'eprintid','title','creators' etc. You can also use values from the configuration files by using '$config{base_url}'.&lt;br /&gt;
&lt;br /&gt;
=== Print in attributes using {} ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you may wish to insert a value into an XML attribute. eg. the &amp;quot;href&amp;quot; part of an anchor. Rather than a complicated system, but correct XML, we decide to go for something a bit more readable. Any {} pair in an XML attribute will be treated as a epc:print.&lt;br /&gt;
&lt;br /&gt;
So you can do something like &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;a href=&amp;quot;http://eprints.badger.edu/cgi/myscript.pl?eprintid={eprintid}&amp;quot;&amp;gt;run myscript on this eprint&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epc:phrase ===&lt;br /&gt;
&lt;br /&gt;
simple:&lt;br /&gt;
 &amp;lt;epc:phrase ref='phraseid' /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with pins:&lt;br /&gt;
 &amp;lt;epc:phrase ref='phraseid'&amp;gt;&lt;br /&gt;
   &amp;lt;epc:param name='somepin'&amp;gt;Content&amp;lt;/epc:param&amp;gt;&lt;br /&gt;
 &amp;lt;/epc:phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outputs the content of the phrase refered to by 'ref'. Any necessary parameters may be set using the &amp;lt;epc:param&amp;gt; tag, with the contents inserted into the pin with the name corresponding to the name attribute.&lt;br /&gt;
&lt;br /&gt;
== Conditional Tags ==&lt;br /&gt;
&lt;br /&gt;
=== epc:if ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:if test='expr'&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outputs any XHTML content and evaluates any EPrints Control structures within the epc:if block if the expression in the test attribute is true.&lt;br /&gt;
&lt;br /&gt;
=== epc:choose, epc:when, epc:otherwise ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:choose&amp;gt;&lt;br /&gt;
   &amp;lt;epc:when test='expr'&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:when&amp;gt;&lt;br /&gt;
   &amp;lt;epc:when test='expr2'&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:when&amp;gt;&lt;br /&gt;
   &amp;lt;epc:otherwise&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:otherwise&amp;gt;&lt;br /&gt;
 &amp;lt;/epc:choose&amp;gt;&lt;br /&gt;
&lt;br /&gt;
epc:choose allows for the construction of a complex conditional. Each epc:when block's 'test' attribute is evaluated, and the content of the block is returned if the result is true. If no expressions return true, the optional epc:otherwise block is returned. Note that no subsequent epc:when blocks are evaluated once the first block to return true is reached.&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
Multiple values can be iterated over. For example.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot;&amp;gt;&lt;br /&gt;
    ( &amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt; )&lt;br /&gt;
  &amp;lt;/epc:foreach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== $index (3.2.0+) ===&lt;br /&gt;
&lt;br /&gt;
Within a foreach block you can use $index to find what iteration of the loop is on. The first value is zero.&lt;br /&gt;
&lt;br /&gt;
This can be used with the &amp;quot;%&amp;quot; to add a strip effect, if wanted, eg.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;  &amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;epc:if expr=&amp;quot;$index % 2&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr class='odd'&amp;gt;&amp;lt;td&amp;gt;&amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
    &amp;lt;epc:if expr=&amp;quot;!($index % 2)&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr class='even'&amp;gt;&amp;lt;td&amp;gt;&amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
  &amp;lt;/epc:foreach&amp;gt;&lt;br /&gt;
  &amp;lt;/table&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints_Control_Format&amp;diff=9295</id>
		<title>EPrints Control Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints_Control_Format&amp;diff=9295"/>
		<updated>2010-05-18T17:18:02Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* Loops */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{formats}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= EPrints Control =&lt;br /&gt;
&lt;br /&gt;
== Output Tags ==&lt;br /&gt;
&lt;br /&gt;
=== epc:print ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:print expr='expression' opt='key=value;key2=value2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;cite:citation xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;br /&gt;
           xmlns:cite=&amp;quot;http://eprints.org/ep3/citation&amp;quot;&lt;br /&gt;
           xmlns:epc=&amp;quot;http://eprints.org/ep3/control&amp;quot;&amp;amp;gt;&lt;br /&gt;
     &amp;amp;lt;epc:print expr=&amp;quot;$item.citation('default')&amp;quot; /&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/cite:citation&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
Outputs the result of the expression in the 'expr' attribute. &lt;br /&gt;
&lt;br /&gt;
Rendering options may be passed in the opt attribute using a key=value form, with semicolons separating multiple options.&lt;br /&gt;
&lt;br /&gt;
Any [[EPScript]] expression can be used. The most simple is just 'eprintid','title','creators' etc. You can also use values from the configuration files by using '$config{base_url}'.&lt;br /&gt;
&lt;br /&gt;
=== Print in attributes using {} ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you may wish to insert a value into an XML attribute. eg. the &amp;quot;href&amp;quot; part of an anchor. Rather than a complicated system, but correct XML, we decide to go for something a bit more readable. Any {} pair in an XML attribute will be treated as a epc:print.&lt;br /&gt;
&lt;br /&gt;
So you can do something like &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;a href=&amp;quot;http://eprints.badger.edu/cgi/myscript.pl?eprintid={eprintid}&amp;quot;&amp;gt;run myscript on this eprint&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epc:phrase ===&lt;br /&gt;
&lt;br /&gt;
simple:&lt;br /&gt;
 &amp;lt;epc:phrase ref='phraseid' /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with pins:&lt;br /&gt;
 &amp;lt;epc:phrase ref='phraseid'&amp;gt;&lt;br /&gt;
   &amp;lt;epc:param name='somepin'&amp;gt;Content&amp;lt;/epc:param&amp;gt;&lt;br /&gt;
 &amp;lt;/epc:phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outputs the content of the phrase refered to by 'ref'. Any necessary parameters may be set using the &amp;lt;epc:param&amp;gt; tag, with the contents inserted into the pin with the name corresponding to the name attribute.&lt;br /&gt;
&lt;br /&gt;
== Conditional Tags ==&lt;br /&gt;
&lt;br /&gt;
=== epc:if ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:if test='expr'&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outputs any XHTML content and evaluates any EPrints Control structures within the epc:if block if the expression in the test attribute is true.&lt;br /&gt;
&lt;br /&gt;
=== epc:choose, epc:when, epc:otherwise ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:choose&amp;gt;&lt;br /&gt;
   &amp;lt;epc:when test='expr'&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:when&amp;gt;&lt;br /&gt;
   &amp;lt;epc:when test='expr2'&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:when&amp;gt;&lt;br /&gt;
   &amp;lt;epc:otherwise&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:otherwise&amp;gt;&lt;br /&gt;
 &amp;lt;/epc:choose&amp;gt;&lt;br /&gt;
&lt;br /&gt;
epc:choose allows for the construction of a complex conditional. Each epc:when block's 'test' attribute is evaluated, and the content of the block is returned if the result is true. If no expressions return true, the optional epc:otherwise block is returned. Note that no subsequent epc:when blocks are evaluated once the first block to return true is reached.&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
Multiple values can be iterated over. For example.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot;&amp;gt;&lt;br /&gt;
    ( &amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt; )&lt;br /&gt;
  &amp;lt;/epc:foreach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== $index (3.2.0+) ===&lt;br /&gt;
&lt;br /&gt;
Within a foreach block you can use $index to find what iteration of the loop is on. The first value is zero.&lt;br /&gt;
&lt;br /&gt;
This can be used with the &amp;quot;%&amp;quot; to add a strip effect, if wanted, eg.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  &amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;epc:if expr=&amp;quot;$index % 2&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr class='odd'&amp;gt;&amp;lt;td&amp;gt;&amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
    &amp;lt;epc:if expr=&amp;quot;!($index % 2)&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr class='even'&amp;gt;&amp;lt;td&amp;gt;&amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
  &amp;lt;/epc:foreach&amp;gt;&lt;br /&gt;
  &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints_Control_Format&amp;diff=9294</id>
		<title>EPrints Control Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints_Control_Format&amp;diff=9294"/>
		<updated>2010-05-18T17:17:53Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* $index (3.2.0+) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{formats}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= EPrints Control =&lt;br /&gt;
&lt;br /&gt;
== Output Tags ==&lt;br /&gt;
&lt;br /&gt;
=== epc:print ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:print expr='expression' opt='key=value;key2=value2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;cite:citation xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;br /&gt;
           xmlns:cite=&amp;quot;http://eprints.org/ep3/citation&amp;quot;&lt;br /&gt;
           xmlns:epc=&amp;quot;http://eprints.org/ep3/control&amp;quot;&amp;amp;gt;&lt;br /&gt;
     &amp;amp;lt;epc:print expr=&amp;quot;$item.citation('default')&amp;quot; /&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/cite:citation&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
Outputs the result of the expression in the 'expr' attribute. &lt;br /&gt;
&lt;br /&gt;
Rendering options may be passed in the opt attribute using a key=value form, with semicolons separating multiple options.&lt;br /&gt;
&lt;br /&gt;
Any [[EPScript]] expression can be used. The most simple is just 'eprintid','title','creators' etc. You can also use values from the configuration files by using '$config{base_url}'.&lt;br /&gt;
&lt;br /&gt;
=== Print in attributes using {} ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you may wish to insert a value into an XML attribute. eg. the &amp;quot;href&amp;quot; part of an anchor. Rather than a complicated system, but correct XML, we decide to go for something a bit more readable. Any {} pair in an XML attribute will be treated as a epc:print.&lt;br /&gt;
&lt;br /&gt;
So you can do something like &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;a href=&amp;quot;http://eprints.badger.edu/cgi/myscript.pl?eprintid={eprintid}&amp;quot;&amp;gt;run myscript on this eprint&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epc:phrase ===&lt;br /&gt;
&lt;br /&gt;
simple:&lt;br /&gt;
 &amp;lt;epc:phrase ref='phraseid' /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with pins:&lt;br /&gt;
 &amp;lt;epc:phrase ref='phraseid'&amp;gt;&lt;br /&gt;
   &amp;lt;epc:param name='somepin'&amp;gt;Content&amp;lt;/epc:param&amp;gt;&lt;br /&gt;
 &amp;lt;/epc:phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outputs the content of the phrase refered to by 'ref'. Any necessary parameters may be set using the &amp;lt;epc:param&amp;gt; tag, with the contents inserted into the pin with the name corresponding to the name attribute.&lt;br /&gt;
&lt;br /&gt;
== Conditional Tags ==&lt;br /&gt;
&lt;br /&gt;
=== epc:if ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:if test='expr'&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outputs any XHTML content and evaluates any EPrints Control structures within the epc:if block if the expression in the test attribute is true.&lt;br /&gt;
&lt;br /&gt;
=== epc:choose, epc:when, epc:otherwise ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:choose&amp;gt;&lt;br /&gt;
   &amp;lt;epc:when test='expr'&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:when&amp;gt;&lt;br /&gt;
   &amp;lt;epc:when test='expr2'&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:when&amp;gt;&lt;br /&gt;
   &amp;lt;epc:otherwise&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:otherwise&amp;gt;&lt;br /&gt;
 &amp;lt;/epc:choose&amp;gt;&lt;br /&gt;
&lt;br /&gt;
epc:choose allows for the construction of a complex conditional. Each epc:when block's 'test' attribute is evaluated, and the content of the block is returned if the result is true. If no expressions return true, the optional epc:otherwise block is returned. Note that no subsequent epc:when blocks are evaluated once the first block to return true is reached.&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
Multiple values can be iterated over. For example.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot;&amp;gt;&lt;br /&gt;
    ( &amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt; )&lt;br /&gt;
  &amp;lt;/epc:foreach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== $index (3.2.0+) ===&lt;br /&gt;
&lt;br /&gt;
Within a foreach block you can use $index to find what iteration of the loop is on. The first value is zero.&lt;br /&gt;
&lt;br /&gt;
This can be used with the &amp;quot;%&amp;quot; to add a strip effect, if wanted, eg.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
  &amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;epc:if expr=&amp;quot;$index % 2&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr class='odd'&amp;gt;&amp;lt;td&amp;gt;&amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
    &amp;lt;epc:if expr=&amp;quot;!($index % 2)&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr class='even'&amp;gt;&amp;lt;td&amp;gt;&amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
  &amp;lt;/epc:foreach&amp;gt;&lt;br /&gt;
  &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints_Control_Format&amp;diff=9293</id>
		<title>EPrints Control Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints_Control_Format&amp;diff=9293"/>
		<updated>2010-05-18T17:15:20Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* Loops */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{formats}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= EPrints Control =&lt;br /&gt;
&lt;br /&gt;
== Output Tags ==&lt;br /&gt;
&lt;br /&gt;
=== epc:print ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:print expr='expression' opt='key=value;key2=value2'/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;cite:citation xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;br /&gt;
           xmlns:cite=&amp;quot;http://eprints.org/ep3/citation&amp;quot;&lt;br /&gt;
           xmlns:epc=&amp;quot;http://eprints.org/ep3/control&amp;quot;&amp;amp;gt;&lt;br /&gt;
     &amp;amp;lt;epc:print expr=&amp;quot;$item.citation('default')&amp;quot; /&amp;amp;gt;&lt;br /&gt;
 &amp;amp;lt;/cite:citation&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
Outputs the result of the expression in the 'expr' attribute. &lt;br /&gt;
&lt;br /&gt;
Rendering options may be passed in the opt attribute using a key=value form, with semicolons separating multiple options.&lt;br /&gt;
&lt;br /&gt;
Any [[EPScript]] expression can be used. The most simple is just 'eprintid','title','creators' etc. You can also use values from the configuration files by using '$config{base_url}'.&lt;br /&gt;
&lt;br /&gt;
=== Print in attributes using {} ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you may wish to insert a value into an XML attribute. eg. the &amp;quot;href&amp;quot; part of an anchor. Rather than a complicated system, but correct XML, we decide to go for something a bit more readable. Any {} pair in an XML attribute will be treated as a epc:print.&lt;br /&gt;
&lt;br /&gt;
So you can do something like &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;a href=&amp;quot;http://eprints.badger.edu/cgi/myscript.pl?eprintid={eprintid}&amp;quot;&amp;gt;run myscript on this eprint&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== epc:phrase ===&lt;br /&gt;
&lt;br /&gt;
simple:&lt;br /&gt;
 &amp;lt;epc:phrase ref='phraseid' /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
with pins:&lt;br /&gt;
 &amp;lt;epc:phrase ref='phraseid'&amp;gt;&lt;br /&gt;
   &amp;lt;epc:param name='somepin'&amp;gt;Content&amp;lt;/epc:param&amp;gt;&lt;br /&gt;
 &amp;lt;/epc:phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outputs the content of the phrase refered to by 'ref'. Any necessary parameters may be set using the &amp;lt;epc:param&amp;gt; tag, with the contents inserted into the pin with the name corresponding to the name attribute.&lt;br /&gt;
&lt;br /&gt;
== Conditional Tags ==&lt;br /&gt;
&lt;br /&gt;
=== epc:if ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:if test='expr'&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Outputs any XHTML content and evaluates any EPrints Control structures within the epc:if block if the expression in the test attribute is true.&lt;br /&gt;
&lt;br /&gt;
=== epc:choose, epc:when, epc:otherwise ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;epc:choose&amp;gt;&lt;br /&gt;
   &amp;lt;epc:when test='expr'&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:when&amp;gt;&lt;br /&gt;
   &amp;lt;epc:when test='expr2'&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:when&amp;gt;&lt;br /&gt;
   &amp;lt;epc:otherwise&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;/epc:otherwise&amp;gt;&lt;br /&gt;
 &amp;lt;/epc:choose&amp;gt;&lt;br /&gt;
&lt;br /&gt;
epc:choose allows for the construction of a complex conditional. Each epc:when block's 'test' attribute is evaluated, and the content of the block is returned if the result is true. If no expressions return true, the optional epc:otherwise block is returned. Note that no subsequent epc:when blocks are evaluated once the first block to return true is reached.&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
Multiple values can be iterated over. For example.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot;&amp;gt;&lt;br /&gt;
    ( &amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt; )&lt;br /&gt;
  &amp;lt;/epc:foreach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== $index (3.2.0+) ===&lt;br /&gt;
&lt;br /&gt;
Within a foreach block you can use $index to find what iteration of the loop is on. The first value is zero.&lt;br /&gt;
&lt;br /&gt;
This can be used with the &amp;quot;%&amp;quot; to add a strip effect, if wanted, eg.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;epc:foreach expr=&amp;quot;creators_name&amp;quot; iterator=&amp;quot;name&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;epc:if expr=&amp;quot;$index % 2&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr class='odd'&amp;gt;&amp;lt;td&amp;gt;&amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
    &amp;lt;epc:if expr=&amp;quot;!($index % 2)&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;tr class='even'&amp;gt;&amp;lt;td&amp;gt;&amp;lt;epc:print expr=&amp;quot;$name&amp;quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/epc:if&amp;gt;&lt;br /&gt;
  &amp;lt;/epc:foreach&amp;gt;&lt;br /&gt;
  &amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=9292</id>
		<title>New Features in EPrints 3.2.1</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=9292"/>
		<updated>2010-05-18T17:08:08Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{releasenotes}}&lt;br /&gt;
== Upgrade Notes ==&lt;br /&gt;
* &amp;lt;b&amp;gt;Please read [[Upgrading 3.1 to 3.2]] before attempting to upgrade your repository from 3.1 to 3.2.&amp;lt;/b&amp;gt;&lt;br /&gt;
* You will need to run epadmin upgrade to update your database structure. '''''Warning''''': This upgrade will add any missing SQL indexes to the database, this took around an hour on a large established repository.&lt;br /&gt;
* Some documents may have been missed in the 3.1.3-3.2.0 upgrade, therefore 3.2.0-3.2.1 will re-scan all files for any missing documents&lt;br /&gt;
&lt;br /&gt;
== Interface ==&lt;br /&gt;
* Admin:Config:Edit screen now does syntax highlighting&lt;br /&gt;
* Reworked eprint item control page UI&lt;br /&gt;
* Improved login -- now detects and warns if cookies are not enabled.&lt;br /&gt;
* Made the eprint_status filters a user preference on the Items screen&lt;br /&gt;
* /cgi/counters now shows the indexer status (allowing nagios to monitor it)&lt;br /&gt;
* /cgi/export can now export any dataset with the correct privilege set.&lt;br /&gt;
* Summary tab has been renamed Preview and is hidden on live items, controlled by +eprint/archive/summary privilege&lt;br /&gt;
&lt;br /&gt;
== Command Line Tools ==&lt;br /&gt;
* epadmin: now accepts a list of eprintids for recommit, reindex &amp;amp; reorder&lt;br /&gt;
* indexer: Remove failed as well as inprogress tasks using --clear&lt;br /&gt;
* indexer: Added --respawn option to indexer to control respawn timeout&lt;br /&gt;
&lt;br /&gt;
==Semantic Web Support==&lt;br /&gt;
* New Export formats: RDF+XML, N3, N-Triples&lt;br /&gt;
* URIs for derived entities. eg. Authors, Events, Locations.&lt;br /&gt;
* Extendable RDF system, by default uses BIBO Ontology&lt;br /&gt;
* voID Ontology describes the repository via /id/repository&lt;br /&gt;
* URIs now use content negotiation to decide which export plugin to redirect to, based on mime-types supplied by plugins and the &amp;quot;accept&amp;quot; header.&lt;br /&gt;
* Semantic relations between eprints and documents&lt;br /&gt;
* URI for subject trees links to RDF in SKOS for each tree&lt;br /&gt;
&lt;br /&gt;
==Misc.==&lt;br /&gt;
* Unary-minus for EPScript :: -(2+4) = -6&lt;br /&gt;
* join() function for EPScript&lt;br /&gt;
* Added EPrints::Const module for eprints constants&lt;br /&gt;
* Triggers refined to use EPrints::Const for the trigger type ($c-&amp;gt;add_trigger and $c-&amp;gt;add_dataset_trigger)&lt;br /&gt;
* New way of configuring apache&lt;br /&gt;
* Change to using repository in function calls etc.&lt;br /&gt;
* Bugfixes&lt;br /&gt;
* Added export priv.&lt;br /&gt;
* lib/cfg.d now contains 'default' configuration files which may be overridden in the archive cfg.d if needed.&lt;br /&gt;
* Added 'codeview' javascript widget to admin config file editing&lt;br /&gt;
* Experimental MSI for Win32/Win64 (i.e. Microsoft Windows)&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Template:Releasenotes&amp;diff=9291</id>
		<title>Template:Releasenotes</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Template:Releasenotes&amp;diff=9291"/>
		<updated>2010-05-18T17:07:30Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border: solid black 1px; text-align: left; background-color: #eee; padding-left: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Release Notes: [[New_Features_in_EPrints_3.1|3.1.0]] | [[New_Features_in_EPrints_3.2|3.2.0]] |&lt;br /&gt;
[[New_Features_in_EPrints_3.2.1|3.2.1]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Category:Releases]]&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Template:Releasenotes&amp;diff=9290</id>
		<title>Template:Releasenotes</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Template:Releasenotes&amp;diff=9290"/>
		<updated>2010-05-18T17:07:15Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border: solid black 1px; text-align: left; background-color: #eee; padding-left: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Release Notes: [[New_Features_in_EPrints_3.1|3.1.0]] | [[New_Features_in_EPrints_3.2.0|3.2.0]] |&lt;br /&gt;
[[New_Features_in_EPrints_3.2.1|3.2.1]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Category:Releases]]&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Installing_EPrints_on_RHEL/Fedora/CentOS&amp;diff=9289</id>
		<title>Installing EPrints on RHEL/Fedora/CentOS</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Installing_EPrints_on_RHEL/Fedora/CentOS&amp;diff=9289"/>
		<updated>2010-05-18T12:18:49Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* Installing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Installation]]&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
&lt;br /&gt;
* RedHat Enterprise 5.5 (earlier versions may work)&lt;br /&gt;
&lt;br /&gt;
==Installing==&lt;br /&gt;
&lt;br /&gt;
Add the rpm.eprints.org repository key:&lt;br /&gt;
&lt;br /&gt;
 rpm -ivh http://rpm.eprints.org/rpm-eprints-org-key-1-1.noarch.rpm&lt;br /&gt;
&lt;br /&gt;
... the rpm.eprints.org RHEL updates repository:&lt;br /&gt;
&lt;br /&gt;
 rpm -ivh http://rpm.eprints.org/RHEL/5Server/noarch/rpm-eprints-org-RHEL-5-1.noarch.rpm&lt;br /&gt;
&lt;br /&gt;
... the rpm.eprints.org EPrints repository:&lt;br /&gt;
&lt;br /&gt;
 rpm -ivh http://rpm.eprints.org/eprints/noarch/rpm-eprints-org-1-1.noarch.rpm&lt;br /&gt;
&lt;br /&gt;
Upgrade your XML libraries:&lt;br /&gt;
&lt;br /&gt;
 yum upgrade libxml2 libxslt perl-XML-LibXML perl-XML-LibXSLT&lt;br /&gt;
&lt;br /&gt;
Install EPrints 3:&lt;br /&gt;
&lt;br /&gt;
 yum install eprints3&lt;br /&gt;
&lt;br /&gt;
==SELinux==&lt;br /&gt;
&lt;br /&gt;
If you're using SELinux on your server you will need to give Apache read/write access to the documents directory for all repositories you create:&lt;br /&gt;
&lt;br /&gt;
 chcon -R -h -t httpd_sys_script_rw_t /opt/eprints3/archives/[repoid]/documents/&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=9288</id>
		<title>New Features in EPrints 3.2.1</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=9288"/>
		<updated>2010-05-17T17:42:56Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Upgrade Notes ==&lt;br /&gt;
* &amp;lt;b&amp;gt;Please read [[Upgrading 3.1 to 3.2]] before attempting to upgrade your repository from 3.1 to 3.2.&amp;lt;/b&amp;gt;&lt;br /&gt;
* You will need to run epadmin upgrade to update your database structure. '''''Warning''''': This upgrade will add any missing SQL indexes to the database, this took around an hour on a large established repository.&lt;br /&gt;
* Some documents may have been missed in the 3.1.3-3.2.0 upgrade, therefore 3.2.0-3.2.1 will re-scan all files for any missing documents&lt;br /&gt;
&lt;br /&gt;
== Interface ==&lt;br /&gt;
* Admin:Config:Edit screen now does syntax highlighting&lt;br /&gt;
* Reworked eprint item control page UI&lt;br /&gt;
* Improved login -- now detects and warns if cookies are not enabled.&lt;br /&gt;
* Made the eprint_status filters a user preference on the Items screen&lt;br /&gt;
* /cgi/counters now shows the indexer status (allowing nagios to monitor it)&lt;br /&gt;
* /cgi/export can now export any dataset with the correct privilege set.&lt;br /&gt;
* Summary tab has been renamed Preview and is hidden on live items, controlled by +eprint/archive/summary privilege&lt;br /&gt;
&lt;br /&gt;
== Command Line Tools ==&lt;br /&gt;
* epadmin: now accepts a list of eprintids for recommit, reindex &amp;amp; reorder&lt;br /&gt;
* indexer: Remove failed as well as inprogress tasks using --clear&lt;br /&gt;
* indexer: Added --respawn option to indexer to control respawn timeout&lt;br /&gt;
&lt;br /&gt;
==Semantic Web Support==&lt;br /&gt;
* New Export formats: RDF+XML, N3, N-Triples&lt;br /&gt;
* URIs for derived entities. eg. Authors, Events, Locations.&lt;br /&gt;
* Extendable RDF system, by default uses BIBO Ontology&lt;br /&gt;
* voID Ontology describes the repository via /id/repository&lt;br /&gt;
* URIs now use content negotiation to decide which export plugin to redirect to, based on mime-types supplied by plugins and the &amp;quot;accept&amp;quot; header.&lt;br /&gt;
* Semantic relations between eprints and documents&lt;br /&gt;
* URI for subject trees links to RDF in SKOS for each tree&lt;br /&gt;
&lt;br /&gt;
==Misc.==&lt;br /&gt;
* Unary-minus for EPScript :: -(2+4) = -6&lt;br /&gt;
* join() function for EPScript&lt;br /&gt;
* Added EPrints::Const module for eprints constants&lt;br /&gt;
* Triggers refined to use EPrints::Const for the trigger type ($c-&amp;gt;add_trigger and $c-&amp;gt;add_dataset_trigger)&lt;br /&gt;
* New way of configuring apache&lt;br /&gt;
* Change to using repository in function calls etc.&lt;br /&gt;
* Bugfixes&lt;br /&gt;
* Added export priv.&lt;br /&gt;
* lib/cfg.d now contains 'default' configuration files which may be overridden in the archive cfg.d if needed.&lt;br /&gt;
* Added 'codeview' javascript widget to admin config file editing&lt;br /&gt;
* Experimental MSI for Win32/Win64 (i.e. Microsoft Windows)&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=9163</id>
		<title>New Features in EPrints 3.2.1</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=9163"/>
		<updated>2010-04-21T19:23:56Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Upgrade Notes ==&lt;br /&gt;
* &amp;lt;b&amp;gt;Please read [[Upgrading 3.1 to 3.2]] before attempting to upgrade your repository from 3.1 to 3.2.&amp;lt;/b&amp;gt;&lt;br /&gt;
* You will need to run epadmin upgrade to update your database structure. '''''Warning''''': This upgrade will add any missing SQL indexes to the database, this took around an hour on a large established repository. &lt;br /&gt;
&lt;br /&gt;
(This page is currently an unofficial, we're using it to keep track of what needs documenting etc.)&lt;br /&gt;
== Interface ==&lt;br /&gt;
* Admin:Config:Edit screen now does syntax highlighting&lt;br /&gt;
* Reworked eprint item control page UI&lt;br /&gt;
* Improved login -- now detects and warns if cookies are not enabled.&lt;br /&gt;
* Made the eprint_status filters a user preference on the Items screen&lt;br /&gt;
* /cgi/counters now shows the indexer status (allowing nagios to monitor it)&lt;br /&gt;
* /cgi/export can now export any dataset with the correct privilege set.&lt;br /&gt;
&lt;br /&gt;
== Command Line Tools ==&lt;br /&gt;
* epadmin: now accepts a list of eprintids for recommit, reindex &amp;amp; reorder&lt;br /&gt;
* indexer: Remove failed as well as inprogress tasks using --clear&lt;br /&gt;
* indexer: Added --respawn option to indexer to control respawn timeout&lt;br /&gt;
&lt;br /&gt;
==Semantic Web Support==&lt;br /&gt;
* New Export formats: RDF+XML, N3, N-Triples&lt;br /&gt;
* URIs for derived entities. eg. Authors, Events, Locations.&lt;br /&gt;
* Extendable RDF system, by default uses BIBO Ontology&lt;br /&gt;
* voID Ontology describes the repository via /id/repository&lt;br /&gt;
* URIs now use content negotiation to decide which export plugin to redirect to, based on mime-types supplied by plugins and the &amp;quot;accept&amp;quot; header.&lt;br /&gt;
* Semantic relations between eprints and documents&lt;br /&gt;
* URI for subject trees links to RDF in SKOS for each tree&lt;br /&gt;
&lt;br /&gt;
==Misc.==&lt;br /&gt;
* Unary-minus for EPScript&lt;br /&gt;
* join() function for EPScript&lt;br /&gt;
* Added EPrints::Const module for eprints constants&lt;br /&gt;
* Triggers refined to use EPrints::Const for the trigger type ($c-&amp;gt;add_trigger and $c-&amp;gt;add_dataset_trigger)&lt;br /&gt;
* New way of configuring apache&lt;br /&gt;
* Change to using repository in function calls etc.&lt;br /&gt;
* Bugfixes&lt;br /&gt;
* Added export priv.&lt;br /&gt;
* lib/cfg.d now contains 'default' configuration files which may be overridden in the archive cfg.d if needed.&lt;br /&gt;
* Added 'codeview' javascript widget to admin config file editing&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=9162</id>
		<title>New Features in EPrints 3.2.1</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=9162"/>
		<updated>2010-04-21T08:34:01Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* Interface */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Upgrade Notes ==&lt;br /&gt;
* &amp;lt;b&amp;gt;Please read [[Upgrading 3.1 to 3.2]] before attempting to upgrade your repository from 3.1 to 3.2.&amp;lt;/b&amp;gt;&lt;br /&gt;
* You will need to run epadmin upgrade to update your database structure. '''''Warning''''': This upgrade will add any missing SQL indexes to the database, this took around an hour on a large established repository. &lt;br /&gt;
&lt;br /&gt;
(This page is currently an unofficial, we're using it to keep track of what needs documenting etc.)&lt;br /&gt;
== Interface ==&lt;br /&gt;
* Admin:Config:Edit screen now does syntax highlighting&lt;br /&gt;
* Reworked eprint item control page UI&lt;br /&gt;
* Improved login -- now detects and warns if cookies are not enabled.&lt;br /&gt;
* Made the eprint_status filters a user preference on the Items screen&lt;br /&gt;
* /cgi/counters now shows the indexer status (allowing nagios to monitor it)&lt;br /&gt;
* /cgi/export can now export any dataset with the correct privilege set.&lt;br /&gt;
&lt;br /&gt;
== Command Line Tools ==&lt;br /&gt;
* epadmin: now accepts a list of eprintids for recommit, reindex &amp;amp; reorder&lt;br /&gt;
* indexer: Remove failed as well as inprogress tasks using --clear&lt;br /&gt;
* indexer: Added --respawn option to indexer to control respawn timeout&lt;br /&gt;
&lt;br /&gt;
==Semantic Web Support==&lt;br /&gt;
* New Export formats: RDF+XML, N3, N-Triples&lt;br /&gt;
* URIs for derived entities. eg. Authors, Events, Locations.&lt;br /&gt;
* Extendable RDF system, by default uses BIBO Ontology&lt;br /&gt;
* voID Ontology describes the repository via /id/repository&lt;br /&gt;
* URIs now use content negotiation to decide which export plugin to redirect to, based on mime-types supplied by plugins and the &amp;quot;accept&amp;quot; header.&lt;br /&gt;
* Semantic relations between eprints and documents&lt;br /&gt;
* URI for subject trees links to RDF in SKOS for each tree&lt;br /&gt;
&lt;br /&gt;
==Misc.==&lt;br /&gt;
* Added EPrints::Const module for eprints constants&lt;br /&gt;
* Triggers refined to use EPrints::Const for the trigger type ($c-&amp;gt;add_trigger and $c-&amp;gt;add_dataset_trigger)&lt;br /&gt;
* New way of configuring apache&lt;br /&gt;
* Change to using repository in function calls etc.&lt;br /&gt;
* Bugfixes&lt;br /&gt;
* Added export priv.&lt;br /&gt;
* lib/cfg.d now contains 'default' configuration files which may be overridden in the archive cfg.d if needed.&lt;br /&gt;
* Added 'codeview' javascript widget to admin config file editing&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=9161</id>
		<title>New Features in EPrints 3.2.1</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=9161"/>
		<updated>2010-04-21T08:19:40Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Upgrade Notes ==&lt;br /&gt;
* &amp;lt;b&amp;gt;Please read [[Upgrading 3.1 to 3.2]] before attempting to upgrade your repository from 3.1 to 3.2.&amp;lt;/b&amp;gt;&lt;br /&gt;
* You will need to run epadmin upgrade to update your database structure. '''''Warning''''': This upgrade will add any missing SQL indexes to the database, this took around an hour on a large established repository. &lt;br /&gt;
&lt;br /&gt;
(This page is currently an unofficial, we're using it to keep track of what needs documenting etc.)&lt;br /&gt;
== Interface ==&lt;br /&gt;
* Admin:Config:Edit screen now does syntax highlighting&lt;br /&gt;
* Reworked eprint item control page UI&lt;br /&gt;
* Improved login -- now detects and warns if cookies are not enabled.&lt;br /&gt;
* Made the eprint_status filters a user preference on the Items screen&lt;br /&gt;
* /cgi/counters now shows the indexer status (allowing nagios to monitor it)&lt;br /&gt;
* /cgi/export can now export any dataset with the correct privilege set.&lt;br /&gt;
&lt;br /&gt;
== Command Line Tools&lt;br /&gt;
* epadmin: now accepts a list of eprintids for recommit, reindex &amp;amp; reorder&lt;br /&gt;
* indexer: Remove failed as well as inprogress tasks using --clear&lt;br /&gt;
* indexer: Added --respawn option to indexer to control respawn timeout&lt;br /&gt;
&lt;br /&gt;
==Semantic Web Support==&lt;br /&gt;
* New Export formats: RDF+XML, N3, N-Triples&lt;br /&gt;
* URIs for derived entities. eg. Authors, Events, Locations.&lt;br /&gt;
* Extendable RDF system, by default uses BIBO Ontology&lt;br /&gt;
* voID Ontology describes the repository via /id/repository&lt;br /&gt;
* URIs now use content negotiation to decide which export plugin to redirect to, based on mime-types supplied by plugins and the &amp;quot;accept&amp;quot; header.&lt;br /&gt;
* Semantic relations between eprints and documents&lt;br /&gt;
* URI for subject trees links to RDF in SKOS for each tree&lt;br /&gt;
&lt;br /&gt;
==Misc.==&lt;br /&gt;
* Added EPrints::Const module for eprints constants&lt;br /&gt;
* Triggers refined to use EPrints::Const for the trigger type ($c-&amp;gt;add_trigger and $c-&amp;gt;add_dataset_trigger)&lt;br /&gt;
* New way of configuring apache&lt;br /&gt;
* Change to using repository in function calls etc.&lt;br /&gt;
* Bugfixes&lt;br /&gt;
* Added export priv.&lt;br /&gt;
* lib/cfg.d now contains 'default' configuration files which may be overridden in the archive cfg.d if needed.&lt;br /&gt;
* Added 'codeview' javascript widget to admin config file editing&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=9070</id>
		<title>New Features in EPrints 3.2.1</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=9070"/>
		<updated>2010-03-30T18:11:36Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(This page is currently an unofficial, we're using it to keep track of what needs documenting etc.)&lt;br /&gt;
&lt;br /&gt;
* New way of configuring apache&lt;br /&gt;
* epadmin now accepts a list of eprintids for recommit, reindex &amp;amp; reorder&lt;br /&gt;
* Change to using repository in function calls etc.&lt;br /&gt;
* New cookie/redirect/check login&lt;br /&gt;
* Bugfixes&lt;br /&gt;
* Remove failed as well as inprogress tasks on --clear&lt;br /&gt;
* Made the eprint_status filters a user preference on the Items screen&lt;br /&gt;
* Added --respawn option to indexer to control respawn timeout&lt;br /&gt;
* counters now shows the indexer status (for nagios etc.)&lt;br /&gt;
* /cgi/export can now export any dataset with the correct priv&lt;br /&gt;
* Added export priv.&lt;br /&gt;
&lt;br /&gt;
==Semantic Web Support==&lt;br /&gt;
* RDF+XML Format&lt;br /&gt;
* N3 Format&lt;br /&gt;
* NTriples format&lt;br /&gt;
* URIs for all objects, including non dataobjs. eg. Authors, Events, Locations.&lt;br /&gt;
* BIBO Ontology&lt;br /&gt;
* Extendable&lt;br /&gt;
* URIs now use content negotiation to decide which export plugin to redirect to, based on mime-types supplied by plugins and the &amp;quot;accept&amp;quot; header.&lt;br /&gt;
* Relations between eprints and documents&lt;br /&gt;
* Base URI for repository /id/repository leads to RDF describing the repository in voID and bibo&lt;br /&gt;
* URI for subject trees links to RDF in skos for each tree&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=9069</id>
		<title>New Features in EPrints 3.2.1</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=9069"/>
		<updated>2010-03-30T18:09:45Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(This page is currently an unofficial, we're using it to keep track of what needs documenting etc.)&lt;br /&gt;
&lt;br /&gt;
* New way of configuring apache&lt;br /&gt;
* epadmin now accepts a list of eprintids for recommit, reindex &amp;amp; reorder&lt;br /&gt;
* Change to using repository in function calls etc.&lt;br /&gt;
* New cookie/redirect/check login&lt;br /&gt;
* Bugfixes&lt;br /&gt;
* Remove failed as well as inprogress tasks on --clear&lt;br /&gt;
* Made the eprint_status filters a user preference on the Items screen&lt;br /&gt;
* Added --respawn option to indexer to control respawn timeout&lt;br /&gt;
* counters now shows the indexer status (for nagios etc.)&lt;br /&gt;
&lt;br /&gt;
==Semantic Web Support==&lt;br /&gt;
* RDF+XML Format&lt;br /&gt;
* N3 Format&lt;br /&gt;
* NTriples format&lt;br /&gt;
* URIs for all objects, including non dataobjs. eg. Authors, Events, Locations.&lt;br /&gt;
* BIBO Ontology&lt;br /&gt;
* Extendable&lt;br /&gt;
* URIs now use content negotiation to decide which export plugin to redirect to, based on mime-types supplied by plugins and the &amp;quot;accept&amp;quot; header.&lt;br /&gt;
* Relations between eprints and documents&lt;br /&gt;
* Base URI for repository /id/repository leads to RDF describing the repository in voID and bibo&lt;br /&gt;
* URI for subject trees links to RDF in skos for each tree&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=9068</id>
		<title>New Features in EPrints 3.2.1</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=9068"/>
		<updated>2010-03-30T18:05:03Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* Semantic Web Support */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(This page is currently an unofficial, we're using it to keep track of what needs documenting etc.)&lt;br /&gt;
&lt;br /&gt;
* New way of configuring apache&lt;br /&gt;
* epadmin now accepts a list of eprintids for recommit, reindex &amp;amp; reorder&lt;br /&gt;
* Change to using repository in function calls etc.&lt;br /&gt;
&lt;br /&gt;
==Semantic Web Support==&lt;br /&gt;
* RDF+XML Format&lt;br /&gt;
* N3 Format&lt;br /&gt;
* NTriples format&lt;br /&gt;
* URIs for all objects, including non dataobjs. eg. Authors, Events, Locations.&lt;br /&gt;
* BIBO Ontology&lt;br /&gt;
* Extendable&lt;br /&gt;
* URIs now use content negotiation to decide which export plugin to redirect to, based on mime-types supplied by plugins and the &amp;quot;accept&amp;quot; header.&lt;br /&gt;
* Relations between eprints and documents&lt;br /&gt;
* Base URI for repository /id/repository leads to RDF describing the repository in voID and bibo&lt;br /&gt;
* URI for subject trees links to RDF in skos for each tree&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Manual&amp;diff=9067</id>
		<title>Manual</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Manual&amp;diff=9067"/>
		<updated>2010-03-30T17:58:09Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Rubbish]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
See the [[Main Page]] for other areas of this wiki.&lt;br /&gt;
&lt;br /&gt;
* [[Introduction|Introduction to EPrints]] and [[History|History of EPrints]] &lt;br /&gt;
* New Features in [[New Features in EPrints 3.1|EPrints 3.1]]&lt;br /&gt;
* In [[New Features in EPrints 3.2|EPrints 3.2]] &lt;br /&gt;
* Planned for [[New Features in EPrints 3.2.1|EPrints 3.2.1]] &lt;br /&gt;
* (see also the note on [[EPrints Version Numbering]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table cellpadding=&amp;quot;10&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td width=&amp;quot;33%&amp;quot; valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Installation and First Steps =&lt;br /&gt;
&lt;br /&gt;
* [[Quick Server Install Guide (Debian / Ubuntu Server)]]&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
{{Download}}&lt;br /&gt;
&lt;br /&gt;
== Installing EPrints From Binary ==&lt;br /&gt;
* [[Installing EPrints 3 via Redhat RPM]]&lt;br /&gt;
* [[Installing EPrints 3 via Fedora RPM]]&lt;br /&gt;
* [[Installing EPrints 3 via apt (Debian/Ubuntu)]]&lt;br /&gt;
&lt;br /&gt;
== Using the Live CD ==&lt;br /&gt;
* [[EPrints Live CD Help]]&lt;br /&gt;
* [[Building the Live CD]]&lt;br /&gt;
&lt;br /&gt;
== Installing EPrints From Source (.tar.gz) ==&lt;br /&gt;
&lt;br /&gt;
* [[Recommended Platforms]]&lt;br /&gt;
* [[Required software]]&lt;br /&gt;
* Install Guides&lt;br /&gt;
** [[Installing Eprints 3 on Fedora Core 7]] (also applicable to FC6)&lt;br /&gt;
** [[Installing EPrints 3 on RedHat Enterprise 4]]&lt;br /&gt;
** [[Installing EPrints 3 on OS X]]&lt;br /&gt;
** [[Debian from source | Installing EPrints 3 on Debian/Ubuntu - The Quick Way]]&lt;br /&gt;
** [[Installing EPrints 3 on Ubuntu 6.10]]&lt;br /&gt;
** [[Installing EPrints 3 on Debian]]&lt;br /&gt;
** [[Installing in a chroot Debian/Ubuntu]]&lt;br /&gt;
** [[:Category:Installation|Installing]] EPrints on various platforms.&lt;br /&gt;
* [[Https3 | Installing EPrints 3 with an https server]]&lt;br /&gt;
&lt;br /&gt;
==Post Installation==&lt;br /&gt;
&lt;br /&gt;
* [[Upgrading EPrints 3 versions | Upgrading from an earlier version of EPrints3]]&lt;br /&gt;
* [[Migration|Migrating from EPrints 2.3]]&lt;br /&gt;
&lt;br /&gt;
==Getting Started==&lt;br /&gt;
* [[Getting Started with EPrints 3|Getting Started]] &lt;br /&gt;
&lt;br /&gt;
* Maintenance &lt;br /&gt;
** [[Backups]]&lt;br /&gt;
** [[Generate Scripts]]&lt;br /&gt;
** [[Alerts]]&lt;br /&gt;
** [[Log Files]]&lt;br /&gt;
** [[Automating your maintenance]]&lt;br /&gt;
&lt;br /&gt;
* [[Troubleshooting]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td width=&amp;quot;33%&amp;quot; valign=&amp;quot;top&amp;quot; style=&amp;quot;border-left: solid 1px #ccc; border-right: solid 1px #ccc;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How-to Guides =&lt;br /&gt;
&lt;br /&gt;
''[http://en.wikipedia.org/wiki/Howto What is a how-to?]&lt;br /&gt;
&lt;br /&gt;
* Orientation &amp;lt;span style=&amp;quot;color: #f94; font-size: 130%&amp;quot;&amp;gt;(Start here)&amp;lt;/span&amp;gt;&lt;br /&gt;
** [[Configuration orientation|New to EPrints 3?]]  - ''before diving into the how-tos, take some time to read through this brief orientation guide and familiarise yourself with the EPrints configuration landscape...''&lt;br /&gt;
** [[EPrints_3_Configuration_orientation_for_EPrints_2_administrators|Migrated from EPrints 2?]] - ''this orientation guide is intended to help you re-orient yourselves in your new EPrints 3 set up...'' &lt;br /&gt;
* [[Front Page Warning | Removing the Front Page Warning]] - Your first go at branding&lt;br /&gt;
* [[Branding with confidence]] - ''one of the most common EPrints customisations is to add your own institution's branding and &amp;quot;look and feel&amp;quot; to the interface...''&lt;br /&gt;
** [[Branding, the next level]] - ''how to completely change the interface to your own design''&lt;br /&gt;
* [[OAI]]&lt;br /&gt;
* [[Adding new views]]&lt;br /&gt;
* Workflow&lt;br /&gt;
* Deposit Types&lt;br /&gt;
** [[Removing types]]&lt;br /&gt;
* Metadata&lt;br /&gt;
* Subjects (fold in with Organisation Hierarchy under &amp;quot;controled vocabularies&amp;quot;)&lt;br /&gt;
* [[EPrints_3_Organisation_Hierarchy|Organisation Hierarchy]] - ''how to put your own organisation's Hierarchy into EPrints 3''&lt;br /&gt;
* Searches&lt;br /&gt;
* [[Autocompletion and Authority Files (Romeo Autocomplete)]] - ''add autocomplete functionality to the Publication Title input field based on an authority file downloaded from EPrints Romeo...''&lt;br /&gt;
* [[Create Export Plugins]] - ''create a Perl Module that will export your data...''&lt;br /&gt;
* [[Login-Only Repository]] - ''require a username and password to access all pages (including search, browse, and the front page)...''&lt;br /&gt;
* [[Change Deposit Status in Bulk]] - ''move a large number of deposits from inbox to archive&lt;br /&gt;
* [[Demoprints Repository]] - ''How to set up and configure the demoprints.eprints.org repository.&lt;br /&gt;
* [[SWORD]] - ''How to configure the SWORD protocol on EPrints.&lt;br /&gt;
* [[:Category:Howto|more ...]]&lt;br /&gt;
&lt;br /&gt;
= How to contribute =&lt;br /&gt;
&lt;br /&gt;
There's a number of different ways you can contribute to the EPrints project. This section covers all the ones we can think of...&lt;br /&gt;
&lt;br /&gt;
Always make an entry on http://files.eprints.org/ for your contribution, even if you don't upload the files. This will make it the one-stop place for people to find EPrints extensions.&lt;br /&gt;
&lt;br /&gt;
* [[Contribute: Plugins | Plugins]]&lt;br /&gt;
* [[Contribute: Scripts | Scripts]]&lt;br /&gt;
* [[Contribute: Themes | Themes]]&lt;br /&gt;
* [[Contribute: Translations | Translations]]&lt;br /&gt;
* [[Contribute: Other | Other neighbourly things to do]]&lt;br /&gt;
* [[Extension Packages]]&lt;br /&gt;
&lt;br /&gt;
= Misc =&lt;br /&gt;
&lt;br /&gt;
* [[Preservation Support]] in EPrints 3&lt;br /&gt;
* [[:Category:Languages|Language support and translations]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot; width=&amp;quot;33%&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Technical Reference =&lt;br /&gt;
&lt;br /&gt;
* [[EPrints Directory Structure]] - will be linked somewhere better, later.&lt;br /&gt;
&lt;br /&gt;
* [[Metadata]] - configuring metadata fields.&lt;br /&gt;
* [[Archives/ARCHIVEID/cfg/|Repository Configuration]]&lt;br /&gt;
* [[XML Configuration]] Files&lt;br /&gt;
** [[EPScript]] - documentation for the EP3 Scripting language (for use in citations and workflow files).&lt;br /&gt;
** [[EPrints Control Format]] - the structure used to embed EPScript in an XML configuration file.&lt;br /&gt;
** [[Citation Format]]&lt;br /&gt;
** [[Workflow Format]] - the structure of the EP3 workflow files&lt;br /&gt;
** [[Phrase Format]]&lt;br /&gt;
** [[Template Format]]&lt;br /&gt;
** [[XPAGE Format]]&lt;br /&gt;
* [[XML Export Format]]&lt;br /&gt;
* EPrints data structure &lt;br /&gt;
** of the software&lt;br /&gt;
** of the database (relating the dataobjects to each other using eprints fields)&lt;br /&gt;
* [[Data Object]]s and data sets&lt;br /&gt;
** The [[EPrint Object]]&lt;br /&gt;
** The [[User Object]]&lt;br /&gt;
** The [[Document Object]]&lt;br /&gt;
** The [[Subject Object]]&lt;br /&gt;
** The [[Saved Search Object]]&lt;br /&gt;
** The [[History Object]]&lt;br /&gt;
** The [[Access Object]]&lt;br /&gt;
** The [[Request Object]]&lt;br /&gt;
* Plugins&lt;br /&gt;
** Import&lt;br /&gt;
** [[Export Plugins]]&lt;br /&gt;
** Components&lt;br /&gt;
** [[Screen Plugins]]&lt;br /&gt;
** Convert&lt;br /&gt;
* [[Autocompletion]]&lt;br /&gt;
** [[Understanding IDs in Workflow Forms]]&lt;br /&gt;
* [[API]]&lt;br /&gt;
* [[Dynamic Template System]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=8864</id>
		<title>New Features in EPrints 3.2.1</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=8864"/>
		<updated>2010-03-12T19:14:15Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* Semantic Web Support */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(This page is currently an unofficial, we're using it to keep track of what needs documenting etc.)&lt;br /&gt;
&lt;br /&gt;
* New way of configuring apache&lt;br /&gt;
* epadmin now accepts a list of eprintids for recommit, reindex &amp;amp; reorder&lt;br /&gt;
* Change to using repository in function calls etc.&lt;br /&gt;
&lt;br /&gt;
==Semantic Web Support==&lt;br /&gt;
* RDF+XML Format&lt;br /&gt;
* N3 Format&lt;br /&gt;
* URIs for all objects, including non dataobjs. eg. Authors, Events, Locations.&lt;br /&gt;
* BIBO Ontology&lt;br /&gt;
* Extendable&lt;br /&gt;
* URIs now use content negotiation to decide which export plugin to redirect to, based on mime-types supplied by plugins and the &amp;quot;accept&amp;quot; header.&lt;br /&gt;
* Relations between eprints and documents&lt;br /&gt;
* Base URI for repository /id/repository leads to RDF describing the repository in voID and bibo&lt;br /&gt;
* URI for subject trees links to RDF in skos for each tree&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=8863</id>
		<title>New Features in EPrints 3.2.1</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2.1&amp;diff=8863"/>
		<updated>2010-03-11T11:52:15Z</updated>

		<summary type="html">&lt;p&gt;Cjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(This page is currently an unofficial, we're using it to keep track of what needs documenting etc.)&lt;br /&gt;
&lt;br /&gt;
* New way of configuring apache&lt;br /&gt;
* epadmin now accepts a list of eprintids for recommit, reindex &amp;amp; reorder&lt;br /&gt;
* Change to using repository in function calls etc.&lt;br /&gt;
&lt;br /&gt;
==Semantic Web Support==&lt;br /&gt;
* RDF+XML Format&lt;br /&gt;
* N3 Format&lt;br /&gt;
* URIs for all objects, including non dataobjs. eg. Authors, Events, Locations.&lt;br /&gt;
* BIBO Ontology&lt;br /&gt;
* Extendable&lt;br /&gt;
* URIs now use content negotiation to decide which export plugin to redirect to, based on mime-types supplied by plugins and the &amp;quot;accept&amp;quot; header.&lt;br /&gt;
* Relations between eprints and documents&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2&amp;diff=8862</id>
		<title>New Features in EPrints 3.2</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=New_Features_in_EPrints_3.2&amp;diff=8862"/>
		<updated>2010-03-11T11:51:31Z</updated>

		<summary type="html">&lt;p&gt;Cjg: /* Semantic Web Support */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Releases]]&lt;br /&gt;
{{releasenotes}}&lt;br /&gt;
This page is now describing actual features, rather than planned.&lt;br /&gt;
&lt;br /&gt;
The [http://wiki.eprints.org/index.php?title=New_Features_in_EPrints_3.2&amp;amp;oldid=6394 Planned Features] may be useful to improve the quality of descriptions on this page.&lt;br /&gt;
&lt;br /&gt;
Unsorted items:&lt;br /&gt;
* ISIWok?&lt;br /&gt;
* Added support for &amp;quot;input_boxes&amp;quot; property to the workflow, so you can now specify the number of input boxes to show for multiple fields, fixes #3675 [Alexander 'Leo' Bergolth &amp;lt;leo@strike.wu.ac.at&amp;gt;]&lt;br /&gt;
* Added --clear option to indexer to clear 'inprogress' events (in case things go wrong)&lt;br /&gt;
* epc: no longer crashes eprints on bad scripts, just reports an error&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==NOTE==&lt;br /&gt;
* We now recommend LibXML in preference to GDOME. It's less buggy, and easier to install.&lt;br /&gt;
* Upgrade may take several hours as it cleans up the unicode issues in the database.&lt;br /&gt;
&lt;br /&gt;
==Database==&lt;br /&gt;
* In addition to MySQL, EPrints 3.2 now supports Oracle and Postgres&lt;br /&gt;
&lt;br /&gt;
==API==&lt;br /&gt;
* This release features a formal API. Not all functionality is yet available via the API, but will be added slowly and carefully in future releases.&lt;br /&gt;
* The bugbear of EPrints internals, EPrints::Session has been merged into EPrints::Repository. All old code will still work.&lt;br /&gt;
&lt;br /&gt;
==Documents==&lt;br /&gt;
* Thumbnails are now documents in their own right&lt;br /&gt;
* Built in document-format icons, as well as those you configure yourself&lt;br /&gt;
* Thumbnailing now happens in the background as part of the indexer process&lt;br /&gt;
&lt;br /&gt;
==Deposit Interface==&lt;br /&gt;
* Edit Locking locks records reduces risk of 2 people editing a record at the same time.&lt;br /&gt;
* Option to extract metadata and images from OpenXML files (.docx and .pptx)&lt;br /&gt;
* Offers options to users and editors on the deposit screen if there are problems&lt;br /&gt;
* Document upload screen has been redesgined to be clearer.&lt;br /&gt;
* Split document uploading into adding a new document and editing existing documents&lt;br /&gt;
* The documents inside an EPrint may now be re-ordered&lt;br /&gt;
* Progress bar on file upload&lt;br /&gt;
* Document upload methods (file, url, zip etc.) are now plugin-based and can be extended&lt;br /&gt;
* When attempting to deposit an eprint with problems show Save button&lt;br /&gt;
* Made it an option to provide action buttons top and bottom in workflow&lt;br /&gt;
&lt;br /&gt;
==Search &amp;amp; Indexing==&lt;br /&gt;
* The search library has been entirely re-written to reduce use of cache tables and to improve performance. Simple searches are now over ten times faster.&lt;br /&gt;
* The indexer now uses plugins, so you can schedule other tasks, like thumbnail conversion, to be done in the background.&lt;br /&gt;
* Added config option &amp;quot;cache_max&amp;quot; to limit the cachemap tables used&lt;br /&gt;
&lt;br /&gt;
==Unicode==&lt;br /&gt;
* EPrints use of unicode has been significantly improved.&lt;br /&gt;
&lt;br /&gt;
==REST==&lt;br /&gt;
* A &amp;quot;REST&amp;quot; style interface to objects, via /rest/eprint/23/title.txt, for example. This can also support &amp;quot;PUT&amp;quot; to alter fields!&lt;br /&gt;
&lt;br /&gt;
==WebDav==&lt;br /&gt;
* ???&lt;br /&gt;
* (tdb: Too buggy for official release - no decent clients available on standard platforms)&lt;br /&gt;
* [[User:Cjg|Cjg]]: (remove this section if it is wrong, I guess?)&lt;br /&gt;
&lt;br /&gt;
==SWORD2==&lt;br /&gt;
* SWORD2 (1.3 Specification) is supported.&lt;br /&gt;
&lt;br /&gt;
==Linked Data Support==&lt;br /&gt;
* Ability to establish arbitrary relations between objects or provide additional metadata in triple form.&lt;br /&gt;
&lt;br /&gt;
==Collections Support==&lt;br /&gt;
* Collections can be built via use of linked data, object ids and relationships. &lt;br /&gt;
&lt;br /&gt;
== Semantic Web / Linked Data (RDF) ==&lt;br /&gt;
&lt;br /&gt;
We have made a (difficult) decision to move these features to 3.2.1 (due out soon after 3.2.0) because testing showed it caused a significant slow down.&lt;br /&gt;
&lt;br /&gt;
We're rewriting it to do the same thing but with much less overhead!&lt;br /&gt;
&lt;br /&gt;
==Storage Layer==&lt;br /&gt;
* Now uses plugins to store files&lt;br /&gt;
** Local Filesystem&lt;br /&gt;
** Amazon S3&lt;br /&gt;
** Sun Cloud Storage&lt;br /&gt;
&lt;br /&gt;
==Speed==&lt;br /&gt;
* Search &amp;amp; Indexing much faster&lt;br /&gt;
* Import is faster&lt;br /&gt;
* Other parts of the code have been audited for speed, and optimised.&lt;br /&gt;
&lt;br /&gt;
==Import==&lt;br /&gt;
* Modified Import UI to allow a per-plugin/single/bulk workflow&lt;br /&gt;
&lt;br /&gt;
==EPC &amp;amp; EPrints Script==&lt;br /&gt;
* New EPC tag: epc:debug, which is like print but sends the XML to STDERR for debugging purposes.&lt;br /&gt;
* New EPC tag: epc:set which defines a variable inside it's scope.&lt;br /&gt;
* Improvements to the epc:foreach processing (better handling of multiple object types in lists)&lt;br /&gt;
* Added &amp;quot;limit&amp;quot; option to epc:foreach to limit the number&lt;br /&gt;
* Inside &amp;lt;epc:foreach&amp;gt; blocks an $index variable is set, allowing you to test which interation it's on.&lt;br /&gt;
* New EPScript methods: citation_link, dataset, related_objects, url, doc_size, is_public, thumbnail_url, preview_link, icon, human_filesize, control_url, contact_email, property, substr, filter_compound_list, to_data_array, pretty_list, array_concat, action_list, action_button, action_title, action_description, action_icon&lt;br /&gt;
* New Script methods: &lt;br /&gt;
** $data.property($key) which takes a string and returns a property from a hash or dataobj.&lt;br /&gt;
** $eprint.documents() which returns all the &amp;quot;real&amp;quot; (non-volatile) documents.&lt;br /&gt;
* New Script inline math functions: + - / * %&lt;br /&gt;
* New EPrints Script datatype: DATA_ARRAY: Represents a list of tuples of [$value, $epscript_type]&lt;br /&gt;
&lt;br /&gt;
==OAI==&lt;br /&gt;
* Stateless OAI Interface means no timing-out&lt;br /&gt;
* Support for multiple constraints in custom OAI sets&lt;br /&gt;
&lt;br /&gt;
==Unit Tests==&lt;br /&gt;
* We have introduced unit-tests to improve both the short and long term quality of our code.&lt;br /&gt;
==Metadata Types==&lt;br /&gt;
* Counter (incrementing value)&lt;br /&gt;
* Timestamp (defaults to the current time)&lt;br /&gt;
* UUID&lt;br /&gt;
* MetaField::Search now has two properties:&lt;br /&gt;
** &amp;quot;namedfields&amp;quot; which is an array ref of field names to search OR&lt;br /&gt;
** &amp;quot;namedfields_config&amp;quot; which is the name of a config variable&lt;br /&gt;
* MetaField::Search can now be used in any workflow (not hard-coded to editpermfields)&lt;br /&gt;
* A captcha pseudo-field based on http://recaptcha.net/&lt;br /&gt;
* added &amp;quot;repeat_secret&amp;quot; property to secret fields that will render a confirmation box which is checked with validate()&lt;br /&gt;
* Storable (store arbitrary Perl structures - internal use)&lt;br /&gt;
&lt;br /&gt;
==Administration Interface==&lt;br /&gt;
* Converted Admin screen into several tabs.&lt;br /&gt;
* Improved the BatchEdit interface&lt;br /&gt;
* Show a progress bar while records are updated during batch edit&lt;br /&gt;
&lt;br /&gt;
==Editorial Interface==&lt;br /&gt;
* Improved &amp;quot;Review&amp;quot; Screen&lt;br /&gt;
* The &amp;quot;Review buffer&amp;quot; can now be filtered for better management of large review buffers.&lt;br /&gt;
* When an editor provide the &amp;quot;Move to Review&amp;quot; button if there are problems&lt;br /&gt;
&lt;br /&gt;
==User Defined Datasets==&lt;br /&gt;
* Allows 3rd party tools to create their own additional datasets&lt;br /&gt;
* Suite of interface screens to work with these new datasets&lt;br /&gt;
&lt;br /&gt;
==Command Line Tools==&lt;br /&gt;
* Allow eprint ids to be specified for redo_thumbnails&lt;br /&gt;
&lt;br /&gt;
==Export ==&lt;br /&gt;
* Added support for OAI-ORE&lt;br /&gt;
* Added support for JSONP&lt;br /&gt;
* Added support for an 'n' argument to search exports&lt;br /&gt;
* Added arguments support to export plugins. Passed by CGI arguments on abstract search or by the --arg option in bin/export&lt;br /&gt;
&lt;br /&gt;
==Abstract Page==&lt;br /&gt;
* Now generated with a citation&lt;br /&gt;
* Shows an &amp;quot;action list&amp;quot;, so plugins can register to appear on this page&lt;br /&gt;
&lt;br /&gt;
==Phrases==&lt;br /&gt;
* Primary method of editing phrases is now the web interface&lt;br /&gt;
* Added &amp;quot;ref&amp;quot; option to phrases, which will cause the referenced phrase to be used instead - Equivalent to calling the referenced phrase directly&lt;br /&gt;
&lt;br /&gt;
==Views==&lt;br /&gt;
* Entire rendering of item lists and menus can be over-ridden by a function&lt;br /&gt;
&lt;br /&gt;
==Misc. Changes ==&lt;br /&gt;
* Can now disable a repository through a system configuration setting&lt;br /&gt;
* Refactoured DataObj::get_defaults so that you can now specify default values through a &amp;quot;default_value&amp;quot; property&lt;br /&gt;
* Most of get_defaults() can now be specified through the metafield spec.&lt;br /&gt;
* Can now apply multiple changes to the same field (???? I assume this means metafield?)&lt;br /&gt;
* Preference field for users (to store k/v pairs in)&lt;br /&gt;
&lt;br /&gt;
==Key Bugfixes==&lt;br /&gt;
* Fixed login page not using phrase for title&lt;br /&gt;
* Fixed spurious history objects being created on document upload&lt;br /&gt;
* Fixed an HTML insertion bug in the &amp;lt;title&amp;gt; element [Brian D. Gregg]&lt;br /&gt;
* Fixed schema errors in uketd_dc and METS/MODS export plugins&lt;br /&gt;
* Fixed bug in Compound creation of Set types that squashed the set options&lt;br /&gt;
* Fixed order static directories are searched to: repository-&amp;gt;theme-&amp;gt;system&lt;br /&gt;
* Support long values in browse views by using the MD5 of the value,&lt;br /&gt;
* Subject inputform component can now be used with singular values&lt;br /&gt;
* Fixed bug that is_advertised property on export plugins was being ignored.&lt;br /&gt;
* Fixed bug in indexer which meant it didn't index in a round-robin fashion.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Changes to repository configuration =&lt;br /&gt;
We've made some changes to the configuration of a new repository. These will not be automatically applied to your current repositories when upgrading.&lt;br /&gt;
&lt;br /&gt;
== Suggested Changes ==&lt;br /&gt;
&lt;br /&gt;
If upgrading from 3.1 to 3.2, the following changes to your own configuration are suggested to gain the features described above.&lt;br /&gt;
&lt;br /&gt;
* cp lib/defaultcfg/cfg.d/rdf* archives/YOURID/cfg/cfg.d/&lt;br /&gt;
* run epadmin recommit&lt;br /&gt;
* edit cfg/lang/en/static/index.xpage and add the following to the &amp;lt;xpage:head&amp;gt; section. &lt;br /&gt;
 &amp;lt;xpage:head&amp;gt;&lt;br /&gt;
   &amp;lt;link rel=&amp;quot;alternate&amp;quot; type=&amp;quot;application/rss+xml&amp;quot; title=&amp;quot;Items in {phrase('archive_name')}&amp;quot; href=&amp;quot;{$config{http_cgiurl}}/latest_tool?output=RSS2&amp;quot;&amp;gt;&amp;lt;/link&amp;gt;&lt;br /&gt;
   &amp;lt;link rel=&amp;quot;alternate&amp;quot; type=&amp;quot;application/atom+xml&amp;quot; title=&amp;quot;Items in {phrase('archive_name')}&amp;quot; href=&amp;quot;{$config{http_cgiurl}}/latest_tool?output=Atom&amp;quot;&amp;gt;&amp;lt;/link&amp;gt;&lt;br /&gt;
   &amp;lt;link rel=&amp;quot;alternate&amp;quot; type=&amp;quot;application/rdf+xml&amp;quot; title=&amp;quot;Repository Summary RDF+XML&amp;quot; href=&amp;quot;{$config{http_cgiurl}}/repositoryinfo/RDFXML/devel.rdf&amp;quot;&amp;gt;&amp;lt;/link&amp;gt;&lt;br /&gt;
   &amp;lt;link rel=&amp;quot;alternate&amp;quot; type=&amp;quot;text/n3&amp;quot; title=&amp;quot;Repository Summary RDF+N3&amp;quot; href=&amp;quot;{$config{http_cgiurl}}/repositoryinfo/RDFN3/devel.n3&amp;quot;&amp;gt;&amp;lt;/link&amp;gt;&lt;br /&gt;
 &amp;lt;/xpage:head&amp;gt;&lt;br /&gt;
(you may already have the rss &amp;amp; atom bits)&lt;br /&gt;
&lt;br /&gt;
* This list has NOT been completed yet, we're working on it!&lt;br /&gt;
&lt;br /&gt;
==New and Altered Config options==&lt;br /&gt;
&lt;br /&gt;
These need documenting and noting which ones we recommend setting/altering when upgrading.&lt;br /&gt;
&lt;br /&gt;
* Set &amp;quot;hide_document_conversion&amp;quot; to hide the Convert link on the document workflow&lt;br /&gt;
* Broke up SystemSettings into logically named files&lt;br /&gt;
* Can now disable a repository through a system configuration setting&lt;br /&gt;
* Moved most of eprint_render.pl into a citation file: summary_page.xml&lt;br /&gt;
* Updated defaults views.pl to show current configuration style&lt;br /&gt;
* Improved document_upload.pl layout to make it easier to add/remove suffix to mimetype mappings.&lt;br /&gt;
* Added URI to EPrint Summary Page&lt;br /&gt;
* Added RDF+XML and N3+NT Document formats &lt;br /&gt;
* New metafield option: $defaults{render_max_search_values} = 5;&lt;br /&gt;
* Added &amp;quot;show_help&amp;quot; option to workflow component to disable collapsing Usage: show_help={always,toggle,never}&lt;br /&gt;
* Added config option &amp;quot;cache_max&amp;quot; to limit the cachemap tables used&lt;br /&gt;
* user defined datasets&lt;br /&gt;
* Made it an option to provide action buttons top and bottom in workflow&lt;br /&gt;
**$c-&amp;gt;{locking}-&amp;gt;{eprint}-&amp;gt;{enable} = 1;&lt;br /&gt;
**$c-&amp;gt;{locking}-&amp;gt;{eprint}-&amp;gt;{timeout} = 600;&lt;br /&gt;
*REST privs&lt;br /&gt;
*check registation email callback&lt;br /&gt;
*epc:debug, epc:set, changes to epc:foreach&lt;br /&gt;
*lots of eprints script functions (see list above)&lt;br /&gt;
*views.pl&lt;br /&gt;
** &amp;quot;DEFAULT;render_fn=render_view_items_3col_boxes&amp;quot;,&lt;br /&gt;
** render_menu =&amp;gt; &amp;quot;render_view_menu_3col_boxes&amp;quot;&lt;br /&gt;
** ranges &amp;amp; variations were introduced in 3.1.? but need documenting.&lt;br /&gt;
* Storage plugins&lt;br /&gt;
* adding actions to abstract page&lt;br /&gt;
* select targz,zip,plain etc. in workflow/upload&lt;br /&gt;
#  Added support for &amp;quot;input_boxes&amp;quot; property to the workflow, so you can now specify the number of input boxes to show for multiple fields, fixes #3675 [Alexander 'Leo' Bergolth &amp;lt;leo@strike.wu.ac.at&amp;gt;]&lt;br /&gt;
# Added --clear option to indexer to clear 'inprogress' events (in case things go wrong)&lt;/div&gt;</summary>
		<author><name>Cjg</name></author>
		
	</entry>
</feed>