JSF MyFaces Tomahawk Probleme

waldek87

Mitglied
Hallo,

ich migriere zur Zeit eine Anwendung von JSF 1.1 auf JSF 2.0.
Laufzeitumgebung der Webapplication ist ein Glassfish v3.1.
Leider habe ich 2 Probleme mit Tomahawk:
1. Header - Facet in der DataTable wird beim Klick auf einen Link innerhalb der Tabelle (z.B. löschen des jeweiligen Datensatzes oder beim Klick auf eine Spalte im TabellenHeader)
2. der Datepicker von Tomahawk funktioniert bei mir jetzt gar nicht mehr.

(beide Probleme sind aber in verschiedenen Views)

Hier der Code für das Sortieren:

Java:
<t:dataTable
	var="row" value="#{VeranstalterHandler.veranstalter}"
	binding="#{VeranstalterHandler.veranstalterTabelle}" 
	border="0" 
	cellpadding="3"					
	cellspacing="0" >
		<t:column sortable="true" defaultSorted="true">
			<f:facet name="header"><h:outputText value="Name"/></f:facet>
			<h:panelGroup rendered="#{VeranstalterHandler.errorMessage} != null and VeranstalterHandler.errorNumber == row.veranstalter.id}">
			<h:outputText value="  " />
			</h:panelGroup>
			<h:outputText value="#{row.veranstalter.name1} #{row.veranstalter.name2} #{row.veranstalter.name3}"/> 
		</t:column>
					
		<t:column sortable="true">
			<f:facet name="header"><h:outputText value="Straße"/></f:facet>
			<h:outputText value="#{row.veranstalter.strasse}"/> 
		</t:column>
					
		<t:column sortable="true">
			<f:facet name="header"><h:outputText value="Ort"/></f:facet>
			<h:outputText value="#{row.veranstalter.ort}"/> 
		</t:column>
					
		<t:column>
			<h:panelGroup style="display:block;text-align:right">
				<h:outputText value="  " />
				<h:commandLink action="#{VeranstalterHandler.deleteVeranstalter}"  
					onclick="if (!confirm('Soll Veranstalter #{row.veranstalter.name} wirklich gelöscht werden?')) return false;" >
					<h:graphicImage library="images" value="cross.gif" name="cross.gif" alt="Veranstalter löschen" title="Veranstalter löschen" />
					<t:updateActionListener value="#{row.veranstalter}" property="#{VeranstalterHandler.killme}"/>
				</h:commandLink>
			</h:panelGroup>  
		</t:column>
									
</t:dataTable>

und der Code für den Datepicker:

Java:
	<t:panelGroup>
		<t:inputCalendar
	                value="#{KopfdatenHandler.vertragKopf.massnahmeVon}" 
	                renderAsPopup="true"
	                renderPopupButtonAsImage="true"
	                popupButtonImageUrl="/images/calendar.gif"/>														
		<t:message for="startdatum" detailFormat="Bitte wählen Sie ein gültiges Datum aus"></t:message>
	</t:panelGroup>

Weiß einer Rat?

Gruß
Waldek87
 
Das mit dem inputCalendar hab ich jetzt lösen können. Ich hatte den StackTrace im server-Log vom glassfish übersehen. Ich hatte ein paar Filter Einstellungen für JSF nicht eingetragen.

Java:
  <filter>
	<filter-name>MyFacesExtensionsFilter</filter-name>
	<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
    <init-param>
        <param-name>uploadMaxFileSize</param-name>
        <param-value>20m</param-value>
    </init-param>
   </filter>
   <filter-mapping>
	<filter-name>MyFacesExtensionsFilter</filter-name>
	<servlet-name>Faces Servlet</servlet-name>
   </filter-mapping>
	
   <filter-mapping>
	<filter-name>MyFacesExtensionsFilter</filter-name>
	<url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
   </filter-mapping>

Leider läuft das mit den Tabellen Headern immer noch nicht.
 
1. Header - Facet in der DataTable wird beim Klick auf einen Link innerhalb der Tabelle (z.B. löschen des jeweiligen Datensatzes oder beim Klick auf eine Spalte im TabellenHeader)

Da fehlt wohl noch der Rest der Fehlerbeschreibung!
 
Ups, das hab ich total übersehen 🙁

Also wenn ich auf einen Header zum Sortieren klicke, werden beim nächsten Rendern der Seite werden erst die Inhalte der Header nicht angezeigt. Wenn ich dann zb. einen Eintrag innerhalb der Tabelle löschen möchte, fehlen dann beim nächsten Rendern die Header komplett.
Das alles verwirrt mich ein wenig, da ja nur Plain Text über <h😱utputText /> ausgegeben wird.

Gruß
Waldek87
 
Hallo,

ich habs hingekriegt! hier ist der code, falls den jemand mal brauchen würde:

Java:
<t:dataTable 
        var="car"
	value="#{tableBean.carsSmall}"
	styleClass="ecc-table"
	border="0"
	rowClasses="ecc-table-row1,ecc-table-row2"
	headerClass="ecc-table-header"
        sortColumn="#{tableBean.sortColumn}"
        sortAscending="#{tableBean.sortAscending}"
        preserveDataModel="true"
        preserveSort="true">
			
	<t:column>
		<f:facet name="header">
			<t:commandSortHeader columnName="model" arrow="true">
				<h:outputText value="Model" />
			</t:commandSortHeader>
		</f:facet>
		<h:outputText value="#{car.model}" />
	</t:column>

und im java code muss folgendes in der bean implementiert werden.

Java:
public void sort(final String column){
	Comparator<Car> comparator = new Comparator<Car>()
	{
		@Override
		public int compare(Car car1, Car car2)
		{		
			if(column == null)
				return 0;
				
			if(column.equals("model")){
				return sortAscending ? car1.getModel().compareTo(car2.getModel()) : car2.getModel().compareTo(car1.getModel());
			} 
				
			if(column.equals("manufacture")){
				return sortAscending ? car1.getManufacturer().compareTo(car2.getManufacturer()) :  car2.getManufacturer().compareTo(car1.getManufacturer());
			}
				
			return 0;
		}
	}; 
	Collections.sort(carsSmall, comparator);
}

Diese Methode sollte dann aufgerufen werden, nachdem die Liste erstellt wurde. Dazu müssen noch 2 Variablen (column, ascending) in der Bean angelegt werden.

- "column" dient dazu, die Spalte zu speichern, die gerade sortiert ist.
- "ascending" dient dazu, um sich zu merken ob jetzt ascending oder descending sortiert werden soll.

Gruß
Waldek87
 

Zurück
Oben