Javascript in PRADO, Questions and Answers
How do I include the Javascript libraries distributed with Prado?
The javascript libraries distributed with Prado can be found in the
framework/Web/Javascripts/source directory. The packages.php
file in that directory defines a list of available package names available
to be loaded. They can be loaded as follows.
- Adding libraries in the template
<com:TClientScript PradoScripts="effects" />
- Adding libraries in PHP code
$this->getPage()->getClientScript()->registerPradoScript("effects");
The available packaged libraries included in Prado are
- prado : basic PRADO javascript framework based on Prototype
- effects : visual effects from script.aculo.us
- ajax : ajax and callback related based on Prototype
- validator : validation
- logger : javascript logger and object browser
- datepicker : datepicker
- colorpicker : colorpicker
The dependencies for each library are automatically resolved. Components
that require a particular library will also automatically load the necessary libraries.
For example, if you add a TDatePicker component on the page, the datepicker
and its dependencies will be automatically included on the page.
See TClientScript for options of adding
your custom Javascript code to the page.
Publishing Javascript Libraries as Assets
Use TClientScriptLoader to publish and combine multiple existing javascript files (e.g. javascript libraries distributed with Prado or otherwise)
as packages.
For greater control on what and when to publish, use the
registerJavascriptPackages($base, $packages, $debug=null, $gzip=true)
method in the TClientScriptManager class, which an instance can be obtained
using $this->getPage()->getClientScript() or its equivalents.
For example, if multiple controls will use the same set of javascript libraries,
write a class to handle the registration of packages required by those controls.
class MyJavascriptLib extends TComponent
{
private $_packages=array(); //keep track of all registrations
private $_manager;
protected function __construct(TPage $owner)
{
$this->_manager = $owner->getClientScript();
$owner->onPreRenderComplete = array($this, 'registerScriptLoader');
}
public static function registerPackage(TControl $control, $name)
{
static $instance;
if($instance===null)
$instance=new self($control->getPage());
$instance->_packages[$name]=true;
}
protected function registerScriptLoader()
{
$dir = dirname(__FILE__).'/myscripts'; //contains my javascript files
$scripts = array_keys($this->_packages);
$url = $this->_manager->registerJavascriptPackages($dir, $scripts);
$this->_manager->registerScriptFile($url,$url);
}
}
// example control class using the javascript packages
class TestComp extends TControl
{
public function onPreRender($param)
{
parent::onPreRender($param);
MyJavascriptLib::registerPackage($this,'package1');
}
}
$Id$