Add analytics
[bus.git] / busui / owa / owa_view.php
blob:a/busui/owa/owa_view.php -> blob:b/busui/owa/owa_view.php
--- a/busui/owa/owa_view.php
+++ b/busui/owa/owa_view.php
@@ -1,1 +1,807 @@
-
+<?php

+

+//

+// Open Web Analytics - An Open Source Web Analytics Framework

+//

+// Copyright 2006 Peter Adams. All rights reserved.

+//

+// Licensed under GPL v2.0 http://www.gnu.org/copyleft/gpl.html

+//

+// Unless required by applicable law or agreed to in writing, software

+// distributed under the License is distributed on an "AS IS" BASIS,

+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+// See the License for the specific language governing permissions and

+// limitations under the License.

+//

+// $Id$

+//

+

+require_once(OWA_BASE_CLASSES_DIR.'owa_template.php');

+require_once(OWA_BASE_CLASSES_DIR.'owa_requestContainer.php'); // ??

+

+/**

+ * Abstract View Class

+ * 

+ * @author      Peter Adams <peter@openwebanalytics.com>

+ * @copyright   Copyright &copy; 2006 Peter Adams <peter@openwebanalytics.com>

+ * @license     http://www.gnu.org/copyleft/gpl.html GPL v2.0

+ * @category    owa

+ * @package     owa

+ * @version		$Revision$	      

+ * @since		owa 1.0.0

+ */

+

