為了因應臺灣的地址,我開發了一個TaiwanAddress的input-type,可以在選擇縣市之後,由程式自動帶入郵遞區號前三碼。
這個程式我也寫成jQuery的plugin,只要引入之後以jQuery(selecotr).taiwanAddress()就可以使用。
由於最近修改程式碼的頻率頻繁,故不提供檔案,而是以指示的方式教你安裝這些功能。以下是安裝與使用教學:
檔案下載 請下載以下檔案,並擺到下述的指定位置:
修改遞交作業 本步驟有兩個檔案必需要修改。
修改edit-metadata.jsp edit-metadata.jsp是遞交作業中填寫metadata使用的JSP檔案。
如果你修改過edit-metadata.jsp的話,你應該要在[dspace-source]/dspace/modules/jspui/src/main/webapp/submit/edit-metadata.jsp找到該檔案,否則請到[dspace-source]/dspace-jspui/dspace-jspui-webapp/src/main/webapp/submit/edit-metadata.jsp找到該檔案。
請依照以下指示修改程式碼:
插入doTaiwanAddress函式
請找到「do」開頭函式的最後一個,如果你安裝過我之前介紹的DSpace新增input-type ,那麼可以找到「} //void doXMLMetadata()」,請在後面插入以下程式碼:
void doTaiwanAddress(javax.servlet.jsp.JspWriter out, Item item,
String fieldName, String schema, String element, String qualifier, boolean repeatable,
int fieldCountIncr, String label, PageContext pageContext, String vocabulary, boolean closedVocabulary)
throws java.io.IOException
{
DCValue[] defaults = item.getMetadata(schema, element, qualifier, Item.ANY);
int fieldCount = defaults.length + fieldCountIncr;
StringBuffer sb = new StringBuffer();
String val;
if (fieldCount == 0)
fieldCount = 1;
for (int i = 0; i < fieldCount; i++)
{
if (i == 0)
sb.append("<tr><td class=\"submitFormLabel\">")
.append(label)
.append("</td>");
else
sb.append("<tr><td> </td>");
if (i < defaults.length)
val = defaults[i].value.replaceAll("\"", """);
else
val = "";
sb.append("<td colspan=\"2\"><input type=\"text\" name=\"")
.append(fieldName);
if (repeatable && i>0)
sb.append("_").append(i);
sb.append("\" size=\"50\" value=\"")
.append(val +"\"")
.append(hasVocabulary(vocabulary)&&closedVocabulary?" readonly=\"readonly\" ":"")
.append(" />")
.append(doControlledVocabulary(fieldName + (repeatable?"_" + i:""), pageContext, vocabulary))
.append("<script type=\"text/javascript\">" + "\n")
.append("jQuery(document).ready(function () {" + "\n")
.append("jQuery(\"input[name=\'")
.append(fieldName);
if (repeatable && i>0)
sb.append("_").append(i);
sb.append("\']\").taiwanAddress();" + "\n")
.append("});" + "\n")
.append("</script>")
.append("</td>\n");
if (repeatable && i < defaults.length)
{
// put a remove button next to filled in values
sb.append("<td><input type=\"submit\" name=\"submit_")
.append(fieldName)
.append("_remove_")
.append(i)
// .append("\" value=\"Remove This Entry\"/> </td></tr>");
.append("\" value=\"")
.append(LocaleSupport.getLocalizedMessage(pageContext, "jsp.submit.edit-metadata.button.remove"))
.append("\"/> </td></tr>");
}
else if (repeatable && i == fieldCount - 1)
{
// put a 'more' button next to the last space
sb.append("<td><input type=\"submit\" name=\"submit_")
.append(fieldName)
// .append("_add\" value=\"Add More\"/> </td></tr>");
.append("_add\" value=\"")
.append(LocaleSupport.getLocalizedMessage(pageContext, "jsp.submit.edit-metadata.button.add"))
.append("\"/> </td></tr>");
}
else
{
// put a blank if nothing else
sb.append("<td> </td></tr>");
}
}
out.write(sb.toString());
}
引用jquery-plugin-taiwan-address.js
找到引用JavaScript與CSS的地方,在「<link rel="stylesheet" href="<%= request.getContextPath() %>/extension/xmlmetadata/dspace-inputtype-xml.css" type="text/css" media="screen">」之後插入以下程式碼:
<script type="text/javascript" src="<%= request.getContextPath() %>/extension/taiwan-address/jquery-plugin-taiwain-address.js"></script>
插入選擇使用doTaiwanAddress
最後找到以下程式碼:
else if (inputType.equals("xmlmetadata"))
{
pageContent.append(doXMLMetadata(out, item, fieldName, dcSchema, dcElement, dcQualifier,
repeatable, fieldCountIncr, label, pageContext, vocabulary,
closedVocabulary, workspaceItemID,
nonInternalBistreamsID, hasMultipleFiles, defaultValue,
request.getContextPath()));
}
在這之後插入以下程式碼:
else if (inputType.equals("taiwanaddress"))
{
pageContent.append(doTaiwanAddress(out, item, fieldName, dcSchema, dcElement, dcQualifier,
repeatable, fieldCountIncr, label, pageContext, vocabulary,
closedVocabulary));
}
修改DescribeStep.java
DescribeStep.java是遞交作業中儲存資料時使用的檔案。
DescribeStep.java的位置在[dspace-source]/dspace-api/src/main/java/org/dspace/submit/step/DescribeStep.java
請找到以下程式碼:(如果增加過input-type,那這邊應該也會有所改變)
else if ((inputType.equals("onebox"))
|| (inputType.equals("twobox"))
|| (inputType.equals("textarea"))
請多加一個條件式如下:
|| (inputType.equals("taiwanaddress"))
修改完畢之後,必須將DSpace重新編譯,方能生效。
修改edit-item-form.jsp
edit-item-form.jsp是修改文件時使用的JSP檔案。
你必須先確認你之前安裝過我寫的DSpace擴增文件編輯功能 ,你才能夠繼續安裝以下功能。
如果你修改過edit-item-form.jsp的話,你應該要在[dspace-source]/dspace/modules/jspui/src/main/webapp/tools/edit-item-forms.jsp找到該檔案,否則請到[dspace-source]/dspace-jspui/dspace-jspui-webapp/src/main/webapp/tools/edit-item-form.jsp找到該檔案。
請依照以下步驟一一插入程式碼。
插入doTaiwanAddress函式
請找到「String doXMLMetadata(…」函式的結束位置,我應該有加一個註解:「}//doXMLMetadata End」,再之後加入以下程式碼:
String doTaiwanAddress(javax.servlet.jsp.JspWriter out, Item item,
String fieldName, String schema, String element, String qualifier, boolean repeatable,
int fieldCountIncr, String label, PageContext pageContext, String vocabulary, boolean closedVocabulary)
throws java.io.IOException
{
StringBuffer output = new StringBuffer();
DCValue[] defaults = item.getMetadata(schema, element, qualifier, Item.ANY);
int fieldCount = defaults.length + fieldCountIncr;
StringBuffer sb = new StringBuffer();
String val;
if (fieldCount == 0)
fieldCount = 1;
int index = 0;
for (int i = 0; i < fieldCount; i++)
{
if (i == 0)
sb.append("<tr><td class=\"submitFormLabel\" width=\"35%\">")
.append(label)
.append("</td>");
else
sb.append("<tr><td> </td>");
if (i < defaults.length)
val = defaults[i].value.replaceAll("\"", """);
else
val = "";
sb.append("<td colspan=\"2\"><input type=\"text\" name=\"")
.append(fieldName);
if (repeatable && i>0)
sb.append("_").append(i);
String editItemFormID = getMetadataID("value_", schema, element, qualifier, index);
String editItemFormRemoveID = getMetadataID("submit_remove_", schema, element, qualifier, index);
String editItemFormAddID = getAddID(schema, element, qualifier);
index++;
sb.append("\" size=\"80\" value=\"")
.append(val +"\"")
//.append(hasVocabulary(vocabulary)&&closedVocabulary?" readonly=\"readonly\" ":"")
.append(" onchange=\"editItemFormSync('"+editItemFormID+"', this.value)\" class=\"doTaiwanAddress\" />")
//.append(doControlledVocabulary(fieldName + (repeatable?"_" + i:""), pageContext, vocabulary))
.append("<textarea class=\"javascript\" style=\"display:none\">" + "\n")
.append("jQuery(document).ready(function () {" + "\n")
.append("jQuery(\"input[name=\'")
.append(fieldName);
if (repeatable && i>0)
sb.append("_").append(i);
sb.append("\']\").taiwanAddress();" + "\n")
.append("});" + "\n")
.append("</textarea>")
.append("</td>\n");
String fieldNameFull = fieldName;
if (repeatable && i>0)
fieldNameFull = fieldNameFull + "_" + i;
if (repeatable && i < defaults.length)
{
// put a remove button next to filled in values
sb.append("<td><input type=\"button\" onclick=\"editItemRemove('"+editItemFormRemoveID+"')\" name=\"submit_")
.append(fieldName)
.append("_remove_")
.append(i)
// .append("\" value=\"Remove This Entry\"/> </td></tr>");
.append("\" value=\"")
.append(LocaleSupport.getLocalizedMessage(pageContext, "jsp.submit.edit-metadata.button.remove"))
.append("\"/> </td></tr>");
}
else if (repeatable && i == fieldCount - 1)
//else if (true)
{
// put a 'more' button next to the last space
sb.append("<td><input type=\"button\" onclick=\"editItemAdd('"+editItemFormAddID+"')\" name=\"submit_")
.append(fieldName)
// .append("_add\" value=\"Add More\"/> </td></tr>");
.append("_add\" value=\"")
.append(LocaleSupport.getLocalizedMessage(pageContext, "jsp.submit.edit-metadata.button.add"))
.append("\"/> </td></tr>");
}
else
{
// put a blank if nothing else
sb.append("<td> </td></tr>");
}
}
//out.write(sb.toString());
output.append(sb.toString());
return output.toString();
}//doTaiwanAddress End
引用jquery-plugin-taiwan-address.js
找到引用JavaScript與CSS的地方,在「<link rel="stylesheet" href="<%= request.getContextPath() %>/extension/xmlmetadata/flora.datepicker.css" type="text/css" media="screen">」之後插入以下程式碼:
<script type="text/javascript" src="<%= request.getContextPath() %>/extension/taiwan-address/jquery-plugin-taiwain-address.js"></script>
插入選擇使用doTaiwanAddress
最後找到以下程式碼:
else if (inputType.equals("xmlmetadata"))
{
pageContent.append(doXMLMetadata(out, item, fieldName, dcSchema, dcElement, dcQualifier,
repeatable, fieldCountIncr, label, pageContext, vocabulary,
closedVocabulary, workspaceItemID,
nonInternalBistreamsID, hasMultipleFiles, defaultValue,
request.getContextPath()));
}
在這之後插入以下程式碼:
else if (inputType.equals("taiwanaddress"))
{
pageContent.append(doTaiwanAddress(out, item, fieldName, dcSchema, dcElement, dcQualifier,
repeatable, fieldCountIncr, label, pageContext, vocabulary,
closedVocabulary));
}
完成!
使用input-type:taiwanaddress
請修改[dspace]/config/input-forms.xml,把input-type設為taiwanaddress就可以囉。舉例來說如下:
<field>
<dc-schema>dc</dc-schema>
<dc-element>contributor</dc-element>
<dc-qualifier>authorAddress</dc-qualifier>
<repeatable>true</repeatable>
<label>Author Address</label>
<input-type>taiwanaddress</input-type>
<hint>Enter the address of the author of this item below.</hint>
<required></required>
</field>
結語
之後還會陸續加入一些東西,我想等穩定一點再來發佈edit-metadata.jsp或其他檔案吧。
<-- Post Catalog -->
(more...)
Comments