:::

DSpace Input-type新增taiwanaddress

6月 15, 2009 2 Comments Edit Post

2009-06-15_000205

為了因應臺灣的地址,我開發了一個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>&nbsp;</td>");

         if (i < defaults.length)
           val = defaults[i].value.replaceAll("\"", "&quot;");
         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>&nbsp;</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重新編譯,方能生效。

2009-06-15_010334

修改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>&nbsp;</td>");

         if (i < defaults.length)
           val = defaults[i].value.replaceAll("\"", "&quot;");
         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>&nbsp;</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));	
								}

完成!

2009-06-15_000205

使用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 -->

總共2 則留言, (我要發問)

  1. ha!我還以為此blog停刊了

    回覆刪除
  2. XDDD

    這裡沒有說要定期發刊啦,但每次都在期待也不會看到什麼有趣的就是

    回覆刪除

留言工具: