You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Thomas Herzog (JIRA)" <de...@myfaces.apache.org> on 2015/12/22 14:56:46 UTC

[jira] [Created] (MYFACES-4026) Composite Component cc.clientId not usable in custom tag

Thomas Herzog created MYFACES-4026:
--------------------------------------

             Summary: 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


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)