Sorry, you're right: The component is basically a compilation of Radio and RadioGroup. I use a static Map to secure the unique names of [EMAIL PROTECTED]'s. In setupRender() I prepare the environment in cleanupRender() I wrap it up.

Here's the code ...


package com.michaelgerzabek.services.web.components;

import java.util.HashMap;
import java.util.Map;

import org.apache.tapestry.Binding;
import org.apache.tapestry.ComponentAction;
import org.apache.tapestry.ComponentResources;
import org.apache.tapestry.Field;
import org.apache.tapestry.MarkupWriter;
import org.apache.tapestry.PageRenderSupport;
import org.apache.tapestry.RadioContainer;
import org.apache.tapestry.ValueEncoder;
import org.apache.tapestry.annotations.Environmental;
import org.apache.tapestry.annotations.Parameter;
import org.apache.tapestry.internal.TapestryInternalUtils;
import org.apache.tapestry.ioc.annotations.Inject;
import org.apache.tapestry.services.ComponentDefaultProvider;
import org.apache.tapestry.services.Environment;
import org.apache.tapestry.services.FormSupport;
import org.apache.tapestry.services.Request;
import org.apache.tapestry.services.ValueEncoderSource;

public class Radio implements Field {

   @Parameter(required = false, defaultPrefix = "literal")
   private String _id;
   private String _clientId;
@Parameter(defaultPrefix = "literal")
   private String _label;
@Parameter("false") private boolean _disabled; @Parameter(required = false)
   private ValueEncoder _encoder;
@Parameter(required = true, principal = true, defaultPrefix="literal")
   private Object _value;
@Parameter(required = true, defaultPrefix="literal")
   private String _name;
public String getElementName() { return _name;
   }

   @Inject
   private ComponentDefaultProvider _defaultProvider;
@Inject
   private ValueEncoderSource _valueEncoderSource;
String defaultLabel() { return _defaultProvider.defaultLabel( _resources );
   }

   Binding defaultValue() {
return _defaultProvider.defaultBinding( "value", _resources );
   }
final ValueEncoder defaultEncoder() { return _valueEncoderSource.createEncoder( "value", _resources );
   }
public String getLabel() { return _label;
   }

   public boolean isDisabled() {
return _disabled;
   }

   public String getClientId() {

       return _clientId;
   }
@Inject
   private PageRenderSupport _pageRenderSupport;
/** ------------------------------------------------------------
    * Markup generieren für <[EMAIL PROTECTED]/>
    */
void beginRender( MarkupWriter writer ) { RadioContainer _container = _environment.peek( RadioContainer.class );
       String value = _container.toClient( _value );

       _clientId = _pageRenderSupport.allocateClientId( _id );
       _name = _container.getElementName();

       writer.element(
               "input",
               "type",
               "radio",
               "id",
               _clientId,
               "name",
               _name,
               "value",
               value);

if ( _container.isSelected( _value ) ) writer.attributes( "checked", "checked" );
   }

   void afterRender( MarkupWriter writer ) {
writer.end();
   }
/** ------------------------------------------------------------
    * Die Container-Organisation
    */
private static Map<String, RadioContainer> radioGroups = new HashMap<String, RadioContainer>(); @Environmental
   private FormSupport _formSupport;

   @Inject
   private Environment _environment;
@Inject
   private ComponentResources _resources;
@Inject
   private Request _request;
private Object _clientValue; private void setup( String elementName ) { _name = elementName;
   }
private void processSubmission() { String clientValue = _request.getParameter( _name );

       Object value = _encoder.toValue( clientValue );

       _clientValue = value;
   }
private static class Setup implements ComponentAction<Radio> { private static final long serialVersionUID = -7984673040135949374L;

       private final String _elementName;

       Setup( String elementName )
       {
           _elementName = elementName;
       }

       public void execute( Radio component )
       {
           component.setup( _elementName );
       }
   };
private static final ComponentAction<Radio> PROCESS_SUBMISSION = new ComponentAction<Radio>()
   {
       private static final long serialVersionUID = -3857110108918776386L;

       public void execute( Radio component )
       {
           component.processSubmission();
       }
   };
/**
    * Environment herstellen
    */
   final void setupRender() {
String name = _formSupport.allocateElementName( _resources.getElementName() ); RadioContainer radioContainer = radioGroups.get( name ); if ( null == radioContainer ) { ComponentAction<Radio> action = new Setup( name );
           _formSupport.storeAndExecute( this, action );
radioGroups.put( name, new RadioContainer() { public String getElementName() { return _name;
               }
public boolean isDisabled() { return _disabled;
               }
@SuppressWarnings("unchecked")
               public String toClient( Object value ) {
if ( null == _encoder )
                       return value.toString();
                   return _encoder.toClient( value );
               }
public boolean isSelected( Object value ) { return TapestryInternalUtils.isEqual( value, _clientValue );
               }
}); _formSupport.store( this, PROCESS_SUBMISSION );
       }
       _environment.push( RadioContainer.class, radioContainer );
   }
/**
    * Environment aufräumen
    */
   final void cleanupRender() {
_environment.pop( RadioContainer.class );
   }

}


Nick Westgate schrieb:
Hard to say without seeing the source and how you are using the component.

Cheers,
Nick.


Michael Gerzabek wrote:
I implemented an alternative radio component. When I debug my setupRender() the parameters from the template are all null. When I look into the ComponentResources in _bindings there are all my Parameters but the annotated values in my own component seem never be initialized.

What am am I missing?


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to