Load Javascript files in CakePHP Layout at "bottom"

akohout picture akohout · Dec 29, 2012 · Viewed 14.1k times · Source

Currently, I have a big CakePHP application with a layout and a lot of views. In the layout, I load Javascript files in the head which are needed by most views. In the views themself, I either load additional Javascript files (e.g., load a library file that is only needed there), or I add some Javascript code that is only relevant for this view in a script tag, for example if I need a click handler.

Since it is a known fact that loading Javascript files in the HTML head blocks loading the page, I wanted to put them at the bottom before closing the body Tag. But if I do so, the Javascript in my views that load the content breaks because it does not know about my loaded Javascript files. I understand that the Javascript code in the loaded views is executed before my files are loaded. But how can I prevent that?

I'm currently using the HTML Helper in the Layout (and everywhere else) to load my JS files like this:

<?php echo $this->Html->script('//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'); ?>

And I use the JS Helper to "output" JS at the end of the page with

<?php echo $this->Js->writeBuffer(); ?>

Is there a way I can append my JS code in the views, so that it is executed when I call writeBuffer? Can that help me out?

Answer

chronon picture chronon · Jan 1, 2013

Since CakePHP version 2.1 you can use script blocks:

// in your view
$this->Html->script('filename', array('block' => 'scriptBottom'));

// in your layout
echo $this->fetch('scriptBottom');

This approach lets you keep echo $this->fetch('script') in the <head> of your layout in case you need any scripts at the top.