From 96114a36fb9e76127b90eee0c30106f87db967b7 Mon Sep 17 00:00:00 2001 From: secretr Date: Tue, 17 Nov 2009 15:23:01 +0000 Subject: [PATCH] admin UI: more improvements and bugfixes --- e107_admin/image.php | 14 ++-- e107_handlers/admin_handler.php | 109 +++++++++++++++++------------- e107_handlers/form_handler.php | 66 ++++++++++++++---- e107_handlers/model_class.php | 22 +++++- e107_handlers/validator_class.php | 10 +-- 5 files changed, 145 insertions(+), 76 deletions(-) diff --git a/e107_admin/image.php b/e107_admin/image.php index b1a0925c0..42ab5c048 100644 --- a/e107_admin/image.php +++ b/e107_admin/image.php @@ -9,9 +9,9 @@ * Image Administration Area * * $Source: /cvs_backup/e107_0.8/e107_admin/image.php,v $ - * $Revision: 1.31 $ - * $Date: 2009-11-17 09:17:08 $ - * $Author: marj_nl_fr $ + * $Revision: 1.32 $ + * $Date: 2009-11-17 15:23:01 $ + * $Author: secretr $ * */ require_once("../class2.php"); @@ -162,7 +162,7 @@ class media_admin_ui extends e_admin_ui * Invoked just before item create event * @return array */ - public function beforeCreate() + public function beforeCreate($new_data) { // return data to be merged with posted model data return $this->observeUploaded(); @@ -172,7 +172,7 @@ class media_admin_ui extends e_admin_ui * Same as beforeCreate() but invoked on edit * @return */ - public function beforeUpdate() + public function beforeUpdate($new_data, $old_data, $id) { // return data to be merged with posted model data return $this->observeUploaded(); @@ -266,12 +266,12 @@ class media_admin_ui extends e_admin_ui } - function beforeDelete($id) // call before 'delete' is executed. - return false to prevent delete execution (e.g. some dependencies check) + function beforeDelete($data, $id) // call before 'delete' is executed. - return false to prevent delete execution (e.g. some dependencies check) { return true; } - function afterDelete($deleted_data) // call after 'delete' is successfully executed. - delete the file with the db record (optional pref) + function afterDelete($deleted_data, $id) // call after 'delete' is successfully executed. - delete the file with the db record (optional pref) { } diff --git a/e107_handlers/admin_handler.php b/e107_handlers/admin_handler.php index 395826d7d..5eaaeaf71 100644 --- a/e107_handlers/admin_handler.php +++ b/e107_handlers/admin_handler.php @@ -9,8 +9,8 @@ * Administration UI handlers, admin helper functions * * $Source: /cvs_backup/e107_0.8/e107_handlers/admin_handler.php,v $ - * $Revision: 1.28 $ - * $Date: 2009-11-16 12:23:07 $ + * $Revision: 1.29 $ + * $Date: 2009-11-17 15:23:00 $ * $Author: secretr $ */ @@ -2027,6 +2027,9 @@ class e_admin_controller_ui extends e_admin_controller */ protected $pluginName; + + protected $batchDelete = true; + /** * Could be LAN constant (mulit-language support) * @var string plugin name @@ -2059,6 +2062,11 @@ class e_admin_controller_ui extends e_admin_controller */ protected $_pref = null; + public function getBatchDelete() + { + return $this->batchDelete; + } + /** * @return string */ @@ -2503,14 +2511,14 @@ class e_admin_controller_ui extends e_admin_controller case 'datestamp': if(!is_numeric($data[$key])) { - $data[$key] = e107::getDateConvert()->toTime($data[$key], 'input'); + $data[$key] = trim($data[$key]) ? e107::getDateConvert()->toTime($data[$key], 'input') : 0; } break; case 'ip': // TODO - ask Steve if this check is required if(strpos($data[$key], '.') !== FALSE) { - $data[$key] = e107::getInstance()->ipEncode($data[$key]); + $data[$key] = trim($data[$key]) ? e107::getInstance()->ipEncode($data[$key]) : ''; } break; } @@ -2833,30 +2841,52 @@ class e_admin_controller_ui extends e_admin_controller /** * Manage submit item - * @param array $posted [optional] additional model data + * 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() * @return */ - protected function _manageSubmit($posted = array(), $noredirectAction = '') + protected function _manageSubmit($callbackBefore = '', $callbackAfter = '', $noredirectAction = '') { - // Scenario I - use request owned POST data - toForm already exeuted + $model = $this->getModel(); + $old_data = $model->getData(); + $_posted = $this->getPosted(); $this->convertToData($_posted); - if($posted && is_array($posted)) + + if($callbackBefore && method_exists($this, $callbackBefore)) { - $_posted = array_merge($_posted, $posted); + $data = $this->$callbackBefore($_posted, $old_data, $model->getId()); + if(false === $data) + { + return false; + } + if($data && is_array($data)) + { + $_posted = array_merge($_posted, $data); + } } - $this->getModel()->setPostedData($_posted, null, false, false) + + // 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); + //$this->getModel()->setPosted($this->convertToData($_POST, null, false, true); // Copy model messages to the default message stack - $this->getModel()->setMessages(); + $model->setMessages(); // Take action based on use choice after success if(!$this->getModel()->hasError()) { - $this->doAfterSubmit($this->getModel()->getId(), $noredirectAction); + // callback (if any) + if($callbackAfter && method_exists($this, $callbackAfter)) + { + $this->$callbackAfter($model->getData(), $old_data, $model->getId()); + } + $this->doAfterSubmit($model->getId(), $noredirectAction); return true; } return false; @@ -2874,8 +2904,6 @@ class e_admin_ui extends e_admin_controller_ui protected $pid; protected $listQry; protected $editQry; - - protected $batchDelete = true; /** * Constructor @@ -3020,17 +3048,17 @@ class e_admin_ui extends e_admin_controller_ui { $this->triggersEnabled(false); $id = intval(array_shift($posted)); - if($this->beforeDelete($id)) + $data = array(); + $model = $this->getTreeModel()->getNode($id); + if($model) + { + $data = $model->getData(); + } + if($this->beforeDelete($data, $id)) { - $data = array(); - $model = $this->getTreeModel()->getNode($id); - if($model) - { - $data = $model->getData(); - } if($this->getTreeModel()->delete($id)) { - $this->afterDelete($data); + $this->afterDelete($data, $id); } $this->getTreeModel()->setMessages(); } @@ -3039,7 +3067,7 @@ class e_admin_ui extends e_admin_controller_ui /** * User defined pre-delete logic */ - public function beforeDelete($id) + public function beforeDelete($data, $id) { return true; } @@ -3047,7 +3075,7 @@ class e_admin_ui extends e_admin_controller_ui /** * User defined after-create logic */ - public function afterDelete($deleted_data) + public function afterDelete($deleted_data, $id) { } @@ -3129,10 +3157,7 @@ class e_admin_ui extends e_admin_controller_ui */ public function EditSubmitTrigger() { - if($this->_manageSubmit($this->beforeUpdate(), 'edit')) - { - $this->afterUpdate(); - } + $this->_manageSubmit('beforeUpdate', 'afterUpdate', 'edit'); } /** @@ -3177,37 +3202,34 @@ class e_admin_ui extends e_admin_controller_ui */ public function CreateSubmitTrigger() { - if($this->_manageSubmit($this->beforeCreate(), '')) - { - $this->afterCreate(); - } + $this->_manageSubmit('beforeCreate', 'afterCreate'); } /** * User defined pre-create logic */ - public function beforeCreate() + public function beforeCreate($new_data, $old_data) { } /** * User defined after-create logic */ - public function afterCreate() + public function afterCreate($new_data, $old_data, $id) { } /** * User defined pre-update logic */ - public function beforeUpdate() + public function beforeUpdate($new_data, $old_data, $id) { } /** * User defined after-update logic */ - public function afterUpdate() + public function afterUpdate($new_data, $old_data, $id) { } @@ -3282,11 +3304,6 @@ class e_admin_ui extends e_admin_controller_ui return ($prefix ? '#' : '').$this->table; } - public function getBatchDelete() - { - return $this->batchDelete; - } - /** * Validation rules retrieved from controller object * @return array @@ -3901,7 +3918,7 @@ class e_admin_icons * @param string $extension without leading dot, default 'png' * @return string icon url without domain */ -function ___I($name, $size = 16, $extension = 'png') +function _I($name, $size = 16, $extension = 'png') { return e107::getSingleton('e_admin_icons')->url($name, $size, $extension); } @@ -3918,7 +3935,7 @@ function ___I($name, $size = 16, $extension = 'png') * @param string $extension default 'png' * @return string img tag */ -function ___ITAG($name, $size = 16, $class = '', $alt = '', $extension = 'png') +function _ITAG($name, $size = 16, $class = '', $alt = '', $extension = 'png') { return e107::getSingleton('e_admin_icons')->tag($name, $size, $class, $alt, $extension); } @@ -3939,7 +3956,7 @@ function ___ITAG($name, $size = 16, $class = '', $alt = '', $extension = 'png') * @param string $extension without leading dot, default 'png' * @return string icon relative server path */ -function ___IPATH($name, $size = 16, $extension = 'png') +function _IPATH($name, $size = 16, $extension = 'png') { return e107::getSingleton('e_admin_icons')->path($name, $size, $extension); } @@ -3948,7 +3965,7 @@ include_once(e107::coreTemplatePath('admin_icons')); /** * TODO: - * 1. move abstract peaces of code to the proper classes + * 1. [DONE - a good start] move abstract peaces of code to the proper classes * 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 diff --git a/e107_handlers/form_handler.php b/e107_handlers/form_handler.php index 25da57d8f..7255e4e23 100644 --- a/e107_handlers/form_handler.php +++ b/e107_handlers/form_handler.php @@ -9,8 +9,8 @@ * Form Handler * * $Source: /cvs_backup/e107_0.8/e107_handlers/form_handler.php,v $ - * $Revision: 1.81 $ - * $Date: 2009-11-15 20:24:55 $ + * $Revision: 1.82 $ + * $Date: 2009-11-17 15:23:00 $ * $Author: secretr $ * */ @@ -123,13 +123,15 @@ class e_form if(is_string($sc_parameters)) parse_str($sc_parameters, $sc_parameters); if(!$label) $label = LAN_SELECT; $parms = "name={$name}"; - $parms .= "&path=".urlencode(e107::getParser()->replaceConstants(vartrue($sc_parameters['path'], '{e_FILE}images/'))); + $parms .= "&path=".rawurlencode(e107::getParser()->replaceConstants(vartrue($sc_parameters['path'], '{e_FILE}images/'))); $parms .= "&filter=0"; $parms .= "&fullpath=1"; - $parms .= "&default=".$default; + $parms .= "&default=".rawurlencode($default); $parms .= "&multiple=FALSE"; $parms .= "&label=-- ".$label." --"; $parms .= "&subdirs=0"; + $parms .= '&width='.vartrue($sc_parameters['width'], 150).'px'; + if(vartrue($sc_parameters['height'])) $parms .= '&height='.$sc_parameters['height'].'px'; //$parms .= "&tabindex=".$this->getNext(); //$parms .= "&click_target=data"; //$parms .= "&click_prefix=[img][[e_IMAGE]]newspost_images/"; @@ -165,7 +167,7 @@ class e_form $cal_attrib['name'] = $name; if ($datestamp) { - $cal_attrib['value'] = e107::getDateConvert()->convert_date($datestamp, 'input'); //date("d/m/Y H:i:s", $datestamp); + $cal_attrib['value'] = is_numeric($datestamp) ? e107::getDateConvert()->convert_date($datestamp, 'input') : $datestamp; //date("d/m/Y H:i:s", $datestamp); // var_dump('date picker', $datestamp, $cal_attrib['value'], e107::getDateConvert()->toTime($cal_attrib['value']), e107::getDateConvert()->convert_date(e107::getDateConvert()->toTime($cal_attrib['value']), 'input')); } //JS manager to send JS/CSS to header if possible, if not - footer @@ -456,7 +458,7 @@ class e_form return $this->option($prefix.$this->_uc->uc_get_classname($classnum), $classnum, in_array($classnum, $tmp), array("style"=>"{$style}"))."\n"; } - function optgroup_open($label, $disabled) + function optgroup_open($label, $disabled = false) { return ""; } @@ -927,7 +929,6 @@ class e_form foreach ($fieldarray as $field => $data) { - //Not found if((!varset($data['forced']) && !in_array($field, $currentlist)) || varset($data['nolist'])) { @@ -1092,12 +1093,17 @@ class e_form break; case 'image': //TODO - thumb, js tooltip... - $ttl = vartrue($parms['title'], 'LAN_PREVIEW'); - $value = ''.defset($ttl, $ttl).''; + if($value) + { + $src = $tp->replaceConstants(vartrue($parms['pre']).$value, 'abs'); + $alt = $src; //basename($value); + $ttl = vartrue($parms['thumb']) ? ''.$alt.'' : vartrue($parms['title'], 'LAN_PREVIEW'); + $value = ''.defset($ttl, $ttl).''; + } break; case 'datestamp': - $value = e107::getDateConvert()->convert_date($value, vartrue($parms['mask'], 'short')); + $value = $value ? e107::getDateConvert()->convert_date($value, vartrue($parms['mask'], 'short')) : ''; break; case 'userclass': @@ -1133,9 +1139,29 @@ class e_form } }*/ // Dirty, but the only way for now - if(vartrue($parms['__idval']) && vartrue($parms['link'])) + $id = 0; + $ttl = ''; + if(vartrue($parms['link'])) { - $value = ''.$value.''; + $id = vartrue($parms['__idval']); + if($value && !is_numeric($value)) + { + $id = vartrue($parms['__idval']); + $ttl = $value; + } + elseif($value && is_numeric($value)) + { + $id = $value; + $ttl = vartrue($parms['__titleval']); + } + } + if($id && $ttl && is_numeric($id)) + { + $value = ''.$ttl.''; + } + else + { + $value = $ttl; } break; @@ -1157,6 +1183,10 @@ class e_form $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: @@ -1203,11 +1233,11 @@ class e_form break; case 'textarea': - return $this->textarea($key, $value, vartrue($parms['rows'], 5), vartrue($parms['cols'], 40), vartrue($parms['__options']), vartrue($parms['counter'], false)); + 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'), vartrue($parms['counter'], false)); + 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... @@ -1287,9 +1317,14 @@ class e_form return call_user_func_array(array($this, $key), array($value, 'write', $parms)); break; - case 'upload': + 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); + break; default: return $value; @@ -1370,6 +1405,7 @@ class e_form } else { + foreach($tree as $model) { $text .= $this->renderTableRow($fields, $current_fields, $model->getData(), $options['pid']); diff --git a/e107_handlers/model_class.php b/e107_handlers/model_class.php index d4733a7f9..994f46b16 100644 --- a/e107_handlers/model_class.php +++ b/e107_handlers/model_class.php @@ -9,8 +9,8 @@ * e107 Base Model * * $Source: /cvs_backup/e107_0.8/e107_handlers/model_class.php,v $ - * $Revision: 1.37 $ - * $Date: 2009-11-16 12:23:07 $ + * $Revision: 1.38 $ + * $Date: 2009-11-17 15:23:01 $ * $Author: secretr $ */ @@ -1578,6 +1578,22 @@ class e_admin_model extends e_model return !empty($this->_db_errno); } + /** + * @return integer last mysql error number + */ + public function getSqlErrorNumber() + { + return $this->_db_errno; + } + + /** + * @return string last mysql error message + */ + public function getSqlError() + { + return e107::getDb()->getLastErrorText(); + } + /** * @return boolean */ @@ -1656,7 +1672,7 @@ class e_admin_model extends e_model { return 0; } - + $res = e107::getDb()->db_Insert($this->getModelTable(), $this->toSqlQuery('create')); if(!$res) { diff --git a/e107_handlers/validator_class.php b/e107_handlers/validator_class.php index 3dfad51e7..104e8fa08 100644 --- a/e107_handlers/validator_class.php +++ b/e107_handlers/validator_class.php @@ -9,9 +9,9 @@ * Handler - general purpose validation functions * * $Source: /cvs_backup/e107_0.8/e107_handlers/validator_class.php,v $ - * $Revision: 1.15 $ - * $Date: 2009-11-17 14:50:26 $ - * $Author: marj_nl_fr $ + * $Revision: 1.16 $ + * $Date: 2009-11-17 15:23:00 $ + * $Author: secretr $ * */ @@ -702,9 +702,9 @@ class e_validator * @param mixed $default * @return integer error code */ - function getErrorCode($field, $default) + function getErrorCode($field, $default = -1) { - return (isset($this->_validation_results[$field]) ? $this->_validation_results[$field] : -1); + return (isset($this->_validation_results[$field]) ? $this->_validation_results[$field] : $default); } /**