2017-10-20 26 views
0

J'explique mon problème:Pourquoi le portlet est renderRequest.setAttribute renvoie la dernière variable?

J'utilise Liferay 6.1 et j'essaie de comprendre le fonctionnement du panneau de contrôle Documents and Media.

  • À mon avis portlet J'ai une table qui affiche une liste de documents de ces champs est la date de modification. Par défaut, cette date est la date de modification du fichier. Dans le code java j'ai besoin de cocher ce champ de date (optionnel), s'il est vide je garde l'ancien code (affiche la date de modification du document) s'il n'est pas vide alors je veux afficher sa valeur à la place (la valeur de la date optionnelle).

  • J'ai créé un type de document et j'ai ajouté un champ dans le type de document appelé date (facultatif) pour ajouter manuellement la date. Une des choses que je n'ai pas compris, en essayant d'ajouter un champ ddm-date de champ le champ de date devrait avoir une valeur par défaut, il ne peut pas être vide ai-je tort?

Mon premier problème, comment définir ddm-date de type à vide?

  • Dans la création du champ quand je frapperai d'aucune de la valeur preferred la CMS change automatiquement à une valeur par défaut et dans le formulaire (lors de l'ajout nouveau fichier) les renseignements de la date en option ne contient pas une valeur vide comme je le vois (par défaut, il contient la date du jour). J'ai donc utilisé le champ texte comme type.

Mon principal problème:

I la date affichée facultative, mais elle écrasera toutes les dates de création. dans l'affichage je reçois seulement la date optionnelle et la dernière. J'explique quand j'ajoute un fichier du panneau de contrôle de Documents and Media avec le champ date optionnel par exemple avec la valeur '2012/08/01', toutes les valeurs dans la table sont remplacées par cette valeur.

J'ai envoyé ma variable à partir du code Java en utilisant renderRequest.setAttribute et je l'ai affiché à mon avis avec le tag JSTL - Core <fmt: formatDate value = "$ {optionalDate}" pattern = "MMM yyyy" />. mon portlet s'étend également à partir de MVCPortlet.

Pourquoi doView est le rendu renderRequest.setAttribute renvoie la dernière variable?

Dans mon code java:

for(DLFileEntry file : listFiles){ 
    try { 
    Map<String, Fields> fieldsMap = file.getFieldsMap(file.getFileVersion().getFileVersionId()); 
     if(fieldsMap.values().size() <= 0) 
      listContextFiles.remove(file); 

    for (Fields fields : fieldsMap.values()) { 
    if(...){ 
     if(...){ 
     } 
     else{ 
     if(fields.get("optionaldate") != null) { 
     DateFormat dateFormat1 = new SimpleDateFormat("yyyy/MM/dd"); 
     String _optionalDate = (String) fields.get("optionaldate").getValue(); 
     Date optionalDate = dateFormat1.parse(_optionalDate); 
     file.setModifiedDate(optionalDate); 
     renderRequest.setAttribute("optionalDate", optionalDate); 
     System.out.println(file.getModifiedDate()); 
     listDate.add(dateFormat.format(file.getModifiedDate())); 
     } 
     else{ 
      renderRequest.setAttribute("optionalDate", file.getModifiedDate());     
      if(!listDate.contains(dateFormat.format(file.getModifiedDate()))){ 
      listDate.add(dateFormat.format(file.getModifiedDate())); 
      } 
     } 
     //other conditions 
    } 
... 

Dans mon view.jsp:

<liferay-ui:search-container iteratorURL="<%=actionURL%>" delta="10" 
     emptyResultsMessage="no-documents"> 
     <liferay-ui:search-container-results total="<%=list.size()%>" 
      results="<%=ListUtil.subList(list, 
             searchContainer.getStart(), 
             searchContainer.getEnd())%>" /> 
     <liferay-ui:search-container-row modelVar="file" 
      className="DLFileEntry"> 

      <!--other code--> 

      <liferay-ui:search-container-column-text name='date' 
       cssClass="txt-capitalize width-10"> 
       <fmt:formatDate value="${optionalDate}" pattern="MMM yyyy" /> 
      </liferay-ui:search-container-column-text> 

      <!--other code--> 

     </liferay-ui:search-container-row> 

    </liferay-ui:search-container> 

est-il un moyen propre à faire tout cela? Quelqu'un peut-il me dire ce qui ne va pas avec mon code?

+0

Bonjour, je peux trouver une solution. Ma question est toujours en attente. –

+0

Quelqu'un peut-il me dire quel est le problème avec mon code? –

Répondre

1

Si vous détendant toutes les boucles, d'abord en Java, puis dans la page JSP, que vous exécutez essentiellement ces commandes (dans cet ordre), compte tenu de 3 objets à afficher:

renderRequest.setAttribute("optionalDate", someDate); 
renderRequest.setAttribute("optionalDate", someOtherDate); 
renderRequest.setAttribute("optionalDate", yetSomeOtherDate); 

suivi par la lecture la valeur de la JSP:

renderRequest.getAttribute("optionalDate"); 
renderRequest.getAttribute("optionalDate"); 
renderRequest.getAttribute("optionalDate"); 

Comme setAttribute n'est pas pushToQueue et getAttribute n'est pas nextFromQueue (au sens figuré), vous obtenez seulement yetSomeOtherDate pour toutes les itérations de la boucle JSP, naturellement .

Vous pouvez

  • calculer la valeur de votre JSP,
  • magasin un objet qui fait le calcul pour vous, en fonction de l'objet courant,
  • magasin l'attribut en utilisant l'ID de l'objet comme une partie de sa clé, par exemple "optionalDate-" + file.getId() au lieu de seulement le générique "optionalDate". Utilisez ensuite la même construction de clé dans la JSP pour lire la valeur correcte. (À mon humble avis, c'est assez inélégant, mais pourrait être pragmatique pour votre utilisation)