FirePHP/FireBug

Howdy folks! I remember reading somewhere that someone was looking for FirePHP/FireBug integration into Yii.

I whipped up a component to do it and thought I'd share. Totally swiped it from a CakePHP helper, original author is noted and credited.



<?php


/**


 * CPSFirePHP class file.


 *


 * This will repeat messages from the error.log as well as variables, form data, 


 * validation errors, session data, and other useful info into the Firebug console 


 * window.  Other than the normal log usage, you don't have to tell it to trace anything,


 * it'll get the info automagically.


 *


 * Install in your /protected/components directory


 *


 * Installation:


 * -------------


 * 1.	Install Firebug, http://www.getfirebug.com, reopen browser, turn Firebug on.


 * 


 * 2.	Turn debug on in /index.php  ie: uncomment defined('YII_DEBUG') or define('YII_DEBUG',true);


 * 


 * 3.	Add as a component to your main.php configuration file: 


 * 'firePHP' => array(


 *     'class' => 'application.components.CPSFirePHP',


 * ),


 * 


 * 4.	Add Yii::app()->firePHP->enableConsole( $this ); between the <HEAD> tags of your layout file(s). 


 * 


 * Credits:


 * --------


 * Converted from original CakePHP FireCake Helper by {@link http://bakery.cakephp.org/articles/view/firecake-helper zomg}


 * 


 * @author Jerry Ablan <jablan@pogostick.com>


 * @link http://ps-yii-extensions.googlecode.com


 * @copyright Copyright &copy; 2009 Pogostick, LLC


 * @license http://www.pogostick.com/license/


 */





/**


 * CPSFirePHP provides an interface to FirePHP


 * 


 * @author Jerry Ablan <jablan@pogostick.com>


 * @version SVN: $Id$


 * @package psYiiExtensions


 * @subpackage Helpers


 * @since 1.0.4


 */


class CPSFirePHP extends CComponent


{


	//********************************************************************************


	//* Constants


	//********************************************************************************


	


	const	JS_NAME = 'arPSFirePHP';





	//********************************************************************************


	//* Public Methods


	//********************************************************************************


	


	/**


	* View FirePHP information


	* 


	* @param CView $oView


	* @param integer $iMode


	*/


	function enableConsole( $oView  )


	{


		//	Define javascript array


		$_sScript = "nvar " . self::JS_NAME . " = new Array();";


		$_sScript .= "n" . self::JS_NAME . "[ 'Version' ] = '" . Yii::getVersion() . "';";





		//	Comment out the ones you don't need.


		//	The first 4 or 5 are suggested mostly.


		//	The others are general info that doesn't change much, but


		//	Might be good for familarization with the way Yii works.





		$_sScript .= "n" . $this->getSessionData();


		$_sScript .= "n" . $this->getPageData();


		$_sScript .= "n" . $this->getVars( $oView );


		$_sScript .= "n" . $this->getLogs();


		$_sScript .= "n" . $this->getConstants();


		$_sScript .= "n" . $this->getModels();


		$_sScript .= "n" . $this->getControllers();


		$_sScript .= "n" . $this->getPhp();


		$_sScript .= "n" . $this->getModules();





		$_sScript .= " nconsole.dir( " . self::JS_NAME . " );n";


		


		//	Now echo it out and call the Firebug console.


		Yii::app()->getClientScript()->registerScript( self::JS_NAME, $_sScript, CClientScript::POS_READY );


	}


	


	//********************************************************************************


	//* Private Methods


	//********************************************************************************





	/**


	 * Get variables in the view


	 */


	protected function getVars( $oView )


	{


		//	Controller variables


		$_arData = array( 'action' => $oView->getAction()->getId(), 'id' => $oView->getId(), 'layout' => $oView->layout, 'uniqueId' => $oView->getUniqueId(), 'viewPath' => $oView->getViewPath(), 'pageTitle' => $oView->pageTitle ); 


		


		//	Parameters


		$_arParams = Yii::app()->getParams();


		if ( is_array( $_arParams ) ) $_arData = array_merge( $_arData, $_arParams );





		return self::JS_NAME . "[ 'Variables' ] = " . CJSON::encode( $_arData ) . ";";


	}





	/**


	 * Dumps the log file to the console


	 */


	protected function getLogs()


