2011-03-22 15:00:03 +01:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* eGroupWare API: egw action grid columns classes
|
|
|
|
*
|
|
|
|
* @link http://www.egroupware.org
|
|
|
|
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
|
|
|
* @package api
|
|
|
|
* @subpackage egw action grid
|
|
|
|
* @author Andreas Stöckel
|
|
|
|
* @copyright (c) 2011 Stylite
|
|
|
|
* @version $Id$
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The egw_grid_columns class in this file is the PHP counterpart to the implementation
|
|
|
|
* in the JS file egw_grid_columns.js. It can generate column json data, verify
|
|
|
|
* it and store user settings for columns in the preferences
|
|
|
|
*/
|
|
|
|
|
|
|
|
class egw_json_object
|
|
|
|
{
|
|
|
|
private $supported_properties = array(
|
|
|
|
"id" => array(
|
|
|
|
"types" => "string",
|
|
|
|
"default" => ""
|
|
|
|
)
|
|
|
|
);
|
|
|
|
|
|
|
|
protected $data = array();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Merges the given properties into the supported properties array.
|
|
|
|
*
|
|
|
|
* @param array $props are the supported properties which will be added to the
|
|
|
|
* object.
|
|
|
|
*/
|
|
|
|
protected function add_supported_properties($props)
|
|
|
|
{
|
|
|
|
$this->supported_properties = array_merge($this->supported_properties, $props);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Reads the object data from the
|
|
|
|
*/
|
|
|
|
public function load_assoc(array $assoc)
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* Calls the magic setter for each data element
|
|
|
|
*/
|
|
|
|
foreach ($assoc as $key => $data)
|
|
|
|
{
|
|
|
|
$this->$key = $data;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns an associative array with the object data
|
|
|
|
*/
|
|
|
|
public function store_assoc($include_defaults = false)
|
|
|
|
{
|
|
|
|
$result = array();
|
|
|
|
|
|
|
|
foreach ($this->supported_properties as $key => $opt)
|
|
|
|
{
|
|
|
|
if (!array_key_exists("store", $opt) || $opt[$store])
|
|
|
|
{
|
|
|
|
$val = $this->$key;
|
|
|
|
|
|
|
|
if ($val != $opt["default"] || $include_defaults )
|
|
|
|
{
|
|
|
|
$result[$key] = $val;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Magic setter function - checks whether the specified key is supported by the
|
|
|
|
* the object and the given value is of the supported type.
|
|
|
|
*/
|
|
|
|
public function __set($key,$val)
|
|
|
|
{
|
|
|
|
if (array_key_exists($key, $this->supported_properties))
|
|
|
|
{
|
|
|
|
$sup_entry = $this->supported_properties[$key];
|
|
|
|
|
|
|
|
// Test for the type (PHP-Docu says not to use gettype here)
|
|
|
|
$correct_type = true;
|
|
|
|
|
|
|
|
if (array_key_exists("types", $sup_entry))
|
|
|
|
{
|
|
|
|
$types = explode(",", $sup_entry["types"]);
|
|
|
|
|
|
|
|
foreach ($types as $type)
|
|
|
|
{
|
|
|
|
switch ($type)
|
|
|
|
{
|
|
|
|
case "bool":
|
|
|
|
$correct_type = $correct_type || is_bool($val);
|
|
|
|
break;
|
|
|
|
case "string":
|
|
|
|
$correct_type = $correct_type || is_string($val);
|
|
|
|
break;
|
|
|
|
case "int":
|
|
|
|
$correct_type = $correct_type || is_int($val);
|
|
|
|
break;
|
|
|
|
case "float":
|
|
|
|
$correct_type = $correct_type || is_float($val);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set the value in the data array or call a setter function an inherited
|
|
|
|
// class might have specified
|
|
|
|
if ($correct_type)
|
|
|
|
{
|
|
|
|
if (method_exists($this, "set_".$key))
|
|
|
|
{
|
|
|
|
call_user_func(array($this, "set_".$key), $val);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$this->data[$key] = $val;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Magic getter function - returns the default value if the data key has not
|
|
|
|
* been set yet, returns null if the property does not exists.
|
|
|
|
*/
|
|
|
|
public function __get($key) {
|
|
|
|
if (array_key_exists($key, $this->supported_properties))
|
|
|
|
{
|
|
|
|
// Check whether the inherited class has a special getter implemented
|
|
|
|
if (method_exists($this, "get_".$key))
|
|
|
|
{
|
|
|
|
return call_user_func(array($this, "get_".$key), $val);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (array_key_exists($key, $this->data))
|
|
|
|
{
|
|
|
|
return $this->data[$key];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return $this->supported_properties[$key]["default"];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Define some constants as they occur in egw_grid_columns.js
|
|
|
|
*/
|
|
|
|
define("EGW_COL_TYPE_DEFAULT", 0);
|
|
|
|
define("EGW_COL_TYPE_NAME_ICON_FIXED", 1);
|
2011-03-30 16:28:49 +02:00
|
|
|
define("EGW_COL_TYPE_CHECKBOX", 2);
|
2011-03-22 15:00:03 +01:00
|
|
|
|
|
|
|
define("EGW_COL_VISIBILITY_ALWAYS", 0);
|
|
|
|
define("EGW_COL_VISIBILITY_VISIBLE", 1);
|
|
|
|
define("EGW_COL_VISIBILITY_INVISIBLE", 2);
|
2011-03-30 14:28:24 +02:00
|
|
|
define("EGW_COL_VISIBILITY_ALWAYS_NOSELECT", 3);
|
2011-03-22 15:00:03 +01:00
|
|
|
|
|
|
|
define("EGW_COL_SORTABLE_NONE", 0);
|
|
|
|
define("EGW_COL_SORTABLE_ALPHABETIC", 1);
|
|
|
|
define("EGW_COL_SORTABLE_NUMERICAL", 2);
|
|
|
|
define("EGW_COL_SORTABLE_NATURAL", 3);
|
2011-03-31 14:17:46 +02:00
|
|
|
define("EGW_COL_SORTABLE_EXTERNAL", 4);
|
2011-03-22 15:00:03 +01:00
|
|
|
|
|
|
|
define("EGW_COL_SORTMODE_NONE", 0);
|
|
|
|
define("EGW_COL_SORTMODE_ASC", 1);
|
|
|
|
define("EGW_COL_SORTMODE_DESC", 2);
|
|
|
|
|
|
|
|
define("EGW_COL_DEFAULT_FETCH", -10000);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Object which represents a single column
|
|
|
|
*/
|
|
|
|
class egw_grid_column extends egw_json_object
|
|
|
|
{
|
|
|
|
public function __construct($id = "")
|
|
|
|
{
|
|
|
|
// Add the supported properties
|
|
|
|
$this->add_supported_properties(array(
|
|
|
|
"width" => array("types" => "bool,int,string", "default" => false),
|
|
|
|
"maxWidth" => array("types" => "int,bool", "default" => false),
|
|
|
|
"caption" => array("types" => "string", "default" => ""),
|
|
|
|
"visibility" => array("types" => "int", "default" => EGW_COL_VISIBILITY_VISIBLE),
|
|
|
|
"visible" => array("types" => "bool", "default" => true, "store" => false),
|
|
|
|
"sortable" => array("types" => "int", "default" => EGW_COL_SORTABLE_NONE),
|
|
|
|
"sortmode" => array("types" => "int", "default" => EGW_COL_SORTMODE_NONE),
|
|
|
|
"default" => array("types" => "string,int", "default" => EGW_COL_DEFAULT_FETCH),
|
2011-03-31 14:17:46 +02:00
|
|
|
"type" => array("types" => "int", "default" => EGW_COL_TYPE_DEFAULT)
|
2011-03-22 15:00:03 +01:00
|
|
|
));
|
|
|
|
|
|
|
|
// Set the column id
|
|
|
|
$this->id = $id;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function get_visible()
|
|
|
|
{
|
|
|
|
return $this->visibility != EGW_COL_VISIBILITY_INVISIBLE;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function set_visible($val)
|
|
|
|
{
|
2011-03-30 16:28:49 +02:00
|
|
|
if ($this->visibility != EGW_COL_VISIBILITY_ALWAYS &&
|
|
|
|
$this->visibility != EGW_COL_VISIBILITY_ALWAYS_NOSELECT)
|
2011-03-22 15:00:03 +01:00
|
|
|
{
|
|
|
|
$this->visibility = $val ? EGW_COL_VISIBILITY_VISIBLE : EGW_COL_VISIBILITY_INVISIBLE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class egw_grid_columns
|
|
|
|
{
|
|
|
|
private $app_name;
|
|
|
|
private $grid_name;
|
|
|
|
|
|
|
|
private $grid_data = array();
|
|
|
|
|
|
|
|
public function __construct($app_name, $grid_name = "main")
|
|
|
|
{
|
|
|
|
$this->app_name = $app_name;
|
|
|
|
$this->grid_name = $grid_name;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function load_grid_data($data)
|
|
|
|
{
|
|
|
|
foreach ($data as $col)
|
|
|
|
{
|
|
|
|
$colobj = new egw_grid_column();
|
|
|
|
$colobj->load_assoc($col);
|
|
|
|
|
|
|
|
$this->grid_data[] = $colobj;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private function get_col($id)
|
|
|
|
{
|
|
|
|
foreach ($this->grid_data as $col)
|
|
|
|
{
|
|
|
|
if ($col->id == $id)
|
|
|
|
{
|
|
|
|
return $col;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Loads the given column data in the user preferences for this grid
|
|
|
|
*/
|
|
|
|
private function get_userdata()
|
|
|
|
{
|
|
|
|
if ($GLOBALS['egw_info']['user']['preferences'][$this->app_name][$this->grid_name.'_column_data'])
|
|
|
|
{
|
|
|
|
return unserialize($GLOBALS['egw_info']['user']['preferences'][$this->app_name][$this->grid_name.'_column_data']);
|
|
|
|
}
|
|
|
|
return array();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Stores the given column data in the user preferences for this grid
|
|
|
|
*/
|
|
|
|
private function set_userdata($data)
|
|
|
|
{
|
|
|
|
$GLOBALS['egw']->preferences->read_repository();
|
|
|
|
|
|
|
|
$GLOBALS['egw']->preferences->change($this->app_name, $this->grid_name.'_column_data',
|
|
|
|
serialize($data));
|
|
|
|
|
|
|
|
$GLOBALS['egw']->preferences->save_repository(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function load_userdata()
|
|
|
|
{
|
|
|
|
// Read the userdata from the user preferences
|
|
|
|
$data = $this->get_userdata();
|
|
|
|
|
|
|
|
// Merge the userdata into the column data
|
|
|
|
foreach ($data as $col_id => $col_data)
|
|
|
|
{
|
|
|
|
$col = $this->get_col($col_id);
|
|
|
|
if ($col && is_array($col_data))
|
|
|
|
{
|
|
|
|
$col->load_assoc($col_data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function store_userdata($data)
|
|
|
|
{
|
|
|
|
$store_data = array();
|
|
|
|
|
|
|
|
// Check whether the specified columns exists
|
|
|
|
foreach ($data as $col_id => $col_data)
|
|
|
|
{
|
|
|
|
$col = $this->get_col($col_id);
|
|
|
|
if ($col)
|
|
|
|
{
|
|
|
|
$store_data[$col_id] = $col_data;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Store the verified data columns
|
|
|
|
$this->set_userdata($store_data);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the associative array containing the column data which can be
|
|
|
|
* JSON-encoded and sent to the client
|
|
|
|
*/
|
|
|
|
public function get_assoc()
|
|
|
|
{
|
|
|
|
$result = array();
|
|
|
|
foreach ($this->grid_data as $col)
|
|
|
|
{
|
|
|
|
$result[] = $col->store_assoc();
|
|
|
|
}
|
|
|
|
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|