<?php
/**
* TODO
*
*/
interface QIGoogleGraph{
/**
* interface design for render method
*
*/
public function render();
/**
* interface design for columns setter
*
* @param array $columns
*/
public function setColumns($columns = array());
/**
* interface design for values setter
*
* @param array $values
*/
public function setValues($values = array());
}
/**
* Wrapper for Google Visualisation API
* Visualisation Class
*
* holds generic settings for all google apis
* @author Thomas Schäfer
* @since 2008-06-29
*
*/
abstract class QGoogleGraph implements QIGoogleGraph {
/**
* curly opening brace
*/
const OC = '{';
/**
* curly closing brace
*/
const CC = '}';
/**
* line break
*/
const LB = "\n";
/**
* offset for context part of class's name
*
* @var integer
*/
private $contextNode = 1;
/**
* context holder
*
* @var string
*/
protected $context;
/**
* holder of id
*
* @var string
*/
protected $id;
/**
* working properties holder
*
* @var array
*/
protected $properties = array();
/**
* holder of xml objects
*
* @var SimpleXMLElement
*/
protected $object;
/**
* constructor
*
*/
public function __construct(){
}
/**
* setter for visualisation method type function
*
* @param string $functionname
* @return self
*/
public function setFunctionName($functionname=null){
$this->setProperty("common", "function", ($functionname?$functionname:strtolower($this->vizualisationType)));
return $this;
}
/**
* setter for properties
*
* @param array $array
* @return self
*/
public function setDrawProperties($array=array()){
$this->setProperty("drawproperties", $array);
return $this;
}
/**
* return object
*
* @return array
*/
public function getObject() {
return $this->object;
}
/**
* adds properties into working object
*
* @param unknown_type $array
* @return unknown
*/
public function addDrawProperties($array=array()){
// last set property overwrites default
$array = array_merge($this->drawProperties, $array);
foreach($array as $key => $value){
$this->putProperty("drawproperties", array( $key => $value));
}
return $this;
}
/**
* checks attributes on existance and values on datatype
*
* @param string $propAttr
* @param mixed $propValue
* @return mixed
*/
protected function checkProperties($propAttr, $propValue){
if(strpos($this->configuration[$propAttr]["datatype"],",")){
$checkProps = explode(",", $this->configuration[$propAttr]["datatype"]);
} else {
$checkProps = false;
}
if($checkProps) {
foreach($checkProps as $checkProp){
$check = function_exists("is_" . $checkProp)
? call_user_func("is_" . $checkProp,$propValue)
: false;
if(empty($check) && $checkProp=="object"){
$check = $this->isLiteralObject($propValue);
if($check){
return "literal";
}
}
if($check
and array_key_exists($propAttr, $this->configuration)
and isset($this->configuration[$propAttr]["values"])
and !is_array($this->configuration[$propAttr]["values"])
and in_array($propValue, array($this->configuration[$propAttr]["values"]))) {
return $this->configuration[$propAttr]["values"];
} elseif($check
and array_key_exists($propAttr, $this->configuration)
and isset($this->configuration[$propAttr]["values"])
and is_array($this->configuration[$propAttr]["values"])
and in_array($propValue, $this->configuration[$propAttr]["values"])) {
return $this->configuration[$propAttr]["values"];
}
}
return false;
} else {
$check = function_exists("is_" . $this->configuration[$propAttr]["datatype"])
? call_user_func("is_" . $this->configuration[$propAttr]["datatype"], $propValue)
: false;
if($this->configuration[$propAttr]["datatype"]=='bool') {
return $this->configuration[$propAttr]["datatype"];
}
if(empty($check) && $this->configuration[$propAttr]["datatype"]=="array"){
$check = $this->isLiteralArray($propValue);
if($check){
return "literal";
}
}
if($check
and array_key_exists($propAttr, $this->configuration)
and isset($this->configuration[$propAttr]["values"])
and is_array($this->configuration[$propAttr]["values"])
and in_array($propValue, $this->configuration[$propAttr]["values"]))
{
return $this->configuration[$propAttr]["datatype"];
} elseif($check) {
return $this->configuration[$propAttr]["datatype"];
} else {
return false;
}
}
}
/**
* check if value is a javascript literal object
*
* @param string $propValue
* @return bool
*/
protected function isLiteralObject($propValue){
$c = substr(trim($propValue),0,1)=="{"?1:0;
$c += substr(trim($propValue),-1,1)=="}"?1:0;
$c += substr_count(trim($propValue),':')>0?1:0;
if($c==3){
return true;
} else {
return false;
}
}
/**
* check if values is a javascript array
*
* @param string $propValue
* @return bool
*/
protected function isLiteralArray($propValue){
$c = substr(trim($propValue),0,1)=="["?1:0;
$c += substr(trim($propValue),-1,1)=="]"?1:0;
$c += substr_count(trim($propValue),',')>0?1:0;
if($c==3){
return true;
} else {
return false;
}
}
/**
* Sets an id attribute for presentation container.
* If not set, an randomly created id will be set
* while preparation.
* If the self::ignoreContainer method is set then
* the context name will be set only.
*
* @param string $id
*/
public function setId($id=null){
$id = (string) $id;
$newId = (strlen($id)?$id:strtolower($this->getContext()) . '_'.substr(md5(microtime()),0,4));
if(empty($this->ignoreContainer)){
$this->setProperty("id", $newId);
$this->object["div"]->div->addAttribute("id",$this->getProperty("id"));
} else {
$this->setProperty("id", $newId);
}
$this->id = $newId;
}
/**
* get id
*
* @return string
*/
public function getId() {
return $this->id;
}
/**
* getter of properties
*
* @param string $offset
* @param string $name
* @return mixed
*/
public function getProperty($offset, $name=null){
if($name) {
return $this->properties[$offset][$name];
} else {
return $this->properties[$offset];
}
}
/**
* set property
*
* @param string $offset
* @param mixed $value
* @param string $type
*/
public function setProperty($offset, $value, $type=null){
if($type){
$this->properties[$offset][$type] = $value;
} else {
$this->properties[$offset] = $value;
}
}
/**
* check property
*
* @param string $offset
* @return bool
*/
public function hasProperty($offset){
if(empty($this->properties[$offset])){
return false;
} else {
return true;
}
}
/**
* attach value to property (concatenate)
*
* @param string $offset
* @param mixed $value
* @param string $type
*/
public function addProperty($offset, $value, $type = null){
if($type){
$this->properties[$offset][$type] .= $value;
} else {
$this->properties[$offset] .= $value;
}
}
/**
* put property as new array entry
*
* @param string $offset
* @param mixed $value
* @param string $type
*/
public function putProperty($offset, $value, $type = null){
if($type){
$this->properties[$offset][$type][] = $value;
} else {
$this->properties[$offset][] = $value;
}
}
public function render(){}
public function setColumns($columns = array()){}
public function setValues($values = array()){}
}
|