	{


		//	Flatten log entries...


		foreach ( Yii::getLogger()->getLogs() as $_oLog )


			$_arLogData[] = implode( ', ', $_oLog );


		


		return self::JS_NAME . "[ 'Application Log' ] = " . CJSON::encode( $_arLogData ) . ";";


	}


	


	/**


	 * Dumps the defined constants


	 */


	protected function getConstants()


	{


		$_arData = get_defined_constants( true );


		$_arData = $_arData[ 'user' ];


		return self::JS_NAME . "[ 'Constants' ] = " . json_encode( $_arData ) . ";";


	}


	


	/***


	* Dumps the current session data


	*/


	protected function getSessionData() 


	{


		return self::JS_NAME . "[ 'Session Data' ] = " . CJSON::encode( $_SESSION ) . ";";


	}





	/**


	 * Get page data, generally form submissions.


	 */


	protected function getPageData()


	{


		$_arData = array();


		


		if ( is_array( $_REQUEST ) ) $_arData = array_merge( $_arData, $_REQUEST );


		


		if ( ! empty( $_arData ) ) 


			return self::JS_NAME . "[ '$_REQUEST Data' ] = " . CJSON::encode( $_arData ) . ";";





		return self::JS_NAME . "[ '$_REQUEST' ] = 'No Data Submitted';";


	}





	/**


	 * Get some info about your installation.


	 */


	function getPhp() 


	{


		$_arTemp = array();


		$_arTemp['VERSION'] = phpversion();


		$_arTemp['REQUEST_URI'] = $_SERVER['REQUEST_URI'];


		$_arTemp['SERVER_PORT'] = $_SERVER['SERVER_PORT'];


		$_arTemp['SCRIPT_FILENAME'] = $_SERVER['SCRIPT_FILENAME'];


		$_arTemp['DOCUMENT_ROOT'] = $_SERVER['DOCUMENT_ROOT'];





		return self::JS_NAME . "['PHP Info'] = " . CJSON::encode( $_arTemp ) . ";";


	}





	/**


	 * Make sure you got mod_rewrite installed and other stuff.


	 */


	function getModules() 


	{


		return self::JS_NAME . "['Apache Modules'] = " . CJSON::encode( apache_get_modules() ) . ";";


	}





	/**


	 * Get each controller and some info about them put into an array.


	 */


	function getControllers() 


	{


		$_arTemp = array();





		$_sCPath = Yii::app()->getControllerPath();


		$_arPaths = scandir( $_sCPath );


		


		foreach ( $_arPaths as $_sPath )


		{


			if ( is_file( $_sCPath . DIRECTORY_SEPARATOR . $_sPath ) && preg_match( "/^(.+)Controller.php$/", basename( $_sPath ), $m ) )


			{


				$_sControllerName = str_ireplace( 'Controller.php', '', $_sPath );


				$_sClassName = $_sControllerName . 'Controller';


				Yii::import( 'application.controllers.' . $_sClassName );


				$_sControllerName{0} = strtolower( $_sControllerName{0} );


				$_oObj = new $_sClassName( $_sControllerName );


				$_arData = $this->getClassDiffValues( get_class_vars( 'CController' ), get_object_vars( $_oObj ) );


				$_arData[ 'Defined Views' ] = $this->getViewList( $_oObj );





				$_arTemp[ $_sControllerName ] = $_arData;


			}


		}





		return self::JS_NAME . "[ 'Controllers' ] = ".CJSON::encode( $_arTemp ).";";


	}





	/**


	 * Get each model and some info about them put into an array.


	 */


	function getModels() 


	{


		$_arTemp = array();





		$_sCPath = Yii::getPathOfAlias( 'application.models' );


		$_arPaths = scandir( $_sCPath );


		


		foreach ( $_arPaths as $_sPath )


		{


			if ( is_file( $_sCPath . DIRECTORY_SEPARATOR . $_sPath ) && preg_match( "/^(.+).php$/", basename( $_sPath ), $m  ) )


			{


				$_sClassName = $_sModelName = str_ireplace( '.php', '', $_sPath );


				Yii::import( 'application.models.' . $_sClassName );


				$_oObj = new $_sClassName( $_sModelName );


				$_arData = $this->getClassDiffValues( get_class_vars( 'CModel' ), get_object_vars( $_oObj ) );


				$_arData[ 'Table Name' ] = ( method_exists( $_oObj, 'tableName' ) ) ? $_oObj->tableName() : $_sModelName;


				$_arTemp[ $_sModelName ] = $_arData;


			}


		}





		return self::JS_NAME . "[ 'Models' ] = ".CJSON::encode( $_arTemp ).";";


	}





