2009-06-30 7 views
0

J'ai une application Seam générée à l'origine par seam-gen avec une vue Search.xhtml. Search.xhtml a un certain nombre de champs d'entrée, dont la moitié sont liés à l'entité Office et la moitié à l'entité Devices. Par exemple, si vous entrez un nom d'hôte, il est lié à un champ dans Périphériques. Si vous entrez une ville, il est lié à un champ dans Office.Comment conditionner la navigation en couture sur un paramètre

La page de destination sera OfficeResult.xhtml par défaut ou, si une propriété "Devices" a été entrée, à DeviceResult.xhtml.

Ma question a 2 parties:

  1. Quelle composante dois-je utiliser dans Search.xhtml pour le bouton d'envoi? Je suppose h: commandButton, mais qu'est-ce que j'utilise pour l'action? Si j'utilise une vue de destination, cela sera-t-il remplacé par la règle de navigation dans le fichier page.xml?

  2. Comment configurer mon fichier Search.page.xml? Comment conditionner la navigation sur le paramètre?

est ici Search.xhtml (pseudo code):

<h:inputText value="#{devicesList.devices.devSerialNum}" /> 
<h:inputText id="state" value="#{officeList.office.state}" /> 

<h:commandButton id="search" action="/OfficeResult.xhtml" value="Search" /> 

Search.page.xml (pseudo code):

<navigation> 
    <rule if devSerNum is set > 
<redirect view-id="/DeviceResult.xhtml"/> 
    </rule> 
    <rule if state is set > 
    <redirect view-id="/OfficeResult.xhtml"/> 
    </rule> 
</navigation> 
+0

Mise à jour: Je suis devenu aussi loin que ce qui suit: dans la vue: dans le page.xml: \t Je ne peux toujours pas obtenir de règle pour fonctionner. J'ai même essayé: Ce doesn ne me prends même pas à OfficeResult.xhtml. Je ne peux obtenir aucune règle ou si = conditionnel au travail. ? –

Répondre

0

Si je comprends bien votre question, et en fonction de votre conception actuelle, je crois que vous pourriez faire quelque chose de semblable à ceci:

Votre Search.xhtml fichier:

<h:inputText value="#{devicesList.devices.devSerialNum}" /> 
<h:inputText id="state" value="#{officeList.office.state}" /> 

<h:commandButton id="search" action="#{devicesList.isDeviceSearch()}" value="Search" /> 

Ajouter une nouvelle méthode pour votre DevicesList.java fichier

@Name("devicesList") 
public class DevicesListImpl implements DevicesList { 

    ...other properties and methods... 

    public boolean isDeviceSearch() { 

     boolean result; 

     ...logic to determine if the search value exists... 

     return result; 

    } 
} 

Et puis dans votre Search.page.xml fichier:

<navigation from-action="#{devicesList.isDeviceSearch()}"> 
    <rule if-outcome="true"> 
     <redirect view-id="/DeviceResult.xhtml" /> 
    </rule> 

    <redirect view-id="/OfficeResult.xhtml" /> 
</navigation> 
+0

En fait, j'ai fini par faire quelque chose comme ça. Mais au lieu d'ajouter la navigation dans le fichier page.xml, j'ai trouvé beaucoup plus simple de renvoyer simplement le view-id du sous-programme. En d'autres termes, au lieu de "résultat de retour"; J'ai renvoyé conditionnellement "/DeviceResult.xhtml" ou "/OfficeResult.xhtml" de isDeviceSearch(). –

+0

Oui, c'est une autre façon de le faire, même si certains avancent que vous mélangez votre logique de navigation avec votre logique métier, c'est-à-dire, votre classe DevicesList devrait-elle connaître les pages et celles qui devraient être rendues? Mais c'est quelque chose pour vous de décider. Heureux que tu es parvenu à le faire fonctionner ;) –

0

J'ai eu du mal à comprendre comment la navigation fonctionne aussi bien. Je travaille moi enfin dans une certaine mesure, voici quelques idées que je voudrais essayer:

  1. utilisation pages.xml d'abord avec un pour vérifier que vous pouvez obtenir votre navigation travailler avec la valeur par défaut, ruleset simple. /WEB-INF/pages.xml

  2. Activez le niveau de journal de suivi pour votre application si vous n'êtes pas sûr de ce qui se passe, il est possible que Seam ne trouve pas de composant. 2.1 # {devicesList ...} peut ne pas être trouvé si vous ne l'importez pas dans votre fichier components.xml à moins que le nom de ce composant ne soit devicesList. Mes composants utilisent leur nom complet, com.stackoverflow ... L'avantage est que vous évitez les collisions, mais pour accéder au composant, vous devez écrire le chemin complet ou faire une importation comme décrit ci-dessus.

  3. Vérifiez l'ID de vue existent (/OfficeResult.xhtml et /DeviceResult.xhtml)

  4. Assurez-vous que chaque page est déclarée qu'une seule fois

  5. votre commandButton devrait être une composante réelle de ma compréhension. Si vous avez un searchAction, alors ce serait quelque chose comme:

    # {} searchAction.search

Vérifiez les exemples de couture, ils fonctionnent bien et vous montrer comment faire beaucoup de choses différentes. Vous pouvez les télécharger dans le code source de couture qui est d'environ 130 Mo, y compris tous ces exemples.

Walter