Como añadir en la busqueda avanzada artículos de la wiki

Por defecto, en Alfresco no se puede buscar específicamente artículos de la wiki, y además no es fácil añadir esta opción a la búsqueda avanzada, ya que estos realmente son del tipo «cm:content», lo que quiere decir que por el tipo no se pueden distinguir.

Sin embargo, si se podría conseguir esta funcionalidad, aplicando la siguiente solución, la cual vamos a explicar paso por paso:

1. Crea un modelo con un nuevo tipo

<types>
<!-- Wiki Article Custom Type: This type is used to control what content is a wiki article -->
<type name="how:wikiArticleType">
<title>Wiki Article custom type</title>
<parent>cm:content</parent>
<properties>
<property name="how:isWikiArticle">
<title>Is Wiki Article</title>
<type>d:boolean</type>
<default>true</default>
<index enabled="true">
<tokenised>true</tokenised>
</index>
</property>
</properties>
</type>
</types>

2. Crea un behavior, el cual le modificará el tipo a todos los artículos nuevos que se creen
De esta forma los artículos en lugar de ser del tipo «cm:content» pasarán a ser «how:wikiArticleType», de esta forma ya sí podremos distinguir los artículos de la wiki del resto de nodos

Nota: Los artículos que se crearon antes de aplicar la solución no se encontrarán, para ello se debería aplicar un parche que los modificase de la misma forma que lo hace el behavior.

@Override
public void onCreateNode(ChildAssociationRef childAssocRef) {
NodeService nodeService=serviceRegistry.getNodeService();
NodeRef parent=childAssocRef.getParentRef();
//Get the name and the type of the node's parent
String name=(String) nodeService.getProperty(parent, ContentModel.PROP_NAME);
QName type = nodeService.getType(parent);
//Check if the node is a new page in the wiki checking the name and type of its parent
if(type.equals(ContentModel.TYPE_FOLDER) && name.equals("wiki")){
//Set a custom type to the node to indicate it's a wiki article
NodeRef child=childAssocRef.getChildRef();
nodeService.setType(child, WikiModel.WikiArticle.TYPE);
//put a true the property "how:isWikiArticle"
nodeService.setProperty(child, WikiModel.WikiArticle.Prop.IS_WIKI_ARTICLE,  new Boolean(true));
}
}

3. Añadir una opción en la búsqueda avanzada para el tipo específico que hemos creado para los artículos de la wiki

Para ello modifica el archivo \src\main\resources\META-INF\share-config-custom.xml con el siguiente código

<!--================================================================================================================ Advanced Search Forms for types (search forms for aspects are not available) We have added a advanced search option for wiki pages ============================================================================================================= -->

<config evaluator="string-compare" condition="AdvancedSearch" replace="true">
<advanced-search>
<forms>
<form labelId="form.label.advancedsearch.wikiPage" descriptionId="form.description.advancedsearch.wikiPage">how:wikiArticleType
</form>
</forms>
</advanced-search>
</config>

<!--================================================================================================================ Config for COTENT, SPECIFICALLY FOR WIKI PAGE ============================================================================================================= -->

<!-- Create and search forms for how:wikiArticleType to search wiki pages -->
<config evaluator="model-type" condition="how:wikiArticleType" replace="true">
<forms>
<!-- Search form -->
<form id="search" replace="true">
<field-visibility>
<show id="cm:name"/>
<show id="cm:taggable" force="true"/>
<show id="how:isWikiArticle" force="true"/>
</field-visibility>
<appearance>
<field id="cm:name" label="Title"></field>
<field id="cm:taggable">
<control>
<control-param name="compactMode">true</control-param>
<control-param name="params">aspect=cm:taggable
</control-param>
<control-param name="createNewItemUri">/api/tag/workspace/SpacesStore
</control-param>
<control-param name="createNewItemIcon">tag</control-param>
</control>
</field>
<!-- This field will be hidden and have a true value by default, so the search only provides nodes with this type and this property with the value true-->
<field id="how:isWikiArticle">
<control template="/com/howtobrothers/custom-form/controls/isWikiArticle.ftl">
<control-param name="options">true
</control-param>
</control>
</field>
</appearance>
</form>
</forms>
</config>

4. Finalmente, añade la definición del custom form field .ftl usado
En nuestro caso, hemos implementado /com/howtobrothers/custom-form/controls/isWikiArticle.ftl tomando de referencia selectone.ftl, modificándolo para que este oculto, y tenga por defecto el valor «true»

Si necesitas más detalles, puedes consultar el código completo de la solución aquí.