+class owa_view extends owa_base {

+

+	/**

+	 * Main view template object

+	 *

+	 * @var object

+	 */

+	var $t;

+	

+	/**

+	 * Body content template object

+	 *

+	 * @var object

+	 */

+	var $body;

+	

+	/**

+	 * Sub View object

+	 *

+	 * @var object

+	 */

+	var $subview;

+	

+	/**

+	 * Rednered subview

+	 *

+	 * @var string

+	 */

+	var $subview_rendered;

+	

+	/**

+	 * CSS file for main template

+	 *

+	 * @var unknown_type

+	 */

+	var $css_file;

+	

+	/**

+	 * The priviledge level required to access this view

+	 * @depricated

+	 * @var string

+	 */

+	var $priviledge_level;

+	

+	/**

+	 * Type of page

+	 *

+	 * @var unknown_type

+	 */

+	var $page_type;

+	

+	/**

+	 * Request Params

+	 *

+	 * @var unknown_type

+	 */

+	var $params;

+	

+	/**

+	 * Authorization object

+	 *

+	 * @var object

+	 */

+	var $auth;

+	

+	var $module; // set by factory.

+	

+	var $data;

+	

+	var $default_subview;

+	

+	var $is_subview;

+	

+	var $js = array();

+	

+	var $css = array();

+	

+	var $postProcessView = false;

+	

+	var $renderJsInline;

+	

+	/**

+	 * Constructor

+	 *

+	 */

+	function __construct($params = null) {

+	

+		parent::__construct($params);

+		

+		$this->t = new owa_template();

+		$this->body = new owa_template($this->module);

+		$this->setTheme();

+		//header('Content-type: text/html; charset=utf-8');

+	}

+	

+	/**

+	 * Assembles the view using passed model objects

+	 *

+	 * @param unknown_type $data

+	 * @return unknown

+	 */

+	function assembleView($data) {

+		

+		$this->e->debug('Assembling view: '.get_class($this));

+		

+		// set view name in template class. used for navigation.

+		if (array_key_exists('view', $this->data)) {

+			$this->body->caller_params['view'] = $this->data['view'];

+		}

+		

+		if (array_key_exists('params', $this->data)):

+			$this->body->set('params', $this->data['params']);

+		endif;

+		

+		if (array_key_exists('subview', $this->data)):

+			$this->body->caller_params['subview'] = $this->data['subview'];

+		endif;

+		

+		// Assign status msg

+		if (array_key_exists('status_msg', $this->data)):

+			$this->t->set('status_msg', $this->data['status_msg']);

+		endif;

+		

+		// get status msg from code passed on the query string from a redirect.

+		if (array_key_exists('status_code', $this->data)):

+			$this->t->set('status_msg', $this->getMsg($this->data['status_code']));

+		endif;

+		

+		// set error msg directly if passed from constructor

+		if (array_key_exists('error_msg', $this->data)):

+			$this->t->set('error_msg', $this->data['error_msg']);

+		endif;		

+		

+		// authentication status

+		if (array_key_exists('auth_status', $this->data)):

+			$this->t->set('authStatus', $this->data['auth_status']);

+		endif;

+		

+		// get error msg from error code passed on the query string from a redirect.

+		if (array_key_exists('error_code', $this->data)):

+			$this->t->set('error_msg', $this->getMsg($this->data['error_code']));

+		endif;

+		

+		// load subview

+		if (!empty($this->data['subview']) || !empty($this->default_subview)):

+			// Load subview

+			$this->loadSubView($this->data['subview']);

+		endif;

+		

+		// construct main view.  This might set some properties of the subview.

+		if (method_exists($this, 'render')) {

+			$this->render($this->data);

+		} else {

+			// old style

+			$this->construct($this->data);

+		}

+		//array of errors usually used for field validations

+		if (array_key_exists('validation_errors', $this->data)):

+			$this->body->set('validation_errors', $this->data['validation_errors']);

+		endif;

+		

+		// pagination

+		if (array_key_exists('pagination', $this->data)):

+			$this->body->set('pagination', $this->data['pagination']);

+		endif;

+		

+		$this->_setLinkState();

+			

+		// assemble subview

+		if (!empty($this->data['subview'])):

+			

+			// set view name in template. used for navigation.

+			$this->subview->body->caller_params['view'] = $this->data['subview'];

+			

+			// Set validation errors

+			$this->subview->body->set('validation_errors', $this->get('validation_errors'));

+			

+			// pagination

+			if (array_key_exists('pagination', $this->data)):

+				$this->subview->body->set('pagination', $this->data['pagination']);

+			endif;

+			

+			if (array_key_exists('params', $this->data)):

+				$this->subview->body->set('params', $this->data['params']);

+				$this->subview->body->set('do', $this->data['params']['do']);

+			endif;

+			

+			// Load subview 

+			$this->renderSubView($this->data);

+			

+			// assign subview to body template

+			$this->body->set('subview', $this->subview_rendered);

+			

+			

+		endif;

+		

+		// assign validation errors

+		if (!empty($this->data['validation_errors'])) {

+			$ves = new owa_template('base');

+			$ves->set_template('error_validation_summary.tpl');

+			$ves->set('validation_errors', $this->data['validation_errors']);

+			$validation_errors_summary = $ves->fetch();

+			$this->t->set('error_msg', $validation_errors_summary);

+		}		

+		

+		

+		// fire post method

+		$this->post();

+		

+		// assign css and js ellements if the view is not a subview.

+		// subview css/js have been merged/pulls from subview and assigned here.

+		if ($this->is_subview != true) {

+			if (!empty($this->css)) {

+				$this->t->set('css', $this->css);

+			}

+			

+			if (!empty($this->js)) {

+				$this->t->set('js', $this->js);

+			}

+		}

+		

+		//Assign body to main template

+		$this->t->set('config', $this->config);

+					

+		//Assign body to main template

+		$this->t->set('body', $this->body);

+		

+		if ($this->postProcessView === true){

+			return $this->postProcess();

+		} else {

+			// Return fully asembled View

+			return $this->t->fetch();

+		}

+	}

+	

+	/**

+	 * Abstract Alternative rendering method reuires the setting of $this->postProcessView to fire

+	 * 

+	 */

+	function postProcess() {

+		

+		return false;

+	}

+	

+	/**

+	 * Post method fired right before view is rendered and returned

+	 * as output

+	 */

+	function post() {

+		

+		return false;

+	}

+	

+	

+	/**

+	 * Sets the theme to be used by a view

+	 *

+	 */

+	function setTheme() {

+		

+		$this->t->set_template($this->config['report_wrapper']);

+		

+		return;

+	}

+	

+	/**

+	 * Abstract method for assembling a view

+	 * @depricated

+	 * @param array $data

+	 */

+	function construct($data) {

+		

+		return;

+		

+	}

+	

+	/**

+	 * Assembles subview

+	 *

+	 * @param array $data

+	 */

+	function loadSubView($subview) {

+		

+		if (empty($subview)):

+			if (!empty($this->default_subview)):

+				$subview = $this->default_subview;

+				$this->data['subview'] = $this->default_subview;

+			else:

+				return $this->e->debug("No Subview was specified by caller.");

+			endif;

+		endif;

+		

+		$this->subview = owa_coreAPI::subViewFactory($subview);

+		//print_r($subview.'///');

+		$this->subview->setData($this->data);

+		

+		return;

+		

+	}

+	

+	/**

+	 * Assembles subview

+	 *

+	 * @param array $data

+	 */

+	function renderSubView($data) {

+		

+		// Stores subview as string into $this->subview

+		$this->subview_rendered = $this->subview->assembleSubView($data);

+		

+		// pull css and jas elements needed by subview

+		$this->css = array_merge($this->css, $this->subview->css);

+		$this->js = array_merge($this->js, $this->subview->js);

+	

+		return;

+		

+	}

+	

+	/**

+	 * Assembles the view using passed model objects

+	 *

+	 * @param unknown_type $data

+	 * @return unknown

+	 */

+	function assembleSubView($data) {

+		

+		// construct main view.  This might set some properties of the subview.

+		if (method_exists($this, 'render')) {

+			$this->render($data);

+		} else {

+			// old style

+			$this->construct($data);

+		}

+		

+		$this->t->set_template('wrapper_subview.tpl');

+		

+		//Assign body to main template

+		$this->t->set('body', $this->body);

+

+		// Return fully asembled View

+		$page =  $this->t->fetch();

+	

+		return $page;

+					

+	}

+	

+	function setCss($path) {

+		

+		$url = owa_coreAPI::getSetting('base', 'modules_url').$path;

+		$this->css[] = $url;

+		return;

+	}

+	

+	function setJs($name, $path, $version ='', $deps = array(), $ie_only = false) {

+		

+		if (empty($version)) {

+			$version = OWA_VERSION;

+		}

+		

+		$uid = $name.$version;

+		

+		$url = sprintf('%s?version=%s', owa_coreAPI::getSetting('base', 'modules_url').$path, $version);

+		$this->js[$uid]['url'] = $url;

+		

+		// build file system path just in case we need to concatenate the JS into a single file.

+		$fs_path = OWA_MODULES_DIR.$path;

+		$this->js[$uid]['path'] = $fs_path;

+		$this->js[$uid]['deps'] = $deps;

+		$this->js[$uid]['version'] = $version;

+		$this->js[$uid]['ie_only'] = $ie_only;

+		

+		return;

+	}

+	

+	function concatinateJs() {

+	

+		$js_libs = '';

+		

+		foreach ($this->js as $lib) {

+			

+			$js_libs .= file_get_contents($lib['path']);

+			$js_libs .= "\n\n";

+		}

+		

+		$this->body->set('js_includes', $js_libs);

+		

+		return;

+	

+	}

+	

+	/**

+	 * Sets flag to tell view to render the JS inline as <SCRIPT> blocks

+	 * TODO: not yet implemented

+	 */

+	function renderJsInline() {

+	

+		$this->renderJsInLine = true;

+		

+		return;

+	}

+	

+	

+	/**

+	 * Sets the Priviledge Level required to access this view

+	 *

+	 * @param string $level

+	 */

+	function _setPriviledgeLevel($level) {

+		

+		$this->priviledge_level = $level;

+		

+		return;

+	}

+	

+	/**

+	 * Sets the page type of this view. Used for tracking.

+	 *

+	 * @param string $page_type

+	 */

+	function _setPageType($page_type) {

+		

+		$this->page_type = $page_type;

+		

+		return;

+	}

+	

+	

+	/**

+	 * Sets properties that are needed to maintain state across most 

+	 * report and widget requests. This is used by many template functions.

+	 *

+	 */

+	function _setLinkState() {

+		

+		// array of params to check

+		$p = $this->get('params');

+		

+		// control array - will check for these params. If they exist it will return.

+		$sp = array('period' => null, 

+					'startDate' => null, 

+					'endDate' => null,

+					'siteId' => null,  

+					'startTime' => null, 

+					'endTime' => null);

+					

+		// result array

+		$link_params = array();

+		

+		if (!empty($p)):

+			$link_params = owa_lib::array_intersect_key($p, $sp);

+		endif;

+		

+		// needed for forwards compatability with 

+		if (array_key_exists('site_id', $link_params) && !array_key_exists('siteId', $link_params)) {

+			$link_params['siteId'] = $link_params['site_id']; 

+		}

+		$this->t->caller_params['link_state'] =  $link_params;				

+		$this->body->caller_params['link_state'] =  $link_params;

+		

+		if(!empty($this->subview)) {

+			$this->subview->body->caller_params['link_state'] =  $link_params;

+		}

+	}

+	

+	function get($name) {

+		

+		if (array_key_exists($name, $this->data)) {

+			return $this->data[$name];

+		} else {

+			return false;

+		}

+		

+	}

+	

+	function set($name, $value) {

+		

+		$this->data[$name] = $value;

+		return;

+	}

+	

+	function setSubViewProperty($name, $value) {

+		

+		$this->subview->set($name, $value);

+		return;

+	}

+	

+	function getSubViewProperty($name) {

+		return $this->subview->get($name); 

+	}

+	

+	function setData($data) {

+		$this->data = $data;

+	}

+	

+	function setTitle($title, $suffix = '') {

+		

+		$this->t->set('page_title', $title);

+		$this->t->set('titleSuffix', $suffix);

+	}

+	

+	function setContentTypeHeader($type = 'html') {

+		

+		owa_lib::setContentTypeHeader($type);

+	}

+	

+}

