Skinning#

	<context-param>
		<param-name>org.richfaces.enableControlSkinning</param-name>
		<param-value>true</param-value>
	</context-param>
	<context-param>
		<param-name>org.richfaces.enableControlSkinningClasses</param-name>
		<param-value>true</param-value>
	</context-param>
	<context-param>
		<param-name>org.richfaces.skin</param-name>
		<param-value>blueSky</param-value>
	</context-param>

Tree#

Um die Selection-Events zu bekommen, sind einige Dinge zu beachten:
  • Der Tree muss sich in einem Form-Tag befinden
  • Das selectionChangeListener-Attribut funktioniert nicht, es muss ein zusätzlicher Tag rich:treeSelectionChangeListener verwendet werden
  • Die Keys der TreeNodes können Probleme bereiten, wenn es Integers sind oder Sonderzeichen enthalten
    <h:form id="tree-form">
        <rich:tree id="tree" value="#{bean.tree}" selectionType="ajax">
		<rich:treeSelectionChangeListener listener="#{bean.changeSelection}"/>
		<rich:treeNode>
			<h:outputText value="#{node.name}"/>
		</rich:treeNode>
        </rich:tree>
    </h:form>
	public void changeSelection(TreeSelectionChangeEvent event) {
		System.out.println("Selection changed: " + event.getNewSelection());
	}

Fixes#

Collapsible Sub-Table#

In Firefox kommt die Meldung "TypeError: RichFaces.ui.CollapsibleSubTable is not a constructor", im Internet-Explorer kommt es zu nicht lokalisierenden Javascript-Fehlern. Ursache sind fehlende Resourcen, der Fix besteht im manuellen Einbinden:
<h:outputScript name="collapsible-subtable.js" library="org.richfaces"/>
<h:outputStylesheet name="collapsible-subtable.ecss" library="org.richfaces"/>

AJAX-Errors#

Richfaces verbiegt das AJAX-Framework von JSF, vor allem um seinen mehr oder weniger nützlichen AJAX-Queue zu implementieren. Dabei entstehen gravierende Nebenwirkungen, wie zum Beispiel dass keine AJAX-Requests mehr mit einer DOM-Element-Id abgeschickt werden können, nur noch mit dem DOM-Element selbst.

Ein anderes Problem ist das Verschlucken von AJAX-Fehlermeldungen. Richfaces registriert mit jsf.ajax.addOnError(onError) einen eigenen Error-Handler, in dessen Code dann steht "//TODO: what if somebody is going to clear queue on error?". Abhilfe schafft das Registrieren eines weiteren Error-Handlers mit einer sinnvollen Ausgabe:

<c:if test="#{facesContext.application.projectStage == 'Development'}">
	<script type="text/javascript">
		jsf.ajax.addOnError(function (data) {
			alert(data.description);
		});
	</script>
</c:if>