DSpace Input-type新增taiwanaddress
為了因應臺灣的地址,我開發了一個TaiwanAddress的input-type,可以在選擇縣市之後,由程式自動帶入郵遞區號前三碼。
這個程式我也寫成jQuery的plugin,只要引入之後以jQuery(selecotr).taiwanAddress()就可以使用。
由於最近修改程式碼的頻率頻繁,故不提供檔案,而是以指示的方式教你安裝這些功能。以下是安裝與使用教學:
檔案下載
請下載以下檔案,並擺到下述的指定位置:
- jquery-plugin-taiwain-address.js
[dspace-source]/dspace/modules/jspui/src/main/webapp/extension/taiwan-address/jquery-plugin-taiwain-address.js
修改遞交作業
本步驟有兩個檔案必需要修改。
修改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 -->
ha!我還以為此blog停刊了
回覆刪除XDDD
回覆刪除這裡沒有說要定期發刊啦,但每次都在期待也不會看到什麼有趣的就是