	/**


	* Returns an array of variable differences between to classes


	* 


	* @param array $arBaseVars


	* @param array $arClassVars


	* @return bool


	*/


	function getClassDiffValues( &$arBaseVars, &$arClassVars )


	{


		$_arTemp = array();





		foreach ( $arClassVars as $_sName => $_oVar )


		{


			if ( @$arBaseVars[ $_sName ] !== $arClassVars[ $_sName ] )


				$_arTemp[ $_sName ] = ( is_array( $_oVar ) ) ? implode( ', ', $_oVar ) : $_oVar;


		}





		return $_arTemp;


	}





	/**


	* Gets a list of views for a controller


	* 


	* @param CBaseController $oCtrl


	*/


	protected function getViewList( $oCtrl )


	{


		$_arTemp = array();


		$_sPath = $oCtrl->getViewPath();


		


		try


		{


			if ( is_dir( $_sPath ) )


			{


				foreach ( scandir( $_sPath ) as $_sFile )


				{


					if ( is_file( $_sPath . DIRECTORY_SEPARATOR . $_sFile ) && preg_match("/(.php|.html)$/", $_sFile ) ) 


						$_arTemp[] = $_sFile;


				}


			}


		}


		catch ( Exception $_ex ) {}


		


		return $_arTemp;


	}


}


This will be part of my extension library in the next release.

Hope you enjoy!

Good job!

Thanks dude! I'm trying hard to add value to your framework!

Hi, I tried this but got init() not defined on CPSFirePHP.

I am also having this issue, did you resolve this?

Give this version a try…




<?php

/**

 * CPSFirePHP class file.

 *

 * This will repeat messages from the error.log as well as variables, form data, 

 * validation errors, session data, and other useful info into the Firebug console 

 * window.  Other than the normal log usage, you don't have to tell it to trace anything,

 * it'll get the info automagically.

 *

 * Installation:

 * -------------

 * 1.	Install Firebug, http://www.getfirebug.com, reopen browser, turn Firebug on.

 * 

 * 2.	Turn debug on in /index.php  ie: uncomment defined('YII_DEBUG') or define('YII_DEBUG',true);

 * 

 * 3.	Add as a component to your main.php configuration file: 

 * 'firePHP' => array(

 *     'class' => 'pogostick.helpers.CPSFirePHP',

 * ),

 * 

 * 4.	Add Yii::app()->firePHP->enableConsole( $this ); between the <HEAD> tags of your layout file(s). 

 * 

 * You can add a second parameter to this if you just want the log.

 * ie: $firecake->view($this,1);

 * 

 * Credits:

 * --------

 * Converted from original CakePHP FireCake Helper by {@link http://bakery.cakephp.org/articles/view/firecake-helper zomg}

 * 

 * @author Jerry Ablan <jablan@pogostick.com>

 * @link http://ps-yii-extensions.googlecode.com

 * @copyright Copyright &copy; 2009 Pogostick, LLC

 * @license http://www.pogostick.com/license/

 */


/**

 * CPSFirePHP provides an interface to FirePHP

 * 

 * @author Jerry Ablan <jablan@pogostick.com>

 * @version SVN: $Id: CPSFirePHP.php 261 2009-08-03 20:07:06Z jerryablan@gmail.com $

 * @package psYiiExtensions

 * @subpackage Helpers

 * @since 1.0.4

 */

class CPSFirePHP extends CComponent

{

	//********************************************************************************

	//* Constants

	//********************************************************************************

	

	const	JS_NAME = 'arPSFirePHP';


	//********************************************************************************

	//* Public Methods

	//********************************************************************************

	

	/**

	* Initialize the component...

	* 

	*/

	public function init()

	{

	}

	

	/**

	* View FirePHP information

	* 

	* @param CView $oView

	*/

	function enableConsole( $oView  )

