Index: branches/5.2.x/core/kernel/db/db_event_handler.php =================================================================== diff -u -r14092 -r14095 --- branches/5.2.x/core/kernel/db/db_event_handler.php (.../db_event_handler.php) (revision 14092) +++ branches/5.2.x/core/kernel/db/db_event_handler.php (.../db_event_handler.php) (revision 14095) @@ -1,6 +1,6 @@ getPrefixSpecial(true) instead of - * $event->Prefix_Special as usual. This is due PHP + * $event->getPrefixSpecial() as usual. This is due PHP * is converting "." symbols in variable names during * submit info "_". $event->getPrefixSpecial optional * 1st parameter returns correct corrent Prefix_Special @@ -32,7 +32,7 @@ * * 2. When using $this->Application-LinkVar on variables submitted * from form which contain $Prefix_Special then note 1st item. Example: - * LinkVar($event->getPrefixSpecial(true).'_varname',$event->Prefix_Special.'_varname') + * LinkVar($event->getPrefixSpecial(true).'_varname',$event->getPrefixSpecial().'_varname') * */ @@ -45,26 +45,6 @@ class kDBEventHandler extends kEventHandler { /** - * Description - * - * @var kDBConnection - * @access public - */ - var $Conn; - - /** - * Adds ability to address db connection - * - * @return kDBEventHandler - * @access public - */ - function kDBEventHandler() - { - parent::kBase(); - $this->Conn =& $this->Application->GetADODBConnection(); - } - - /** * Checks permissions of user * * @param kEvent $event @@ -321,10 +301,11 @@ // this smells... needs to be refactored $first_id = getArrayValue($ret,0); if (($first_id === false) && ($event->getEventParam('raise_warnings') == 1)) { - if ($this->Application->isDebugMode()) { + if ( $this->Application->isDebugMode() ) { $this->Application->Debugger->appendTrace(); } - trigger_error('Requested ID for prefix '.$event->getPrefixSpecial().' not passed',E_USER_NOTICE); + + trigger_error('Requested ID for prefix ' . $event->getPrefixSpecial() . ' not passed', E_USER_NOTICE); } $this->Application->SetVar($event->getPrefixSpecial() . '_id', $first_id); @@ -405,12 +386,6 @@ $this->Application->SetVar($prefix_special.'_id', ''); // $event->getPrefixSpecial(true).'_id' too may be } - /*function SetSaveEvent(&$event) - { - $this->Application->SetVar($event->Prefix_Special.'_SaveEvent','OnUpdate'); - $this->Application->LinkVar($event->Prefix_Special.'_SaveEvent'); - }*/ - /** * Common builder part for Item & List * @@ -434,14 +409,10 @@ $object->SwitchToTemp(); } - // This strange constuction creates hidden field for storing event name in form submit - // It pass SaveEvent to next screen, otherwise after unsuccsefull create it will try to update rather than create - $current_event = $this->Application->GetVar($event->Prefix_Special.'_event'); -// $this->Application->setEvent($event->Prefix_Special, $current_event); - $this->Application->setEvent($event->Prefix_Special, ''); + $this->Application->setEvent($event->getPrefixSpecial(), ''); $save_event = $this->UseTempTables($event) && $this->Application->GetTopmostPrefix($event->Prefix) == $event->Prefix ? 'OnSave' : 'OnUpdate'; - $this->Application->SetVar($event->Prefix_Special.'_SaveEvent',$save_event); + $this->Application->SetVar($event->getPrefixSpecial().'_SaveEvent',$save_event); } /** @@ -482,9 +453,10 @@ return ; } - if ($this->Application->isDebugMode()) { + if ( $this->Application->isDebugMode() ) { $this->Application->Debugger->appendTrace(); } + trigger_error('ItemLoad Permission Failed for prefix [' . $event->getPrefixSpecial() . '] in checkItemStatus, leading to "404 Not Found"', E_USER_NOTICE); header('HTTP/1.0 404 Not Found'); @@ -551,7 +523,7 @@ if (!$perm_status) { // when no permission to view item -> redirect to no pemrission template - if ($this->Application->isDebugMode()) { + if ( $this->Application->isDebugMode() ) { $this->Application->Debugger->appendTrace(); } @@ -575,9 +547,9 @@ } $actions =& $this->Application->recallObject('kActions'); - $actions->Set($event->Prefix_Special.'_GoTab', ''); + $actions->Set($event->getPrefixSpecial().'_GoTab', ''); - $actions->Set($event->Prefix_Special.'_GoId', ''); + $actions->Set($event->getPrefixSpecial().'_GoId', ''); } /** @@ -638,7 +610,7 @@ if ($object->Load($id)) { $actions =& $this->Application->recallObject('kActions'); - $actions->Set($event->Prefix_Special.'_id', $object->GetID() ); + $actions->Set($event->getPrefixSpecial().'_id', $object->GetID() ); } else { $object->setID($id); @@ -658,12 +630,12 @@ $this->dbBuild($object,$event); - if (!$object->mainList && $event->getEventParam('main_list')) { + if (!$object->isMainList() && $event->getEventParam('main_list')) { // once list is set to main, then even "requery" parameter can't remove that /*$passed = $this->Application->GetVar('passed'); $this->Application->SetVar('passed', $passed . ',' . $event->Prefix);*/ - $object->mainList = true; + $object->becameMain(); } $object->setGridName( $event->getEventParam('grid') ); @@ -672,8 +644,7 @@ $sql = $this->Application->ReplaceLanguageTags($sql); $object->setSelectSQL($sql); - $object->Counted = false; // when requery="1" should re-count records too! - $object->ClearOrderFields(); // prevents duplicate order fields, when using requery="1" + $object->reset(); $object->linkToParent( $this->getMainSpecial($event) ); @@ -682,14 +653,11 @@ $this->SetPagination($event); $this->SetSorting($event); -// $object->CalculateTotals(); // Now called in getTotals to avoid extra query - $actions =& $this->Application->recallObject('kActions'); - $actions->Set('remove_specials['.$event->Prefix_Special.']', '0'); - $actions->Set($event->Prefix_Special.'_GoTab', ''); + $actions->Set('remove_specials['.$event->getPrefixSpecial().']', '0'); + $actions->Set($event->getPrefixSpecial().'_GoTab', ''); } - /** * Get's special of main item for linking with subitem * @@ -831,7 +799,7 @@ $object->SetPerPage( $this->getPerPage($event) ); // main lists on Front-End have special get parameter for page - $page = $object->mainList ? $this->Application->GetVar('page') : false; + $page = $object->isMainList() ? $this->Application->GetVar('page') : false; if (!$page) { // page is given in "env" variable for given prefix @@ -844,7 +812,7 @@ $page = $this->Application->GetVar($event->getPrefixSpecial(true) . '_Page'); } - if (!$object->mainList) { + if (!$object->isMainList()) { // main lists doesn't use session for page storing $this->Application->StoreVarDefault($event->getPrefixSpecial() . '_Page', 1, true); // true for optional @@ -906,7 +874,7 @@ return $per_page; } - if (!$per_page && $object->mainList) { + if (!$per_page && $object->isMainList()) { // main lists on Front-End have special get parameter for per-page $per_page = $this->Application->GetVar('per_page'); } @@ -922,7 +890,7 @@ $per_page = $this->Application->GetVar($event->getPrefixSpecial(true) . '_PerPage'); } - if (!$object->mainList) { + if (!$object->isMainList()) { // per-page given in env and not in main list $view_name = $this->Application->RecallVar($event->getPrefixSpecial() . '_current_view'); @@ -969,7 +937,7 @@ $object =& $event->getObject(); /* @var $object kDBList */ - if ($object->mainList) { + if ($object->isMainList()) { $sort_by = $this->Application->GetVar('sort_by'); $cur_sort1 = $cur_sort1_dir = $cur_sort2 = $cur_sort2_dir = false; @@ -1107,9 +1075,9 @@ if ($filter_data) { $filter_data = unserialize($filter_data); foreach ($filter_data as $filter_field => $filter_params) { - $filter_type = ($filter_params['type'] == 'having') ? HAVING_FILTER : WHERE_FILTER; + $filter_type = ($filter_params['type'] == 'having') ? kDBList::HAVING_FILTER : kDBList::WHERE_FILTER; $filter_value = str_replace(EDIT_MARK, $edit_mark, $filter_params['value']); - $object->addFilter($filter_field, $filter_value, $filter_type, FLT_SEARCH); + $object->addFilter($filter_field, $filter_value, $filter_type, kDBList::FLT_SEARCH); } } @@ -1123,9 +1091,9 @@ foreach ($custom_filters[$grid_name] as $field_name => $field_options) { list ($filter_type, $field_options) = each($field_options); if (isset($field_options['value']) && $field_options['value']) { - $filter_type = ($field_options['sql_filter_type'] == 'having') ? HAVING_FILTER : WHERE_FILTER; + $filter_type = ($field_options['sql_filter_type'] == 'having') ? kDBList::HAVING_FILTER : kDBList::WHERE_FILTER; $filter_value = str_replace(EDIT_MARK, $edit_mark, $field_options['value']); - $object->addFilter($field_name, $filter_value, $filter_type, FLT_CUSTOM); + $object->addFilter($field_name, $filter_value, $filter_type, kDBList::FLT_CUSTOM); } } } @@ -1143,7 +1111,7 @@ { $group_info = $filter_menu['Groups'][$group_key]; - $temp_filter->setType( constant('FLT_TYPE_'.$group_info['mode']) ); + $temp_filter->setType( constant('kDBList::FLT_TYPE_'.$group_info['mode']) ); $temp_filter->clearFilters(); foreach ($group_info['filters'] as $flt_id) { @@ -1153,7 +1121,7 @@ $temp_filter->addFilter('view_filter_'.$flt_id, $filter_menu['Filters'][$flt_id][$sql_key]); } } - $object->addFilter('view_group_'.$group_key, $temp_filter, $group_info['type'] , FLT_VIEW); + $object->addFilter('view_group_'.$group_key, $temp_filter, $group_info['type'] , kDBList::FLT_VIEW); $group_key++; } } @@ -1365,13 +1333,13 @@ //look at kDBItem' Create for ForceCreateId description, it's rarely used and is NOT set by default if ( $object->Create($event->getEventParam('ForceCreateId')) ) { $this->customProcessing($event,'after'); - $event->status=erSUCCESS; - $event->redirect_params = Array('opener'=>'u'); + $event->status=kEvent::erSUCCESS; + $event->setRedirectParams(Array('opener'=>'u'), true); } else { - $event->status = erFAIL; + $event->status = kEvent::erFAIL; $event->redirect = false; - $this->Application->SetVar($event->Prefix_Special.'_SaveEvent','OnCreate'); + $this->Application->SetVar($event->getPrefixSpecial().'_SaveEvent','OnCreate'); $object->setID($id); } } @@ -1385,7 +1353,7 @@ function OnUpdate(&$event) { if ($this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1)) { - $event->status = erFAIL; + $event->status = kEvent::erFAIL; return; } @@ -1400,10 +1368,10 @@ if ( $object->Update($id) ) { $this->customProcessing($event, 'after'); - $event->status = erSUCCESS; + $event->status = kEvent::erSUCCESS; } else { - $event->status = erFAIL; + $event->status = kEvent::erFAIL; $event->redirect = false; break; } @@ -1422,7 +1390,7 @@ function OnDelete(&$event) { if ($this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1)) { - $event->status = erFAIL; + $event->status = kEvent::erFAIL; return; } @@ -1463,7 +1431,7 @@ /* @var $object kDBItem */ $object->Clear(0); - $this->Application->SetVar($event->Prefix_Special.'_SaveEvent', 'OnCreate'); + $this->Application->SetVar($event->getPrefixSpecial().'_SaveEvent', 'OnCreate'); if ($event->getEventParam('top_prefix') != $event->Prefix) { // this is subitem prefix, so use main item special @@ -1505,7 +1473,7 @@ } } - $event->redirect_params = Array('opener'=>'u'); + $event->setRedirectParams(Array('opener'=>'u'), true); } @@ -1519,11 +1487,11 @@ function OnMassDelete(&$event) { if ($this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1)) { - $event->status = erFAIL; + $event->status = kEvent::erFAIL; return; } - $event->status=erSUCCESS; + $event->status=kEvent::erSUCCESS; $temp =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler'); @@ -1596,7 +1564,7 @@ function OnSave(&$event) { $event->CallSubEvent('OnPreSave'); - if ($event->status == erSUCCESS) { + if ($event->status == kEvent::erSUCCESS) { $skip_master = false; $temp =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler'); @@ -1606,7 +1574,7 @@ $live_ids = $temp->SaveEdit($event->getEventParam('master_ids') ? $event->getEventParam('master_ids') : Array()); if ($live_ids === false) { // coping from table failed, because we have another coping process to same table, that wasn't finished - $event->status = erFAIL; + $event->status = kEvent::erFAIL; return ; } @@ -1632,12 +1600,12 @@ $this->SaveLoggedChanges($changes_var_name, $object->ShouldLogChanges()); } else { - $event->status = erFAIL; + $event->status = kEvent::erFAIL; } $this->clearSelectedIDs($event); - $event->redirect_params = Array('opener' => 'u'); + $event->setRedirectParams(Array('opener' => 'u'), true); $this->Application->RemoveVar($event->getPrefixSpecial().'_modified'); // all temp tables are deleted here => all after hooks should think, that it's live mode now @@ -1747,7 +1715,7 @@ $temp->CancelEdit(); $this->clearSelectedIDs($event); - $event->redirect_params = Array('opener'=>'u'); + $event->setRedirectParams(Array('opener'=>'u'), true); $this->Application->RemoveVar($event->getPrefixSpecial().'_modified'); $changes_var_name = $this->Prefix . '_changes_' . $this->Application->GetTopmostWid($this->Prefix); @@ -1793,21 +1761,21 @@ } $object =& $event->getObject( Array('skip_autoload' => true) ); + /* @var $object kDBItem */ $items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) ); if ($items_info) { foreach ($items_info as $id => $field_values) { - $object->SetDefaultValues(); $object->Load($id); $object->SetFieldsFromHash($field_values); $this->customProcessing($event, 'before'); if( $object->Update($id) ) { $this->customProcessing($event, 'after'); - $event->status=erSUCCESS; + $event->status=kEvent::erSUCCESS; } else { - $event->status = erFAIL; + $event->status = kEvent::erFAIL; $event->redirect = false; break; } @@ -1825,7 +1793,7 @@ $not_created = $this->isNewItemCreate($event); $event->CallSubEvent($not_created ? 'OnCreate' : 'OnUpdate'); - if ($event->status == erSUCCESS) { + if ($event->status == kEvent::erSUCCESS) { $object =& $event->getObject(); /* @var $object kDBItem */ @@ -1849,7 +1817,7 @@ { $event->CallSubEvent('OnPreSave'); - if ($event->status == erSUCCESS) { + if ($event->status == kEvent::erSUCCESS) { $id = $this->Application->GetVar($event->getPrefixSpecial(true) . '_GoId'); $event->SetRedirectParam($event->getPrefixSpecial() . '_id', $id); } @@ -1864,7 +1832,7 @@ function OnPreSaveAndGoToTab(&$event) { $event->CallSubEvent('OnPreSave'); - if ($event->status==erSUCCESS) { + if ($event->status==kEvent::erSUCCESS) { $event->redirect=$this->Application->GetVar($event->getPrefixSpecial(true).'_GoTab'); } } @@ -1879,7 +1847,7 @@ { $event->setPseudoClass('_List'); $event->CallSubEvent('OnUpdate'); - if ($event->status==erSUCCESS) { + if ($event->status==kEvent::erSUCCESS) { $event->redirect=$this->Application->GetVar($event->getPrefixSpecial(true).'_GoTab'); } } @@ -1931,12 +1899,12 @@ if( $object->Create() ) { $this->customProcessing($event, 'after'); - $event->redirect_params[$event->getPrefixSpecial(true).'_id'] = $object->GetId(); - $event->status=erSUCCESS; + $event->SetRedirectParam($event->getPrefixSpecial(true).'_id', $object->GetId()); + $event->status=kEvent::erSUCCESS; } else { - $event->status=erFAIL; + $event->status=kEvent::erFAIL; $event->redirect=false; $object->setID(0); } @@ -1963,7 +1931,7 @@ function iterateItems(&$event) { if ($this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1)) { - $event->status = erFAIL; + $event->status = kEvent::erFAIL; return; } @@ -2000,10 +1968,10 @@ } if ($object->Update()) { - $event->status = erSUCCESS; + $event->status = kEvent::erSUCCESS; } else { - $event->status = erFAIL; + $event->status = kEvent::erFAIL; $event->redirect = false; break; } @@ -2021,11 +1989,11 @@ function OnMassClone(&$event) { if ($this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1)) { - $event->status = erFAIL; + $event->status = kEvent::erFAIL; return; } - $event->status = erSUCCESS; + $event->status = kEvent::erSUCCESS; $temp =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler'); @@ -2371,7 +2339,7 @@ $this->RemoveRequiredFields($object); $event->CallSubEvent('OnPreSave'); - if ($event->status == erSUCCESS) { + if ($event->status == kEvent::erSUCCESS) { $resource_id = $this->Application->GetVar('translator_resource_id'); if ($resource_id) { @@ -2387,15 +2355,15 @@ } $event->redirect = $this->Application->GetVar('translator_t'); - $event->redirect_params = Array ( + $event->setRedirectParams(Array ( 'pass' => 'all,trans,' . $this->Application->GetVar('translator_prefixes'), 'opener' => 's', $event->getPrefixSpecial(true) . '_id' => $object->GetID(), 'trans_event' => 'OnLoad', 'trans_prefix' => $this->Application->GetVar('translator_prefixes'), 'trans_field' => $this->Application->GetVar('translator_field'), 'trans_multi_line' => $this->Application->GetVar('translator_multi_line'), - ); + ), true); // 1. SAVE LAST TEMPLATE TO SESSION (really needed here, because of tweaky redirect) $last_template = $this->Application->RecallVar('last_template'); @@ -2404,14 +2372,19 @@ } } + /** + * Makes all fields non-required + * + * @param kDBItem $object + */ function RemoveRequiredFields(&$object) { // making all field non-required to achieve successful presave - foreach($object->Fields as $field => $options) - { - if(isset($options['required'])) - { - unset($object->Fields[$field]['required']); + $fields = $object->getFields(); + + foreach ($fields as $field => $options) { + if ( $object->isRequired($field) ) { + $object->setRequired($field, false); } } } @@ -2594,7 +2567,7 @@ $event->CallSubEvent('OnPreSave'); } - if ($event->status == erSUCCESS) { + if ($event->status == kEvent::erSUCCESS) { $this->Application->SetVar('m_lang', $this->Application->GetVar('language')); $data = $this->Application->GetVar('st_id'); @@ -2612,7 +2585,7 @@ */ function OnUploadFile(&$event) { - $event->status = erSTOP; + $event->status = kEvent::erSTOP; // define('DBG_SKIP_REPORTING', 0); $default_msg = "Flash requires that we output something or it won't fire the uploadSuccess event"; @@ -2740,7 +2713,7 @@ */ function OnDeleteFile(&$event) { - $event->status = erSTOP; + $event->status = kEvent::erSTOP; if (strpos($this->Application->GetVar('file'), '../') !== false) { return ; @@ -2763,6 +2736,8 @@ */ function OnViewFile(&$event) { + $event->status = kEvent::erSTOP; + $file = $this->Application->GetVar('file'); if ((strpos($file, '../') !== false) || (trim($file) !== $file)) { // when relative paths or special chars are found template names from url, then it's hacking attempt @@ -2810,10 +2785,7 @@ header('Content-Type: ' . $type); header('Content-Disposition: inline; filename="' . $file . '"'); - safeDefine('DBG_SKIP_REPORTING', 1); - readfile($path); - exit; } /** @@ -2842,14 +2814,14 @@ return ; } - $event->status = erSTOP; + $event->status = kEvent::erSTOP; $field = $this->Application->GetVar('field'); $cur_value = $this->Application->GetVar('cur_value'); $object =& $event->getObject(); - if (!$field || !$cur_value || !array_key_exists($field, $object->Fields)) { + if (!$field || !$cur_value || !$object->isField($field)) { return ; } @@ -2883,7 +2855,7 @@ */ function OnSaveWidths(&$event) { - $event->status = erSTOP; + $event->status = kEvent::erSTOP; $lang =& $this->Application->recallObject('lang.current'); // header('Content-type: text/xml; charset='.$lang->GetDBField('Charset')); @@ -2900,7 +2872,7 @@ /** * Called from CSV import script after item fields * are set and validated, but before actual item create/update. - * If event status is erSUCCESS, line will be imported, + * If event status is kEvent::erSUCCESS, line will be imported, * else it will not be imported but added to skipped lines * and displayed in the end of import. * Event status is preset from import script.