diff --git a/e107_handlers/admin_ui.php b/e107_handlers/admin_ui.php index 0adc39ed0..93a3b63ae 100644 --- a/e107_handlers/admin_ui.php +++ b/e107_handlers/admin_ui.php @@ -10,64 +10,64 @@ class e_admin_request * @var array */ protected $_request_qry; - + /** * Current POST array * @var array */ protected $_posted_qry; - + /** * Current Mode * @var string */ protected $_mode = ''; - + /** * Default Mode * @var string */ protected $_default_mode = 'main'; - + /** * Key name for mode search * @var string */ protected $_mode_key = 'mode'; - + /** * Current action * @var string */ protected $_action = ''; - + /** * Default Action * @var string */ protected $_default_action = 'index'; - + /** * Key name for action search * @var string */ protected $_action_key = 'action'; - + /** * Current ID * @var integer */ protected $_id = 0; - + /** * Key name for ID search * @var string */ protected $_id_key = 'id'; - + /** * Constructor - * + * * @param string|array $qry [optional] * @return none */ @@ -82,7 +82,7 @@ class e_admin_request $this->parseRequest($request_string); } } - + /** * Parse request data * @param string|array $request_data @@ -95,34 +95,34 @@ class e_admin_request parse_str($request_data, $request_data); } $this->_request_qry = (array) $request_data; - + // Set current mode if(isset($this->_request_qry[$this->_mode_key])) { $this->_mode = preg_replace('/[^\w]/', '', $this->_request_qry[$this->_mode_key]); } - + // Set current action if(isset($this->_request_qry[$this->_action_key])) { $this->_action = preg_replace('/[^\w]/', '', $this->_request_qry[$this->_action_key]); } - + // Set current id if(isset($this->_request_qry[$this->_id_key])) { $this->_id = intval($this->_request_qry[$this->_id_key]); } - + $this->_posted_qry = $_POST; //raw? - + return $this; } - + /** * Retrieve variable from GET scope * If $key is null, all GET data will be returned - * + * * @param string $key [optional] * @param mixed $default [optional] * @return mixed @@ -135,12 +135,12 @@ class e_admin_request } return (isset($this->_request_qry[$key]) ? $this->_request_qry[$key] : $default); } - + /** * Set/Unset GET variable * If $key is array, $value is not used. - * If $value is null, (string) $key is unset - * + * If $value is null, (string) $key is unset + * * @param string|array $key * @param mixed $value [optional] * @return e_admin_request @@ -155,21 +155,21 @@ class e_admin_request } return $this; } - + if(null === $value) { unset($this->_request_qry[$key]); return $this; } - + $this->_request_qry[$key] = $value; return $this; } - + /** * Retrieve variable from POST scope * If $key is null, all POST data will be returned - * + * * @param string $key [optional] * @param mixed $default [optional] * @return mixed @@ -182,12 +182,12 @@ class e_admin_request } return (isset($this->_posted_qry[$key]) ? $this->_posted_qry[$key] : $default); } - + /** * Set/Unset POST variable * If $key is array, $value is not used. - * If $value is null, (string) $key is unset - * + * If $value is null, (string) $key is unset + * * @param object $key * @param object $value [optional] * @return e_admin_request @@ -202,18 +202,18 @@ class e_admin_request } return $this; } - + if(null === $value) { unset($this->_posted_qry[$key]); return $this; } - + $tp = e107::getParser(); $this->_posted_qry[$tp->post_toForm($key)] = $tp->post_toForm($value); return $this; } - + /** * Get current mode * @return string @@ -223,7 +223,7 @@ class e_admin_request if(!$this->_mode) return $this->getDefaultMode(); return $this->_mode; } - + /** * Get default mode * @return string @@ -232,17 +232,17 @@ class e_admin_request { return $this->_default_mode; } - + /** * Get current mode name - * + * * @return string */ public function getModeName() { return strtolower(str_replace('-', '_', $this->getMode())); } - + /** * Reset current mode * @param string $mode @@ -254,7 +254,7 @@ class e_admin_request $this->setQuery($this->_mode_key, $this->_mode); return $this; } - + /** * Set default mode * @param string $mode @@ -265,7 +265,7 @@ class e_admin_request if($mode) $this->_default_mode = $mode; return $this; } - + /** * Set mode key name * @param string $key @@ -276,7 +276,7 @@ class e_admin_request $this->_mode_key = $key; return $this; } - + /** * Get current action * @return TBD @@ -286,7 +286,7 @@ class e_admin_request if(!$this->_action) return $this->getDefaultAction(); return $this->_action; } - + /** * Get default action * @return string @@ -295,7 +295,7 @@ class e_admin_request { return $this->_default_action; } - + /** * Get current action name * @return string camelized action @@ -304,10 +304,10 @@ class e_admin_request { return $this->camelize($this->getAction()); } - + /** * Reset current action - * + * * @param string $action * @return e_admin_request */ @@ -317,10 +317,10 @@ class e_admin_request $this->setQuery($this->_action_key, $this->_action); return $this; } - + /** * Set default action - * + * * @param string $action * @return e_admin_request */ @@ -329,7 +329,7 @@ class e_admin_request if($action) $this->_default_action = $action; return $this; } - + /** * Set action key name * @param string $key @@ -340,7 +340,7 @@ class e_admin_request $this->_action_key = $key; return $this; } - + /** * Get current ID * @return integer @@ -349,7 +349,7 @@ class e_admin_request { return $this->_id; } - + /** * Reset current ID * @param string $id @@ -362,7 +362,7 @@ class e_admin_request $this->setQuery($this->_id_key, $id); return $this; } - + /** * Set id key name * @param string $key @@ -373,11 +373,11 @@ class e_admin_request $this->_id_key = $key; return $this; } - + /** * Build query string from current request array * NOTE: changing url separator to & ($encode==true) (thus URL XHTML compliance) works in PHP 5.1.2+ environment - * + * * @param string|array $merge_with [optional] override request values * @param boolean $encode if true & separator will be used, all values will be http encoded, default true * @param string|array $exclude_from_query numeric array/comma separated list of vars to be excluded from current query, true - don't use current query at all @@ -386,7 +386,7 @@ class e_admin_request public function buildQueryString($merge_with = array(), $encode = true, $exclude_from_query = '') { $ret = $this->getQuery(); - + //special case - exclude all current if(true === $exclude_from_query) { @@ -397,14 +397,14 @@ class e_admin_request { $exclude_from_query = array_map('trim', explode(',', $exclude_from_query)); } - if($exclude_from_query) + if($exclude_from_query) { foreach ($exclude_from_query as $var) { unset($ret[$var]); } } - + if(is_string($merge_with)) { parse_str($merge_with, $merge_with); @@ -416,7 +416,7 @@ class e_admin_request $separator = '&'; //$ret = array_map('rawurlencode', $ret); } - + $ret = http_build_query($ret, 'numeric_', $separator); if(!$encode) { @@ -424,10 +424,10 @@ class e_admin_request } return $ret; } - + /** * Convert string to CamelCase - * + * * @param string $str * @return string */ @@ -448,56 +448,56 @@ class e_admin_response * @var array */ protected $_body = array(); - + /** * Title segments * * @var unknown_type */ protected $_title = array(); - + /** * e107 meta title * * @var array */ protected $_e_PAGETITLE = array(); - + /** * e107 meta description * * @var array */ protected $_META_DESCRIPTION = array(); - + /** * e107 meta keywords * * @var array */ protected $_META_KEYWORDS = array(); - + /** * Render mods * * @var array */ protected $_render_mod = array(); - + /** * Meta title segment description * * @var string */ protected $_meta_title_separator = ' - '; - + /** * Title segment separator * * @var string */ protected $_title_separator = ' » '; - + /** * Constructor * @@ -553,7 +553,7 @@ class e_admin_response $this->_body[$namespace] = array_merge(array($content), $this->_body[$namespace]); return $this; } - + /** * Get body segments from a namespace * @@ -597,7 +597,7 @@ class e_admin_response * @return e_admin_response */ function appendTitle($title, $namespace = 'default') - { + { if(empty($title)) { return $this; @@ -606,7 +606,7 @@ class e_admin_response { $this->_title[$namespace] = array(); } - $this->_title[$namespace][] = $title; + $this->_title[$namespace][] = $title; return $this; } @@ -699,7 +699,7 @@ class e_admin_response } return $this; } - + /** * Add meta title segment * @@ -711,7 +711,7 @@ class e_admin_response $this->addMetaData('e_PAGETITLE', $title); return $this; } - + /** * Add meta description segment * @@ -723,7 +723,7 @@ class e_admin_response $this->addMetaData('META_DESCRIPTION', $description); return $this; } - + /** * Add meta keywords segment * @@ -746,12 +746,12 @@ class e_admin_response //HEADERF already included or meta content already sent if(e_AJAX_REQUEST || defined('HEADER_INIT') || defined('e_PAGETITLE')) return $this; - + if(!defined('e_PAGETITLE') && !empty($this->_e_PAGETITLE)) { define('e_PAGETITLE', implode($this->_meta_title_separator, $this->_e_PAGETITLE)); } - + if(!defined('META_DESCRIPTION') && !empty($this->_META_DESCRIPTION)) { define('META_DESCRIPTION', implode(' ', $this->_META_DESCRIPTION)); @@ -762,7 +762,7 @@ class e_admin_response } return $this; } - + /** * Add content segment to the header namespace * @@ -774,7 +774,7 @@ class e_admin_response $this->appendBody($content, 'header_content'); return $this; } - + /** * Get page header namespace content segments * @@ -786,7 +786,7 @@ class e_admin_response { return $this->getBody('header_content', $reset, $glue); } - + /** * Switch to iframe mod * FIXME - implement e_IFRAME to frontend - header_default.php @@ -796,9 +796,9 @@ class e_admin_response function setIframeMod() { global $HEADER, $FOOTER, $CUSTOMHEADER, $CUSTOMFOOTER; - $HEADER = $FOOTER = ''; + $HEADER = $FOOTER = ''; $CUSTOMHEADER = $CUSTOMFOOTER = array(); - + // New if(!defined('e_IFRAME')) { @@ -820,63 +820,63 @@ class e_admin_response { parse_str($options, $options); } - + // Merge with all available default options $options = array_merge(array( - 'messages' => true, - 'render' => true, - 'meta' => false, - 'return' => false, + 'messages' => true, + 'render' => true, + 'meta' => false, + 'return' => false, 'raw' => false, 'ajax' => false ), $options); - + $content = $this->getBody($name, true); - $title = $this->getTitle($name, true); + $title = $this->getTitle($name, true); $return = $options['return']; - + if($options['ajax'] || e_AJAX_REQUEST) { $type = $options['ajax'] && is_string($options['ajax']) ? $options['ajax'] : ''; $this->getJsHelper()->sendResponse($type); } - + if($options['messages']) { $content = e107::getMessage()->render().$content; } - + if($options['meta']) { $this->sendMeta(); } - + // raw output expected - force return array if($options['raw']) { return array($title, $content, $this->getRenderMod($name)); } - + //render disabled by the controller if(!$this->getRenderMod($name)) { $options['render'] = false; } - + if($options['render']) { return e107::getRender()->tablerender($title, $content, $this->getRenderMod($name), $return); } - + if($return) { return $content; } - + print($content); return ''; } - + /** * Get JS Helper instance * @@ -898,42 +898,42 @@ class e_admin_dispatcher * @var e_admin_request */ protected $_request = null; - + /** * @var e_admin_response */ protected $_response = null; - - /** + + /** * @var e_admin_controller */ protected $_current_controller = null; - + /** * Required (set by child class). - * Controller map array in format + * Controller map array in format * 'MODE' => array('controller' =>'CONTROLLER_CLASS_NAME'[, 'path' => 'CONTROLLER SCRIPT PATH', 'ui' => extend of 'comments_admin_form_ui', 'uipath' => 'path/to/ui/']); - * + * * @var array */ protected $modes; - + /** * @var string */ protected $defaultMode = ''; - + /** * @var string */ protected $defaultAction = ''; - + /** - * Optional - map 'mode/action' pair to 'modeAlias/actionAlias' + * Optional - map 'mode/action' pair to 'modeAlias/actionAlias' * @var string */ protected $adminMenuAliases = array(); - + /** * Optional (set by child class). * Required for admin menu render @@ -942,21 +942,21 @@ class e_admin_dispatcher * @var array */ protected $adminMenu = array(); - + /** * Optional (set by child class). * @var string */ protected $menuTitle = 'Menu'; - + /** * @var string */ protected $pluginTitle = ''; - + /** - * Constructor - * + * Constructor + * * @param string|array|e_admin_request $request [optional] * @param e_admin_response $response */ @@ -966,31 +966,31 @@ class e_admin_dispatcher { $request = new e_admin_request($request); } - + if(null === $response) { $response = new e_admin_response(); } - + $this->setRequest($request)->setResponse($response)->init(); - + if(!$this->defaultMode || !$this->defaultAction) { $this->setDefaults(); } - + $request->setDefaultMode($this->defaultMode)->setDefaultAction($this->defaultAction); - + // register itself e107::setRegistry('admin/ui/dispatcher', $this); - + if($auto_observe) { $this->runObservers(true); } - + } - + /** * User defined constructor - called before _initController() method * @return e_admin_dispatcher @@ -998,7 +998,7 @@ class e_admin_dispatcher public function init() { } - + /** * Retrieve missing default action/mode * @return e_admin_dispatcher @@ -1017,13 +1017,13 @@ class e_admin_dispatcher $mode = key($this->modes); $action = $this->modes[$mode]['index']; } - + if(!$this->defaultMode) $this->defaultMode = $mode; if(!$this->defaultAction) $this->defaultAction = $action; - + return $this; } - + /** * Get request object * @return e_admin_request @@ -1032,7 +1032,7 @@ class e_admin_dispatcher { return $this->_request; } - + /** * Set request object * @param e_admin_request $request @@ -1043,7 +1043,7 @@ class e_admin_dispatcher $this->_request = $request; return $this; } - + /** * Get response object * @return e_admin_response @@ -1052,7 +1052,7 @@ class e_admin_dispatcher { return $this->_response; } - + /** * Set response object * @param e_admin_response $response @@ -1063,38 +1063,38 @@ class e_admin_dispatcher $this->_response = $response; return $this; } - + /** * Dispatch & render all - * - * @param boolean $return if true, array(title, body, render_mod) will be returned + * + * @param boolean $return if true, array(title, body, render_mod) will be returned * @return string|array current admin page body */ public function run($return = false) { return $this->runObserver()->renderPage($return); } - + /** * Run observers/headers only, should be called before header.php call - * + * * @return e_admin_dispatcher */ public function runObservers($run_header = true) { //search for $actionName.'Observer' method. Additional $actionName.$triggerName.'Trigger' methods will be called as well $this->getController()->dispatchObserver(); - + //search for $actionName.'Header' method, js manager should be used inside for sending JS to the page, // meta information should be created there as well if($run_header) { $this->getController()->dispatchHeader(); - + } return $this; } - + /** * Run page action. * If return type is array, it should contain allowed response options (see e_admin_response::send()) @@ -1104,7 +1104,7 @@ class e_admin_dispatcher * - response: return response object * - raw: return array(title, content, render mode) * - ajax: force ajax output (and exit) - * + * * @param string|array $return_type expected string values: render|render_out|response|raw|ajax[_text|_json|_xml] * @return mixed */ @@ -1119,20 +1119,20 @@ class e_admin_dispatcher { case 'render_return': $options = array( - 'messages' => true, - 'render' => true, - 'meta' => true, - 'return' => true, + 'messages' => true, + 'render' => true, + 'meta' => true, + 'return' => true, 'raw' => false ); break; case 'raw': $options = array( - 'messages' => false, - 'render' => false, - 'meta' => false, - 'return' => true, + 'messages' => false, + 'render' => false, + 'meta' => false, + 'return' => true, 'raw' => true ); break; @@ -1142,43 +1142,43 @@ class e_admin_dispatcher case 'ajax_xml'; case 'ajax_json'; $options = array( - 'messages' => false, - 'render' => false, - 'meta' => false, - 'return' => false, + 'messages' => false, + 'render' => false, + 'meta' => false, + 'return' => false, 'raw' => false, 'ajax' => str_replace(array('ajax_', 'ajax'), array('', 'text'), $return_type) ); break; - + case 'response': return $response; break; - + case 'render': default: $options = array( - 'messages' => true, - 'render' => true, - 'meta' => false, - 'return' => false, + 'messages' => true, + 'render' => true, + 'meta' => false, + 'return' => false, 'raw' => false ); break; } return $response->send('default', $options); } - + /** * Proxy method - * + * * @return string */ public function getHeader() { return $this->getController()->getHeader(); } - + /** * Get current controller object * @return e_admin_controller @@ -1191,10 +1191,10 @@ class e_admin_dispatcher } return $this->_current_controller; } - + /** * Try to init Controller from request using current controller map - * + * * @return e_admin_dispatcher */ protected function _initController() @@ -1205,7 +1205,7 @@ class e_admin_dispatcher { $class_name = $this->modes[$request->getModeName()]['controller']; $class_path = vartrue($this->modes[$request->getModeName()]['path']); - + if($class_path) { require_once(e107::getParser()->replaceConstants($class_path)); @@ -1214,22 +1214,22 @@ class e_admin_dispatcher { $this->_current_controller = new $class_name($request, $response); //give access to current request object, user defined init - $this->_current_controller->setRequest($this->getRequest())->init(); + $this->_current_controller->setRequest($this->getRequest())->init(); } else { - //TODO - get default controller (core or user defined), set Action for + //TODO - get default controller (core or user defined), set Action for //'Controller not found' page, add message(?), break - // get default controller + // get default controller $this->_current_controller = $this->getDefaultController(); // add messages e107::getMessage()->add('Can\'t find class '.($class_name ? $class_name : 'n/a'), E_MESSAGE_ERROR) ->add('Requested: '.e_SELF.'?'.$request->buildQueryString(), E_MESSAGE_DEBUG); - // + // $request->setMode($this->getDefaultControllerName())->setAction('e404'); - $this->_current_controller->setRequest($request)->init(); + $this->_current_controller->setRequest($request)->init(); } - + if(vartrue($this->modes[$request->getModeName()]['ui'])) { $class_name = $this->modes[$request->getModeName()]['ui']; @@ -1244,12 +1244,12 @@ class e_admin_dispatcher } } $this->_current_controller->setParam('modes', $this->modes); - + } - + return $this; } - + /** * Default controller object - needed if controller not found * @return e_admin_controller @@ -1259,7 +1259,7 @@ class e_admin_dispatcher $class_name = $this->getDefaultControllerName(); return new $class_name($this->getRequest(), $this->getResponse()); } - + /** * Default controller name - needed if controller not found * @return string name of controller @@ -1268,7 +1268,7 @@ class e_admin_dispatcher { return 'e_admin_controller'; } - + /** * Generic Admin Menu Generator * @return string @@ -1277,11 +1277,11 @@ class e_admin_dispatcher { $tp = e107::getParser(); $var = array(); - + foreach($this->adminMenu as $key => $val) { $tmp = explode('/', trim($key, '/'), 2); - + foreach ($val as $k=>$v) { switch($k) @@ -1289,12 +1289,12 @@ class e_admin_dispatcher case 'caption': $k2 = 'text'; break; - + case 'url': $k2 = 'link'; $v = $tp->replaceConstants($v, 'abs').'?mode='.$tmp[0].'&action='.$tmp[1]; break; - + default: $k2 = $k; break; @@ -1306,12 +1306,12 @@ class e_admin_dispatcher { $var[$key]['link'] = e_SELF.'?mode='.$tmp[0].'&action='.$tmp[1]; // FIXME - URL based on $modes, remove url key } - + /*$var[$key]['text'] = $val['caption']; $var[$key]['link'] = (vartrue($val['url']) ? $tp->replaceConstants($val['url'], 'abs') : e_SELF).'?mode='.$tmp[0].'&action='.$tmp[1]; $var[$key]['perm'] = $val['perm']; */ } - + $request = $this->getRequest(); $selected = $request->getMode().'/'.$request->getAction(); $selected = vartrue($this->adminMenuAliases[$selected], $selected); @@ -1325,24 +1325,24 @@ class e_admin_controller * @var e_admin_request */ protected $_request; - + /** * @var e_admin_response */ protected $_response; - + /** * @var array User defined parameters */ protected $_params = array(); - + /** * @var string default action name */ protected $_default_action = 'index'; - + /** - * Constructor + * Constructor * @param e_admin_request $request [optional] */ public function __construct($request, $response, $params = array()) @@ -1352,7 +1352,7 @@ class e_admin_controller ->setResponse($response) ->setParams($params); } - + /** * User defined init * Called before dispatch routine @@ -1360,7 +1360,7 @@ class e_admin_controller public function init() { } - + /** * Get controller parameter * Currently used core parameters: @@ -1368,8 +1368,8 @@ class e_admin_controller * - modes - see dispatcher::$modes * - ajax_response - text|xml|json - default is 'text'; this should be set by the action method * - TODO - more parameters/add missing to this list - * - * @param string $key [optional] if null - get whole array + * + * @param string $key [optional] if null - get whole array * @param mixed $default [optional] * @return mixed */ @@ -1381,7 +1381,7 @@ class e_admin_controller } return (isset($this->_params[$key]) ? $this->_params[$key] : $default); } - + /** * Set parameter * @param string $key @@ -1398,7 +1398,7 @@ class e_admin_controller $this->_params[$key] = $value; return $this; } - + /** * Merge passed parameter array with current parameters * @param array $params @@ -1409,7 +1409,7 @@ class e_admin_controller $this->_params = array_merge($this->_params, $params); return $this; } - + /** * Reset parameter array * @param array $params @@ -1420,16 +1420,16 @@ class e_admin_controller $this->_params = $params; return $this; } - + /** * Get current request object - * @return e_admin_request + * @return e_admin_request */ public function getRequest() { return $this->_request; } - + /** * Set current request object * @param e_admin_request $request @@ -1443,13 +1443,13 @@ class e_admin_controller /** * Get current response object - * @return e_admin_response + * @return e_admin_response */ public function getResponse() { return $this->_response; } - + /** * Set current response object * @param e_admin_response $response @@ -1460,9 +1460,9 @@ class e_admin_controller $this->_response = $response; return $this; } - + /** - * Request proxy method + * Request proxy method * @param string $key [optional] * @param mixed $default [optional] * @return mixed @@ -1471,9 +1471,9 @@ class e_admin_controller { return $this->getRequest()->getQuery($key, $default); } - + /** - * Request proxy method + * Request proxy method * @param string|array $key * @param mixed $value [optional] * @return e_admin_controller @@ -1483,9 +1483,9 @@ class e_admin_controller $this->getRequest()->setQuery($key, $value); return $this; } - + /** - * Request proxy method + * Request proxy method * @param string $key [optional] * @param mixed $default [optional] * @return mixed @@ -1494,9 +1494,9 @@ class e_admin_controller { return $this->getRequest()->getPosted($key, $default); } - + /** - * Request proxy method + * Request proxy method * @param string $key * @param mixed $value [optional] * @return e_admin_controller @@ -1506,7 +1506,7 @@ class e_admin_controller $this->getRequest()->setPosted($key, $value); return $this; } - + /** * Add page title, response proxy method * @@ -1520,7 +1520,7 @@ class e_admin_controller if($meta) $this->addMetaTitle($title); return $this; } - + /** * Add page meta title, response proxy method. * Should be called before header.php @@ -1533,11 +1533,11 @@ class e_admin_controller $this->getResponse()->addMetaTitle($title); return $this; } - + /** * Add header content, response proxy method * Should be called before header.php - * + * * @param string $content * @return e_admin_controller */ @@ -1546,7 +1546,7 @@ class e_admin_controller $this->getResponse()->addHeaderContent($content); return $this; } - + /** * Get header content, response proxy method * @@ -1556,7 +1556,7 @@ class e_admin_controller { return $this->getResponse()->getHeaderContent(); } - + /** * Get current mode, response proxy method * @return string @@ -1565,7 +1565,7 @@ class e_admin_controller { return $this->getRequest()->getMode(); } - + /** * Get current actin, response proxy method * @return string @@ -1574,7 +1574,7 @@ class e_admin_controller { return $this->getRequest()->getAction(); } - + /** * Get current ID, response proxy method * @return string @@ -1583,7 +1583,7 @@ class e_admin_controller { return $this->getRequest()->getId(); } - + /** * Get response owned JS Helper instance, response proxy method * @@ -1593,16 +1593,16 @@ class e_admin_controller { return $this->getResponse()->getJsHelper(); } - + protected function _preDispatch($action = '') { - if(!$action) $action = $this->getRequest()->getActionName(); - $method = $this->toMethodName($action, 'page'); + if(!$action) $action = $this->getRequest()->getActionName(); + $method = $this->toMethodName($action, 'page'); if(!method_exists($this, $method)) { $this->getRequest()->setAction($this->getDefaultAction()); } - + // switch to 404 if needed $method = $this->toMethodName($this->getRequest()->getActionName(), 'page'); if(!method_exists($this, $method)) @@ -1611,10 +1611,10 @@ class e_admin_controller e107::getMessage()->add('Action '.$method.' not found!', E_MESSAGE_ERROR); } } - + /** * Dispatch observer, check for triggers - * + * * @param string $action [optional] * @return e_admin_controller */ @@ -1626,13 +1626,13 @@ class e_admin_controller $request = new e_admin_request(); $this->setRequest($request); } - + $this->_preDispatch($action); if(null === $action) { $action = $request->getActionName(); } - + // check for observer $actionObserverName = $this->toMethodName($action, 'observer', e_AJAX_REQUEST); if(method_exists($this, $actionObserverName)) @@ -1648,7 +1648,7 @@ class e_admin_controller { if(strpos($key, 'etrigger_') === 0) { - $actionTriggerName = $this->toMethodName($action.$request->camelize(substr($key, 9)), 'trigger', false); + $actionTriggerName = $this->toMethodName($action.$request->camelize(substr($key, 9)), 'trigger', false); if(method_exists($this, $actionTriggerName)) { $this->$actionTriggerName($value); @@ -1661,10 +1661,10 @@ class e_admin_controller } } } - + return $this; } - + /** * Dispatch header, not allowed in Ajax mode * @param string $action [optional] @@ -1677,35 +1677,35 @@ class e_admin_controller { return $this; } - + $request = $this->getRequest(); if(null === $request) { $request = new e_admin_request(); $this->setRequest($request); } - + $this->_preDispatch($action); if(null === $action) { $action = $request->getActionName(); } - + // check for observer - $actionHeaderName = $this->toMethodName($action, 'header', false); + $actionHeaderName = $this->toMethodName($action, 'header', false); if(method_exists($this, $actionHeaderName)) { $this->$actionHeaderName(); } - + //send meta data $this->getResponse()->sendMeta(); return $this; } - + /** * Dispatch controller action - * + * * @param string $action [optional] * @return e_admin_response */ @@ -1718,15 +1718,15 @@ class e_admin_controller $this->setRequest($request); } $response = $this->getResponse(); - $this->_preDispatch($action); - + $this->_preDispatch($action); + if(null === $action) { $action = $request->getActionName(); } - + // check for observer - $actionName = $this->toMethodName($action, 'page'); + $actionName = $this->toMethodName($action, 'page'); $ret = ''; if(!method_exists($this, $actionName)) // pre dispatch already switched to default action/not found page if needed { @@ -1735,23 +1735,23 @@ class e_admin_controller } ob_start(); //catch any output $ret = $this->{$actionName}(); - - + + //Ajax XML/JSON communication if(e_AJAX_REQUEST && is_array($ret)) { $response_type = $this->getParam('ajax_response', 'xml'); ob_clean(); $js_helper = $response->getJsHelper(); - foreach ($ret as $act => $data) + foreach ($ret as $act => $data) { $js_helper->addResponse($data, $act); } $js_helper->sendResponse($response_type); } - + $ret .= ob_get_clean(); - + // Ajax text response if(e_AJAX_REQUEST) { @@ -1762,33 +1762,33 @@ class e_admin_controller { $response->appendBody($ret); } - + return $response; } - + public function E404Observer() { $this->getResponse()->setTitle('Page Not Found'); } - + public function E404Page() { return '
Requested page was not found!
'; // TODO - lan } - - + + public function E404AjaxPage() { exit; } - + /** * Generic redirect handler, it handles almost everything we would need. * Additionally, it moves currently registered system messages to SESSION message stack * In almost every case {@link redirectAction()} and {@link redirectMode()} are better solution - * - * @param string $action defaults to current action - * @param string $mode defaults to current mode + * + * @param string $action defaults to current action + * @param string $mode defaults to current mode * @param string|array $exclude_query comma delimited variable names to be excluded from current query OR TRUE to exclude everything * @param string|array $merge_query query string (& delimiter) or associative array to be merged with current query * @param string $path default to e_SELF @@ -1801,21 +1801,21 @@ class e_admin_controller if($mode) $request->setMode($mode); if($action) $request->setAction($action); if(!$path) $path = e_SELF; - + $url = $path.'?'.$request->buildQueryString($merge_query, false, $exclude_query); // Transfer all messages to session - e107::getMessage()->moveToSession(); + e107::getMessage()->moveToSession(); // write session data session_write_close(); // do redirect header('Location: '.$url); exit; } - + /** - * Convenient redirect() proxy method, make life easier when redirecting between actions + * Convenient redirect() proxy method, make life easier when redirecting between actions * in same mode. - * + * * @param string $action [optional] * @param string|array $exclude_query [optional] * @param string|array $merge_query [optional] @@ -1825,11 +1825,11 @@ class e_admin_controller { $this->redirect($action, null, $exclude_query, $merge_query); } - + /** * Convenient redirect to another mode (doesn't use current Query state) * If path is empty, it'll be auto-detected from modes (dispatcher) array - * + * * @param string $mode * @param string $action * @param string|array $query [optional] @@ -1848,11 +1848,11 @@ class e_admin_controller } $this->redirect($action, $mode, true, $query, $path); } - + /** * Convert action name to method name - * - * @param string $action_name formatted (e.g. request method getActionName()) action name + * + * @param string $action_name formatted (e.g. request method getActionName()) action name * @param string $type page|observer|header|trigger * @param boolean $ajax force with true/false, if null will be auto-resolved * @return string @@ -1862,14 +1862,14 @@ class e_admin_controller if(null === $ajax) $ajax = e_AJAX_REQUEST; //auto-resolving return $action_name.($ajax ? 'Ajax' : '').ucfirst(strtolower($type)); } - + /** * Check if there is a trigger available in the posted data * @return boolean */ public function hasTrigger() { - $posted = array_keys($this->getPosted()); + $posted = array_keys($this->getPosted()); foreach ($posted as $key) { if(strpos($key, 'etrigger_') === 0) @@ -1879,7 +1879,7 @@ class e_admin_controller } return false; } - + /** * Get default action * @return string action @@ -1888,9 +1888,9 @@ class e_admin_controller { return $this->_default_action; } - + /** - * Set default action + * Set default action * @param string $action_name * @return e_admin_controller */ @@ -1899,7 +1899,7 @@ class e_admin_controller $this->_default_action = $action_name; return $this; } - + /** * @return boolean */ @@ -1907,7 +1907,7 @@ class e_admin_controller { return $this->getParam('enable_triggers'); } - + /** * @param boolean $flag * @return e_admin_controller @@ -1926,75 +1926,93 @@ class e_admin_controller_ui extends e_admin_controller * @var array UI field data */ protected $fields = array(); - + /** * @var array default fields activated on List view */ protected $fieldpref = array(); - + /** * @var array Plugin Preference description array */ protected $prefs = array(); - + /** * Data required for _modifyListQry() to automate * db query building - * @var array + * @var array */ protected $tableJoin = array(); - + /** * Main model table alias * @var string */ protected $tableAlias; - + /** * @var string plugin name */ protected $pluginName; - - + + /** + * @var string + */ + protected $defaultOrderField = null; + + /** + * @var string + */ + protected $defaultOrder = 'asc'; + + /** + * @var string SQL order, false to disable order, null is default order + */ + protected $listOrder = null; + + /** + * @var boolean + */ protected $batchDelete = true; - + /** * Could be LAN constant (mulit-language support) + * * @var string plugin name */ protected $pluginTitle; - + /** * Default (db) limit value * @var integer */ protected $perPage = 20; - + /** * @var e_admin_model */ protected $_model = null; - + /** * @var e_admin_tree_model */ protected $_tree_model = null; - + /** * @var e_admin_tree_model */ protected $_ui = null; - + /** * @var e_plugin_pref|e_core_pref */ protected $_pref = null; - + public function getBatchDelete() { return $this->batchDelete; } - + /** * @return string */ @@ -2002,7 +2020,7 @@ class e_admin_controller_ui extends e_admin_controller { return $this->pluginName; } - + /** * @return string */ @@ -2010,7 +2028,7 @@ class e_admin_controller_ui extends e_admin_controller { return deftrue($this->pluginTitle, $this->pluginTitle); } - + /** * Get all field data * @return array @@ -2019,9 +2037,9 @@ class e_admin_controller_ui extends e_admin_controller { return $this->fields; } - + /** - * + * * @param string $field * @param string $key attribute name * @param mixed $default default value if not set, default is null @@ -2039,9 +2057,9 @@ class e_admin_controller_ui extends e_admin_controller } return $default; } - + /** - * + * * @param string $field * @param string $key attribute name * @param mixed $value default value if not set, default is null @@ -2083,7 +2101,7 @@ class e_admin_controller_ui extends e_admin_controller $this->fields[$field][$key] = $value; return $this; } - + /** * Get fields stored as user preferences * @return array @@ -2092,26 +2110,37 @@ class e_admin_controller_ui extends e_admin_controller { return $this->fieldpref; } - + /** - * Get Config data array + * Get Config data array * @return array */ public function getPrefs() { return $this->prefs; } - + public function getPerPage() { return $this->perPage; } - + public function getPrimaryName() { return $this->getModel()->getFieldIdName(); } - + + + public function getDefaultOrderField() + { + return ($this->defaultOrder ? $this->defaultOrderField : $this->getPrimaryName()); + } + + public function getDefaultOrder() + { + return ($this->defaultOrder ? $this->defaultOrder : 'asc'); + } + /** * Get column preference array * @return array @@ -2121,7 +2150,7 @@ class e_admin_controller_ui extends e_admin_controller global $user_pref; return vartrue($user_pref['admin_cols_'.$this->getTableName()], array()); } - + /** * Set column preference array * @return boolean success @@ -2133,7 +2162,7 @@ class e_admin_controller_ui extends e_admin_controller $this->fieldpref = $new; return save_prefs('user'); } - + /** * Get current model * @@ -2145,7 +2174,7 @@ class e_admin_controller_ui extends e_admin_controller { $this->_setModel(); } - + return $this->_model; } @@ -2159,7 +2188,7 @@ class e_admin_controller_ui extends e_admin_controller $this->_model = $model; return $this; } - + /** * Get model validation array * @return array @@ -2168,7 +2197,7 @@ class e_admin_controller_ui extends e_admin_controller { return $this->getModel()->getValidationRules(); } - + /** * Get model data field array * @return array @@ -2177,7 +2206,7 @@ class e_admin_controller_ui extends e_admin_controller { return $this->getModel()->getDataFields(); } - + /** * Get model table or alias * @param boolean $alias get table alias on true, default false @@ -2189,17 +2218,17 @@ class e_admin_controller_ui extends e_admin_controller if($alias) return ($this->tableAlias ? $this->tableAlias : ''); return ($prefix ? '#' : '').$this->getModel()->getModelTable(); } - + public function getIfTableAlias($prefix = false, $quote = false) { $alias = $this->getTableName(true); if($alias) { return $alias; - } + } return ( !$quote ? $this->getTableName(false, $prefix) : '`'.$this->getTableName(false, $prefix).'`' ); } - + /** * Get join table data * @param string $table if null all data will be returned @@ -2218,10 +2247,10 @@ class e_admin_controller_ui extends e_admin_controller } return (isset($this->tableJoin[$table][$att_name]) ? $this->tableJoin[$table][$att_name] : $default_att); } - + public function setJoinData($table, $data) { - if(null === $data) + if(null === $data) { unset($this->tableJoin[$table]); return $this; @@ -2229,7 +2258,7 @@ class e_admin_controller_ui extends e_admin_controller $this->tableJoin[$table] = (array) $data; return $this; } - + /** * User defined model setter * @return e_admin_controller_ui @@ -2238,7 +2267,7 @@ class e_admin_controller_ui extends e_admin_controller { return $this; } - + /** * Get current tree model * @return e_admin_tree @@ -2249,10 +2278,10 @@ class e_admin_controller_ui extends e_admin_controller { $this->_setTreeModel(); } - + return $this->_tree_model; } - + /** * Set controller tree model * @param e_admin_tree $tree_model @@ -2263,7 +2292,7 @@ class e_admin_controller_ui extends e_admin_controller $this->_tree_model = $tree_model; return $this; } - + /** * User defined tree model setter * @return e_admin_controller_ui @@ -2272,7 +2301,7 @@ class e_admin_controller_ui extends e_admin_controller { return $this; } - + /** * Get extended (UI) Form instance * @@ -2286,7 +2315,7 @@ class e_admin_controller_ui extends e_admin_controller } return $this->_ui; } - + /** * Set controller UI form * @param e_admin_form_ui $ui @@ -2306,22 +2335,22 @@ class e_admin_controller_ui extends e_admin_controller { return $this; } - + /** - * Get Config object + * Get Config object * @return e_plugin_pref or e_core_pref when used in core areas */ public function getConfig() - { + { if(null === $this->_pref) { $this->_setConfig(); } return $this->_pref; } - + /** - * Set Config object + * Set Config object * @return e_admin_controller_ui */ public function setConfig($config) @@ -2329,7 +2358,7 @@ class e_admin_controller_ui extends e_admin_controller $this->_prefs = $config; return $this; } - + /** * User defined config setter * @return e_admin_controller_ui @@ -2338,7 +2367,7 @@ class e_admin_controller_ui extends e_admin_controller { return $this; } - + /** * Manage column visibility * @param string $batch_trigger @@ -2356,13 +2385,13 @@ class e_admin_controller_ui extends e_admin_controller continue; } } - + if($cols) { $this->setUserPref($cols); } } - + /** * Handle posted batch options routine * @param string $batch_trigger @@ -2374,12 +2403,12 @@ class e_admin_controller_ui extends e_admin_controller //$multi_name = vartrue($this->fields['checkboxes']['toggle'], 'multiselect'); $multi_name = $this->getFieldAttr('checkboxes', 'toggle', 'multiselect'); $selected = array_values($this->getPosted($multi_name, array())); - + if(empty($selected)) return $this; - + $selected = array_map('intval', $selected); $trigger = $tp->toDB(explode('__', $batch_trigger)); - + $this->setTriggersEnabled(false); //disable further triggering switch($trigger[0]) @@ -2392,8 +2421,8 @@ class e_admin_controller_ui extends e_admin_controller $this->$method($selected); } break; - - case 'bool': + + case 'bool': $field = $trigger[1]; $value = $trigger[2] ? 1 : 0; //something like handleListBoolBatch(); for custom handling of 'bool' batch @@ -2404,7 +2433,7 @@ class e_admin_controller_ui extends e_admin_controller break; } break; - + case 'boolreverse': $field = $trigger[1]; //something like handleListBoolreverseBatch(); for custom handling of 'boolreverse' batch @@ -2415,7 +2444,7 @@ class e_admin_controller_ui extends e_admin_controller break; } break; - + default: $field = $trigger[0]; $value = $trigger[1]; //TODO - errors @@ -2435,7 +2464,7 @@ class e_admin_controller_ui extends e_admin_controller break; } return $this; - } + } /** * Handle requested filter dropdown value @@ -2453,11 +2482,11 @@ class e_admin_controller_ui extends e_admin_controller $res = array(); switch($filter[0]) { - case 'bool': + case 'bool': // direct query $res = array($filter[1], $filter[2]); break; - + default: //something like handleListUrlTypeFilter(); for custom handling of 'url_type' field name filters $method = 'handle'.$this->getRequest()->getActionName().$this->getRequest()->camelize($filter[0]).'Filter'; @@ -2473,8 +2502,8 @@ class e_admin_controller_ui extends e_admin_controller } return $res; } - - + + /** * Convert posted to model values after submit (based on field type) * @param array $data @@ -2495,10 +2524,10 @@ class e_admin_controller_ui extends e_admin_controller case 'datestamp': if(!is_numeric($value)) { - $value = trim($value) ? e107::getDateConvert()->toTime($value, 'input') : 0; + $value = trim($value) ? e107::getDateConvert()->toTime($value, 'input') : 0; } break; - + case 'ip': // TODO - ask Steve if this check is required if(strpos($value, '.') !== FALSE) { @@ -2509,10 +2538,10 @@ class e_admin_controller_ui extends e_admin_controller } $data = $model->getData(); unset($model); - + $this->toData($data); } - + /** * User defined method for converting POSTED to MODEL data * @param array $data posted data @@ -2522,7 +2551,7 @@ class e_admin_controller_ui extends e_admin_controller protected function toData(&$data, $type = '') { } - + /** * Take approproate action after successfull submit * @@ -2533,19 +2562,19 @@ class e_admin_controller_ui extends e_admin_controller { if($noredirect_for && $noredirect_for == $this->getPosted('__after_submit_action') && $noredirect_for == $this->getAction()) { - return; + return; } - + $choice = $this->getPosted('__after_submit_action', 0); switch ($choice) { case 'create': // create $this->redirectAction('create', 'id'); break; - + case 'edit': // edit $this->redirectAction('edit', '', 'id='.$id); break; - + case 'list': // list $this->redirectAction('list', 'id'); break; @@ -2557,17 +2586,17 @@ class e_admin_controller_ui extends e_admin_controller } return; } - + /** * Build ajax auto-complete filter response * @return string response markup */ protected function renderAjaxFilterResponse($listQry = '') { - + $srch = $this->getPosted('searchquery'); $this->getRequest()->setQuery('searchquery', $srch); //_modifyListQry() is requiring GET String - + $ret = ''; return $ret; } - + /** - * Parses all available field data, adds internal attributes for handling join requests + * Parses all available field data, adds internal attributes for handling join requests * @return e_admin_controller_ui */ protected function parseAliases() @@ -2640,12 +2669,12 @@ class e_admin_controller_ui extends e_admin_controller $this->setJoinData($table, $att); } } - + // check for table & field aliases $fields = array(); // preserve order foreach ($this->fields as $field => $att) { - // tableAlias.fieldName.fieldAlias + // tableAlias.fieldName.fieldAlias if(strpos($field, '.') !== false) { $tmp = explode('.', $field, 3); @@ -2653,7 +2682,7 @@ class e_admin_controller_ui extends e_admin_controller $att['alias'] = vartrue($tmp[2]); $att['field'] = $tmp[1]; $field = $att['alias'] ? $att['alias'] : $tmp[1]; - $fields[$field] = $att; + $fields[$field] = $att; unset($tmp); } else @@ -2663,9 +2692,9 @@ class e_admin_controller_ui extends e_admin_controller $att['field'] = $field; $fields[$field] = $att; } - + if($fields[$field]['table'] == $this->getIfTableAlias(false)) - { + { $fields[$field]['__tableField'] = $att['alias'] ? $att['alias'] : $this->getIfTableAlias(true, true).'.'.$att['field']; $fields[$field]['__tableFrom'] = $this->getIfTableAlias(true, true).'.'.$att['field'].($att['alias'] ? ' AS '.$att['alias'] : ''); } @@ -2674,9 +2703,9 @@ class e_admin_controller_ui extends e_admin_controller $fields[$field]['__tableField'] = $this->getJoinData($fields[$field]['table'], '__tablePath').$field; } /*if($fields[$field]['table']) - { + { if($fields[$field]['table'] == $this->getIfTableAlias(false)) - { + { $fields[$field]['__tableField'] = $att['alias'] ? $att['alias'] : $this->getIfTableAlias(true, true).'.'.$att['field']; $fields[$field]['__tableFrom'] = $this->getIfTableAlias(true, true).'.'.$att['field'].($att['alias'] ? ' AS '.$att['alias'] : ''); } @@ -2691,10 +2720,10 @@ class e_admin_controller_ui extends e_admin_controller }*/ } $this->fields = $fields; - + return $this; } - + // TODO - abstract, array return type, move to parent? protected function _modifyListQry($raw = false, $isfilter = false, $forceFrom = false, $forceTo = false, $listQry = '') { @@ -2707,7 +2736,7 @@ class e_admin_controller_ui extends e_admin_controller $tableSFieldsArr = array(); // FROM for main table $tableSJoinArr = array(); // FROM for join tables $filter = array(); - + $searchQuery = $tp->toDB($request->getQuery('searchquery', '')); $searchFilter = $this->_parseFilterRequest($request->getQuery('filter_options', '')); list($filterField, $filterValue) = $searchFilter; @@ -2726,25 +2755,25 @@ class e_admin_controller_ui extends e_admin_controller { continue; } - + // select FROM... for main table if($var['alias'] && vartrue($var['__tableFrom'])) { $tableSFieldsArr[] = $var['__tableFrom']; } - - // filter for WHERE and FROM clauses + + // filter for WHERE and FROM clauses $searchable_types = array('text', 'textarea', 'bbarea', 'user'); //method? if(trim($searchQuery) !== '' && in_array($var['type'], $searchable_types)) { - $filter[] = $var['__tableField']." REGEXP ('".$searchQuery."')"; + $filter[] = $var['__tableField']." REGEXP ('".$searchQuery."')"; if($isfilter) { $filterFrom[] = $var['__tableField']; } } } - + if($isfilter) { if(!$filterFrom) return false; @@ -2754,11 +2783,11 @@ class e_admin_controller_ui extends e_admin_controller { $tableSFields = $tableSFieldsArr ? implode(', ', $tableSFieldsArr) : $tablePath.'*'; } - + $jwhere = array(); $joins = array(); //file_put_contents('e:/www/log', $tableSFields."\n\n", FILE_APPEND); - if($this->getJoinData()) + if($this->getJoinData()) { $qry = "SELECT SQL_CALC_FOUND_ROWS ".$tableSFields; foreach ($this->getJoinData() as $jtable => $tparams) @@ -2781,21 +2810,21 @@ class e_admin_controller_ui extends e_admin_controller }*/ } } - + // Prepare Joins $joins[] = " ".vartrue($tparams['joinType'], 'LEFT JOIN')." {$tparams['__tableFrom']} ON ".(vartrue($tparams['leftTable']) ? $tparams['leftTable'].'.' : $tablePath)."`".vartrue($tparams['leftField'])."` = {$tparams['__tablePath']}`".vartrue($tparams['rightField'])."`".(vartrue($tparams['whereJoin']) ? ' '.$tparams['whereJoin'] : ''); - + // Prepare Where if(vartrue($tparams['where'])) { $jwhere[] = $tparams['where']; } } - + //From $qry .= ', '.implode(', ', $tableSJoinArr)." FROM ".$tableFrom; - + // Joins if(count($joins) > 0) { @@ -2819,7 +2848,7 @@ class e_admin_controller_ui extends e_admin_controller $rawData['limitTo'] = false === $forceTo ? intval($this->getPerPage()) : intval($forceTo); return $rawData; } - + // join where if(count($jwhere) > 0) { @@ -2830,34 +2859,41 @@ class e_admin_controller_ui extends e_admin_controller { $searchQry[] = " ( ".implode(" OR ",$filter)." ) "; } - + // where query if(count($searchQry) > 0) { $qry .= " WHERE ".implode(" AND ", $searchQry); } - - $orderField = $request->getQuery('field', $this->getPrimaryName()); - if(isset($this->fields[$orderField]) && strpos($this->listQry,'ORDER BY')==FALSE) //override ORDER using listQry (admin->sitelinks) + + if(null !== $this->listOrder && $this->listOrder) { - // no need of sanitize - it's found in field array - $qry .= ' ORDER BY '.$this->fields[$orderField]['__tableField'].' '.($request->getQuery('asc') == 'desc' ? 'DESC' : 'ASC'); + $qry .= ' ORDER BY '.$this->listOrder; + } + elseif(false !== $this->listOrder) + { + $orderField = $request->getQuery('field', $this->getDefaultOrderField()); + $orderDef = (null === $request->getQuery('asc', null) ? $this->getDefaultOrder() : $request->getQuery('asc')); + if(isset($this->fields[$orderField]) && strpos($this->listQry,'ORDER BY')==FALSE) //override ORDER using listQry (admin->sitelinks) + { + // no need of sanitize - it's found in field array + $qry .= ' ORDER BY '.$this->fields[$orderField]['__tableField'].' '.(strtolower($orderDef) == 'desc' ? 'DESC' : 'ASC'); + } } - if($this->getPerPage() || false !== $forceTo) { $from = false === $forceFrom ? intval($request->getQuery('from', 0)) : intval($forceFrom); if(false === $forceTo) $forceTo = $this->getPerPage(); $qry .= ' LIMIT '.$from.', '.intval($forceTo); } - + return $qry; } - + /** * Manage submit item * Note: $callbackBefore will break submission if returns false - * + * * @param string $callbackBefore existing method from $this scope to be called before submit * @param string $callbackAfter existing method from $this scope to be called after successfull submit * @param string $noredirectAction passed to doAfterSubmit() @@ -2867,10 +2903,10 @@ class e_admin_controller_ui extends e_admin_controller { $model = $this->getModel(); $old_data = $model->getData(); - + $_posted = $this->getPosted(); $this->convertToData($_posted); - + if($callbackBefore && method_exists($this, $callbackBefore)) { $data = $this->$callbackBefore($_posted, $old_data, $model->getId()); @@ -2893,19 +2929,19 @@ class e_admin_controller_ui extends e_admin_controller $_posted = array_merge($_posted, $data); } } - - + + // Scenario I - use request owned POST data - toForm already executed $model->setPostedData($_posted, null, false, false) ->save(true); // Scenario II - inner model sanitize //$this->getModel()->setPosted($this->convertToData($_POST, null, false, true); - + // Take action based on use choice after success if(!$this->getModel()->hasError()) { // callback (if any) - if($callbackAfter && method_exists($this, $callbackAfter)) + if($callbackAfter && method_exists($this, $callbackAfter)) { $this->$callbackAfter($model->getData(), $old_data, $model->getId()); } @@ -2922,7 +2958,7 @@ class e_admin_controller_ui extends e_admin_controller } return false; } - + // Copy model messages to the default message stack $model->setMessages(); return false; @@ -2935,39 +2971,39 @@ class e_admin_ui extends e_admin_controller_ui protected $fieldTypes = array(); protected $dataFields = array(); protected $validationRules = array(); - + protected $table; protected $pid; protected $listQry; protected $editQry; /** - * Constructor + * Constructor * @param e_admin_request $request * @param e_admin_response $response * @param array $params [optional] */ public function __construct($request, $response, $params = array()) { - $this->setDefaultAction($request->getDefaultAction()); + $this->setDefaultAction($request->getDefaultAction()); $params['enable_triggers'] = true; // override - + parent::__construct($request, $response, $params); if(!$this->pluginName) { $this->pluginName = 'core'; } - + $ufieldpref = $this->getUserPref(); if($ufieldpref) { $this->fieldpref = $ufieldpref; } - - $this->addTitle($this->pluginTitle, true)->parseAliases(); + + $this->addTitle($this->pluginTitle, true)->parseAliases(); } - + /** * Catch fieldpref submit * @param string $batch_trigger @@ -2978,7 +3014,7 @@ class e_admin_ui extends e_admin_controller_ui $this->setTriggersEnabled(false); //disable further triggering parent::manageColumns(); } - + /** * Catch batch submit * @param string $batch_trigger @@ -2986,11 +3022,11 @@ class e_admin_ui extends e_admin_controller_ui */ public function ListBatchTrigger($batch_trigger) { - $this->setPosted('etrigger_batch', null); + $this->setPosted('etrigger_batch', null); // proceed ONLY if there is no other trigger if($batch_trigger && !$this->hasTrigger()) $this->_handleListBatch($batch_trigger); } - + /** * Batch delete trigger * @param array $selected @@ -3002,7 +3038,7 @@ class e_admin_ui extends e_admin_controller_ui { e107::getMessage()->add('Batch delete not allowed!', E_MESSAGE_WARNING); return; - } + } // delete one by one - more control, less performance // TODO - pass afterDelete() callback to tree delete method? $set_messages = true; @@ -3027,7 +3063,7 @@ class e_admin_ui extends e_admin_controller_ui //$this->getTreeModel()->delete($selected); if($set_messages) $this->getTreeModel()->setMessages(); } - + /** * Batch boolean trigger * @param array $selected @@ -3042,7 +3078,7 @@ class e_admin_ui extends e_admin_controller_ui } $this->getTreeModel()->setMessages(); } - + /** * Batch boolean reverse trigger * @param array $selected @@ -3060,7 +3096,7 @@ class e_admin_ui extends e_admin_controller_ui } $this->getTreeModel()->setMessages(); } - + /** * Batch default (field) trigger * @param array $selected @@ -3070,13 +3106,13 @@ class e_admin_ui extends e_admin_controller_ui { $cnt = $this->getTreeModel()->update($field, "'".$value."'", $selected, $value, false); if($cnt) - { - $vttl = $this->getUI()->renderValue($field, $value, $this->getFieldAttr($field)); + { + $vttl = $this->getUI()->renderValue($field, $value, $this->getFieldAttr($field)); $this->getTreeModel()->addMessageSuccess(''.$vttl.' set for '.$cnt.' record(s).'); } $this->getTreeModel()->setMessages(); } - + /** * Catch delete submit * @param string $batch_trigger @@ -3085,7 +3121,7 @@ class e_admin_ui extends e_admin_controller_ui public function ListDeleteTrigger($posted) { $this->setTriggersEnabled(false); - $id = intval(array_shift($posted)); + $id = intval(array_shift($posted)); $data = array(); $model = $this->getTreeModel()->getNode($id); if($model) @@ -3105,7 +3141,7 @@ class e_admin_ui extends e_admin_controller_ui } } } - + /** * User defined pre-delete logic */ @@ -3113,7 +3149,7 @@ class e_admin_ui extends e_admin_controller_ui { return true; } - + /** * User defined after-delete logic */ @@ -3121,7 +3157,7 @@ class e_admin_ui extends e_admin_controller_ui { return true; } - + /** * List action header * @return void @@ -3141,7 +3177,7 @@ class e_admin_ui extends e_admin_controller_ui $this->getTreeModel()->setParam('db_query', $this->_modifyListQry(false, false, false, false, $this->listQry))->load(); $this->addTitle('List'); // FIXME - get captions from dispatch list } - + /** * Filter response ajax page * @return string @@ -3150,7 +3186,7 @@ class e_admin_ui extends e_admin_controller_ui { return $this->renderAjaxFilterResponse($this->listQry); //listQry will be used only if available } - + /** * Generic List action page * @return string @@ -3159,7 +3195,7 @@ class e_admin_ui extends e_admin_controller_ui { return $this->getUI()->getList(); } - + /** * List action observer * @return void @@ -3168,7 +3204,7 @@ class e_admin_ui extends e_admin_controller_ui { $this->getTreeModel()->setParam('db_query', $this->_modifyListQry(false, false, 0, false, $this->listQry))->load(); } - + /** * Generic List action page (Ajax) * @return string @@ -3177,7 +3213,7 @@ class e_admin_ui extends e_admin_controller_ui { return $this->getUI()->getList(true); } - + /** * Generic Edit observer */ @@ -3186,7 +3222,7 @@ class e_admin_ui extends e_admin_controller_ui $this->getModel()->load($this->getId()); $this->addTitle(LAN_UPDATE, true); } - + /** * Generic Create submit trigger */ @@ -3194,7 +3230,7 @@ class e_admin_ui extends e_admin_controller_ui { $this->redirectAction('list', 'id'); } - + /** * Generic Edit submit trigger */ @@ -3202,7 +3238,7 @@ class e_admin_ui extends e_admin_controller_ui { $this->_manageSubmit('beforeUpdate', 'afterUpdate', 'onUpdateError', 'edit'); } - + /** * Edit - send JS to page Header * @return none @@ -3211,7 +3247,7 @@ class e_admin_ui extends e_admin_controller_ui { e107::getJs()->requireCoreLib('core/admin.js'); } - + /** * Generic Edit page * @return string @@ -3220,7 +3256,7 @@ class e_admin_ui extends e_admin_controller_ui { return $this->CreatePage(); } - + /** * Generic Create observer * @return string @@ -3230,7 +3266,7 @@ class e_admin_ui extends e_admin_controller_ui $this->setTriggersEnabled(true); $this->addTitle(LAN_CREATE, true); } - + /** * Generic Create submit trigger */ @@ -3238,7 +3274,7 @@ class e_admin_ui extends e_admin_controller_ui { $this->redirectAction('list', 'id'); } - + /** * Generic Create submit trigger */ @@ -3246,49 +3282,49 @@ class e_admin_ui extends e_admin_controller_ui { $this->_manageSubmit('beforeCreate', 'afterCreate', 'onCreateError'); } - + /** * User defined pre-create logic, return false to prevent DB query execution */ public function beforeCreate($new_data, $old_data) { } - + /** * User defined after-create logic */ public function afterCreate($new_data, $old_data, $id) { } - + /** * User defined error handling, return true to suppress model messages */ public function onCreateError($new_data, $old_data) { } - + /** * User defined pre-update logic, return false to prevent DB query execution */ public function beforeUpdate($new_data, $old_data, $id) { } - + /** * User defined after-update logic */ public function afterUpdate($new_data, $old_data, $id) { } - + /** * User defined error handling, return true to suppress model messages */ public function onUpdateError($new_data, $old_data, $id) { } - + /** * Create - send JS to page Header * @return none @@ -3298,16 +3334,16 @@ class e_admin_ui extends e_admin_controller_ui // TODO - invoke it on className (not all textarea elements) e107::getJs()->requireCoreLib('core/admin.js'); } - + /** - * + * * @return TBD */ public function CreatePage() { return $this->getUI()->getCreate(); } - + public function PrefsSaveTrigger() { $this->getConfig() @@ -3316,14 +3352,14 @@ class e_admin_ui extends e_admin_controller_ui ->save(true); $this->getConfig()->setMessages(); - + } - + public function PrefsPage() { return $this->getUI()->getSettings(); } - + /** * Parent overload * @return e_admin_ui @@ -3334,13 +3370,13 @@ class e_admin_ui extends e_admin_controller_ui if(strpos($this->table, '.') !== false) { $tmp = explode('.', $this->table, 2); - $this->table = $tmp[1]; + $this->table = $tmp[1]; $this->tableAlias = $tmp[0]; unset($tmp); } - + parent::parseAliases(); - + return $this; } @@ -3348,18 +3384,18 @@ class e_admin_ui extends e_admin_controller_ui { if(!varset($this->pid) && vartrue($this->fields)) { - e107::getMessage()->add("There is no pid set.", E_MESSAGE_WARNING); + e107::getMessage()->add("There is no pid set.", E_MESSAGE_WARNING); } - + return $this->pid; } - + public function getTableName($alias = false, $prefix = false) { if($alias) return ($this->tableAlias ? $this->tableAlias : ''); return ($prefix ? '#' : '').$this->table; } - + /** * Validation rules retrieved from controller object * @return array @@ -3368,7 +3404,7 @@ class e_admin_ui extends e_admin_controller_ui { return $this->validationRules; } - + /** * Data Field array retrieved from controller object * @return array @@ -3377,51 +3413,51 @@ class e_admin_ui extends e_admin_controller_ui { return $this->dataFields; } - - + + /** * Set read and write parms with drop-down-list array data (ie. type='dropdown') * @param str $field * @param array $array [optional] * @return none */ - public function setDropDown($field,$array) //TODO Have Miro check this. + public function setDropDown($field,$array) //TODO Have Miro check this. { $this->fields[$field]['readParms'] = $array; $this->fields[$field]['writeParms'] = $array; } - + /** - * Set Config object + * Set Config object * @return e_admin_ui */ protected function _setConfig() - { + { $this->_pref = $this->pluginName == 'core' ? e107::getConfig() : e107::getPlugConfig($this->pluginName); - + $dataFields = $validateRules = array(); foreach ($this->prefs as $key => $att) { // create dataFields array $dataFields[$key] = vartrue($att['data'], 'string'); - + // create validation array if(vartrue($att['validate'])) { $validateRules[$key] = array((true === $att['validate'] ? 'required' : $att['validate']), varset($att['rule']), $att['title'], varset($att['error'], $att['help'])); } - /* Not implemented in e_model yet + /* Not implemented in e_model yet elseif(vartrue($att['check'])) { $validateRules[$key] = array($att['check'], varset($att['rule']), $att['title'], varset($att['error'], $att['help'])); }*/ } $this->_pref->setDataFields($dataFields)->setValidationRules($validateRules); - + return $this; } - + /** * Set current model * @@ -3461,7 +3497,7 @@ class e_admin_ui extends e_admin_controller_ui }*/ } } - + // default model $this->_model = new e_admin_model(); $this->_model->setModelTable($this->table) @@ -3470,11 +3506,11 @@ class e_admin_ui extends e_admin_controller_ui ->setFieldTypes($this->fieldTypes) ->setDataFields($this->dataFields) ->setMessageStackName('admin_ui_model_'.$this->table) - ->setParam('db_query', $this->editQry); - + ->setParam('db_query', $this->editQry); + return $this; } - + /** * Set current tree * @return e_admin_ui @@ -3487,7 +3523,7 @@ class e_admin_ui extends e_admin_controller_ui ->setFieldIdName($this->pid) ->setMessageStackName('admin_ui_tree_'.$this->table) ->setParams(array('model_class' => 'e_admin_model', 'model_message_stack' => 'admin_ui_model_'.$this->table ,'db_query' => $this->listQry)); - + return $this; } @@ -3513,13 +3549,13 @@ class e_admin_ui extends e_admin_controller_ui } class e_admin_form_ui extends e_form -{ +{ /** * @var e_admin_ui */ protected $_controller = null; - - + + /** * Constructor * @param e_admin_ui $controller @@ -3529,13 +3565,13 @@ class e_admin_form_ui extends e_form { $this->_controller = $controller; parent::__construct($tabindex); - - // protect current methods from conflict. + + // protect current methods from conflict. $this->preventConflict(); // user constructor $this->init(); } - + protected function preventConflict() { $err = ""; @@ -3543,38 +3579,38 @@ class e_admin_form_ui extends e_form foreach($fields as $val) { - if(method_exists('e_form',$val)) // check even if type is not method. - just in case of an upgrade later by 3rd-party. + if(method_exists('e_form',$val)) // check even if type is not method. - just in case of an upgrade later by 3rd-party. { $err .= "

