Index: branches/5.2.x/core/kernel/db/db_event_handler.php =================================================================== diff -u -N -r14870 -r14892 --- branches/5.2.x/core/kernel/db/db_event_handler.php (.../db_event_handler.php) (revision 14870) +++ branches/5.2.x/core/kernel/db/db_event_handler.php (.../db_event_handler.php) (revision 14892) @@ -1,6 +1,6 @@ getNavigationResource($object, $event->getEventParam('list'), $event->Special == 'next', $select_clause); } + elseif ( $event->Special == 'filter' ) { + // temporary object, used to print filter options only + return 0; + } if (preg_match('/^auto-(.*)/', $event->Special, $regs) && $this->Application->prefixRegistred($regs[1])) { // - returns field DateFormat value from language (LanguageId is extracted from current phrase object) @@ -1178,6 +1182,7 @@ } } + // add view filter $view_filter = $this->Application->RecallVar($event->getPrefixSpecial() . '_view_filter'); if ( $view_filter ) { @@ -1209,9 +1214,75 @@ $group_key++; } } + + // add item filter + if ( $object->isMainList() ) { + $this->applyItemFilters($event); + } } /** + * Applies item filters + * + * @param kEvent $event + * @return void + * @access protected + */ + protected function applyItemFilters(&$event) + { + $filter_values = $this->Application->GetVar('filters', Array ()); + + if ( !$filter_values ) { + return; + } + + $object =& $event->getObject(); + /* @var $object kDBList */ + + $where_clause = Array ( + 'ItemPrefix = ' . $this->Conn->qstr($object->Prefix), + 'FilterField IN (' . implode(',', $this->Conn->qstrArray(array_keys($filter_values))) . ')', + 'Enabled = 1', + ); + + $sql = 'SELECT * + FROM ' . $this->Application->getUnitOption('item-filter', 'TableName') . ' + WHERE (' . implode(') AND (', $where_clause) . ')'; + $filters = $this->Conn->Query($sql, 'FilterField'); + + foreach ($filters as $filter_field => $filter_data) { + $filter_value = $filter_values[$filter_field]; + + if ( "$filter_value" === '' ) { + // ListManager don't pass empty values, but check here just in case + continue; + } + + $table_name = $object->isVirtualField($filter_field) ? '' : '%1$s.'; + + switch ($filter_data['FilterType']) { + case 'radio': + $filter_value = $table_name . '`' . $filter_field . '` = ' . $this->Conn->qstr($filter_value); + break; + + case 'checkbox': + $filter_value = explode('|', substr($filter_value, 1, -1)); + $filter_value = $this->Conn->qstrArray($filter_value, 'escape'); + + if ( $object->GetFieldOption($filter_field, 'multiple') ) { + $filter_value = $table_name . '`' . $filter_field . '` LIKE "%|' . implode('|%" OR ' . $table_name . '`' . $filter_field . '` LIKE "%|', $filter_value) . '|%"'; + } + else { + $filter_value = $table_name . '`' . $filter_field . '` IN (' . implode(',', $filter_value) . ')'; + } + break; + } + + $object->addFilter('item_filter_' . $filter_field, $filter_value); + } + } + + /** * Set's new sorting for list * * @param kEvent $event