	{

		//	Define javascript array

		$_sScript = "\nvar " . self::JS_NAME . " = new Array();";

		$_sScript .= "\n" . self::JS_NAME . "[ 'Version' ] = '" . Yii::getVersion() . "';";


		//	Comment out the ones you don't need.

		//	The first 4 or 5 are suggested mostly.

		//	The others are general info that doesn't change much, but

		//	Might be good for familarization with the way Yii works.


		$_sScript .= "\n" . $this->getSessionData();

		$_sScript .= "\n" . $this->getPageData();

		$_sScript .= "\n" . $this->getVars( $oView );

		$_sScript .= "\n" . $this->getLogs();

		$_sScript .= "\n" . $this->getConstants();

		$_sScript .= "\n" . $this->getModels();

		$_sScript .= "\n" . $this->getControllers();

		$_sScript .= "\n" . $this->getPhp();

		$_sScript .= "\n" . $this->getModules();


		$_sScript .= " \nconsole.dir( " . self::JS_NAME . " );\n";

		

		//	Now echo it out and call the Firebug console.

		Yii::app()->getClientScript()->registerScript( self::JS_NAME, $_sScript, CClientScript::POS_READY );

	}

	

	//********************************************************************************

	//* Private Methods

	//********************************************************************************


	/**

	 * Get variables in the view

	 */

	protected function getVars( $oView )

	{

		//	Controller variables

		$_arData = array( 'action' => $oView->getAction()->getId(), 'id' => $oView->getId(), 'layout' => $oView->layout, 'uniqueId' => $oView->getUniqueId(), 'viewPath' => $oView->getViewPath(), 'pageTitle' => $oView->pageTitle ); 

		

		//	Parameters

		$_arParams = Yii::app()->getParams();

		if ( is_array( $_arParams ) ) $_arData = array_merge( $_arData, $_arParams );


		return self::JS_NAME . "[ 'Variables' ] = " . CJSON::encode( $_arData ) . ";";

	}


	/**

	 * Dumps the log file to the console

	 */

	protected function getLogs()

	{

		//	Flatten log entries...

		foreach ( Yii::getLogger()->getLogs() as $_oLog )

			$_arLogData[] = implode( ', ', $_oLog );

		

		return self::JS_NAME . "[ 'Application Log' ] = " . CJSON::encode( $_arLogData ) . ";";

	}

	

	/**

	 * Dumps the defined constants

	 */

	protected function getConstants()

	{

		$_arData = get_defined_constants( true );

		$_arData = $_arData[ 'user' ];

		return self::JS_NAME . "[ 'Constants' ] = " . json_encode( $_arData ) . ";";

	}

	

	/***

	* Dumps the current session data

	*/

	protected function getSessionData() 

	{

		return self::JS_NAME . "[ 'Session Data' ] = " . CJSON::encode( $_SESSION ) . ";";

	}


	/**

	 * Get page data, generally form submissions.

	 */

	protected function getPageData()

	{

		$_arData = array();

		

		if ( is_array( $_REQUEST ) ) $_arData = array_merge( $_arData, $_REQUEST );

		

		if ( ! empty( $_arData ) ) 

			return self::JS_NAME . "[ '\$_REQUEST Data' ] = " . CJSON::encode( $_arData ) . ";";


		return self::JS_NAME . "[ '$_REQUEST' ] = 'No Data Submitted';";

	}


	/**

	 * Get some info about your installation.

	 */

	function getPhp() 

	{

		$_arTemp = array();

		$_arTemp['VERSION'] = phpversion();

		$_arTemp['REQUEST_URI'] = $_SERVER['REQUEST_URI'];

		$_arTemp['SERVER_PORT'] = $_SERVER['SERVER_PORT'];

		$_arTemp['SCRIPT_FILENAME'] = $_SERVER['SCRIPT_FILENAME'];

		$_arTemp['DOCUMENT_ROOT'] = $_SERVER['DOCUMENT_ROOT'];


		return self::JS_NAME . "['PHP Info'] = " . CJSON::encode( $_arTemp ) . ";";

	}


	/**

	 * Make sure you got mod_rewrite installed and other stuff.

	 */

	function getModules() 

	{

		if ( function_exists( 'apache_get_modules' ) ) return self::JS_NAME . "['Apache Modules'] = " . CJSON::encode( apache_get_modules() ) . ";";

	}


