Вход Регистрация
Файл: system/controllers/content/hooks/subscription_match_list.php
Строк: 82
<?php

class onContentSubscriptionMatchList extends cmsAction {

    public function 
run($subscription$items){

        
// результирующий список
        
$match_list = array();

        
// тип контента
        
$ctype $this->model->getContentTypeByName($subscription['subject']);
        if(!
$ctype){
            return 
$match_list;
        }

        
// формируем id записей
        
$item_ids = array();
        foreach (
$items as $item) {
            
$item_ids[] = $item['id'];
        }

        
// категория
        
$category = array();

        
// фильтр по связи
        
$relation_filter '';

        
// фильтрация по набору параметров
        // тут может быть и фильтр наборов
        // и кастомный фильтр
        
$params = array();

        
// Получаем поля для данного типа контента
        
$fields $this->model->getContentFields($ctype['name']);

        
// фильтры по ячейкам таблицы
        
if(!empty($subscription['params']['filters'])){

            foreach (
$subscription['params']['filters'] as $key => $filters) {

                
// отдельные фильтры по некторым полям
                // связи
                
if($filters['field'] == 'relation'){

                    
$_item $this->model->getContentItem($filters['value']['parent_ctype_id'], $filters['value']['parent_item_id']);

                    if(
$_item){

                        
$parent_ctype $this->model->getContentType($filters['value']['parent_ctype_id']);

                        if(
$parent_ctype){

                            
$relation_filter "r.parent_ctype_id = {$parent_ctype['id']} AND ".
                                        
"r.parent_item_id = {$_item['id']} AND ".
                                        
"r.child_ctype_id = {$ctype['id']} AND ".
                                        
"r.child_item_id = i.id";

                        }

                    }

                    continue;

                }
                
// категория
                
if($filters['field'] == 'category_id'){

                    
$category $this->model->getCategory($ctype['name'], $filters['value']);

                    continue;

                }

                
// проверяем наличие ячеек и заполняем фильтрацию
                
if($this->model->db->isFieldExists($this->model->table_prefix $ctype['name'], $filters['field'])){
                    
$params[] = $filters;
                }

            }

        }

        
// Получаем свойства
        
$props $props_fields false;
        if (!empty(
$category['id']) && $category['id'] > 1){
            
$props $this->model->getContentProps($ctype['name'], $category['id']);
            if(
$props){
                
$props_fields $this->getPropsFields($props);
            }
        }

        
/**
         * Начинаем собирать запрос SQL
         */
        
$this->model->limit(false);

        
// нам нужны только записи, id которых передали
        
$this->model->filterIn('id'$item_ids);

        
// категория
        
if (!empty($category['id']) && $category['id'] > 1){

            
// рекурсивность
            
$is_recursive true;
            if(
array_key_exists('subscriptions_recursive_categories'$ctype['options'])){
                if(!
$ctype['options']['subscriptions_recursive_categories']){
                    
$is_recursive false;
                }
            }

            
$this->model->filterCategory($ctype['name'], $category$is_recursive);

        }

        
// фильтр по связям
        
if($relation_filter){
            
$this->model->joinInner('content_relations_bind''r'$relation_filter);
        }

        
// фильтр по набору фильтров
        
if($params){
            
$this->model->applyDatasetFilters(array(
                
'filters' => $params
            
), true);
        }

        
// фильтрация по полям и свойствам
        
if(!empty($subscription['params']['field_filters'])){

            foreach (
$subscription['params']['field_filters'] as $field_name => $field_value) {

                
$matches = array();

                
// свойства или поля
                
if(preg_match('/^p([0-9]+)$/i'$field_name$matches)){

                    
// нет свойств
                    
if (!is_array($props)){
                        continue;
                    }

                    
// нет такого свойства
                    
if(!isset($props_fields[$matches[1]])){ continue; }

                    
$this->model->filterPropValue($ctype['name'], array(
                        
'id'      => $matches[1],
                        
'handler' => $props_fields[$matches[1]]
                    ), 
$field_value);

                } else {

                    
// нет такого поля
                    
if(!isset($fields[$field_name])){ continue; }

                    
$fields[$field_name]['handler']->applyFilter($this->model$field_value);

                }


            }

        }

        
$found_items $this->model->getContentItems($ctype['name']);

        if(
$found_items){
            foreach (
$found_items as $item) {

                
$match_list[] = array(
                    
'url'       => href_to_abs($ctype['name'], $item['slug'] . '.html'),
                    
'image_src' => '',
                    
'title'     => $item['title']
                );

            }
        }

        return 
$match_list;

    }

}
Онлайн: 2
Реклама