tags:

views:

93

answers:

1

Hello,

Let's consider that I want to extend an existing JSF component, such as the <rich:datatable/>. My main requirement is to dynamically modify the content of a <f:facet>, to change its content.

What is the best way to achieve that? Or where is the best place in the code to achieve that?

In my faces-config.xml, I have the following declaration:

<faces-config>
    ...
    <component>
        <component-type>my.component.dataTable</component-type>
        <component-class>my.project.component.table.MyHtmlDataTable</component-class>
    </component>
    ...
    <render-kit>
        <render-kit-id>HTML_BASIC</render-kit-id>
        <renderer>
            <component-family>org.richfaces.DataTable</component-family>
            <renderer-type>my.renderkit.dataTable</renderer-type>
            <renderer-class>my.project.component.table.MyDataTableRenderer</renderer-class>
        </renderer>
        ...

Also, my my-project.taglib.xml file (as I use Facelets) looks like:

<facelet-taglib>
    <namespace>http://my.project/jsf&lt;/namespace&gt;
    <tag>
        <tag-name>dataTable</tag-name>
        <component>
            <component-type>my.component.dataTable</component-type>
            <renderer-type>my.renderkit.dataTable</renderer-type>
        </component>
    </tag>

So as you can see, I have two classes in my project for my custom datatable: MyHtmlDataTable and MyDataTableRenderer. One of my idea is to modify the content of the <f:facet> directly in the doEncodeBegin() method of my renderer. This is working (in fact almost working), but I don't really think that's the better place to achieve my modification.

What do you think?

Technical information: JSF 1.2, Facelets, Richfaces 3.3.2, Java 1.6

A: 

I guess you can call getFacet(facetName) and make the modifications on the returned component.

You can override getFacets() (and/or getFacet(..)), call the super method and make the modifications on the returned value, and then return it.

Bozho
Yes, that's exactly what I do, but my question is to know where I have to do that? Because for the moment, I do the modification on the renderer class, during the RENDER_VIEW phase, but I am not fully satisfied with this solution...
romaintaz
see my update .
Bozho