	/**

	 * Get each controller and some info about them put into an array.

	 */

	function getControllers() 

	{

		$_arTemp = array();


		$_sCPath = Yii::app()->getControllerPath();

		$_arPaths = scandir( $_sCPath );

		

		foreach ( $_arPaths as $_sPath )

		{

			if ( is_file( $_sCPath . DIRECTORY_SEPARATOR . $_sPath ) && preg_match( "/^(.+)Controller\.php$/", basename( $_sPath ), $m ) )

			{

				$_sControllerName = str_ireplace( 'Controller.php', '', $_sPath );

				$_sClassName = $_sControllerName . 'Controller';

				Yii::import( 'application.controllers.' . $_sClassName );

				$_sControllerName{0} = strtolower( $_sControllerName{0} );

				$_oObj = new $_sClassName( $_sControllerName );

				$_arData = $this->getClassDiffValues( get_class_vars( 'CController' ), get_object_vars( $_oObj ) );

				$_arData[ 'Defined Views' ] = $this->getViewList( $_oObj );


				$_arTemp[ $_sControllerName ] = $_arData;

			}

		}


		return self::JS_NAME . "[ 'Controllers' ] = ".CJSON::encode( $_arTemp ).";";

	}


	/**

	 * Get each model and some info about them put into an array.

	 */

	function getModels() 

	{

		$_arTemp = array();


		$_sCPath = Yii::getPathOfAlias( 'application.models' );

		$_arPaths = scandir( $_sCPath );

		

		foreach ( $_arPaths as $_sPath )

		{

			if ( is_file( $_sCPath . DIRECTORY_SEPARATOR . $_sPath ) && preg_match( "/^(.+)\.php$/", basename( $_sPath ), $m  ) )

			{

				$_sClassName = $_sModelName = str_ireplace( '.php', '', $_sPath );

				Yii::import( 'application.models.' . $_sClassName );

				$_oObj = new $_sClassName( $_sModelName );

				$_arData = $this->getClassDiffValues( get_class_vars( 'CModel' ), get_object_vars( $_oObj ) );

				$_arData[ 'Table Name' ] = ( method_exists( $_oObj, 'tableName' ) ) ? $_oObj->tableName() : $_sModelName;

				$_arTemp[ $_sModelName ] = $_arData;

			}

		}


		return self::JS_NAME . "[ 'Models' ] = ".CJSON::encode( $_arTemp ).";";

	}


	/**

	* Returns an array of variable differences between to classes

	* 

	* @param array $arBaseVars

	* @param array $arClassVars

	* @return bool

	*/

	function getClassDiffValues( &$arBaseVars, &$arClassVars )

	{

		$_arTemp = array();


		foreach ( $arClassVars as $_sName => $_oVar )

		{

			if ( @$arBaseVars[ $_sName ] !== $arClassVars[ $_sName ] )

				$_arTemp[ $_sName ] = ( is_array( $_oVar ) ) ? implode( ', ', $_oVar ) : $_oVar;

		}


		return $_arTemp;

	}


	/**

	* Gets a list of views for a controller

	* 

	* @param CBaseController $oCtrl

	*/

	protected function getViewList( $oCtrl )

	{

		$_arTemp = array();

		$_sPath = $oCtrl->getViewPath();

		

		try

		{

			if ( is_dir( $_sPath ) )

			{

				foreach ( scandir( $_sPath ) as $_sFile )

				{

					if ( is_file( $_sPath . DIRECTORY_SEPARATOR . $_sFile ) && preg_match("/(.php|.html)$/", $_sFile ) ) 

						$_arTemp[] = $_sFile;

				}

			}

		}

		catch ( Exception $_ex ) {}

		

		return $_arTemp;

	}

}



[quote=“xx666xx, post:6, topic:17084”]

Give this version a try…

<code deleted>

Yes, this looks to work fine now.

I had tried adding the init() function and was homing in to what appeared to be a missing ‘;’ in the jQuery(document).ready(function() when you posted the response.

Many thanks for the prompt reply.

Chris

Apologies if I have missed something…

Yep, I sure did, big time. Should have tried Yii::trace($str);

Doh!

Just a note:

You can circumvent the empty init() by extending CApplicationComponent instead of CComponent.