* @license http://www.contenido.org/license/LIZENZ.txt * @link http://www.4fb.de * @link http://www.contenido.org * @since file available since contenido release <= 4.6 * * {@internal * created unknown * modified 2008-06-30, Dominik Ziegler, add security fix * * $Id$: * }} * */ if(!defined('CON_FRAMEWORK')) { die('Illegal call'); } /* Introduction to metaobjects * * A metaobject is an object which combines pure API objects with presentation logic. * An API object contains API functions for doing actions or data manipulation in general. * * A metaobject can define the following things: * * - Map data objects to widgets * - Map data into groups * - Map actions (from the API objects) to visible actions * - Map data fields with flags (searchable, sortable) * */ define("CMETAOBJECT_BASE", 1); define("CMETAOBJECT_PLUGIN", 2); class cMetaObject { /** * Type of this plugin * @var int Contains the object type * @access private */ var $_objectType; /** * Object icon * @var string Icon filename * @access private */ var $_iconFilename; var $_objectInvalid; var $_payloadObject; function __construct ($payload = false) { $this->_actions = array(); $this->_fields = array(); $this->_objectInvalid = false; $this->setPayloadObject($payload); } /** * setObjectType ($type) * * Sets the object type (either COBJECT_BASE or COBJECT_PLUGIN). * * @param int $type Constant with the object type * */ function setObjectType ($type) { if ($type != COBJECT_BASE && $type != COBJECT_PLUGIN) { cDie(__FILE__, __LINE__, "When calling setObjectType, please use either COBJECT_BASE or COBJECT_PLUGIN"); } $this->_objectType = $type; } /** * setIcon ($icon) * Defines the icon for this object * @param string $icon Icon path * @return none */ function setIcon ($icon = false) { $icon = Contenido_Security::escapeDB($icon, null); $this->_iconFilename = $icon; } /** * getIcon ($icon) * Returns the icon for this object * @param string $icon Icon path * @return none */ function getIcon () { return $this->_iconFilename; } function setPayloadObject ($object) { if (is_object($object)) { $this->_payloadObject = $object; $this->defineActions(); } else { if (class_exists($object)) { $this->_payloadObject = new $object; $this->defineActions(); } } } function getName () { return; } function getDescription () { return; } function defineActions () { } function assignField ($field, $name, $editwidget, $parameters = array(), $group = "default", $readonly = false) { if (!array_key_exists("default", $parameters)) { $parameters["default"] = $this->_payloadObject->get($field); $parameters["_payload"] = $this->_payloadObject; } $this->_fields[$group][$field]["name"] = $name; $this->_fields[$group][$field]["editwidget"] = $editwidget; $this->_fields[$group][$field]["readonly"] = $readonly; $this->_fields[$group][$field]["parameters"] = $parameters; } function setEditAction ($actionclass) { $args = func_num_args(); unset($this->_editAction); $this->_editAction = $actionclass; $this->_editParams = array(); for ($i=1; $i< $args; $i++) { $this->_editParams[$i] = func_get_arg($i); } } function setCreateAction ($actionclass) { $args = func_num_args(); unset($this->_createAction); $this->_createAction = $actionclass; $this->_createParams = array(); for ($i=1; $i< $args; $i++) { $this->_createParams[$i] = func_get_arg($i); } } function addAction ($actionclass) { $args = func_num_args(); $this->_actions[$actionclass] = array(); for ($i=1; $i< $args; $i++) { $this->_actions[$actionclass][$i] = func_get_arg($i); } } function defineFields () { } function defineEditAction () { } function defineCreateAction () { } function processActions () { $reload = false; $actions = $this->getActions(); if (is_array($actions)) { foreach ($actions as $action) { if ($_GET["action"] == $action->_namedAction) { /* Collect parameters */ foreach ($action->_wantParameters as $parameter) { /* Mangle parameter */ if (get_magic_quotes_gpc()) { $parameters[$parameter] = stripslashes($_GET[$parameter]); } else { $parameters[$parameter] = $_GET[$parameter]; } } foreach ($action->_parameters as $parameter => $value) { if (get_magic_quotes_gpc()) { $parameters[$parameter] = stripslashes($_GET[$parameter]); } else { $parameters[$parameter] = $_GET[$parameter]; } } if ($action->process($parameters) == true) { $reload = true; } if ($action->_objectInvalid) { $this->_objectInvalid = true; } } } } return $reload; } function processEdit () { $this->defineFields(); $modified = false; foreach ($this->_fields as $group) { foreach ($group as $field => $params) { $vname = get_class($this)."_".$field; if (array_key_exists($vname, $_GET)) { if (get_magic_quotes_gpc()) { $this->_payloadObject->set($field, stripslashes($_GET[$vname])); } else { $this->_payloadObject->set($field, $_GET[$vname]); } $modified = true; } } } if ($modified == true) { $this->_payloadObject->store(); } } function processCreate () { if ($this->_actionsDefined == false) { $this->defineActions(); $this->_actionsDefined = true; } /* Get create action */ $createaction = $this->getAction($this->_createAction); if ($createaction != false) { if ($_GET["action"] == $createaction->_namedAction) { return $createaction->process(); } } } function getActions () { if ($this->_actionsDefined == false) { $this->defineActions(); $this->_actionsDefined = true; } foreach ($this->_actions as $action => $params) { $i = $this->getAction($action); if ($i !== false) { $actions[] = $i; } } return ($actions); } function getAction ($action) { if (!array_key_exists($action, $this->_actions)) { if ($this->_editAction == $action) { $params = $this->_editParams; } else { if ($this->_createAction == $action) { $params = $this->_createParams; } else { return false; } } } else { $params = $this->_actions[$action]; } $myparams = array(); if (!is_array($params)) { $params = array(); } foreach ($params as $param) { switch (gettype($param)) { case "string" : $myparams[] = '"'.addslashes($param).'"'; break; case "boolean": if ($param == true) { $myparams[] = "true"; } else { $myparams[] = "false"; } break; default: $myparams[] = $param; } } $statement = '$action = new '.$action."(".implode(", ",$myparams).");"; eval($statement); return ($action); } } ?>