Файл: 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;
}
}