Array ('subitem' => 'add|edit'), ); $this->permMapping = array_merge($this->permMapping, $permissions); } /** * Adds products from selected categories and their sub-categories and directly selected products to discount items with duplicate checking * * @param kEvent $event */ function OnProcessSelected($event) { $object =& $event->getObject( Array('skip_autoload' => true) ); $selected_ids = $this->Application->GetVar('selected_ids'); if ($selected_ids['c'] == $this->Application->GetVar('m_cat_id')) { // no categories were selected, so selector returned current in catalog. This is not needed here $selected_ids['c'] = ''; } $table_data = $object->getLinkedInfo(); // in selectors we could select category & item together $prefixes = Array('c', 'p'); foreach ($prefixes as $prefix) { $item_ids = $selected_ids[$prefix] ? explode(',', $selected_ids[$prefix]) : Array(); if (!$item_ids) continue; if ($prefix == 'c') { // select all products from selected categories and their subcategories $sql = 'SELECT DISTINCT p.ResourceId FROM '.TABLE_PREFIX.'Categories c LEFT JOIN '.TABLE_PREFIX.'CategoryItems ci ON c.CategoryId = ci.CategoryId LEFT JOIN '.TABLE_PREFIX.'Products p ON p.ResourceId = ci.ItemResourceId WHERE (p.ProductId IS NOT NULL) AND (c.ParentPath LIKE "%|'.implode('|%" OR c.ParentPath LIKE "%|', $item_ids).'|%")'; $resource_ids = $this->Conn->GetCol($sql); } else { // select selected prodcts $sql = 'SELECT ResourceId FROM '.$this->Application->getUnitOption($prefix, 'TableName').' WHERE '.$this->Application->getUnitOption($prefix, 'IDField').' IN ('.implode(',', $item_ids).')'; $resource_ids = $this->Conn->GetCol($sql); } if (!$resource_ids) continue; $sql = 'SELECT ItemResourceId FROM '.$object->TableName.' WHERE ('.$table_data['ForeignKey'].' = '.$table_data['ParentId'].') AND (ItemResourceId IN ('.implode(',', $resource_ids).'))'; // 1. don't insert items, that are already in $skip_resource_ids = $this->Conn->GetCol($sql); $resource_ids = array_diff($resource_ids, $skip_resource_ids); // process only not already in db resourceids for current discount // 2. insert ids, that left foreach ($resource_ids as $resource_id) { $object->SetDBField($table_data['ForeignKey'], $table_data['ParentId']); $object->SetDBField('ItemResourceId', $resource_id); $object->SetDBField('ItemType', 1); $object->Create(); } } $this->finalizePopup($event); } /** * Allows to set discount on entire order * * @param kEvent $event * @todo get parent item id through $object->getLinkedInfo()['ParentId'] * @access public */ function OnEntireOrder($event) { $object =& $event->GetObject(); $sql = 'DELETE FROM '.$object->TableName.' WHERE DiscountId='.$this->Application->GetVar('d_id'); $this->Conn->Query($sql); $object->SetDBField('DiscountId', $this->Application->GetVar('d_id')); $object->SetDBField('ItemResourceId', -1); $object->SetDBField('ItemType', 0); if ( $object->Create() ) { $this->customProcessing($event,'after'); $event->status = kEvent::erSUCCESS; $event->SetRedirectParam('opener', 's'); } else { $event->status = kEvent::erFAIL; $this->Application->SetVar($event->getPrefixSpecial().'_SaveEvent','OnCreate'); $object->setID(0); } } /** * Deletes discount items where hooked item (product) is used * * @param kEvent $event */ function OnDeleteDiscountedItem($event) { $main_object =& $event->MasterEvent->getObject(); $resource_id = $main_object->GetDBField('ResourceId'); $table = $this->Application->getUnitOption($event->Prefix,'TableName'); $sql = 'DELETE FROM '.$table.' WHERE ItemResourceId = '.$resource_id; $this->Conn->Query($sql); } /** * Makes ItemName calculated field from primary language * * @param kEvent $event * @return void * @access protected */ protected function OnAfterConfigRead(kEvent $event) { parent::OnAfterConfigRead($event); $calculated_fields = $this->Application->getUnitOption($event->Prefix, 'CalculatedFields'); $language_id = $this->Application->GetVar('m_lang'); $primary_language_id = $this->Application->GetDefaultLanguageId(); $calculated_fields['']['ItemName'] = 'COALESCE(p.l' . $language_id . '_Name, p.l' . $primary_language_id . '_Name)'; $this->Application->setUnitOption($event->Prefix, 'CalculatedFields', $calculated_fields); } }