ERROR: The field name (".$val.") is not allowed.

"; $err .= "Please rename the key (".$val.") to something else in your fields array and database table.

"; - } + } } - + if($err) { echo $err; exit; - } + } } - - - + + + /** * User defined init */ public function init() { } - + /** * TODO - lans - * Generic DB Record Creation Form. + * Generic DB Record Creation Form. * @return string */ function getCreate() { $controller = $this->getController(); - $request = $controller->getRequest(); + $request = $controller->getRequest(); if($controller->getId()) { $legend = LAN_UPDATE.' record #'.$controller->getId(); @@ -3595,24 +3631,24 @@ class e_admin_form_ui extends e_form 'fields' => $controller->getFields(), //see e_admin_ui::$fields 'after_submit_options' => true, // or true for default redirect options 'after_submit_default' => $request->getPosted('__after_submit_action', $controller->getDefaultAction()), // or true for default redirect options - 'triggers' => 'auto', // standard create/update-cancel triggers + 'triggers' => 'auto', // standard create/update-cancel triggers ) - ) + ) ); $models[] = $controller->getModel(); - + return $this->renderCreateForm($forms, $models, e_AJAX_REQUEST); } - + /** * TODO - lans - * Generic Settings Form. + * Generic Settings Form. * @return string */ function getSettings() { $controller = $this->getController(); - $request = $controller->getRequest(); + $request = $controller->getRequest(); $legend = 'Settings'; $forms = $models = array(); $forms[] = array( @@ -3626,20 +3662,20 @@ class e_admin_form_ui extends e_form 'fields' => $controller->getPrefs(), //see e_admin_ui::$prefs 'after_submit_options' => false, 'after_submit_default' => false, // or true for default redirect options - 'triggers' => array('save' => array(LAN_SAVE, 'update')), // standard create/update-cancel triggers + 'triggers' => array('save' => array(LAN_SAVE, 'update')), // standard create/update-cancel triggers ) - ) + ) ); $models[] = $controller->getConfig(); - + return $this->renderCreateForm($forms, $models, e_AJAX_REQUEST); } - + /** * Create list view * Search for the following GET variables: * - from: integer, current page - * + * * @return string */ public function getList($ajax = false) @@ -3650,7 +3686,7 @@ class e_admin_form_ui extends e_form $request = $controller->getRequest(); $id = $this->getElementId(); $tree = $options = array(); - $tree[$id] = $controller->getTreeModel(); + $tree[$id] = $controller->getTreeModel(); $options[$id] = array( 'id' => $this->getElementId(), // unique string used for building element ids, REQUIRED 'pid' => $controller->getPrimaryName(), // primary field name, REQUIRED @@ -3663,9 +3699,9 @@ class e_admin_form_ui extends e_form 'form_post' => '', // markup to be added after closing form element 'fields' => $controller->getFields(), // see e_admin_ui::$fields 'fieldpref' => $controller->getFieldPref(), // see e_admin_ui::$fieldpref - 'table_pre' => '', // markup to be added before opening table element + 'table_pre' => '', // markup to be added before opening table element 'table_post' => !$tree[$id]->isEmpty() ? $this->renderBatch($controller->getBatchDelete()) : '', - 'fieldset_pre' => '', // markup to be added before opening fieldset element + 'fieldset_pre' => '', // markup to be added before opening fieldset element 'fieldset_post' => '', // markup to be added after closing fieldset element 'perPage' => $controller->getPerPage(), // if 0 - no next/prev navigation 'from' => $controller->getQuery('from', 0), // current page, default 0 @@ -3674,7 +3710,7 @@ class e_admin_form_ui extends e_form ); return $this->renderListForm($options, $tree, $ajax); } - + function renderFilter($current_query = array(), $location = '', $input_options = array()) { if(!$input_options) $input_options = array('size' => 20); @@ -3682,7 +3718,7 @@ class e_admin_form_ui extends e_form { $location = 'main/list'; //default location } - $l = e107::getParser()->post_toForm(explode('/', $location)); + $l = e107::getParser()->post_toForm(explode('/', $location)); if(!is_array($input_options)) { parse_str($input_options, $input_options); @@ -3700,7 +3736,7 @@ class e_admin_form_ui extends e_form ".$this->option('Clear Filter', '___reset___')." ".$this->renderBatchFilter('filter', $current_query[1])." ".$this->select_close()." -
+
".$this->hidden('mode', $l[0])." ".$this->hidden('action', $l[1])." ".$this->admin_button('etrigger_filter', 'etrigger_filter', 'filter e-hide-if-js', LAN_FILTER, array('id' => false))." @@ -3710,24 +3746,24 @@ class e_admin_form_ui extends e_form - "; + "; e107::getJs()->requireCoreLib('scriptaculous/controls.js', 2); //TODO - external JS e107::getJs()->footerInline(" //autocomplete fields - \$\$('input[name=searchquery]').each(function(el, cnt) { + \$\$('input[name=searchquery]').each(function(el, cnt) { if(!cnt) el.activate(); else return; new Ajax.Autocompleter(el, el.next('div.e-autocomplete'), '".e_SELF."?mode=".$l[0]."&action=filter', { paramName: 'searchquery', minChars: 2, frequency: 0.5, - afterUpdateElement: function(txt, li) { + afterUpdateElement: function(txt, li) { var cfrm = el.up('form'), cont = cfrm.next('.e-container'); if(!cont) { return; - } + } cfrm.submitForm(cont); }, indicator: el.next('span.indicator'), @@ -3735,7 +3771,7 @@ class e_admin_form_ui extends e_form }); var sel = el.next('select.filter'); if(sel) { - sel.observe('change', function (e) { + sel.observe('change', function (e) { var cfrm = e.element().up('form'), cont = cfrm.next('.e-container'); if(cfrm && cont && e.element().value != '___reset___') { e.stop(); @@ -3747,19 +3783,19 @@ class e_admin_form_ui extends e_form } }); "); - - return $text; + + return $text; } - + // FIXME - use e_form::batchoptions(), nice way of buildig batch dropdown - news administration show_batch_options() function renderBatch($allow_delete = false) - { + { $fields = $this->getController()->getFields(); if(!varset($fields['checkboxes'])) { return ''; - } - + } + $text = "
@@ -3773,26 +3809,26 @@ class e_admin_form_ui extends e_form "; return $text; } - + // TODO - do more - function renderBatchFilter($type='batch', $selected = '') // Common function used for both batches and filters. + function renderBatchFilter($type='batch', $selected = '') // Common function used for both batches and filters. { $optdiz = array('batch' => 'Modify ', 'filter'=> 'Filter by '); $table = $this->getController()->getTableName(); $text = ''; $textsingle = ''; - + foreach($this->getController()->getFields() as $key=>$val) { if(!varset($val[$type])) { continue; } - + $option = array(); $parms = vartrue($val['writeParms'], array()); if(is_string($parms)) parse_str($parms, $parms); - + switch($val['type']) { case 'boolean': //TODO modify description based on $val['parm] @@ -3804,7 +3840,7 @@ class e_admin_form_ui extends e_form } break; - case 'templates': + case 'templates': case 'layouts': $parms['raw'] = true; $val['writeParms'] = $parms; @@ -3814,23 +3850,23 @@ class e_admin_form_ui extends e_form $option[$key.'__'.$k] = $name; } break; - - case 'dropdown': // use the array $parm; + + case 'dropdown': // use the array $parm; unset($parms['__options']); //remove element options if any foreach($parms as $k => $name) { $option[$key.'__'.$k] = $name; } break; - - case 'datestamp': // use $parm to determine unix-style or YYYY-MM-DD - //TODO last hour, today, yesterday, this-month, last-month etc. + + case 'datestamp': // use $parm to determine unix-style or YYYY-MM-DD + //TODO last hour, today, yesterday, this-month, last-month etc. /* foreach($val['parm'] as $k=>$name) { - $text .= $frm->option($name, $type.'__'.$key."__".$k); + $text .= $frm->option($name, $type.'__'.$key."__".$k); }*/ break; - + case 'userclass': //case 'userclasses': $classes = e107::getUserClass()->uc_required_class_list(vartrue($parms['classlist'], '')); @@ -3838,12 +3874,12 @@ class e_admin_form_ui extends e_form { $option[$key.'__'.$k] = $name; } - break; - + break; + case 'method': $method = $key; $list = call_user_func_array(array($this, $method), array('', $type, $parms)); - + if(is_array($list)) { //check for single option @@ -3865,33 +3901,33 @@ class e_admin_form_ui extends e_form } break; } - + if(count($option) > 0) { $text .= "\t".$this->optgroup_open($optdiz[$type].defset($val['title'], $val['title']), varset($disabled))."\n"; foreach($option as $okey=>$oval) { - $text .= $this->option($oval, $okey, $selected == $okey)."\n"; + $text .= $this->option($oval, $okey, $selected == $okey)."\n"; } - $text .= "\t".$this->optgroup_close()."\n"; + $text .= "\t".$this->optgroup_close()."\n"; } } - + return $textsingle.$text; - + } - + public function getElementId() { $controller = $this->getController(); return str_replace('_', '-', ($controller->getPluginName() == 'core' ? 'core-'.$controller->getTableName() : 'plugin-'.$controller->getPluginName())); } - + /** * @return e_admin_ui */ public function getController() - { + { return $this->_controller; } } @@ -3905,8 +3941,8 @@ include_once(e107::coreTemplatePath('admin_icons')); * 2. [DONE - at least for alpha release] remove duplicated code (e_form & e_admin_form_ui), refactoring * 3. make JS Manager handle Styles (.css files and inline CSS) * 4. [DONE] e_form is missing some methods used in e_admin_form_ui - * 5. [DONE] date convert needs string-to-datestamp auto parsing, strptime() is the solution but needs support for - * Windows and PHP < 5.1.0 - build custom strptime() function (php_compatibility_handler.php) on this - + * 5. [DONE] date convert needs string-to-datestamp auto parsing, strptime() is the solution but needs support for + * Windows and PHP < 5.1.0 - build custom strptime() function (php_compatibility_handler.php) on this - * http://sauron.lionel.free.fr/?page=php_lib_strptime (bad license so no copy/paste is allowed!) * 6. [DONE - read/writeParms introduced ] $fields[parms] mess - fix it, separate list/edit mode parms somehow * 7. clean up/document all object vars (e_admin_ui, e_admin_dispatcher) @@ -3915,7 +3951,7 @@ include_once(e107::coreTemplatePath('admin_icons')); * 10. draggable (or not?) ordering (list view) * 11. [DONE] realtime search filter (typing text) - like downloads currently * 12. [DONE] autosubmit when 'filter' dropdown is changed (quick fix?) - * 13. tablerender captions + * 13. tablerender captions * 14. [DONE] textareas auto-height * 15. [DONE] multi JOIN table support (optional), aliases * 16. tabs support (create/edit view) diff --git a/e107_handlers/form_handler.php b/e107_handlers/form_handler.php index b09ab6035..f9be90f6d 100644 --- a/e107_handlers/form_handler.php +++ b/e107_handlers/form_handler.php @@ -9,9 +9,9 @@ * Form Handler * * $Source: /cvs_backup/e107_0.8/e107_handlers/form_handler.php,v $ - * $Revision: 1.102 $ - * $Date: 2009-12-23 10:04:38 $ - * $Author: e107coders $ + * $Revision: 1.103 $ + * $Date: 2009-12-23 15:12:13 $ + * $Author: secretr $ * */ @@ -73,9 +73,9 @@ class e_form function __construct($enable_tabindex = false) { - + $this->_tabindex_enabled = $enable_tabindex; - $this->_uc = e107::getUserClass(); + $this->_uc = e107::getUserClass(); } function text($name, $value, $maxlength = 200, $options = array()) @@ -84,9 +84,9 @@ class e_form //never allow id in format name-value for text fields return "get_attributes($options, $name)." />"; } - + function iconpreview($id, $default, $width='', $height='') // FIXME - { + { $parms = $name."|".$width."|".$height."|".$id; $sc_parameters .= 'mode=preview&default='.$default.'&id='.$id; return e107::getParser()->parseTemplate("{ICONPICKER=".$sc_parameters."}"); @@ -116,27 +116,27 @@ class e_form return $ret; } - + // FIXME - better GUI, {IMAGESELECTOR} rewrite, flexibility, thumbnails, tooltip image preivew, etc. - //FIXME - use the media-manager as an image selector. + //FIXME - use the media-manager as an image selector. function imagepicker($name, $default, $label = '', $sc_parameters = '') { - // Temporary Fix for using Media-Manager data - + // Temporary Fix for using Media-Manager data + $sql = e107::getDb(); + if($sql->db_Select('core_media','*',"media_userclass IN (".USERCLASS_LIST.") ORDER BY media_name")) { while($row = $sql->db_Fetch()) { $opts[$row['media_category']][$row['media_url']] = $row['media_name']. " (".$row['media_dimensions'].") "; } - - asort($opts); - return $this->selectbox($name,$opts,$default, array('default'=>' ')); + + asort($opts); + return $this->selectbox($name,$opts,$default, array('default'=>' ')); } - - // ---------------- - + // ---------------- + if(is_string($sc_parameters)) parse_str($sc_parameters, $sc_parameters); if(!$label) $label = LAN_SELECT; $parms = "name={$name}"; @@ -153,12 +153,12 @@ class e_form //$parms .= "&click_target=data"; //$parms .= "&click_prefix=[img][[e_IMAGE]]newspost_images/"; //$parms .= "&click_postfix=[/img]"; - $tp = e107::getParser(); + $tp = e107::getParser(); $ret = "
".$tp->parseTemplate("{IMAGESELECTOR={$parms}&scaction=select}")."
"; $ret .= "
".$tp->parseTemplate("{IMAGESELECTOR={$parms}&scaction=preview}")."
"; return $ret; } - + /** * Date field with popup calendar * $options allowed keys: @@ -166,7 +166,7 @@ class e_form * - others: ???, default is false * - weeks: show weeks, default is false * - size: input field size attribute, default 25 - * + * * @param string $name the name of the field * @param integer $datestamp UNIX timestamp - default value of the field * @param array $options calendar options @@ -195,21 +195,21 @@ class e_form return $cal->make_input_field($cal_options, $cal_attrib); } - + /** * User auto-complete search - * + * * @param string $name_fld field name for user name * @param string $id_fld field name for user id - * @param string $default_name default user name value + * @param string $default_name default user name value * @param integer $default_id default user id - * @param array|string $options [optional] 'readonly' (make field read only), 'name' (db field name, default user_name) + * @param array|string $options [optional] 'readonly' (make field read only), 'name' (db field name, default user_name) * @return string HTML text for display */ function userpicker($name_fld, $id_fld, $default_name, $default_id, $options = array()) { if(!is_array($options)) parse_str($options, $options); - + //'.$this->text($id_fld, $default_id, 10, array('id' => false, 'readonly'=>true, 'class'=>'tbox number')).' $ret = '
@@ -218,30 +218,30 @@ class e_form -
-
+
+
'; - + e107::getJs()->requireCoreLib('scriptaculous/controls.js', 2); //TODO - external JS e107::getJs()->footerInline(" //autocomplete fields \$\$('input[name={$name_fld}]').each(function(el) { - if(el.readOnly) { - el.observe('click', function(ev) { ev.stop(); var el1 = ev.findElement('input'); el1.blur(); } ); - el.next('span.indicator').hide(); + if(el.readOnly) { + el.observe('click', function(ev) { ev.stop(); var el1 = ev.findElement('input'); el1.blur(); } ); + el.next('span.indicator').hide(); el.next('div.e-autocomplete').hide(); - return; + return; } new Ajax.Autocompleter(el, el.next('div.e-autocomplete'), '".e_FILE_ABS."e_ajax.php', { paramName: '{$name_fld}', minChars: 2, frequency: 0.5, - afterUpdateElement: function(txt, li) { + afterUpdateElement: function(txt, li) { if(!\$(li)) return; - if(\$(li).id) { - el.next('input[name={$id_fld}]').value = parseInt(\$(li).id); + if(\$(li).id) { + el.next('input[name={$id_fld}]').value = parseInt(\$(li).id); } else { el.next('input[name={$id_fld}]').value = 0 } @@ -252,7 +252,7 @@ class e_form }); "); return $ret; - + } function file($name, $options = array()) @@ -261,7 +261,7 @@ class e_form //never allow id in format name-value for text fields return "get_attributes($options, $name)." />"; } - + function upload($name, $options = array()) { return 'Ready to use upload form fields, optional - file list view'; @@ -283,7 +283,7 @@ class e_form { $options['class'] = (isset($options['class']) && $options['class']) ? $options['class'].' e-autoheight' : 'tbox textarea e-autoheight'; } - + $options = $this->format_options('textarea', $name, $options); //never allow id in format name-value for text fields return "".(false !== $counter ? $this->hidden('__'.$name.'autoheight_opt', $counter) : ''); @@ -294,22 +294,22 @@ class e_form //size - large|medium|small //width should be explicit set by current admin theme switch($size) - { + { case 'medium': $rows = '10'; break; - + case 'small': $rows = '7'; break; - + case 'large': default: $rows = '15'; $size = 'large'; break; } - + // auto-height support $options = array('class' => 'tbox bbarea '.($size ? ' '.$size : '').' e-wysiwyg'); $bbbar = ''; @@ -339,7 +339,7 @@ class e_form return "get_attributes($options, $name, $value)." />"; } - + function checkbox_label($label_title, $name, $value, $checked = false, $options = array()) { return $this->checkbox($name, $value, $checked, $options).$this->label($label_title, $name, $value); @@ -372,7 +372,7 @@ class e_form return ''; $tmp = explode(',', $current_value); //TODO add support for when $current_value is an array. - + $class = $style = ''; if($nest_level == 0) { @@ -386,11 +386,11 @@ class e_form return "
".$this->checkbox($treename.'[]', $classnum, in_array($classnum, $tmp), $field_options).$this->label($this->_uc->uc_get_classname($classnum).$descr, $treename.'[]', $classnum)."
\n"; } - - + + function uc_label($classnum) { - return $this->_uc->uc_get_classname($classnum); + return $this->_uc->uc_get_classname($classnum); } function radio($name, $value, $checked = false, $options = array()) @@ -437,7 +437,7 @@ class e_form } /** - * + * * @param object $name * @param object $option_array * @param object $selected [optional] @@ -446,17 +446,19 @@ class e_form */ function selectbox($name, $option_array, $selected = false, $options = array()) { + if(!is_array($options)) parse_str($options, $options); + if($option_array == 'yesno') { $option_array = array(1=>LAN_YES,0=>LAN_NO); - } + } $text = $this->select_open($name, $options)."\n"; - + if(vartrue($options['default'])) { - $text .= $this->option($options['default'],''); + $text .= $this->option($options['default'],''); } - + $text .= $this->option_multi($option_array, $selected)."\n".$this->select_close(); return $text; } @@ -516,14 +518,14 @@ class e_form $text .= $this->optgroup_open($value); foreach($label as $val => $lab) { - $text .= $this->option($lab, $val, ($selected == $val), $options)."\n"; + $text .= $this->option($lab, $val, ($selected == $val), $options)."\n"; } - $text .= $this->optgroup_close(); + $text .= $this->optgroup_close(); } else { - $text .= $this->option($label, $value, $selected == $value, $options)."\n"; - } + $text .= $this->option($label, $value, $selected == $value, $options)."\n"; + } } return $text; @@ -571,7 +573,7 @@ class e_form } /** - * + * * @param string $name * @param string $value * @param string $action [optional] default is submit @@ -633,7 +635,7 @@ class e_form case 'title': if($optval) $ret .= " title='{$optval}'"; break; - + case 'label': if($optval) $ret .= " label='{$optval}'"; break; @@ -690,7 +692,7 @@ class e_form $value = trim(preg_replace('#[^a-z0-9\-]/i#','-', $value), '-'); $value = trim(str_replace("/","-",$value), '-'); if(!$id_value && is_numeric($value)) $id_value = $value; - + // clean - do it better, this could lead to dups $id_value = trim($id_value, '-'); @@ -843,7 +845,7 @@ class e_form - "; + "; $text .= ""; return $text; @@ -877,20 +879,20 @@ class e_form $text = ""; // Recommended pattern: mode=list&field=[FIELD]&asc=[ASC]&from=[FROM] - + if(strpos($querypattern,'&')!==FALSE) { - // we can assume it's always $_GET since that's what it will generate + // we can assume it's always $_GET since that's what it will generate // more flexible (e.g. pass default values for order/field when they can't be found in e_QUERY) & secure - $tmp = str_replace('&', '&', $requeststr ? $requeststr : e_QUERY); + $tmp = str_replace('&', '&', $requeststr ? $requeststr : e_QUERY); parse_str($tmp, $tmp); - + $etmp = array(); parse_str(str_replace('&', '&', $querypattern), $etmp); } else // Legacy Queries. eg. main.[FIELD].[ASC].[FROM] { - $tmp = explode(".", ($requeststr ? $requeststr : e_QUERY)); + $tmp = explode(".", ($requeststr ? $requeststr : e_QUERY)); $etmp = explode(".", $querypattern); } @@ -930,7 +932,7 @@ class e_form $repl = array($key,$ascdesc,$from); $val['url'] = e_SELF."?".str_replace($srch,$repl,$querypattern); } - + $text .= (vartrue($val['url'])) ? "" : ""; // Really this column-sorting link should be auto-generated, or be autocreated via unobtrusive js. $text .= vartrue($val['title'], ''); $text .= ($val['url']) ? "" : ""; @@ -951,9 +953,9 @@ class e_form "; } - + /** - * Render Table cells from field listing. + * Render Table cells from field listing. * @param array $fieldarray - eg. $this->fields * @param array $currentlist - eg $this->fieldpref * @param array $fieldvalues - eg. $row @@ -964,14 +966,14 @@ class e_form { $cnt = 0; $ret = ''; - + /*$fieldarray = $obj->fields; $currentlist = $obj->fieldpref; $pid = $obj->pid;*/ - + $trclass = vartrue($fieldvalues['__trclass']) ? ' class="'.$trclass.'"' : ''; unset($fieldvalues['__trclass']); - + foreach ($fieldarray as $field => $data) { // shouldn't happen... @@ -980,7 +982,7 @@ class e_form $fieldvalues[$data['alias']] = $fieldvalues[$data['field']]; $field = $data['alias']; } - + //Not found if((!varset($data['forced']) && !in_array($field, $currentlist)) || varset($data['nolist'])) { @@ -993,10 +995,10 @@ class e_form Not Found! "; - + continue; } - + $tdclass = vartrue($data['class']); if($field == 'checkboxes') $tdclass = $tdclass ? $tdclass.' autocheck e-pointer' : 'autocheck e-pointer'; // there is no other way for now - prepare user data @@ -1023,10 +1025,10 @@ class e_form '.$value.' '; - + $cnt++; } - + if($cnt) { return ' @@ -1035,10 +1037,10 @@ class e_form '; } - + return ''; } - + /** * Render Field Value * @param string $field field name @@ -1062,9 +1064,9 @@ class e_form { parse_str(str_replace('&', '&', e_QUERY), $query); //FIXME - FIX THIS // keep other vars in tact - $query['action'] = 'edit'; - $query['id'] = $id; - + $query['action'] = 'edit'; + $query['id'] = $id; + //$edit_query = array('mode' => varset($query['mode']), 'action' => varset($query['action']), 'id' => $id); $query = http_build_query($query); @@ -1074,14 +1076,14 @@ class e_form //$attributes['type'] = 'text'; return $value; break; - + case 'checkboxes': $value = $this->checkbox(vartrue($attributes['toggle'], 'multiselect').'['.$id.']', $id); //$attributes['type'] = 'text'; return $value; break; } - + switch($attributes['type']) { case 'number': @@ -1093,14 +1095,14 @@ class e_form $value = vartrue($parms['pre']).$value.vartrue($parms['post']); // else same break; - + case 'ip': $e107 = e107::getInstance(); $value = $e107->ipDecode($value); // else same break; - - case 'templates': + + case 'templates': case 'layouts': $pre = vartrue($parms['pre']); $post = vartrue($parms['post']); @@ -1117,16 +1119,16 @@ class e_form $tmp = $this->renderElement($key, '', $attributes); $value = $pre.vartrue($tmp[$value]).$post; break; - + case 'dropdown': if(vartrue($parms) && is_array($parms)) { $value = vartrue($parms['pre']).vartrue($parms[$value]).vartrue($parms['post']); } break; - + case 'text': - + if(vartrue($parms['truncate'])) { $value = $tp->text_truncate($value, $parms['truncate'], '...'); @@ -1137,7 +1139,7 @@ class e_form } $value = vartrue($parms['pre']).$value.vartrue($parms['post']); break; - + case 'bbarea': case 'textarea': $expand = '...'; @@ -1150,7 +1152,7 @@ class e_form $ttl = vartrue($parms['expand'], ' ...'); $expand = ' '.defset($ttl, $ttl).""; } - + $oldval = $value; if(vartrue($parms['truncate'])) { @@ -1169,11 +1171,11 @@ class e_form $value .= ''; } break; - + case 'icon': $value = ''.basename($value).''; break; - + case 'image': //TODO - thumb, js tooltip... if($value) { @@ -1183,15 +1185,15 @@ class e_form $value = ''.defset($ttl, $ttl).''; } break; - + case 'datestamp': $value = $value ? e107::getDateConvert()->convert_date($value, vartrue($parms['mask'], 'short')) : ''; break; - + case 'userclass': $value = $this->_uc->uc_get_classname($value); break; - + case 'userclasses': $classes = explode(',', $value); $value = array(); @@ -1201,7 +1203,7 @@ class e_form } $value = implode(vartrue($parms['separator']), $pieces); break; - + /*case 'user_name': case 'user_loginname': case 'user_login': @@ -1215,7 +1217,7 @@ class e_form { $value = $value[$attributes['type']] ? $value[$attributes['type']] : $value['user_name']; } - else + else { $value = 'not found'; } @@ -1246,11 +1248,12 @@ class e_form $value = $ttl; } break; - + + case 'bool': case 'boolean': $value = $value ? ADMIN_TRUE_ICON : ADMIN_FALSE_ICON; break; - + case 'url': if(!$value) break; $ttl = $value; @@ -1260,7 +1263,7 @@ class e_form } $value = "".$ttl.""; break; - + case 'email': if(!$value) break; $ttl = $value; @@ -1270,26 +1273,26 @@ class e_form } $value = "".$ttl.""; break; - - case 'method': // Custom Function - $method = $field; - $value = call_user_func_array(array($this, $method), array($value, 'read', $parms)); + + case 'method': // Custom Function + $method = $field; + $value = call_user_func_array(array($this, $method), array($value, 'read', $parms)); break; - + case 'hidden': return (vartrue($parms['show']) ? ($value ? $value : vartrue($parms['empty'])) : ''); break; - + //TODO - order - + default: //unknown type break; } - + return $value; } - + /** * Auto-render Form Element * @param string $key @@ -1301,12 +1304,12 @@ class e_form { $parms = vartrue($attributes['writeParms'], array()); $tp = e107::getParser(); - + if(is_string($parms)) parse_str($parms, $parms); - + if(vartrue($attributes['readonly'])) // quick fix (maybe 'noedit'=>'readonly'?) { - return $this->renderValue($key, $value, $attributes); + return $this->renderValue($key, $value, $attributes); } switch($attributes['type']) @@ -1318,41 +1321,40 @@ class e_form if(!vartrue($parms['class'])) $parms['class'] = 'tbox number'; return vartrue($parms['pre']).$this->text($key, $value, $maxlength, $parms).vartrue($parms['post']); break; - + case 'ip': return $this->text($key, e107::getInstance()->ipDecode($value), 32, $parms); break; - + case 'url': case 'email': case 'text': - $maxlength = vartrue($parms['maxlength'], 255); unset($parms['maxlength']); return vartrue($parms['pre']).$this->text($key, $value, $maxlength, vartrue($parms['__options'])).vartrue($parms['post']); break; - + case 'textarea': return $this->textarea($key, $value, vartrue($parms['rows'], 5), vartrue($parms['cols'], 40), vartrue($parms['__options']), varset($parms['counter'], false)); break; - + case 'bbarea': return $this->bbarea($key, $value, vartrue($parms['help']), vartrue($parms['helptag']), vartrue($parms['size'], 'medium'), varset($parms['counter'], false)); break; - + case 'image': //TODO - thumb, image list shortcode, js tooltip... $label = varset($parms['label'], 'LAN_EDIT'); unset($parms['label']); return $this->imagepicker($key, $value, defset($label, $label), vartrue($parms['__options'])); break; - - case 'icon': + + case 'icon': $label = varset($parms['label'], 'LAN_EDIT'); $ajax = varset($parms['ajax'], true) ? true : false; unset($parms['label'], $parms['ajax']); return $this->iconpicker($key, $value, defset($label, $label), $parms, $ajax); break; - + case 'datestamp': if(vartrue($parms['auto'])) { @@ -1366,22 +1368,22 @@ class e_form return $this->datepicker($key, $value, $parms); break; - + case 'layouts': //to do - exclude param (exact match) $location = varset($parms['plugin']); // empty - core $ilocation = vartrue($parms['id'], $location); // omit if same as plugin name - $where = vartrue($parms['area'], 'front'); //default is 'front' + $where = vartrue($parms['area'], 'front'); //default is 'front' $filter = varset($parms['filter']); $merge = vartrue($parms['merge']) ? true : false; $layouts = e107::getLayouts($location, $ilocation, $where, $filter, $merge, true); if(varset($parms['default']) && !isset($layouts[0]['default'])) { $layouts[0] = array('default' => $parms['default']) + $layouts[0]; - } + } $info = array(); if($layouts[1]) { - foreach ($layouts[1] as $k => $info_array) + foreach ($layouts[1] as $k => $info_array) { if(isset($info_array['description'])) $info[$k] = defset($info_array['description'], $info_array['description']); @@ -1390,8 +1392,8 @@ class e_form //$this->selectbox($key, $layouts, $value) return (vartrue($parms['raw']) ? $layouts[0] : $this->radio_multi($key, $layouts[0], $value, true, $info)); - break; - + break; + case 'templates': //to do - exclude param (exact match) $templates = array(); if(varset($parms['default'])) @@ -1406,7 +1408,7 @@ class e_form $k = str_replace('_template.php', '', $files['fname']); $templates[$k] = implode(' ', array_map('ucfirst', explode('_', $k))); //TODO add LANS? } - + // override $where = vartrue($parms['area'], 'front'); $location = vartrue($parms['plugin']) ? $parms['plugin'].'/' : ''; @@ -1417,15 +1419,15 @@ class e_form $templates[$k] = implode(' ', array_map('ucfirst', explode('_', $k))); //TODO add LANS? } return (vartrue($parms['raw']) ? $templates : $this->selectbox($key, $templates, $value)); - break; - + break; + case 'dropdown': $eloptions = vartrue($parms['__options'], array()); if(is_string($eloptions)) parse_str($eloptions); unset($parms['__options']); return $this->selectbox($key, $parms, $value, $eloptions); - break; - + break; + case 'userclass': case 'userclasses': $uc_options = vartrue($parms['classlist'], 'public,guest,nobody,member,classes,admin,main'); // defaults to 'public,guest,nobody,member,classes' (userclass handler) @@ -1433,7 +1435,7 @@ class e_form $method = $attributes['type'] == 'userclass' ? 'uc_select' : 'uc_checkbox'; return $this->$method($key, $value, $uc_options, vartrue($parms['__options'], array())); break; - + /*case 'user_name': case 'user_loginname': case 'user_login': @@ -1444,7 +1446,7 @@ class e_form // Just temporary solution, could be changed soon if(!isset($parms['__options'])) $parms['__options'] = array(); if(!is_array($parms['__options'])) parse_str($parms['__options'], $parms['__options']); - + if((empty($value) && vartrue($parms['currentInit'])) || vartrue($parms['current'])) { $value = USERID; @@ -1458,31 +1460,32 @@ class e_form { $value = get_user_data($value); } - + $colname = vartrue($parms['nameType'], 'user_name'); $parms['__options']['name'] = $colname; - + if(!$value) $value = array(); $uname = varset($value[$colname]); $value = varset($value['user_id'], 0); return $this->userpicker(vartrue($parms['nameField'], $key.'_usersearch'), $key, $uname, $value, vartrue($parms['__options'])); break; - + + case 'bool': case 'boolean': $lenabled = vartrue($parms['enabled'], 'LAN_ENABLED'); $ldisabled = vartrue($parms['disabled'], 'LAN_DISABLED'); unset($parms['enabled'], $parms['disabled']); return $this->radio_switch($key, $value, defset($lenabled, $lenabled), defset($ldisabled, $ldisabled)); break; - - case 'method': // Custom Function + + case 'method': // Custom Function return call_user_func_array(array($this, $key), array($value, 'write', $parms)); break; - + case 'upload': //TODO - from method return $tp->parseTemplate("{UPLOADFILE=".e_UPLOAD."}"); break; - + case 'hidden': $ret = (vartrue($parms['show']) ? ($value ? $value : vartrue($parms['empty'])) : ''); return $ret.$this->hidden($key, $value); @@ -1493,7 +1496,7 @@ class e_form break; } } - + /** * Generic List Form, used internal by admin UI * Expected options array format: @@ -1511,9 +1514,9 @@ class e_form * 'form_post' => '', // markup to be added after closing form element * 'fields' => array(...), // see e_admin_ui::$fields * 'fieldpref' => array(...), // see e_admin_ui::$fieldpref - * 'table_pre' => '', // markup to be added before opening table element + * 'table_pre' => '', // markup to be added before opening table element * 'table_post' => '', // markup to be added after closing table element (e.g. Batch actions) - * 'fieldset_pre' => '', // markup to be added before opening fieldset element + * 'fieldset_pre' => '', // markup to be added before opening fieldset element * 'fieldset_post' => '', // markup to be added after closing fieldset element * 'perPage' => 15, // if 0 - no next/prev navigation * 'from' => 0, // current page, default 0 @@ -1531,13 +1534,13 @@ class e_form public function renderListForm($form_options, $tree_models, $nocontainer = false) { $tp = e107::getParser(); - + foreach ($form_options as $fid => $options) { $tree_model = $tree_models[$fid]; $tree = $tree_model->getTree(); $total = $tree_model->getTotal(); - + $amount = $options['perPage']; $from = vartrue($options['from'], 0); $field = vartrue($options['field'], $options['pid']); @@ -1548,7 +1551,7 @@ class e_form $formurl = $url.($query ? '?'.$query : ''); $fields = $options['fields']; $current_fields = varset($options['fieldpref']) ? $options['fieldpref'] : array_keys($options['fields']); - + $text = "
".vartrue($options['fieldset_pre'])." @@ -1560,7 +1563,7 @@ class e_form ".$this->thead($fields, $current_fields, varset($options['head_query']), varset($options['query']))." "; - + if(!$tree) { $text .= " @@ -1571,27 +1574,27 @@ class e_form } else { - + foreach($tree as $model) { $text .= $this->renderTableRow($fields, $current_fields, $model->getData(), $options['pid']); } - + } - + $text .= " ".vartrue($options['table_post'])." "; - - + + if($tree && $amount) - { + { $parms = $total.",".$amount.",".$from.",".$url.'?'.($options['np_query'] ? $options['np_query'].'&' : '').'from=[FROM]'; $text .= $tp->parseTemplate("{NEXTPREV={$parms}}"); } - + $text .= " ".vartrue($options['fieldset_post'])." @@ -1601,13 +1604,13 @@ class e_form { $text = '
'.$text.'
'; } - + } return (vartrue($options['form_pre']).$text.vartrue($options['form_post'])); } - + /** - * Generic DB Record Management Form. + * Generic DB Record Management Form. * TODO - lans * TODO - move fieldset & table generation in separate methods, needed for ajax calls * Expected arrays format: @@ -1624,23 +1627,23 @@ class e_form * 'fields' => array(...), //see e_admin_ui::$fields * 'after_submit_options' => array('action' => 'Label'[,...]), // or true for default redirect options * 'after_submit_default' => 'action_name', - * 'triggers' => 'auto', // standard create/update-cancel triggers + * 'triggers' => 'auto', // standard create/update-cancel triggers * //or custom trigger array in format array('sibmit' => array('Title', 'create', '1'), 'cancel') - trigger name - title, action, optional hidden value (in this case named sibmit_value) * ), - * + * * 'advanced' => array( * 'legend' => 'Fieldset Legend', * 'fields' => array(...), //see e_admin_ui::$fields * 'after_submit_options' => array('__default' => 'action_name' 'action' => 'Label'[,...]), // or true for default redirect options - * 'triggers' => 'auto', // standard create/update-cancel triggers + * 'triggers' => 'auto', // standard create/update-cancel triggers * //or custom trigger array in format array('submit' => array('Title', 'create', '1'), 'cancel' => array('cancel', 'cancel')) - trigger name - title, action, optional hidden value (in this case named sibmit_value) * ) - * ) + * ) * ); * $models[0] = new e_admin_model($data); * $models[0]->setFieldIdName('primary_id'); // you need to do it if you don't use your own admin model extension * - * @param array $forms numerical array + * @param array $forms numerical array * @param array $models numerical array with values instance of e_admin_model * @param boolean $nocontainer don't enclose in div container * @return string @@ -1648,25 +1651,25 @@ class e_form function renderCreateForm($forms, $models, $nocontainer = false) { $text = ''; - foreach ($forms as $fid => $form) + foreach ($forms as $fid => $form) { $model = $models[$fid]; $query = isset($form['query']) ? $form['query'] : e_QUERY ; $url = (isset($form['url']) ? e107::getParser()->replaceConstants($form['url'], 'abs') : e_SELF).($query ? '?'.$query : ''); - + $text .= " "; - - foreach ($form['fieldsets'] as $elid => $data) + + foreach ($form['fieldsets'] as $elid => $data) { $elid = $form['id'].'-'.$elid; $text .= $this->renderCreateFieldset($elid, $data, $model, $nocontainer); } - + $text .= "
- "; + "; e107::getJs()->footerInline("Form.focusFirstElement('{$form['id']}-form');"); } if(!$nocontainer) @@ -1675,7 +1678,7 @@ class e_form } return $text; } - + function renderCreateFieldset($id, $fdata, $model, $nocontainer = false) { $text = vartrue($fdata['fieldset_pre'])." @@ -1689,20 +1692,20 @@ class e_form "; - + foreach($fdata['fields'] as $key => $att) { // convert aliases - not supported in edit mod if($att['alias'] && !$model->hasData($key)) { - $key = $att['field']; + $key = $att['field']; } - + $parms = vartrue($att['formparms'], array()); if(!is_array($parms)) parse_str($parms, $parms); $label = vartrue($att['note']) ? '
'.deftrue($att['note'], $att['note']).'
' : ''; $help = vartrue($att['help']) ? '
'.deftrue($att['help'], $att['help']).'
' : ''; - + $valPath = trim(vartrue($att['dataPath'], $key), '/'); $keyName = $key; if(strpos($valPath, '/')) //not TRUE, cause string doesn't start with / @@ -1714,7 +1717,7 @@ class e_form $keyName .= '['.$path.']'; } } - + // type null - system (special) fields if($att['type'] !== null && !vartrue($att['noedit']) && $key != $model->getFieldIdName()) { @@ -1731,12 +1734,12 @@ class e_form "; } //if($bckp) $model->remove($bckp); - + } $text .= " - + ".vartrue($fdata['table_post'])."
"; @@ -1747,7 +1750,7 @@ class e_form { $submitopt = $defsubmitopt; } - + if($submitopt) { $selected = isset($fdata['after_submit_default']) && array_key_exists($fdata['after_submit_default'], $submitopt) ? $fdata['after_submit_default'] : ''; @@ -1757,7 +1760,7 @@ class e_form
'; } - + $triggers = vartrue($fdata['triggers'], 'auto'); if(is_string($triggers) && 'auto' === $triggers) { @@ -1772,7 +1775,7 @@ class e_form } $triggers['cancel'] = array(LAN_CANCEL, 'cancel'); } - + foreach ($triggers as $trigger => $tdata) { $text .= $this->admin_button('etrigger_'.$trigger, $tdata[0], $tdata[1]); @@ -1781,26 +1784,26 @@ class e_form $text .= $this->hidden($trigger.'_value', $tdata[2]); } } - + $text .= " ".vartrue($fdata['fieldset_post'])." - "; + "; return $text; } - + // The 2 functions below are for demonstration purposes only, and may be moved/modified before release. function filterType($fieldarray) { return " frm-> filterType() is Deprecated    "; } - + function filterValue($type = '', $fields = '') { return " frm-> filterValue() is Deprecated.   "; } - + /** * Generates a batch options select component * This component is generally associated with a table of items where one or more rows in the table can be selected (using checkboxes). @@ -1818,14 +1821,14 @@ class e_form ".$this->select_open('execute_batch', array('class' => 'tbox select batch e-autosubmit', 'id' => false))." ".$this->option('With selected...', '')." "; - - - //used for getperms() check + + + //used for getperms() check $permissions = vartrue($options['__permissions'], array()); //used for check_classs() check $classes = vartrue($options['__check_class'], array()); unset($options['__permissions'], $options['__check_class']); - + foreach ($options as $key => $val) { if(isset($permissions[$key]) && !getperms($permissions[$key])) @@ -1835,35 +1838,35 @@ class e_form $disabled = false; if(isset($classes[$key]) && !is_array($classes[$key]) && !check_class($classes[$key])) { - $disabled = true; + $disabled = true; } if(!is_array($val)) { if($disabled) $val = $val.' ('.LAN_NOPERMISSION.')'; - $text .= "\t".$this->option('    '.$val, $key, false, array('disabled' => $disabled))."\n"; + $text .= "\t".$this->option('    '.$val, $key, false, array('disabled' => $disabled))."\n"; } else { if($disabled) $val[0] = $val[0].' ('.LAN_NOPERMISSION.')'; - + $text .= "\t".$this->optgroup_open($val[0], $disabled)."\n"; foreach ($val[1] as $k => $v) { - $disabled = false; + $disabled = false; if(isset($classes[$key][$k]) && !check_class($classes[$key][$k])) { - $disabled = true; + $disabled = true; $v = $v.' ('.LAN_NOPERMISSION.')'; } - $text .= "\t\t".$this->option($v, $key.'_selected_'.$k, false, array('disabled' => $disabled))."\n"; + $text .= "\t\t".$this->option($v, $key.'_selected_'.$k, false, array('disabled' => $disabled))."\n"; } $text .= $this->optgroup_close()."\n"; - - } + + } } - if ($ucOptions) // Userclass List. + if ($ucOptions) // Userclass List. { foreach ($ucOptions as $ucKey => $ucVal) { @@ -1875,14 +1878,14 @@ class e_form $text .= $this->optgroup_close()."\n"; } } - + $text .= " ".$this->select_close()." ".$this->admin_button('trigger_execute_batch', 'trigger_execute_batch', 'submit multi e-hide-if-js', 'Go')."
"; - + return $text; } } diff --git a/e107_handlers/model_class.php b/e107_handlers/model_class.php index 982c2f148..f42a313d3 100644 --- a/e107_handlers/model_class.php +++ b/e107_handlers/model_class.php @@ -9,16 +9,16 @@ * e107 Base Model * * $Source: /cvs_backup/e107_0.8/e107_handlers/model_class.php,v $ - * $Revision: 1.49 $ - * $Date: 2009-12-13 21:52:32 $ - * $Author: e107steved $ + * $Revision: 1.50 $ + * $Date: 2009-12-23 15:12:12 $ + * $Author: secretr $ */ if (!defined('e107_INIT')) { exit; } /** * Base e107 Model class - * + * * @package e107 * @category e107_handlers * @version 1.0 @@ -33,34 +33,34 @@ class e_model * @var array */ protected $_data = array(); - + /** - * Data structure (types) array, required for {@link e_admin_model::sanitize()} method, + * Data structure (types) array, required for {@link e_admin_model::sanitize()} method, * it also serves as a map (find data) for building DB queries, * copy/sanitize posted data to object data, etc. - * + * * This can/should be overwritten by extending the class * * @var array */ protected $_data_fields = array(); - + /** * Current model DB table, used in all db calls - * + * * This can/should be overwritten/set by extending the class - * + * * @var string */ protected $_db_table; - + /** * Runtime cache of parsed from {@link _getData()} keys * * @var array */ protected $_parsed_keys = array(); - + /** * Avoid DB calls if data is not changed * @@ -68,7 +68,7 @@ class e_model * @var boolean */ protected $data_has_changed = false; - + /** * Name of object id field * Required for {@link getId()()} method @@ -76,21 +76,21 @@ class e_model * @var string */ protected $_field_id; - + /** * Namespace to be used for model related system messages in {@link eMessage} handler - * - * @var string + * + * @var string */ protected $_message_stack = 'default'; - + /** * Model parameters passed mostly from external sources - * + * * @var array */ protected $_params = array(); - + /** * Constructor - set data on initialization * @@ -100,12 +100,12 @@ class e_model { $this->setData($data); } - + /** * Optional DB table - used for auto-load data from the DB * @param string $table * @return e_model - */ + */ public function getModelTable() { return $this->_db_table; @@ -115,13 +115,13 @@ class e_model * Set model DB table * @param string $table * @return e_model - */ + */ public function setModelTable($table) { $this->_db_table = $table; return $this; } - + /** * Get data fields array * @return array @@ -130,7 +130,7 @@ class e_model { return $this->_data_fields; } - + /** * Set Predefined data fields in format key => type * @return e_model @@ -140,7 +140,7 @@ class e_model $this->_data_fields = $data_fields; return $this; } - + /** * Set Predefined data field * @return e_model @@ -150,12 +150,12 @@ class e_model $this->_data_fields[$field] = $type; return $this; } - + /** * Set name of object's field id * * @see getId() - * + * * @param string $name * @return e_model */ @@ -169,7 +169,7 @@ class e_model * Retrieve name of object's field id * * @see getId() - * + * * @param string $name * @return string */ @@ -185,13 +185,13 @@ class e_model */ public function getId() { - if ($this->getFieldIdName()) + if ($this->getFieldIdName()) { return $this->get($this->getFieldIdName(), 0); } return $this->get('id', 0); } - + /** * Set object primary id field value * @@ -199,13 +199,13 @@ class e_model */ public function setId($id) { - if ($this->getFieldIdName()) + if ($this->getFieldIdName()) { return $this->set($this->getFieldIdName(), intval($id)); } return $this; } - + /** * Retrieves data from the object ($_data) without * key parsing (performance wise, prefered when possible) @@ -219,7 +219,7 @@ class e_model { return $this->_getDataSimple((string) $key, $default); } - + /** * Retrieves data from the object ($_data) * If $key is empty, return all object data @@ -234,12 +234,12 @@ class e_model { return $this->_getData($key, $default, $index); } - + /** * Overwrite data in the object for a single field. Key is not parsed. * Public proxy of {@link _setDataSimple()} * Data isn't sanitized so use this method only when data comes from trustable sources (e.g. DB) - * + * * * @see _setData() * @param string $key @@ -251,7 +251,7 @@ class e_model { return $this->_setDataSimple($key, $value, $strict); } - + /** * Overwrite data in the object. Public proxy of {@link _setData()} * Data isn't sanitized so use this method only when data comes from trustable sources (e.g. DB) @@ -266,14 +266,14 @@ class e_model { return $this->_setData($key, $value, $strict); } - + /** * Add data to the object. * Retains existing data in the object. * Public proxy of {@link _addData()} - * + * * If $override is false, data will be updated only (check against existing data) - * + * * @param string|array $key * @param mixed $value * @param boolean $override override existing data @@ -283,7 +283,7 @@ class e_model { return $this->_addData($key, $value, $override); } - + /** * Unset single field from the object. * Public proxy of {@link _unsetDataSimple()} @@ -295,13 +295,13 @@ class e_model { return $this->_unsetDataSimple($key); } - + /** * Unset data from the object. * $key can be a string only. Array will be ignored. * '/' inside the key will be treated as array path * if $key is null entire object will be reset - * + * * Public proxy of {@link _unsetData()} * * @param string|null $key @@ -311,7 +311,7 @@ class e_model { return $this->_unsetData($key); } - + /** * @param string $key * @return boolean @@ -320,7 +320,7 @@ class e_model { return $this->_hasData($key); } - + /** * @param string $key * @return boolean @@ -329,7 +329,7 @@ class e_model { return $this->_hasData($key); } - + /** * @param string $key * @return boolean @@ -338,7 +338,7 @@ class e_model { return (isset($this->_data[$key])); } - + /** * @param string $key * @return boolean @@ -347,7 +347,7 @@ class e_model { return $this->_isData($key); } - + /** * Retrieves data from the object * @@ -367,7 +367,7 @@ class e_model protected function _getData($key = '', $default = null, $index = null, $data_src = '_data') { $key = trim($key, '/'); - if ('' === $key) + if ('' === $key) { return $this->$data_src; } @@ -380,21 +380,21 @@ class e_model } $keyArr = explode('/', $key); $data = $this->$data_src; - foreach ($keyArr as $k) + foreach ($keyArr as $k) { - if ('' === $k) + if ('' === $k) { return $default; } - if (is_array($data)) + if (is_array($data)) { - if (!isset($data[$k])) + if (!isset($data[$k])) { return $default; } $data = $data[$k]; } - else + else { return $default; } @@ -404,23 +404,23 @@ class e_model } //get $index - if (isset($this->{$data_src}[$key])) + if (isset($this->{$data_src}[$key])) { - if (null === $index) + if (null === $index) { return $this->{$data_src}[$key]; } $value = $this->{$data_src}[$key]; - if (is_array($value)) + if (is_array($value)) { - if (isset($value[$index])) + if (isset($value[$index])) { return $value[$index]; } return $default; - } - elseif (is_string($value)) + } + elseif (is_string($value)) { $arr = explode("\n", $value); return (isset($arr[$index]) ? $arr[$index] : $default); @@ -429,7 +429,7 @@ class e_model } return $default; } - + /** * Get value from _data array without parsing the key * @@ -442,7 +442,7 @@ class e_model { return isset($this->{$data_src}[$key]) ? $this->{$data_src}[$key] : $default; } - + /** * Overwrite data in the object. * @@ -451,7 +451,7 @@ class e_model * '/' inside the key will be treated as array path * * If $key is an array and $strict is false, it will overwrite all the data in the object. - * + * * If $strict is true and $data_src is '_data', data will be updated only (no new data will be added) * * @param string|array $key @@ -462,11 +462,11 @@ class e_model */ protected function _setData($key, $value = null, $strict = false, $data_src = '_data') { - if(is_array($key)) + if(is_array($key)) { if($strict) { - foreach(array_keys($key) as $k) + foreach(array_keys($key) as $k) { $this->_setData($k, $key[$k], true, $data_src); } @@ -475,8 +475,8 @@ class e_model $this->$data_src = $key; return $this; - } - + } + //multidimensional array support - strict _setData for values of type array if($strict && !empty($value) && is_array($value)) { @@ -486,30 +486,30 @@ class e_model } return $this; } - + //multidimensional array support - parse key $key = trim($key, '/'); - if(strpos($key,'/')) + if(strpos($key,'/')) { //if strict - update only if($strict && !$this->isData($key)) { return $this; } - + $keyArr = explode('/', $key); $data = &$this->{$data_src}; - for ($i = 0, $l = count($keyArr); $i < $l; $i++) + for ($i = 0, $l = count($keyArr); $i < $l; $i++) { $k = $keyArr[$i]; - - if (!isset($data[$k])) + + if (!isset($data[$k])) { $data[$k] = array(); } $data = &$data[$k]; } - + //data has changed - optimized if('_data' === $data_src && !$this->data_has_changed) { @@ -518,7 +518,7 @@ class e_model $this->_parsed_keys[$data_src.'/'.$key] = $value; $data = $value; } - else + else { //if strict - update only if($strict && !isset($this->_data[$key])) @@ -534,7 +534,7 @@ class e_model return $this; } - + /** * Set data for the given source. More simple (and performance wise) version * of {@link _setData()} @@ -558,7 +558,7 @@ class e_model $this->{$data_src}[$key] = $value; return $this; } - + if($this->isData($key)) { if('_data' === $data_src && !$this->data_has_changed) @@ -570,13 +570,13 @@ class e_model return $this; } - + /** * Add data to the object. * Retains existing data in the object. - * + * * If $override is false, only new (non-existent) data will be added - * + * * @param string|array $key * @param mixed $value * @param boolean $override allow override of existing data @@ -593,7 +593,7 @@ class e_model } return $this; } - + if($override || !$this->_isData($key, $data_src)) { if(is_array($value)) @@ -611,7 +611,7 @@ class e_model } return $this; } - + /** * Unset data from the object from the given source. * $key can be a string only. Array will be ignored. @@ -624,7 +624,7 @@ class e_model */ protected function _unsetData($key = null, $data_src = '_data') { - if (null === $key) + if (null === $key) { if('_data' === $data_src && !empty($this->_data)) { @@ -632,19 +632,19 @@ class e_model } $this->{$data_src} = array(); return $this; - } - + } + $key = trim($key, '/'); - if(strpos($key,'/')) + if(strpos($key,'/')) { $keyArr = explode('/', $key); $data = &$this->{$data_src}; - + $unskey = array_pop($keyArr); - for ($i = 0, $l = count($keyArr); $i < $l; $i++) + for ($i = 0, $l = count($keyArr); $i < $l; $i++) { $k = $keyArr[$i]; - if (!isset($data[$k])) + if (!isset($data[$k])) { return $this; //not found } @@ -659,7 +659,7 @@ class e_model unset($data[$unskey], $this->_parsed_keys[$data_src.'/'.$key]); } } - else + else { if('_data' === $data_src && isset($this->{$data_src}[$key])) { @@ -669,7 +669,7 @@ class e_model } return $this; } - + /** * Unset single field from the object from the given source. Key is not parsed * @@ -697,14 +697,14 @@ class e_model */ protected function _hasData($key = '', $data_src = '_data') { - if (empty($key)) + if (empty($key)) { return !empty($this->$data_src); } $value = $this->_getData($key, null, null, $data_src); return !empty($value); } - + /** * Checks if the specified key is set * @@ -719,7 +719,7 @@ class e_model /** * Add system message of type Information - * + * * @param string $message * @param boolean $session [optional] * @return e_model @@ -729,10 +729,10 @@ class e_model e107::getMessage()->addStack($message, $this->_message_stack, E_MESSAGE_INFO, $session); return $this; } - + /** * Add system message of type Success - * + * * @param string $message * @param boolean $session [optional] * @return e_model @@ -742,10 +742,10 @@ class e_model e107::getMessage()->addStack($message, $this->_message_stack, E_MESSAGE_SUCCESS, $session); return $this; } - + /** * Add system message of type Warning - * + * * @param string $message * @param boolean $session [optional] * @return e_model @@ -755,10 +755,10 @@ class e_model e107::getMessage()->addStack($message, $this->_message_stack, E_MESSAGE_WARNING, $session); return $this; } - + /** * Add system message of type Error - * + * * @param string $message * @param boolean $session [optional] * @return e_model @@ -768,10 +768,10 @@ class e_model e107::getMessage()->addStack($message, $this->_message_stack, E_MESSAGE_ERROR, $session); return $this; } - + /** * Add system message of type Information - * + * * @param string $message * @param boolean $session [optional] * @return e_model @@ -781,10 +781,10 @@ class e_model e107::getMessage()->addStack($message, $this->_message_stack, E_MESSAGE_DEBUG, $session); return $this; } - + /** * Render System messages (if any) - * + * * @param boolean $session store messages to session * @param boolean $reset reset errors * @return string @@ -793,10 +793,10 @@ class e_model { return e107::getMessage()->render($this->_message_stack, $session, $reset); } - + /** * Move model System messages (if any) to the default eMessage stack - * + * * @param boolean $session store messages to session * @return e_model */ @@ -805,7 +805,7 @@ class e_model e107::getMessage()->moveStack($this->_message_stack, 'default', false, $session); return $this; } - + /** * Set model message stack * @param string $stack_name @@ -816,7 +816,7 @@ class e_model $this->_message_stack = $stack_name; return $this; } - + /** * Get model message stack name * @return string @@ -825,7 +825,7 @@ class e_model { return $this->_message_stack; } - + /** * User defined model validation * Awaiting for child class implementation @@ -834,15 +834,15 @@ class e_model public function verify() { } - + /** - * Model validation + * Model validation * @see e_model_admin */ public function validate() { } - + /** * Generic load data from DB * @param boolean $force @@ -854,13 +854,13 @@ class e_model { return $this; } - + if($force) { $this->setData(array()); } $id = intval($id); - + $qry = str_replace('{ID}', $id, $this->getParam('db_query')); if(!$qry) { @@ -874,7 +874,7 @@ class e_model { $this->setData($sql->db_Fetch()); } - + if($sql->getLastErrorNumber()) { $this->addMessageDebug('SQL error #'.$sql->getLastErrorNumber().': '.$sql->getLastErrorText()); @@ -882,7 +882,7 @@ class e_model return $this; } - + /** * Save data to DB * Awaiting for child class implementation @@ -891,7 +891,7 @@ class e_model public function save() { } - + /** * Insert data to DB * Awaiting for child class implementation @@ -900,7 +900,7 @@ class e_model public function dbInsert() { } - + /** * Update DB data * Awaiting for child class implementation @@ -909,7 +909,7 @@ class e_model public function dbUpdate() { } - + /** * Replace DB record * Awaiting for child class implementation @@ -918,7 +918,7 @@ class e_model public function dbReplace() { } - + /** * Delete DB data * Awaiting for child class implementation @@ -927,7 +927,7 @@ class e_model public function dbDelete() { } - + /** * Set parameter array * Core parameters: @@ -942,7 +942,7 @@ class e_model $this->_params = $params; return $this; } - + /** * Update parameter array * @param array $params @@ -953,21 +953,21 @@ class e_model $this->_params = array_merge($this->_params, $params); return $this; } - + /** * Get parameter array - * + * * @return array parameters */ public function getParams() { return $this->_params; } - + /** * Set parameter - * - * @param string $key + * + * @param string $key * @param mixed $value * @return e_model */ @@ -976,7 +976,7 @@ class e_model $this->_params[$key] = $value; return $this; } - + /** * Get parameter * @@ -987,11 +987,11 @@ class e_model { return (isset($this->_params[$key]) ? $this->_params[$key] : $default); } - + /** * Render model data, all 'sc_*' methods will be recongnized * as shortcodes. - * + * * @param string $template * @param boolean $parsesc parse external shortcodes, default is true * @return string parsed template @@ -1000,12 +1000,12 @@ class e_model { return e107::getParser()->parseTemplate($template, $parsesc, $this); } - + public function toXML() { $ret = "\n"; $ret .= "\n"; - + $ret .= "\t\n"; // TODO - handle multi dimensional arrays (already possible - field1/field2?), method toXMLValue($value, $type) foreach ($this->getDataFields() as $field => $type) @@ -1015,15 +1015,15 @@ class e_model $ret .= "\n"; } $ret .= "\t\n"; - + $ret .= ""; return $ret; } - + /** * Try to convert string to a number * Shoud fix locale related troubles - * + * * @param string $value * @return integer|float */ @@ -1031,14 +1031,14 @@ class e_model { if(!is_numeric($value)) { - $larr = localeconv(); + $larr = localeconv(); $search = array($larr['decimal_point'], $larr['mon_decimal_point'], $larr['thousands_sep'], $larr['mon_thousands_sep'], $larr['currency_symbol'], $larr['int_curr_symbol']); $replace = array('.', '.', '', '', '', ''); $value = str_replace($search, $replace, $value); } return (0 + $value); } - + /** * Convert model object to array * @return array object data @@ -1047,7 +1047,7 @@ class e_model { return $this->getData(); } - + /** * Convert object data to a string * @@ -1068,12 +1068,12 @@ class e_model } return (string) e107::getArrayStorage()->WriteArray($this->getData(), $AddSlashes); } - + /** * Magic method - convert object data to a string - * NOTE: before PHP 5.2.0 the __toString method was only + * NOTE: before PHP 5.2.0 the __toString method was only * called when it was directly combined with echo() or print() - * + * * NOTE: PHP 5.3+ is throwing parse error if __toString has optional arguments. * * @param boolean $AddSlashes @@ -1083,7 +1083,7 @@ class e_model { return $this->toString((func_num_args() && @func_get_arg(0) === true)); } - + public function destroy() { $this->_data = array(); @@ -1099,12 +1099,12 @@ class e_model /** * Base e107 Admin Model class - * + * * Some important points: * - model data should be always in toDB() format: * - retrieved direct from DB * - set & sanitized via setPostedData()->mergePostedData() - * - manually sanitized before passed to model setter (set(), setData(), add(), addData(), etc.) methods + * - manually sanitized before passed to model setter (set(), setData(), add(), addData(), etc.) methods * - $_data_fields property is important, it tells to sanitize() method how to sanitize posted data * - if $_data_fields is missing, sanitize() will call internally e107::getParser()->toDB() on the data * - sanitize() is triggered by default on mergePostedData() and mergeData() methods @@ -1116,7 +1116,7 @@ class e_model * - in almost every case $_FIELD_TYPES shouldn't contain 'escape' and 'todb' - dont't forget you are going to pass already sanitized data (see above) * - most probably $_FIELD_TYPES will go in the future, $_data_fields alone could do the job * - default db related methods (save(), dbUpdate(), etc.) need $_db_table - * + * * @package e107 * @category e107_handlers * @version 1.0 @@ -1132,17 +1132,17 @@ class e_admin_model extends e_model * @var array */ protected $_posted_data = array(); - + /** * DB format array - see db::_getTypes() and db::_getFieldValue() (mysql_class.php) * for example - * + * * This can/should be overwritten by extending the class * * @var array */ protected $_FIELD_TYPES = array(); - + /** * Validation structure - see {@link e_validator::$_required_rules} for * more information about the array format. @@ -1153,19 +1153,19 @@ class e_admin_model extends e_model * @var array */ protected $_validation_rules = array(); - + /** * @var integer Last SQL error number */ protected $_db_errno = 0; - + /** * Validator object - * - * @var e_validator + * + * @var e_validator */ protected $_validator = null; - + /** * @return array */ @@ -1173,10 +1173,10 @@ class e_admin_model extends e_model { return $this->_validation_rules; } - + /** * Set object validation rules if $_validation_rules array is empty - * + * * @param array $vrules * @return e_admin_model */ @@ -1188,7 +1188,7 @@ class e_admin_model extends e_model } return $this; } - + /** * Predefined data fields types, passed to DB handler * @return array @@ -1197,10 +1197,10 @@ class e_admin_model extends e_model { return $this->_FIELD_TYPES; } - + /** * Predefined data fields types, passed to DB handler - * + * * @param array $field_types * @return e_admin_model */ @@ -1209,7 +1209,7 @@ class e_admin_model extends e_model $this->_FIELD_TYPES = $field_types; return $this; } - + /** * Retrieves data from the object ($_posted_data) without * key parsing (performance wise, prefered when possible) @@ -1223,7 +1223,7 @@ class e_admin_model extends e_model { return $this->_getDataSimple((string) $key, $default, '_posted_data'); } - + /** * Retrieves data from the object ($_posted_data) * If $key is empty, return all object posted data @@ -1237,13 +1237,13 @@ class e_admin_model extends e_model { return $this->_getData($key, $default, $index, '_posted_data'); } - + /** * Search for requested data from available sources in this order: * - posted data * - default object data * - passed default value - * + * * Use this method inside forms * * @param string $key @@ -1260,13 +1260,13 @@ class e_admin_model extends e_model } return e107::getParser()->toForm($this->getData((string) $key, $default, $index)); } - + /** * Overwrite posted data in the object for a single field. Key is not parsed. * Public proxy of {@link _setDataSimple()} - * Use this method to store data from non-trustable sources (e.g. _POST) - it doesn't overwrite + * Use this method to store data from non-trustable sources (e.g. _POST) - it doesn't overwrite * the original object data - * + * * @param string $key * @param mixed $value * @param boolean $strict update only @@ -1283,11 +1283,11 @@ class e_admin_model extends e_model } return $this->_setDataSimple($key, $value, $strict, '_posted_data'); } - + /** * Overwrite posted data in the object. Key is parsed (multidmensional array support). * Public proxy of {@link _setData()} - * Use this method to store data from non-trustable sources (e.g. _POST) - it doesn't overwrite + * Use this method to store data from non-trustable sources (e.g. _POST) - it doesn't overwrite * the original object data * * @param string|array $key @@ -1306,14 +1306,14 @@ class e_admin_model extends e_model } return $this->_setData($key, $value, $strict, '_posted_data'); } - + /** * Add data to the object. * Retains existing data in the object. * Public proxy of {@link _addData()} - * + * * If $override is false, data will be updated only (check against existing data) - * + * * @param string|array $key * @param mixed $value * @param boolean $override override existing data @@ -1330,7 +1330,7 @@ class e_admin_model extends e_model } return $this->_addData($key, $value, $override, '_posted_data'); } - + /** * Unset single posted data field from the object. * Public proxy of {@link _unsetDataSimple()} @@ -1342,13 +1342,13 @@ class e_admin_model extends e_model { return $this->_unsetDataSimple($key, '_posted_data'); } - + /** * Unset posted data from the object. * $key can be a string only. Array will be ignored. * '/' inside the key will be treated as array path * if $key is null entire object will be reset - * + * * Public proxy of {@link _unsetData()} * * @param string|null $key @@ -1368,7 +1368,7 @@ class e_admin_model extends e_model { return $this->_hasData($key, '_posted_data'); } - + /** * Check if posted data is empty * @return boolean @@ -1377,10 +1377,10 @@ class e_admin_model extends e_model { return $this->_hasData('', '_posted_data'); } - + /** * Check if given key exists in the posted data array - * + * * @param string $key * @return boolean */ @@ -1388,10 +1388,10 @@ class e_admin_model extends e_model { return (isset($this->_posted_data[$key])); } - + /** * Check if given key exists in the posted data array ($key us parsed) - * + * * @param string $key * @return boolean */ @@ -1399,7 +1399,7 @@ class e_admin_model extends e_model { return $this->_isData($key, '_posted_data'); } - + /** * Compares posted data vs object data * @@ -1413,7 +1413,7 @@ class e_admin_model extends e_model $postedData = $this->getPostedData($field); return ($strict ? $newData !== $postedData : $newData != $postedData); } - + /** * @return boolean */ @@ -1421,16 +1421,16 @@ class e_admin_model extends e_model { return $this->data_has_changed; } - + /** * Merge posted data with the object data * Should be used on edit/update/create record (back-end) * Retrieved for copy Posted data will be removed (no matter if copy is successfull or not) - * + * * If $strict is true, only existing object data will be copied (update) * If $validate is true, data will be copied only after successful validation * - * @param boolean $strict + * @param boolean $strict * @param boolean $sanitize sanitize posted data before move it to the object data * @param boolean $validate perform validation check * @return e_admin_model @@ -1439,12 +1439,12 @@ class e_admin_model extends e_model { if(!$this->hasPostedData() || ($validate && !$this->validate())) { - return $this; + return $this; } - + /* XXX - Wrong? Should validator keep track on validated data at all? // retrieve only valid data - if($validate) + if($validate) { $data = $this->getValidator()->getValidData(); } @@ -1452,7 +1452,7 @@ class e_admin_model extends e_model { $data = $this->getPostedData(); }*/ - + $data = $this->getPostedData(); if($sanitize) { @@ -1467,19 +1467,19 @@ class e_admin_model extends e_model $data = $tp->toDB($data); } } - - foreach ($data as $field => $dt) + + foreach ($data as $field => $dt) { $this->setData($field, $dt, $strict) ->removePostedData($field); } return $this; } - + /** * Merge passed data array with the object data * Should be used on edit/update/create record (back-end) - * + * * If $strict is true, only existing object data will be copied (update) * If $validate is true, data will be copied only after successful validation * @@ -1495,14 +1495,14 @@ class e_admin_model extends e_model { return $this; } - + /* Wrong? // retrieve only valid data - if($validate) + if($validate) { $src_data = $this->getValidator()->getValidData(); }*/ - + if($sanitize) { // search for db_field types @@ -1515,15 +1515,15 @@ class e_admin_model extends e_model $src_data = $tp->toDB($src_data); } } - + foreach ($src_data as $key => $value) { $this->setData($key, $value, $strict); } - + return $this; } - + /** * Validate posted data: * 1. validate posted data against object validation rules @@ -1539,13 +1539,13 @@ class e_admin_model extends e_model { return true; } - if(null === $data) + if(null === $data) { $data = $this->getPostedData(); } return $this->getValidator()->validate($data); } - + /** * User defined model validation * Awaiting for child class implementation @@ -1554,7 +1554,7 @@ class e_admin_model extends e_model public function verify() { } - + /** * @return e_validator */ @@ -1573,12 +1573,12 @@ class e_admin_model extends e_model * Add custom validation message. * $field_type and $error_code will be inserted via sprintf() * in the $message string - * Example: + * Example: * - * $model->addValidationError('Custom error message [#%d] for %s', 'My Field', 1000); + * $model->addValidationError('Custom error message [#%d] for %s', 'My Field', 1000); * //produces 'Custom error message [#1000] for My Field' * - * + * * @param string $message * @param string $field_title [optional] * @param integer $error_code [optional] @@ -1589,10 +1589,10 @@ class e_admin_model extends e_model $this->getValidator()->addValidateMessage($field_title, $error_code, $message); return $this; } - + /** * Render validation errors (if any) - * + * * @param boolean $session store messages to session * @param boolean $reset reset errors * @return string @@ -1601,10 +1601,10 @@ class e_admin_model extends e_model { return $this->getValidator()->renderValidateMessages($session, $reset); } - + /** * Render System messages (if any) - * + * * @param boolean $validation render validation messages as well * @param boolean $session store messages to session * @param boolean $reset reset errors @@ -1618,10 +1618,10 @@ class e_admin_model extends e_model } return parent::renderMessages($session, $reset); } - + /** * Move model System messages (if any) to the default eMessage stack - * + * * @param boolean $session store messages to session * @param boolean $validation move validation messages as well * @return e_admin_model @@ -1643,7 +1643,7 @@ class e_admin_model extends e_model { return $this->getValidator()->isValid(); } - + /** * @return boolean */ @@ -1651,7 +1651,7 @@ class e_admin_model extends e_model { return !empty($this->_db_errno); } - + /** * @return integer last mysql error number */ @@ -1659,7 +1659,7 @@ class e_admin_model extends e_model { return $this->_db_errno; } - + /** * @return string last mysql error message */ @@ -1667,7 +1667,7 @@ class e_admin_model extends e_model { return e107::getDb()->getLastErrorText(); } - + /** * @return boolean */ @@ -1675,7 +1675,7 @@ class e_admin_model extends e_model { return ($this->hasValidationError() || $this->hasSqlError()); } - + /** * Generic load data from DB * @param boolean $force @@ -1684,7 +1684,7 @@ class e_admin_model extends e_model public function load($id, $force = false) { parent::load($id, $force); - + $this->_db_errno = e107::getDb()->getLastErrorNumber(); if($this->_db_errno) { @@ -1693,10 +1693,10 @@ class e_admin_model extends e_model } return $this; } - + /** * Save data to DB - * + * * @param boolen $from_post */ public function save($from_post = true, $force = false, $session_messages = false) @@ -1705,21 +1705,21 @@ class e_admin_model extends e_model { return false; } - + if($from_post) { - //no strict copy, validate & sanitize + //no strict copy, validate & sanitize $this->mergePostedData(false, true, true); } - + if($this->getId()) { return $this->dbUpdate($force, $session_messages); } - + return $this->dbInsert($force, $session_messages); } - + public function delete($destroy = true, $session_messages = false) { $ret = $this->dbDelete(); @@ -1732,10 +1732,10 @@ class e_admin_model extends e_model } return $ret; } - + /** * Insert data to DB - * + * * @param boolean $force force query even if $data_has_changed is false * @param boolean $session_messages to use or not session to store system messages */ @@ -1755,17 +1755,17 @@ class e_admin_model extends e_model $this->addMessageDebug('SQL Error #'.$this->_db_errno.': '.e107::getDb()->getLastErrorText()); return false; } - + // Set the reutrned ID $this->setId($res); $this->addMessageSuccess(LAN_CREATED); - + return $res; } - + /** * Replace data in DB - * + * * @param boolean $force force query even if $data_has_changed is false * @param boolean $session_messages to use or not session to store system messages */ @@ -1776,7 +1776,7 @@ class e_admin_model extends e_model { return 0; } - + $res = e107::getDb()->db_Insert($this->getModelTable(), $this->toSqlQuery('replace')); if(!$res) { @@ -1787,13 +1787,13 @@ class e_admin_model extends e_model $this->addMessageDebug('SQL Error #'.$this->_db_errno.': '.e107::getDb()->getLastErrorText()); } } - + return $res; } - + /** * Update DB data - * + * * @param boolean $force force query even if $data_has_changed is false * @param boolean $session_messages to use or not session to store system messages */ @@ -1815,17 +1815,17 @@ class e_admin_model extends e_model $this->addMessageDebug('SQL Error #'.$this->_db_errno.': '.e107::getDb()->getLastErrorText()); return false; } - + $this->addMessageInfo(LAN_NO_CHANGE); return 0; } $this->addMessageSuccess(LAN_UPDATED); return $res; } - + /** * Delete DB data - * + * * @param boolean $force force query even if $data_has_changed is false * @param boolean $session_messages to use or not session to store system messages */ @@ -1836,7 +1836,7 @@ class e_admin_model extends e_model { return 0; } - + if(!$this->getId()) { $this->addMessageError('Record not found', $session_messages); //TODO - Lan @@ -1852,20 +1852,20 @@ class e_admin_model extends e_model $this->addMessageDebug('SQL Error #'.$this->_db_errno.': '.e107::getDb()->getLastErrorText()); } } - + return $res; } - + /** * Build query array to be used with db methods (db_Update, db_Insert, db_Replace) - * + * * @param string $force [optional] force action - possible values are create|update|replace * @return array db query */ public function toSqlQuery($force = '') { $qry = array(); - + if($force) { $action = $force; @@ -1874,11 +1874,11 @@ class e_admin_model extends e_model { $action = $this->getId() ? 'update' : 'create'; } - + $qry['_FIELD_TYPES'] = $this->_FIELD_TYPES; //DB field types are optional $qry['data'][$this->getFieldIdName()] = $this->getId(); $qry['_FIELD_TYPES'][$this->getFieldIdName()] = 'int'; - + foreach ($this->_data_fields as $key => $type) { if($key == $this->getFieldIdName()) @@ -1891,7 +1891,7 @@ class e_admin_model extends e_model } $qry['data'][$key] = $this->getData($key); } - + switch($action) { case 'create': @@ -1900,26 +1900,26 @@ class e_admin_model extends e_model case 'replace': $qry['_REPLACE'] = true; break; - + case 'update': unset($qry['data'][$this->getFieldIdName()]); $qry['WHERE'] = $this->getFieldIdName().'='.intval($this->getId()); //intval just in case... break; } - + return $qry; } - + /** * Sanitize value based on its db field type ($_data_fields), * method will return null only if db field rule is not found. * If $value is null, it'll be retrieved from object posted data * If $key is an array, $value is omitted. - * + * * NOTE: If $key is not found in object's _data_fields array, null is returned - * + * * @param mixed $key string key name or array data to be sanitized - * @param mixed $value + * @param mixed $value * @return mixed sanitized $value or null on failure */ public function sanitize($key, $value = null) @@ -1927,7 +1927,7 @@ class e_admin_model extends e_model $tp = e107::getParser(); if(is_array($key)) { - $ret = array(); + $ret = array(); foreach ($key as $k=>$v) { if(isset($this->_data_fields[$k])) @@ -1937,7 +1937,7 @@ class e_admin_model extends e_model } return $ret; } - + if(!isset($this->_data_fields[$key])) { return null; @@ -1947,7 +1947,7 @@ class e_admin_model extends e_model { $value = $this->getPostedData($key); } - + switch ($type) { case 'int': @@ -1960,7 +1960,7 @@ class e_admin_model extends e_model return $tp->toDB($value); break; - case 'float': + case 'float': return $this->toNumber($value); break; @@ -1972,12 +1972,12 @@ class e_admin_model extends e_model case 'model': return $value->mergePostedData(false, true, true); break; - + case 'null': return ($value ? $tp->toDB($value) : null); break; } - + return null; } @@ -1989,30 +1989,30 @@ class e_admin_model extends e_model $this->_db_errno = null; $this->_posted_data = array(); $this->data_has_changed = array(); - $this->_FIELD_TYPES = array(); + $this->_FIELD_TYPES = array(); } } /** * Model collection handler */ -class e_tree_model extends e_model +class e_tree_model extends e_model { /** * Current model DB table, used in all db calls * This can/should be overwritten by extending the class - * + * * @var string */ protected $_db_table; - + /** * All records (no limit) cache - * + * * @var string */ protected $_total = false; - + /** * Constructor * @@ -2024,18 +2024,18 @@ class e_tree_model extends e_model $this->setTree($tree_data); } } - + public function getTotal() { - return $this->_total; + return $this->_total; } - + public function setTotal($num) { $this->_total = $num; return $this; } - + /** * Set table name * @param object $table @@ -2046,7 +2046,7 @@ class e_tree_model extends e_model $this->_db_table = $table; return $this; } - + /** * Get table name * @return string @@ -2055,16 +2055,16 @@ class e_tree_model extends e_model { return $this->_db_table; } - + /** - * Set array of models + * Get array of models * @return array */ - function getTree($force = false) + function getTree() { return $this->get('__tree', array()); } - + /** * Set array of models * @return e_tree_model @@ -2078,26 +2078,26 @@ class e_tree_model extends e_model return $this; } - + /** * Default load method - * + * * @return e_tree_model */ public function load($force = false) { - + if(!$force && !$this->isEmpty()) { return $this; } - + if ($force) { $this->setTree(array(), true); $this->_total = false; } - + if($this->getParam('db_query') && $this->getParam('model_class') && class_exists($this->getParam('model_class'))) { $sql = e107::getDb(); @@ -2116,13 +2116,13 @@ class e_tree_model extends e_model } $this->setNode($tmp->get($this->getFieldIdName()), $tmp); } - + if(false === $this->_total && $this->getModelTable() && !$this->getParam('nocount')) { //SQL_CALC_FOUND_ROWS not found in the query, do one more query $this->_total = e107::getDb()->db_Count($this->getModelTable()); } - + unset($tmp); } } @@ -2138,10 +2138,10 @@ class e_tree_model extends e_model { return $this->getData('__tree/'.$node_id); } - + /** * Add or remove (when $node is null) model to the collection - * + * * @param integer $node_id * @param e_model $node * @return e_tree_model @@ -2153,14 +2153,14 @@ class e_tree_model extends e_model $this->removeData('__tree/'.$node_id); return $this; } - + $this->setData('__tree/'.$node_id, $node); return $this; } - + /** * Check if model with passed id exists in the collection - * + * * @param integer $node_id * @return boolean */ @@ -2168,10 +2168,10 @@ class e_tree_model extends e_model { return $this->isData('__tree/'.$node_id); } - + /** * Check if model with passed id exists in the collection and is not empty - * + * * @param integer $node_id * @return boolean */ @@ -2179,7 +2179,7 @@ class e_tree_model extends e_model { return $this->hasData('__tree/'.$node_id); } - + /** * Check if collection is empty * @@ -2207,16 +2207,16 @@ class e_admin_tree_model extends e_tree_model if(!is_array($ids)) { $ids = explode(',', $ids); - + } - + $ids = array_map('intval', $ids); $idstr = implode(', ', $ids); - + $sql = e107::getDb(); $res = $sql->db_Delete($this->getModelTable(), $this->getFieldIdName().' IN ('.$idstr.')'); if(!$res) - { + { if($sql->getLastErrorNumber()) { $this->addMessageError('SQL Delete Error', $session_messages); //TODO - Lan @@ -2235,10 +2235,10 @@ class e_admin_tree_model extends e_tree_model } } } - + return $res; } - + /** * Batch update tree records/nodes * @param string $field field name @@ -2252,7 +2252,7 @@ class e_admin_tree_model extends e_tree_model public function update($field, $value, $ids, $syncvalue = null, $sanitize = true, $session_messages = false) { $tp = e107::getParser(); - $sql = e107::getDb(); + $sql = e107::getDb(); if(empty($ids)) { return 0; @@ -2261,7 +2261,7 @@ class e_admin_tree_model extends e_tree_model { $ids = explode(',', $ids); } - + if($sanitize) { $ids = array_map('intval', $ids); @@ -2269,23 +2269,23 @@ class e_admin_tree_model extends e_tree_model $value = "'".$tp->toDb($value)."'"; } $idstr = implode(', ', $ids); - + $res = $sql->db_Update($this->getModelTable(), "{$field}={$value} WHERE ".$this->getFieldIdName().' IN ('.$idstr.')'); if(!$res) - { + { if($sql->getLastErrorNumber()) { - $this->addMessageError(LAN_UPDATED_FAILED, $session_messages); + $this->addMessageError(LAN_UPDATED_FAILED, $session_messages); $this->addMessageDebug('SQL Error #'.$sql->getLastErrorNumber().': '.$sql->getLastErrorText()); } else { - $this->addMessageInfo(LAN_NO_CHANGE, $session_messages); + $this->addMessageInfo(LAN_NO_CHANGE, $session_messages); } } - + if(null === $syncvalue) return $res; - + foreach ($ids as $id) { if($this->hasNode($id))