Tapestry's Submit component renders out as <input type="submit">. Since HTML 4.0 a submit button can be written as <button type="submit">. I prefer this approach, because it makes it easier to distinguish between real input elements (especially textfields) and buttons. I have created a JIRA request for this: https://issues.apache.org/jira/browse/TAP5-1545
Hopefully it will get implemented in future Tapestry versions.

In the meanwhile I have helped myself out with a mixin that is able to change the markup of the element (element name and attributes) it is attached to. In case someone else finds this usefull this is the code:

import java.util.Collection;
import java.util.List;

import org.apache.tapestry5.BindingConstants;
import org.apache.tapestry5.MarkupWriter;
import org.apache.tapestry5.annotations.AfterRender;
import org.apache.tapestry5.annotations.BeforeRenderTemplate;
import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.dom.Attribute;
import org.apache.tapestry5.dom.Element;
import org.apache.tapestry5.dom.Node;

/**
 * Mixin that changes the markup of an element to desired values.
 */
public final class MarkupChanger {

    /**
     * The desired new name for the element.
     */
@Parameter(required = true, allowNull = false, defaultPrefix = BindingConstants.LITERAL)
    private String newElemName;

    /**
* A string containing pairs of attribute names and values separated by ",".
     */
    @Parameter(allowNull = false, defaultPrefix = BindingConstants.LITERAL)
    private String newAttribs;

    /**
     * The {@link Element} to change the markup.
     */
    private Element originalElem;

    /**
* In this render phase we can easily get the element that this mixin is
     * placed into by calling writer.getElement.
     *
     * @param writer
     *          {@link MarkupWriter} injected by Tapestry.
     */
    @BeforeRenderTemplate
    final void determineOriginalElem(final MarkupWriter writer ) {

        this.originalElem = writer.getElement();
    }

    /**
* We do all the rewriting of markup in the final phase not to interfere with
     * the render phases of the original element.
     *
     * @param writer
     *          {@link MarkupWriter} injected by Tapestry.
     */
    @AfterRender
    final void changeMarkup(final MarkupWriter writer ) {

        // Create a new element with the desired new name.
        final Element newElem = writer.element(this.newElemName);

        // Add all original attributes to the newly created element.
final Collection<Attribute> attribs = this.originalElem.getAttributes();

        for (final Attribute attrib : attribs) {

            newElem.attribute(attrib.getName(), attrib.getValue());
        }

// Add new attributes to the new element, possibly overwriting original ones.
        if (this.newAttribs != null && !this.newAttribs.isEmpty()) {

            final String[] attribArr = this.newAttribs.split(",");

            // parse null-String to null.
            for (int i = 0; i < attribArr.length; i++) {

                if ("null".equals(attribArr[i])) {

                    attribArr[i] = null;
                }
            }

            newElem.forceAttributes(attribArr);
        }

// Get children from the original element and add them to the new one.
        final List<Node> children = this.originalElem.getChildren();

        for (final Node node : children) {

            node.moveToBottom(newElem);
        }

        // End tag for new element.
        writer.end();

        // Remove the original element from DOM.
        this.originalElem.remove();
    }
}

Cheers nillehammer

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to