+

+/**

+ * Generic HTMl Table View

+ *

+ * Will produce a generic html table

+ *

+ */

+class owa_genericTableView extends owa_view {

+

+	function __construct() {

+		

+		return parent::__construct();

+		

+	}

+	

+	function render($data) {

+	

+		$this->t->set_template('wrapper_blank.tpl');		

+		$this->body->set_template('generic_table.tpl');

+		

+		if (!empty($data['labels'])):

+			$this->body->set('labels', $data['labels']);

+			$this->body->set('col_count', count($data['labels']));

+		else:

+			$this->body->set('labels', '');

+			$this->body->set('col_count', count($data['rows'][0]));

+		endif;

+			

+		if (!empty($data['rows'])):

+			$this->body->set('rows', $data['rows']);

+			$this->body->set('row_count', count($data['rows']));

+		else:

+			$this->body->set('rows', '');

+			$this->body->set('row_count', 0);

+		endif;

+		

+		if (array_key_exists('table_class', $data)):

+			$this->body->set('table_class', $data['table_class']);

+		else:

+			$this->body->set('table_class', 'data');		

+		endif;

+		

+		if (array_key_exists('header_orientation', $data)):

+			$this->body->set('header_orientation', $data['header_orientation']);

+		else:

+			$this->body->set('header_orientation', 'col');		

+		endif;

+		

+		if (array_key_exists('table_footer', $data)):

+			$this->body->set('table_footer', $data['table_footer']);

+		else:

+			$this->body->set('table_footer', '');		

+		endif;

+		

+		if (array_key_exists('table_caption', $data)):

+			$this->body->set('table_caption', $data['table_caption']);

+		else:

+			$this->body->set('table_caption', '');		

+		endif;

+		

+		if (array_key_exists('is_sortable', $data)) {

+			if ($data['is_sortable'] != true) {

+				$this->body->set('sort_table_class', '');

+			}

+		} else {

+			$this->body->set('sort_table_class', 'tablesorter');		

+		}

+		

+		if (array_key_exists('table_row_template', $data)):

+			$this->body->set('table_row_template', $data['table_row_template']);

+		else:

+			;		

+		endif;

+		

+		// show the no data error msg

+		if (array_key_exists('show_error', $data)):

+			$this->body->set('show_error', $data['show_error']);

+		else:

+			$this->body->set('show_error', true);		

+		endif;

+		

+		$this->body->set('table_id', str_replace('.', '-', $data['params']['do']).'-table');

+		

+		return;

+		

+		

+	}

+

+}

