Index: trunk/core/units/general/cat_event_handler.php =================================================================== diff -u -N -r8104 -r8363 --- trunk/core/units/general/cat_event_handler.php (.../cat_event_handler.php) (revision 8104) +++ trunk/core/units/general/cat_event_handler.php (.../cat_event_handler.php) (revision 8363) @@ -18,9 +18,9 @@ 'OnSaveSettings' => Array('self' => 'add|edit|advanced:import'), 'OnBeforeDeleteOriginal' => Array('self' => 'edit|advanced:approve'), - 'OnCancelAction' => Array( 'self' => true), - + 'OnCancelAction' => Array('self' => true), ); + $this->permMapping = array_merge($this->permMapping, $permissions); } @@ -1503,10 +1503,11 @@ { parent::OnNew($event); - if ($event->Special != 'import' && $event->Special != 'export') return ; - $export_helper =& $this->Application->recallObject('CatItemExportHelper'); - $export_helper->setRequiredFields($event); - $this->Application->StoreVar('ImportCategory', 0); + if ($event->Special == 'import' || $event->Special == 'export') { + $export_helper =& $this->Application->recallObject('CatItemExportHelper'); + $export_helper->setRequiredFields($event); + $this->Application->StoreVar('ImportCategory', 0); + } } /** @@ -1705,6 +1706,55 @@ } /** + * Set status for new category item based on user permission in category + * + * @param kEvent $event + */ + function OnBeforeItemCreate(&$event) + { + if ($this->Application->IsAdmin()) { + return true; + } + + $use_pending_editing = $this->Application->getUnitOption($event->Prefix, 'UsePendingEditing'); + if ($use_pending_editing) { + $object =& $event->getObject(); + /* @var $object kDBItem */ + + $perm_helper =& $this->Application->recallObject('PermissionsHelper'); + /* @var $perm_helper kPermissionsHelper */ + + $primary_category = $object->GetDBField('CategoryId') > 0 ? $object->GetDBField('CategoryId') : $this->Application->GetVar('m_cat_id'); + $item_status = $perm_helper->AddCheckPermission($primary_category, $event->Prefix); + if ($item_status == STATUS_DISABLED) { + $event->status = erFAIL; + return false; + } + else { + $object->SetDBField('Status', $item_status); + } + } + } + + /** + * Creates category item & redirects to confirmation template (front-end only) + * + * @param kEvent $event + */ + function OnCreate(&$event) + { + parent::OnCreate($event); + + if (!$this->Application->IsAdmin()) { + $event->SetRedirectParam('opener', 's'); + + $object =& $event->getObject(); + $next_template = $object->GetDBField('Status') == STATUS_ACTIVE ? 'suggest_confirm_template' : 'suggest_pending_confirm_template'; + $event->redirect = $this->Application->GetVar($next_template); + } + } + + /** * Apply same processing to each item beeing selected in grid * * @param kEvent $event Index: trunk/core/units/general/cat_dbitem.php =================================================================== diff -u -N -r7635 -r8363 --- trunk/core/units/general/cat_dbitem.php (.../cat_dbitem.php) (revision 7635) +++ trunk/core/units/general/cat_dbitem.php (.../cat_dbitem.php) (revision 8363) @@ -23,9 +23,9 @@ */ var $usePendingEditing = false; - function Clear() + function Clear($new_id = null) { - parent::Clear(); + parent::Clear($new_id); $this->CategoryPath = Array(); } Index: trunk/core/units/users/users_tag_processor.php =================================================================== diff -u -N -r8078 -r8363 --- trunk/core/units/users/users_tag_processor.php (.../users_tag_processor.php) (revision 8078) +++ trunk/core/units/users/users_tag_processor.php (.../users_tag_processor.php) (revision 8363) @@ -192,6 +192,20 @@ return $username === false ? '' : $username; } + /** + * Checks if user have one of required permissions + * + * @param Array $params + * @return bool + */ + function HasPermission($params) + { + $perm_helper =& $this->Application->recallObject('PermissionsHelper'); + /* @var $perm_helper kPermissionsHelper */ + + return $perm_helper->TagPermissionCheck($params, 'm_RequireLogin'); + } + } Index: trunk/core/units/general/helpers/permissions_helper.php =================================================================== diff -u -N -r8360 -r8363 --- trunk/core/units/general/helpers/permissions_helper.php (.../permissions_helper.php) (revision 8360) +++ trunk/core/units/general/helpers/permissions_helper.php (.../permissions_helper.php) (revision 8363) @@ -147,7 +147,7 @@ if (!$id) { // item being created -> check by current (before editing started, saved in OnPreCreate event) category permissions - $category_id = $this->Application->RecallVar('m_cat_id'); + $category_id = $this->Application->IsAdmin() ? $this->Application->RecallVar('m_cat_id') : $this->Application->GetVar('m_cat_id'); } elseif ($top_prefix == 'c') { $category_id = $id; @@ -167,14 +167,19 @@ if (substr($event->Name, 0, 9) == 'OnPreSave' || $event->Name == 'OnCreate' || $event->Name == 'OnUpdate') { if ($event_handler->isNewItemCreate($event)) { - return $this->CheckPermission($item_prefix.'.ADD', 0, $category_id) || - $this->CheckPermission($item_prefix.'.ADD.PENDING', 0, $category_id); + $check_status = $this->CheckPermission($item_prefix.'.ADD', 0, $category_id) || + $this->CheckPermission($item_prefix.'.ADD.PENDING', 0, $category_id); } else { - return $this->CheckPermission($item_prefix.'.ADD', 0, $category_id) || - $this->CheckPermission($item_prefix.'.ADD.PENDING', 0, $category_id) || - $this->ModifyCheckPermission($owner_id, $category_id, $top_prefix); + $check_status = $this->CheckPermission($item_prefix.'.ADD', 0, $category_id) || + $this->CheckPermission($item_prefix.'.ADD.PENDING', 0, $category_id) || + $this->ModifyCheckPermission($owner_id, $category_id, $top_prefix); } + + if (!$check_status) { + $event->status = erPERM_FAIL; + } + return $check_status; } $perm_status = false;