'OnChangePriority', 'OnMassMoveDown' => 'OnChangePriority', ); $this->eventMethods = array_merge($this->eventMethods, $events_map); } /** * Allows to override standard permission mapping * */ function mapPermissions() { parent::mapPermissions(); $permissions = Array ( 'OnItemBuild' => Array ('self' => true), 'OnSetSticky' => Array ('self' => 'view'), 'OnRegisterView' => Array ('self' => true), 'OnFollowLink' => Array ('self' => true), 'OnResetCounters' => Array ('self' => 'add|edit'), ); $this->permMapping = array_merge($this->permMapping, $permissions); } /** * Processes OnMassMoveUp, OnMassMoveDown events * * @param kEvent $event */ function OnChangePriority(&$event) { $this->Application->SetVar('priority_prefix', $event->getPrefixSpecial()); $event->CallSubEvent('priority:' . $event->Name); } /** * Apply any custom changes to list's sql query * * @param kEvent $event * @return void * @access protected * @see kDBEventHandler::OnListBuild() */ protected function SetCustomQuery(&$event) { parent::SetCustomQuery($event); if ( $this->Application->isAdminUser ) { return; } $object =& $event->getObject(); /* @var $object kDBList */ if ( $event->Special == 'home' ) { $object->addFilter('status_filter', '%1$s.Status = ' . STATUS_ACTIVE); $object->addFilter('scheduled_from_filter', '%1$s.ScheduleFromDate IS NULL OR %1$s.ScheduleFromDate <= ' . TIMENOW); $object->addFilter('scheduled_to_filter', '%1$s.ScheduleToDate IS NULL OR %1$s.ScheduleToDate >= ' . TIMENOW); } } /** * Set's block as sticky * * @param kEvent $event * @return void * @access protected */ protected function OnSetSticky(kEvent &$event) { $object =& $event->getObject( Array('skip_autoload' => true) ); /* @var $object kDBItem */ $ids = $this->StoreSelectedIDs($event); if ( $ids ) { $id = array_shift($ids); $sql = 'UPDATE ' . $object->TableName . ' SET Sticky = 0'; $this->Conn->Query($sql); $sql = 'UPDATE ' . $object->TableName . ' SET Sticky = 1, Status = ' . STATUS_ACTIVE . ' WHERE BlockId = ' . $id; $this->Conn->Query($sql); } $this->clearSelectedIDs($event); } /** * Set Required fields * * @param kEvent $event * @return void * @access protected */ protected function OnBeforeItemCreate(&$event) { parent::OnBeforeItemCreate($event); $this->_itemChanged($event); } /** * Set Required fields * * @param kEvent $event * @return void * @access protected */ protected function OnBeforeItemUpdate(&$event) { parent::OnBeforeItemUpdate($event); $this->_itemChanged($event); } /** * Schedule dates * * @param kEvent $event * @return void * @access protected */ protected function _itemChanged(kEvent &$event) { $object =& $event->getObject(); /* @var $object kDBItem */ $date_from = $object->GetDBField('ScheduleFromDate_date'); $date_to = $object->GetDBField('ScheduleToDate_date'); if ( $date_from && $date_to && $date_from >= $date_to ) { $object->SetError('ScheduleFromDate_date', 'wrong_date_interval'); } $object->setRequired('CategoryId', $object->GetDBField('LinkType') == PromoBlockType::INTERNAL); $object->setRequired('ExternalLink', $object->GetDBField('LinkType') == PromoBlockType::EXTERNAL); } /** * Registers view of the promo block * * @param kEvent $event * @return void * @access protected */ protected function OnRegisterView(kEvent &$event) { $this->_incrementField($event, 'NumberOfViews'); } /** * Registers click on the promo block * * @param kEvent $event * @return void * @access protected */ protected function OnFollowLink(kEvent &$event) { $object =& $event->getObject(); /* @var $object kDBItem */ $this->_incrementField($event, 'NumberOfClicks', false); if ( $object->GetDBField('LinkType') == 1 ) { // Internal $sql = 'SELECT NamedParentPath FROM ' . TABLE_PREFIX . 'Category WHERE CategoryId = ' . $object->GetDBField('CategoryId'); $event->redirect = $this->Conn->GetOne($sql); $event->SetRedirectParam('pass', 'm'); } else { $ext_url = $object->GetDBField('ExternalLink'); $event->redirect = 'external:' . (preg_match('/^(http|ftp):\\/\\/.*/', $ext_url) ? $ext_url : $this->Application->BaseURL() . $ext_url); } } /** * Increment given promo block counters * * @param kEvent $event * @param string $field * @param bool $is_ajax * @return void * @access protected */ protected function _incrementField(kEvent &$event, $field, $is_ajax = true) { if ( $is_ajax ) { $event->status = kEvent::erSTOP; if ( $this->Application->GetVar('ajax') != 'yes' ) { return ; } } $object =& $event->getObject(); /* @var $object kDBItem */ if ( !$object->isLoaded() ) { echo 'FAILED'; return ; } // don't use kDBItem::Update to support concurrent view updates from different visitors $sql = 'UPDATE ' . $object->TableName . ' SET ' . $field . ' = ' . $field . ' + 1 WHERE ' . $object->IDField . ' = ' . $object->GetID(); $this->Conn->Query($sql); echo 'OK'; } /** * Resets promo block counters * * @param kEvent $event * @return void * @access protected */ protected function OnResetCounters(kEvent &$event) { $object =& $event->getObject( Array ('skip_autoload' => true) ); /* @var $object kDBItem */ $ids = $this->StoreSelectedIDs($event); foreach ($ids as $id) { $object->Load($id); $object->SetDBField('NumberOfViews', 0); $object->SetDBField('NumberOfClicks', 0); $object->Update(); } $this->clearSelectedIDs($event); } /** * Occurs, when config was parsed, allows to change config data dynamically * * @param kEvent $event * @return void * @access protected */ protected function OnAfterConfigRead(kEvent &$event) { parent::OnAfterConfigRead($event); $category_helper =& $this->Application->recallObject('CategoryHelper'); /* @var $category_helper CategoryHelper */ $fields = $this->Application->getUnitOption($event->Prefix, 'Fields'); $fields['CategoryId']['options'] = $category_helper->getStructureTreeAsOptions(); // images multilang fields $a_image = Array( 'type' => 'string', 'max_len' => 255, 'formatter' => 'kUploadFormatter', 'upload_dir' => IMAGES_PATH, 'multiple' => 1, 'thumb_format' => 'resize:100x100', 'file_types' => '*.jpg;*.gif;*.png', 'files_description' => '!la_Image_Files!', 'required' => 1, 'not_null' => 1, 'default' => '', ); // get active languages $sql = 'SELECT LanguageId FROM ' . TABLE_PREFIX . 'Language'; $languages = $this->Conn->GetCol($sql); foreach ($languages AS $lang_id) { $fields['l' . $lang_id . '_Image'] = $a_image; } $this->Application->setUnitOption($event->Prefix, 'Fields', $fields); } }