+

+

+class owa_sparklineJsView extends owa_view {

+

+	function __construct() {

+	

+		return parent::__construct();

+

+	}

+	

+	function render($data) {

+	

+		// load template

+		$this->t->set_template('wrapper_blank.tpl');

+		$this->body->set_template('sparklineJs.tpl');

+		// set

+		$this->body->set('widget', $data['widget']);

+		$this->body->set('type', $data['type']);

+		$this->body->set('height', $data['height']);

+		$this->body->set('width', $data['width']);

+		$this->body->set('values', $data['series']['values']);

+		$this->body->set('dom_id', $data['dom_id'].rand());

+		//$this->setJs("includes/jquery/jquery.sparkline.js");

+		return;

+	}

+

+

+}

+

+class owa_chartView extends owa_view {

+	

+	function __construct() {

+	

+		return parent::__construct();

+

+	}

+	

+	function render($data) {

+	

+		// load template

+		$this->t->set_template('wrapper_blank.tpl');

+		$this->body->set_template('chart_dom.tpl');

+		// set

+		$this->body->set('widget', $this->get('widget'));

+		$this->body->set('type', $this->get('type'));

+		//print_r($this->get('height'));

+		//height should be passed in as a request params as it sets the height of the actual flash object

+		$this->body->set('height', $this->get('height'));

+		//width should always be 100%

+		$this->body->set('width', $this->get('width'));

+		$this->body->set('data', $this->get('chart_data'));

+		$this->body->set('dom_id', $this->get('dom_id').rand().'Chart');

+		$this->setJs('swfobject', "base/js/includes/swfobject.js");

+		return;

+	}

+	

+}

