03-07-2012 05:51 AM
<config evaluator="model-type" condition="cm:content">
      <forms>
         <form id="search">
            <field-visibility>
               <!– … (other fields here)  –>
               <show id="path"/>
            </field-visibility>
            <appearance>
               <!– … (other fields here)  –>
               <field id="path" label="Path">
                  <control template="/org/alfresco/components/form/controls/association.ftl" />
               </field>
            </appearance>
         </form>
      </forms>
   </config>
ERROR [freemarker.runtime] [http-8080-36] Template processing error: "Expression field.endpointType is undefined on line 22, column 20 in org/alfresco/components/form/controls/association.ftl."
 
Expression field.endpointType is undefined on line 22, column 20 in org/alfresco/components/form/controls/association.ftl.
The problematic instruction:
———-
==> ${field.endpointType} [on line 22, column 18 in org/alfresco/components/form/controls/association.ftl]
 in include "${field.control.template}" [on line 90, column 7 in org/alfresco/components/form/form.lib.ftl]
 in user-directive renderField [on line 121, column 13 in org/alfresco/components/form/form.lib.ftl]
 in user-directive formLib.renderSet [on line 23, column 16 in org/alfresco/components/form/form.get.html.ftl]
 in user-directive formLib.renderFormContainer [on line 20, column 7 in org/alfresco/components/form/form.get.html.ftl]
———-
03-07-2012 03:01 PM
03-12-2012 10:11 AM
11-29-2012 11:38 AM
 
					
				
		
08-16-2014 02:26 PM
FormFilter
<extension>
  <modules>
    <module>
      <id>Main module of my custom extension</id>
      <version>${project.version}</version>
      <auto-deploy>true</auto-deploy>
      <customizations>
        <customization>
          <!– Order matters here! target before source, always! –>
          <targetPackageRoot>org.alfresco</targetPackageRoot>
          <sourcePackageRoot>my-module</sourcePackageRoot>
        </customization>
      </customizations>
    </module>
  </modules>
</extension>
<alfresco-config>
  
  <!– Search form
   | OVERRIDES: webapps/share/WEB-INF/classes/alfresco/share-form-config.xml
   | OVERRIDES: webapps/share/WEB-INF/classes/alfresco/team-config.xml
  –>
  <config evaluator="model-type" condition="cm:content">
    <forms>
      <!– Search form –>
      <form id="search">
        <field-visibility>
          <show id="searchInFolder" force="true" />
        </field-visibility>
        <appearance>
          <field id="searchInFolder" label="Search in">
            <control template="/org/alfresco/components/form/controls/association.ftl" />
          </field> 
        </appearance>
      </form>
    </forms>
  </config>
  
</alfresco-config>
searchInFolder
package my.project.forms;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.alfresco.repo.forms.AssociationFieldDefinition;
import org.alfresco.repo.forms.Field;
import org.alfresco.repo.forms.Form;
import org.alfresco.repo.forms.FormData;
import org.alfresco.repo.forms.processor.AbstractFilter;
import org.alfresco.repo.forms.processor.node.ContentModelField;
import org.alfresco.service.cmr.repository.NodeRef;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class SearchInFolderFilter extends AbstractFilter<Object, NodeRef> {
  private static final Log logger = LogFactory.getLog(SearchInFolderFilter.class);
  
  @Override
  public void beforeGenerate(Object item, List<String> fieldStringList, 
      List<String> forcedFieldStringList, Form form, 
      Map<String, Object> contextMap) {
    logger.debug("beforeGenerate");
  }
  
  @Override
  public void afterGenerate(Object item, List<String> fieldStringList, 
      List<String> forcedFieldStringList, Form form, 
      Map<String, Object> contextMap) {
    logger.debug("afterGenerate");
    try {
      if (fieldStringList.contains("searchInFolder")) {
        AssociationFieldDefinition associationFieldDefinition = new AssociationFieldDefinition("searchInFolder", "cm:folder", AssociationFieldDefinition.Direction.TARGET);
        associationFieldDefinition.setDataKeyName("searchInFolder");
        associationFieldDefinition.setLabel("searchInFolder");
        Field field = new ContentModelField(associationFieldDefinition, Collections.EMPTY_LIST);
        form.addField(field);
      }
    } catch (Exception e) {
      logger.error("There was a problem creating the searchInFolder field", e);
    }
    
  }
  
  @Override
  public void beforePersist(Object item, FormData formData) {
    logger.debug("beforePersist");
  }
  
  @Override
  public void afterPersist(Object item, FormData formData, 
      NodeRef persistedObjectNodeRef) {
    logger.debug("afterPersist");
  }
  
}
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
   <bean id="searchInFolderFilterNode" 
         class="my.project.forms.SearchInFolderFilter" 
         parent="baseFormFilter">
      <property name="filterRegistry" ref="nodeFilterRegistry" />
   </bean>
   <bean id="searchInFolderFilterType" 
         class="my.project.forms.SearchInFolderFilter" 
         parent="baseFormFilter">
      <property name="filterRegistry" ref="typeFilterRegistry" />
   </bean>
