To have a better controle on script you can implement like me your own
DocumentScriptBuilderImpl

And override the existing with this code in your app module :


public PageRenderInitializer buildMyPageRenderInitializer(final
List<PageRenderCommand> configuration,
                                                             final
Environment environment) {
       return new PageRenderInitializer() {
           public void cleanup(MarkupWriter writer) {
               Iterator<PageRenderCommand> i =
InternalUtils.reverseIterator(configuration);
               while (i.hasNext())
                   i.next().cleanup(environment);

               environment.clear();
           }

           public void setup(MarkupWriter writer) {
               environment.clear();

               environment.push(MarkupWriter.class, writer);
               environment.push(Document.class, writer.getDocument());

               for (PageRenderCommand command : configuration)
                   command.setup(environment);
           }
       };
   }

   public void
contributeMyPageRenderInitializer(OrderedConfiguration<PageRenderCommand>
configuration,
                                                 ThreadLocale threadLocale,

@Path("org/apache/tapestry/default.css")
                                                 Asset tapestry_css,
                                                 @Path("my_own.css")
                                                 Asset my_own_css,

@Path("org/apache/tapestry/field-error-marker.png")Asset fieldErrorIcon,
                                                 ValidationMessagesSource
validationMessagesSource,
                                                 final SymbolSource
symbolSource,
                                                 final AssetSource
assetSource) {
       configuration.add("PageRenderSupport", new PageRenderCommand() {
           public void cleanup(Environment environment) {
               environment.pop(PageRenderSupport.class);
               Document document = environment.peek(Document.class);
               DocumentScriptBuilder builder = environment.pop(
DocumentScriptBuilder.class);
               builder.updateDocument(document);
           }

           public void setup(Environment environment) {
               DocumentScriptBuilder builder = new
MyOwnDocumentScriptBuilderImpl();
               environment.push(DocumentScriptBuilder.class, builder);
               environment.push(PageRenderSupport.class, new
PageRenderSupportImpl(builder,
                       symbolSource, assetSource));
           }
       });

       configuration.add("Heartbeat", new PageRenderCommand() {
           public void cleanup(Environment environment) {
               environment.pop(Heartbeat.class).end();
           }

           public void setup(Environment environment) {
               HeartbeatImpl heartbeat = new HeartbeatImpl();
               heartbeat.begin();
               environment.push(Heartbeat.class, heartbeat);
           }
       });

       configuration.add("InjectTapestryStylesheet", new
InjectStandardStylesheetCommand(tapestry_css));
       configuration.add("InjectBaseStylesheet", new
InjectStandardStylesheetCommand(my_own_css,));
       configuration.add("DefaultValidationDelegate", new
DefaultValidationDelegateCommand(threadLocale, validationMessagesSource,
fieldErrorIcon));
   }


   public static void
contributeAliasOverrides(Configuration<AliasContribution> configuration,

@InjectService("MyPageRenderInitializer")PageRenderInitializer
pageRenderInitializer) {
       configuration.add(AliasContribution.create(
PageRenderInitializer.class, pageRenderInitializer));
   }

And you can controle the script render like this  (in your own
DocumentScriptBuilderImpl)

public void updateDocument(Document document) {
       Element head = document.find("html/head");
       Element body = document.find("html/body");

       if (head == null || body == null)
           return;

       for (int i = 0; i < scripts.size(); i++) {
           String scriptURL = scripts.get(i);
           head.elementAt(i, "script", "src", scriptURL, "type",
"text/javascript");
       }

       if (scriptBlock.length() > 0)
       {
           ...
       }




On 7/17/07, Todd Orr <[EMAIL PROTECTED]> wrote:

Thanks! These both work, sort of. The renderSupport puts the script
tag in the body tag (5.0.5). So, its not a huge improvement. While the
more manual solution of adding the element works well enough, neither
of these solutions easily allow arbitrary blocks to be inserted. I
think this would be the holy grail of this situation.

1. Define a Block of code (declaratively in your template)
2. Insert Block into head

With the Element and RenderSupport solutions I imagine the the
plumbing exists to do this. I'll have to dig deeper into the how's to
figure it out.

Thanks again.

On 7/17/07, David Avenante <[EMAIL PROTECTED]> wrote:
> I think something like that work :
>
> @Environmental
>     private PageRenderSupport renderSupport;
>
>     @Inject
>     @Path("myScript.js")
>     private Asset myScript;
>
>
>  renderSupport.addScriptLink(myScript);
>
> ---------------------------------------------------------------------
> 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]


Reply via email to