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)); /* @var $object kDBItem */ $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 products $config = $this->Application->getUnitConfig($prefix); $sql = 'SELECT ResourceId FROM ' . $config->getTableName() . ' WHERE ' . $config->getIDField() . ' 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(); /* @var $main_object kDBItem */ $sql = 'DELETE FROM ' . $event->getUnitConfig()->getTableName() . ' WHERE ItemResourceId = ' . $main_object->GetDBField('ResourceId'); $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); $language_id = $this->Application->GetVar('m_lang'); $primary_language_id = $this->Application->GetDefaultLanguageId(); $event->getUnitConfig()->addCalculatedFieldsBySpecial('', Array ( 'ItemName' => 'COALESCE(p.l' . $language_id . '_Name, p.l' . $primary_language_id . '_Name)' )); } }