+1 If 'renderExtraAttributes' always renders the last attributes of the tag this looks clean to me. This would allow rendering multiple <input> or other tags with the single tag.
Edgar > -----Original Message----- > From: Sgarlata Matt [mailto:[EMAIL PROTECTED] > Sent: Sunday, September 28, 2003 11:02 AM > To: Struts Developers List > Subject: [VOTE] Accept patches to make html taglib more extensible > > > I hope it's OK for a non-committer to start a vote. I know > this has been a contentious issue, so I would like to clearly > outline my plan for making the html taglibs more extensible > and I would like a vote before I go to all the trouble of > coding, updating documentation, resolving bugfixes, answering > questions, etc. > > DESIRED FUNCTIONALITY > The ability to cleanly extend the Struts tags. The tags are > so good that when an application-specific requirement arises, > it's much more desirable to extend from the Struts tag and > keep tie-ins with ActionForms and such than it is to go off > on your own. > > PROPOSED SOLUTION > The solution is two parts. Please vote separately for each > part of the solution. > A) Instead of accessing instance variables directly, use getters. > > <snip from="BaseFieldTag.java"> > if (accept != null) { > results.append(" accept=\""); > //old way > //results.append(accept); > //new way > results.append(getAccept()); > results.append("\""); > } > </snip> > > If someone wanted to override the accept attribute so that it > was always equal to foo then they would be able to do so. A > better use case would be overriding the onclick method so > that it does something special like display a calendar popup. > Getters are actually already used in some places (e.g. - > prepareMouseEvents in BaseHandlerTag), so really this is just > doing an audit on the code to ensure getters are used > consistently throughout the taglib. > > Use case for Part A: > I built an implementation > of Matt Kruse's JavaScript calendar widget based on the > Struts tags a few weeks before Matt made his own > implementation, so I have some experience doing this. As > some brief background, the widget is a text box and a > corresponding calendar icon. When you click on the calendar > icon a popup appears where you can choose the date. When you > click on the text box (which is what overrides a Struts tag) > you want onfocus to automatically call this.blur() so that > the user can't enter text into the textbox (that's the > calendar popup's job). So in my subclass it would be nice to > override the getOnfocus() method instead of overriding the entire > renderIForgetWhatItIsCalled() method. Of course in this > particular instance > getOnfocus() is already being used instead of onfocus being > accessed directly, but I think this behavior should be > consistent for all attributes. > > B) Add a new renderExtraAttributes() method that gives people > the chance to throw non-standard HTML into their tags that > extend from Struts tags. > > <snip from="BaseFieldTag.java"> > results.append("\""); results.append(this.prepareEventHandlers()); > results.append(this.prepareStyles()); > results.append(this.getElementClose()); > > <matts-idea> > results.append(renderExtraAttributes()); > </matt-sidea> > > return results.toString(); > </snip> > > Use Case for Part B: > > Unfortunately I still can't think of a good HTML 4.01 > compliant use case for > renderExtraAttributes(), but here is a weak try at it. If my other > suggestion of having the render() method call getters instead > of directly accessing instance variables is used, then > renderExtraAttributes() becomes more important. If it is not > provided and someone wants to stick in some non-HTML 4.01 > compliant HTML, what they will do is override something like > the getSize() method so that it correctly renders the size > and then sticks in the understandard HTML. This is a nasty > hack but you know a programmer will choose that over > duplicating an entire render() method. > > If you made it this far, thanks for reading this long email > ;) I know I've posted much of this before in several > different messages, but hopefully this consolidation is useful. > > Matt > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]