+

+class owa_mailView extends owa_view {

+

+	// post office

+	var $po;

+	var $postProcessView = true;

+	

+	function __construct() {

+		

+		// make this a service

+		require_once(OWA_BASE_CLASS_DIR.'mailer.php');

+		$this->po = new owa_mailer;

+		return parent::__construct();

+	}

+	

+	function postProcess() {

+		

+		$this->po->mailer->Body = $this->t->fetch();

+		

+		if (!empty($data['plainTextView'])) {

+			$this->po->mailer->AltBody = owa_coreAPI::displayView($this->get('plain_text_view'));

+		}

+

+		return $this->po->sendMail();

+	}	

+	

+	function setMailSubject($sbj) {

+	

+		$this->po->mailer->Subject = $sbj;

+		return;

+	}

+	

+	function addMailToAddress($email, $name = '') {

+		

+		if (empty($name)) {

+			$name = $email;

+		}

+		

+		$this->po->mailer->AddAddress($email, $name);

+		return;

+	}

+}

+

+class owa_adminView extends owa_view {

+	

+	var $postProcessView = true;

+	

+	function __construct() {

+		

+		return parent::__construct();

+	}

+	

+	function post() {

+		

+		$this->setJs('owa.admin.css');

+		return;

+	}

+	

+	

+}

+

+class owa_jsonView extends owa_view {

+

+	function __construct() {

+		

+		if (!class_exists('Services_JSON')) {

+			require_once(OWA_INCLUDE_DIR.'JSON.php');

+		}

+		

+		return parent::__construct();

+	}

+	

+	function render() {

+	

+		// load template

+		$this->t->set_template('wrapper_blank.tpl');

+		$this->body->set_template('json.php');

+		

+		$json = new Services_JSON();

+		// set

+		

+		// look for jsonp callback

+		$callback = $this->get('jsonpCallback');

+		

+		// if not found look on the request scope.

+		if ( ! $callback ) {

+			$callback = owa_coreAPI::getRequestParam('jsonpCallback');

+		}

+		

+		if ( $callback ) {

+			$body = sprintf("%s(%s);", $callback, $json->encode( $this->get( 'json' ) ) );

+		} else {

+			$body = $json->encode( $this->get( 'json' ) );

+		}

+		$this->body->set('json', $body);

+	}

+}

+

+class owa_jsonResultsView extends owa_view {

+

+	function __construct() {

+		

+		if (!class_exists('Services_JSON')) {

+			require_once(OWA_INCLUDE_DIR.'JSON.php');

+		}

+		

+		return parent::__construct();

+	}

+	

+	function render() {

+	

+		// load template

+		$this->t->set_template('wrapper_blank.tpl');

+		$this->body->set_template('json.php');

+		

+		$json = new Services_JSON();

+		// set

+		$this->body->set('json', $json->encode($this->get('data')));

+	}

+}

+

+?>