[ 
https://issues.apache.org/jira/browse/MYFACES-4026?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15093493#comment-15093493
 ] 

Thomas Herzog commented on MYFACES-4026:
----------------------------------------

No one interested, or need further information ? 

> Composite Component cc.clientId not usable in custom tag
> --------------------------------------------------------
>
>                 Key: MYFACES-4026
>                 URL: https://issues.apache.org/jira/browse/MYFACES-4026
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: General
>    Affects Versions: 2.1.17
>            Reporter: Thomas Herzog
>            Priority: Trivial
>         Attachments: demo.zip
>
>
> If you use the cc.clientId in a custom tag, then the wrong ids are generated. 
> {code:xml}
> <composite:implementation>
>       <cure:grid id="#{cc.clientId}">
>               <cure:gridRow>
>                       <cure:gridCol width="12">
>                               my col
>                       </cure:gridCol>
>               </cure:gridRow>
>       </cure:grid>
> </composite:implementation>
> {code}
> Here we need an id otherwise an update on this component will fail since 
> there wouldn't be an html node on the client side which contents can be 
> replaced by an update. There are some cases where the composite component is 
> not allowed to define an div which holds the client id.
> {code:xml}
> <composite:implementation>
> <!-- Would break grid container specification -->
> <div id="#{cc.clientid}">
>               <cure:gridRow>
>                       <cure:gridCol width="12">
>                               my col
>                       </cure:gridCol>
>               </cure:gridRow>
> <div>
> </composite:implementation>
> {code}
> We think this is caused by the fact that the cc.clientId is accessed during 
> build view time and gets cached in the UIComponentBase. At this time the 
> cc.clientId is empty. This seems to be a common issue, because cc.clientId 
> can never be accessed at build view time.
> {code:title="UIComponentBase#getClientId"}
>     @Override
>     public String getClientId(FacesContext context)
>     {
>         if (context == null)
>         {
>             throw new NullPointerException("context");
>         }
>         if (_clientId != null)
>         {
>             return _clientId;
>         }
> ...
> }
> {code}
> {code:xml|title="one of the custom tags we use"}
> <ui:composition
>     xmlns:c="http://java.sun.com/jsp/jstl/core";
>     xmlns:f="http://java.sun.com/jsf/core";
>     xmlns:h="http://java.sun.com/jsf/html";
>       xmlns:p="http://primefaces.org/ui";
>     xmlns:ui="http://java.sun.com/jsf/facelets";>
>     
>     <c:set var="styleClass" value="#{not empty styleClass ? styleClass : ''}" 
> />
>     <c:set var="style" value="#{not empty style ? style : ''}" />
>     <c:set var="rendered" value="#{not empty rendered ? rendered : true}" />
>     <c:set var="isFormRow" value="#{not empty isFormRow and isFormRow}" />
>       
>       <c:if test="#{not empty id}">
>               <h:panelGroup id="#{id}" layout="block" styleClass="#{isFormRow 
> ? 'form-row' : ''} #{styleClass} ui-grid-row" style="#{style}" 
> rendered="#{rendered}">
>                       <ui:insert/>
>               </h:panelGroup>
>       </c:if>
>       
>       <c:if test="#{empty id}">
>               <h:panelGroup layout="block" styleClass="#{isFormRow ? 
> 'form-row' : ''} #{styleClass} ui-grid-row" style="#{style}" 
> rendered="#{rendered}">
>                       <ui:insert/>
>               </h:panelGroup>
>       </c:if>
>       
> </ui:composition>
> {code}
> {code:html|title="resulting html"}
> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"; >
> <html xmlns="http://www.w3.org/1999/xhtml";>
>    <head></head>
>    <body>
>       <form id="myForm1" name="myForm1" method="post" 
> action="/jsf2-basic-portlet/index.xhtml" 
> enctype="application/x-www-form-urlencoded">
>          <div id="composite1:composite1" class=" ui-grid ui-grid-responsive">
>             <div class="  ui-grid-row">
>                <div class=" ui-grid-col-12">
>                   my col
>                </div>
>             </div>
>          </div>
>          <input type="hidden" name="myForm1_SUBMIT" value="1" /><input 
> type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" 
> value="puXzCX78lsGwm5D7TAEgUKup9vm0hFpybGfw7y1R85EQt46s" />
>       </form>
>       <form id="myForm2" name="myForm2" method="post" 
> action="/jsf2-basic-portlet/index.xhtml" 
> enctype="application/x-www-form-urlencoded"><span 
> id="myForm2:composite2:myOutputText">OutputText</span><input type="hidden" 
> name="myForm2_SUBMIT" value="1" /><input type="hidden" 
> name="javax.faces.ViewState" id="javax.faces.ViewState" 
> value="puXzCX78lsGwm5D7TAEgUKup9vm0hFpybGfw7y1R85EQt46s" /></form>
>    </body>
> </html>
> {code}
> I have an sample which I could provide but here is no option to upload it.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to