</beans>
searchInFoldersearchInFolderrootNodesearchInFolder
/**
 * Advanced Search component.
 * 
 * @namespace Alfresco
 * @class Alfresco.AdvancedSearch
 * 
 * CALLED AFTER: webapps/share/components/search/advsearch.js
 */
(function()
{
   /**
    * YUI Library aliases
    */
   var Dom = YAHOO.util.Dom;
   
   YAHOO.lang.augmentObject(Alfresco.AdvancedSearch.prototype,
   {
      /**
       * Event handler that gets fired when user clicks the Search button.
       *
       * @method onSearchClick
       * @param e {object} DomEvent
       * @param obj {object} Object passed back from addListener method
       */
      onSearchClick: function ADVSearch_onSearchClick(e, obj)
      {
         // retrieve form data structure directly from the runtime
         var formData = this.currentForm.runtime.getFormData();
         
         // add DD type to form data structure
         formData.datatype = this.currentForm.type;
         
         // Clean association.ftl data from the formData, it is useless for our purpose
         delete formData.assoc_searchInFolder_added;
         delete formData.assoc_searchInFolder_removed;
         
         // Retrieve the node ref of the selected "search in" folder, it is in
         // the hidden input of "association.ftl" that has no name. In order to
         // find it, use one of the two useless (in our case) fields: 
         // "assoc_searchInFolder_added" and "assoc_searchInFolder_removed" in
         // order to deduce the id of our useful field.
         var searchInFolder_value = null;
         try {
            var searchInFolder_added_id = document.getElementsByName("assoc_searchInFolder_added")[0].id;
            var searchInFolder_id = searchInFolder_added_id.substring(0, searchInFolder_added_id.length - "-cntrl-added".length);
            searchInFolder_value = document.getElementById(searchInFolder_id).value;
         } catch (err) {
            // Something is probably undefined…
            alert("Something is probably undefined - " + err.message)
         }
         
         // build and execute url for search page
         var url = YAHOO.lang.substitute(Alfresco.constants.URL_PAGECONTEXT + "{site}search?t={terms}&q={query}&r={repo}&searchInFolder={searchInFolder}",
         {
            site: (this.options.siteId.length !== 0 ? ("site/" + this.options.siteId + "/") : ""),
            terms: encodeURIComponent(Dom.get(this.id + "-search-text").value),
            query: encodeURIComponent(YAHOO.lang.JSON.stringify(formData)),
            repo: this.options.searchRepo.toString(),
            searchInFolder : searchInFolder_value == null?"":searchInFolder_value
         });
         
         window.location.href = url;
      }
   }, true);
})();
<#– OVERRIDES: webapps/share/WEB-INF/classes/alfresco/site-webscripts/org/alfresco/components/search/advsearch.get.html.ftl
–>
<@markup id="custom-share-js"  target="js" action="after">
  <@script src="${url.context}/res/my-module/components/search/advsearch.js" group="search"/>
</@>
rootNode
/**
 * Search component GET method
 */
function main()
{
   var search = widgetUtils.findObject(model.widgets, "id", "Search");
   if (page.url.args["searchInFolder"] != null && page.url.args["searchInFolder"] != "") {
      search.options.searchRootNode = page.url.args["searchInFolder"];
   }
}
main();
getSearchResults
         // When "seach in" folder is selected and "key word" field is empty, we set it to "*" so it will return all the results
         var searchText = encodeURIComponent(Dom.get(this.id + "-search-text").value); 
         if (searchInFolder_value != null && searchInFolder_value != "" && searchText == "") {
            searchText = "*";
         }
         
         // build and execute url for search page
         var url = YAHOO.lang.substitute(Alfresco.constants.URL_PAGECONTEXT + "{site}search?t={terms}&q={query}&r={repo}&searchInFolder={searchInFolder}",
         {
            site: (this.options.siteId.length !== 0 ? ("site/" + this.options.siteId + "/") : ""),
            terms: searchText,
            query: encodeURIComponent(YAHOO.lang.JSON.stringify(formData)),
            repo: this.options.searchRepo.toString(),
            searchInFolder : searchInFolder_value == null?"":searchInFolder_value
         });
06-30-2017 05:15 AM
does this work for alfresco CE 5.2?
 
					
				
		
07-29-2015 08:59 AM
 
					
				
				
			
		
Tags
Find what you came for
We want to make your experience in Hyland Connect as valuable as possible, so we put together some helpful links.