Index: kernel/db/cat_dbitem.php =================================================================== --- kernel/db/cat_dbitem.php (revision 13936) +++ kernel/db/cat_dbitem.php (working copy) @@ -59,25 +59,6 @@ function Create($force_id = false, $system_create = false) { // TODO: move to OnBeforeItemCreate method - if ($this->Validate()) { - // TODO: such approach will not respect changes from OnBeforeItemCreate event - $this->SetDBField('ResourceId', $this->Application->NextResourceId()); - } - - $this->SetDBField('Modified_date', adodb_mktime() ); - $this->SetDBField('Modified_time', adodb_mktime() ); - - $is_admin = $this->Application->isAdminUser; - $owner_field = $this->Application->getUnitOption($this->Prefix, 'OwnerField'); - - if (!$owner_field) { - $owner_field = 'CreatedById'; - } - - if ((!$this->IsTempTable() && !$is_admin) || ($is_admin && !$this->GetDBField($owner_field))) { - $this->SetDBField($owner_field, $this->Application->RecallVar('user_id')); - } - if ($this->useFilenames) { $this->checkFilename(); $this->generateFilename(); Index: kernel/db/cat_event_handler.php =================================================================== --- kernel/db/cat_event_handler.php (revision 13987) +++ kernel/db/cat_event_handler.php (working copy) @@ -2197,29 +2197,54 @@ */ function OnBeforeItemCreate(&$event) { - if ($this->Application->isAdminUser) { - // don't set permission-based status, when creating categories in admin - return true; + $object =& $event->getObject(); + /* @var $object kDBItem */ + + $is_admin = $this->Application->isAdminUser; + $owner_field = $this->getOwnerField($event->Prefix); + + if ((!$object->IsTempTable() && !$is_admin) || ($is_admin && !$object->GetDBField($owner_field))) { + // Front-end OR owner not specified -> set to currently logged-in user + $object->SetDBField($owner_field, $this->Application->RecallVar('user_id')); } + if ( $object->Validate() ) { + $object->SetDBField('ResourceId', $this->Application->NextResourceId()); + } + + if (!$this->Application->isAdmin) { + $this->setItemStatusByPermission($event); + } + } + + /** + * Sets category item status based on user permissions (only on Front-end) + * + * @param kEvent $event + */ + function setItemStatusByPermission(&$event) + { $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 */ + if (!$use_pending_editing) { + return ; + } - $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); - } + $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; } + else { + $object->SetDBField('Status', $item_status); + } } /**