[Extension] HighchartsWidget

I have created a wrapper extension for the Highcharts library, available here:

Yii Highcharts Extension

Yii Highcharts Repository

The extension is clean, compact, and supports configuration via either standard PHP arrays or a JSON string. Please let me know if you have any questions, comments, or suggestions.

Hi,

as far as I know Highcharts in not allow in commercial projects (unless you buy licence).

but can I use your extension a commercial project it seems to be very useful? :)

You’re right. Highcharts is only free for non-commercial use. You can use my (PHP) code however you like, but I have no authority to grant you the same privilege for the packaged Highcharts JavaScript files. For those, I can only refer you to the Highcharts License and Pricing page.

My own advice would be to go ahead and purchase the Single Website license, which is (at the time of this post) only $80, and pass the expense on to your client. If you are the client, then it’s your call. ;)

Hi Milo,

Thanks for this extension, it’s just what I’ve been looking for.

Hi, Milo. After to read the Highcharts documentation, I read about Exporting module.

Question: How can I use it in the widget?

TIA

Cheers

Monico

Good call, Monico. I overlooked that functionality in the initial release. I will add that module and update the documentation in the next day or two.

Sorry for the inconvenience.

Hi, Milo. Please don’t mention it. I’ll check it out !

Cheers

Monico

Monico, I posted the update. The Exporting module should now be enabled by default. For instructions on disabling the module, see the Tips section of the Documentation.

Let me know if anything is missing or unclear.

Hi, Milo. I appreciate your time to update this excellent Highchart wiget. Yes, I’ll test it this new update. I’ll write down if I have problems with it.

Cheers

Monico

This looks great, Milo!

I am downloading it test right now.

Thanks a Lot Milo,

I do have a small issue though

In highchartswidget.php you have used array_replace_recursive().

This was introduced only in 5.3 and most webhosts only have 5.2.

I came to know about this after some debugging. I think you should make it backward compatible with 5.2

Thanks

Gaurav

I had the same problem and made a small work-around.

I created a new file in components called CompatibleFunctions.php.




<?php

/* 

 * To use the needed PHP 5.3 functions in a PHP 5.2 environment

 * 

 */

// as of PHP 5.3.0 array_replace_recursive() does the work for us

if (function_exists('array_replace_recursive'))

{

	return call_user_func_array('array_replace_recursive', func_get_args());

}

if (!function_exists('array_replace_recursive'))

{

  function array_replace_recursive($array, $array1)

  {

	function recurse($array, $array1)

	{

	  foreach ($array1 as $key => $value)

	  {

		// create new key in $array, if it is empty or not an array

		if (!isset($array[$key]) || (isset($array[$key]) && !is_array($array[$key])))

		{

		  $array[$key] = array();

		}


		// overwrite the value in the base array

		if (is_array($value))

		{

		  $value = recurse($array[$key], $value);

		}

		$array[$key] = $value;

	  }

	  return $array;

	}


	// handle the arguments, merge one by one

	$args = func_get_args();

	$array = $args[0];

	if (!is_array($array))

	{

	  return $array;

	}

	for ($i = 1; $i < count($args); $i++)

	{

	  if (is_array($args[$i]))

	  {

		$array = recurse($array, $args[$i]);

	  }

	}

	return $array;

  }

}

?>



And added this file to be loaded in the index.php of Yii.




<?php

// change the following paths if necessary

$yii=dirname(__FILE__).'/../framework/yii.php';

$config=dirname(__FILE__).'/protected/config/main.php';

$compfunctions=dirname(__FILE__).'/protected/components/CompatibleFunctions.php';


// remove the following lines when in production mode

defined('YII_DEBUG') or define('YII_DEBUG',true);

defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);


require_once($compfunctions);

require_once($yii);

Yii::createWebApplication($config)->run();



Problem solved. After you upgrade to PHP 5.3 the original function will be used instead of this work-around one.

Thank you for the tip, Gaurav. That was an oversight on my part. I have updated the requirements section of the documentation and will add support for PHP 5.2 in the next release.

Great workaround, mrwallace. This is a big help. I have added a link to your post in the requirements section of the documentation.

I’m having problems with fitting the axis-labels on the screen. After a certain length the label just gets cut off. Ideas anyone?

Do you have a screenshot you can post?

Here you go. The first 4 labels are cut off. At first I thought it was because of my use of a bar chart, so I’ve changed to a column chart. But as you can see, the problem is the same.

Edit:

It seems to be caused by differences in div sizes and SVG size.

Try using the "renderTo" chart option.:


$this->Widget('ext.highcharts.HighchartsWidget', array(

                    'options' => array(

                        'chart' => array(

                            'renderTo' => 'myContainer',

                            'defaultSeriesType' => 'column', 

                            ....                           

                        ),

                       ...

                       ));

echo '<div id="myContainer"></div>';



Where "myContainer" is the DIV ID of your choice. If you display more than one chart, you can use "myContainer1", "myContainer2", etc…

How to display pie chart using highcharts?

Sbasuki, here is a brief example of how to render a pie chart:


$this->widget('ext.highcharts.HighchartsWidget',array(

	'options' => array(

		'series' => array(array(

			'type' => 'pie',

			'data' => array(

				array('Firefox', 44.2),

				array('IE7', 26.6),

				array('IE6', 20),

				array('Chrome', 3.1),

				array('Other', 5.4)

			)

		))

	)

));

For more examples and other options, see the Highcharts demo gallery and online documentation.