JLoader PHP Class

Tagged: JavaScript, PHP Date: 6th, October 2008

So here is one very simple php class. In past it has proven to be very useful in cases where you need to load multiple javascript files or on large project with a lot of modules (especially if those modules are developed by different persons).
It will help you to avoid double js file loads, it will also help you keep only one copy of each js file on server.

Enjoy:

/**
 * @author Vladimir Cvetic @ Ferdinand Development
 * @email vladimir@ferdinand.rs
 * @phone +381 60 5000240
 *
 * @version 1.0.0
 *
 * Example 1:
 * $jloader = new JLoader();
 * $jloader->load('prototype', '1.6.0.2');
 * $jloader->printjs();
 * Output:
 * 
 *
 * Example 2:
 * $jloader = new JLoader();
 * $jloader->load('prototype', '1.6.0.2');
 * $jloader->load('prototype', false, '/javascript/my_prototype.js');
 * $jloader->printjs();
 * Output:
 * 
 *
 * Example 3:
 * $jloader = new JLoader();
 * $jloader->repository = "/javascript/";
 * $jloader->load('prototype', '1.6.0.2');
 * $jloader->printjs();
 * Output:
 * 
 *
 * Example 4:
 * $jloader = new JLoader();
 * $jloader->repository = "/javascript/";
 * $jloader->load('prototype', '1.6.0.2');
 * $jloader->load('mootools', '1.2');
 * $jloader->load('custom_script', '1.0', '/scripts/custom_script.js', array('scriptaculous','jquery'));
 * $jloader->printjs();
 * Output:
 * 
 * 
 * 
 * 
 * 
 */
class JLoader{

	public $loaded = array();
	public $repository = "/common/jloader";
	public $home_path = "/www/mysite";

	function JLoader()
	{
		return true;
	}

	/**
	 *
	 * @since 1.0.0
	 *
	 * @param string $handler Valid external file handler name.
	 * @param int|bool $ver Optional. Script version number. Default is false.
	 * @param array|bool $depends Array of valid handler dependencies.
	 * @return bool
	 */
	function load($handler, $ver = false, $src = false, $depends=false)
	{
		global $conf;

		if ($src!=false)
		{
			$src = $src;
		}
		elseif ($ver!=false)
		{
			$src = $this->repository."/$handler/$handler.js?ver=$ver";
		}
		else
		{
			$src = $this->repository."/$handler/$handler.js";
		}

		if ($src!=false)
		{
			if (!file_exists($src))
			{
				trigger_error("ExtLoader::load($handler, $ver, $src) sad file ".$src." doesn't exist.");
				return false;
			}
		}
		else
		{
			if (!file_exists($this->home_path.$src))
			{
				trigger_error("ExtLoader::load($handler, $ver, $src) sad file ".$this->home_path.$src." doesn't exist.");
				return false;
			}
		}
		if ($depends!=false)
		{
			foreach($depends as $script)
			{
				$this->load($script);
			}
		}
		$this->loaded[$handler] = '';

		return true;
	}

	/**
	 * Print loaded Javascript files.
	 *
	 * @since 1.0.0
	 *
	 * @return unknown
	 */
	function printjs()
	{

		foreach($this->loaded as $script)
		{
			echo $script."\n";
		}
	}

}

5 Responses to "JLoader PHP Class"

1 | Sean Nieuwoudt

October 7th, 2008 at 12:28 am

Avatar

Done something similar myself for some of my CodeIgniter apps.

Thanks!

2 | Ian

October 7th, 2008 at 6:36 pm

Avatar

I was bored, so I rewrote your code:
<?php
class JLoader{

public $loaded = array();
public $repository = “/common/jloader”;
public $home_path = “/www/mysite”;

/**
*
* @since 1.0.0
*
* @param string $handler Valid external file handler name.
* @param int|bool $ver Optional. Script version number. Default is false.
* @param array|bool $depends Array of valid handler dependencies.
* @return bool
*/
public function load($handler, $ver = false, $src = false, $depends=false)
{
if (!$src)
{
if($ver)
{
$src = $this->repository.”/$handler/$handler.js?ver=$ver”;
} else {
$src = $this->repository.”/$handler/$handler.js”;
}
}

if ($src && !file_exists($src) && !file_exists($this->home_path.$src))
{
trigger_error(”ExtLoader::load($handler, $ver, $src) sad file “.$src.” doesn’t exist in local or home path.”);
return false;
}

if (is_array($depends) && count($depends))
{
foreach($depends as $script)
{
$this->load($script);
}
}
$this->loaded[$handler] = ‘<script type=”text/javascript” src=”%27.$src.%27″></script>’;

return true;
}

/**
* Print loaded Javascript files.
*
* @since 1.0.0
*
* @return unknown
*/
function printjs()
{
foreach($this->loaded as $script)
{
echo $script.”\n”;
}
}
}

3 | Vladimir Cvetic

October 7th, 2008 at 10:03 pm

Avatar

I noticed that validation on:
if ($src && !file_exists($src) && !file_exists($this->home_path.$src))

was not correct your will do better.

But I don’t agree on the
if (is_array($depends) && count($depends))
it’s just silly to check for size of array. Even if size is 0, foreach will not trigger.

4 | Ian

October 8th, 2008 at 9:53 pm

Avatar

The is_array() check prevents PHP from possibly throwing type mismatch warnings on the subsequent calls which are only meant for arrays. The count() check only saves a few CPU cycles in this case, but it is a good best practice to use these two in tandem.

I suggest developing your code with logging enabled and your error_reporting set to either “E_ALL” or “E_ALL & ~E_NOTICE”. This will help you maintain best practices in your code.

5 | Vladimir Cvetic

October 9th, 2008 at 7:17 am

Avatar

“It’s a good practise” because…?

Comment Form