Files
AtomicOld/api/Services.php
2026-02-14 19:34:54 +03:00

707 lines
30 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
require_once('Simpla.php');
class Services extends Simpla
{
public $menu_id = 3;
public $root_id = 28;
public $services_brands = array(
//1 => array('id' => 1, 'name' => 'Alfa Romeo','url' => 'alfa-romeo', 'image' => ''),
2 => array('id' => 2, 'name' => 'Audi', 'url' => 'audi', 'image' => 'audi.png'),
3 => array('id' => 3, 'name' => 'Bentley', 'url' => 'bentley', 'image' => 'bentley.png'),
4 => array('id' => 4, 'name' => 'BMW', 'url' => 'bmw', 'image' => 'bmw.png'),
5 => array('id' => 5, 'name' => 'Cadillac', 'url' => 'cadillac', 'image' => 'cadillac.png'),
55 => array('id' => 55, 'name' => 'Changan', 'url' => 'changan', 'image' => 'changan.png'),
6 => array('id' => 6, 'name' => 'Chery','url' => 'chery', 'image' => 'chery.png'),
7 => array('id' => 7, 'name' => 'Chevrolet', 'url' => 'chevrolet', 'image' => 'chevrolet.png'),
8 => array('id' => 8, 'name' => 'Chrysler', 'url' => 'chrysler', 'image' => 'chrysler.png'),
9 => array('id' => 9, 'name' => 'Citroen', 'url' => 'citroen', 'image' => 'citroen.png'),
//10 => array('id' => 10, 'name' => 'Daewoo','url' => 'daewoo', 'image' => ''),
11 => array('id' => 11, 'name' => 'Dodge', 'url' => 'dodge', 'image' => 'dodge.png'),
56 => array('id' => 56, 'name' => 'Dongfeng', 'url' => 'Dongfeng', 'image' => 'dongfeng.png'),
54 => array('id' => 54, 'name' => 'Exeed', 'url' => 'exeed', 'image' => 'exeed.png'),
12 => array('id' => 12, 'name' => 'Ferrari', 'url' => 'ferrari', 'image' => 'ferrari.png'),
13 => array('id' => 13, 'name' => 'Fiat', 'url' => 'fiat', 'image' => 'fiat.png'),
53 => array('id' => 53, 'name' => 'Ford', 'url' => 'ford', 'image' => 'ford.png'),
57 => array('id' => 57, 'name' => 'GAC', 'url' => 'gac', 'image' => 'gac.png'),
14 => array('id' => 14, 'name' => 'Geely', 'url' => 'geely', 'image' => 'geely.png'),
//15 => array('id' => 15, 'name' => 'GMC','url' => 'gmc', 'image' => ''),
16 => array('id' => 16, 'name' => 'Great Wall','url' => 'great-wall', 'image' => 'great-wall.png'),
17 => array('id' => 17, 'name' => 'Haval', 'url' => 'haval', 'image' => 'haval.png'),
18 => array('id' => 18, 'name' => 'Honda', 'url' => 'honda', 'image' => 'honda.png'),
19 => array('id' => 19, 'name' => 'Hummer', 'url' => 'hummer', 'image' => 'hummer.png'),
20 => array('id' => 20, 'name' => 'Hyundai', 'url' => 'hyundai', 'image' => 'hyundai.png'),
58 => array('id' => 58, 'name' => 'Haima', 'url' => 'haima', 'image' => 'haima.png'),
21 => array('id' => 21, 'name' => 'Infiniti', 'url' => 'infiniti', 'image' => 'infiniti.png'),
22 => array('id' => 22, 'name' => 'Jaguar', 'url' => 'jaguar', 'image' => 'jaguar.png'),
59 => array('id' => 59, 'name' => 'JAC', 'url' => 'jac', 'image' => 'jac.png'),
60 => array('id' => 60, 'name' => 'Jaecoo', 'url' => 'jaecoo', 'image' => 'jaecoo.png'),
61 => array('id' => 61, 'name' => 'Jetour', 'url' => 'jetour', 'image' => 'jetour.png'),
62 => array('id' => 62, 'name' => 'Jetta', 'url' => 'jetta', 'image' => 'jetta.png'),
23 => array('id' => 23, 'name' => 'Jeep', 'url' => 'jeep', 'image' => 'jeep.png'),
63 => array('id' => 63, 'name' => 'JMC', 'url' => 'jmc', 'image' => 'jmc.png'),
64 => array('id' => 64, 'name' => 'Kaiyi', 'url' => 'kaiyi', 'image' => 'kaiyi.png'),
24 => array('id' => 24, 'name' => 'Kia', 'url' => 'kia', 'image' => 'kia.png'),
25 => array('id' => 25, 'name' => 'Land Rover', 'url' => 'land-rover', 'image' => 'land-rover.png'),
26 => array('id' => 26, 'name' => 'Lexus', 'url' => 'lexus', 'image' => 'lexus.png'),
27 => array('id' => 27, 'name' => 'LiXiang','url' => 'lixiang', 'image' => 'LiXiang.png'),
65 => array('id' => 65, 'name' => 'Livan', 'url' => 'livan', 'image' => 'livan.png'),
28 => array('id' => 28, 'name' => 'Mazda', 'url' => 'mazda', 'image' => 'mazda.png'),
29 => array('id' => 29, 'name' => 'Mercedes-Benz', 'url' => 'mercedes-benz', 'image' => 'mercedes-benz.png'),
30 => array('id' => 30, 'name' => 'Mini', 'url' => 'mini', 'image' => 'mini.png'),
31 => array('id' => 31, 'name' => 'Mitsubishi', 'url' => 'mitsubishi', 'image' => 'mitsubishi.png'),
32 => array('id' => 32, 'name' => 'Nissan', 'url' => 'nissan', 'image' => 'nissan.png'),
66 => array('id' => 66, 'name' => 'OMODA', 'url' => 'omoda', 'image' => 'omoda.png'),
33 => array('id' => 33, 'name' => 'Opel', 'url' => 'opel', 'image' => 'opel.png'),
34 => array('id' => 34, 'name' => 'Peugeot', 'url' => 'peugeot', 'image' => 'peugeot.png'),
35 => array('id' => 35, 'name' => 'Porsche', 'url' => 'porsche', 'image' => 'porsche.png'),
36 => array('id' => 36, 'name' => 'Renault', 'url' => 'renault', 'image' => 'renault.png'),
//37 => array('id' => 37, 'name' => 'Saab','url' => 'saab', 'image' => 'saab.png'),
38 => array('id' => 38, 'name' => 'Scania', 'url' => 'scania', 'image' => 'scania.png'),
//39 => array('id' => 39, 'name' => 'Seat','url' => 'seat', 'image' => ''),
40 => array('id' => 40, 'name' => 'Skoda', 'url' => 'skoda', 'image' => 'skoda.png'),
41 => array('id' => 41, 'name' => 'Smart', 'url' => 'smart', 'image' => 'smart.png'),
//42 => array('id' => 42, 'name' => 'SsangYong','url' => 'ssangyong', 'image' => 'ssangyong.png'),
43 => array('id' => 43, 'name' => 'Subaru', 'url' => 'subaru', 'image' => 'subaru.png'),
44 => array('id' => 44, 'name' => 'Suzuki', 'url' => 'suzuki', 'image' => 'suzuki.png'),
67 => array('id' => 67, 'name' => 'Tank', 'url' => 'tank', 'image' => 'tank.png'),
45 => array('id' => 45, 'name' => 'Tesla', 'url' => 'tesla', 'image' => 'tesla.png'),
46 => array('id' => 46, 'name' => 'Toyota', 'url' => 'toyota', 'image' => 'toyota.png'),
47 => array('id' => 47, 'name' => 'Volkswagen', 'url' => 'volkswagen', 'image' => 'volkswagen.png'),
48 => array('id' => 48, 'name' => 'Volvo', 'url' => 'volvo', 'image' => 'volvo.png'),
68 => array('id' => 68, 'name' => 'VOYAH', 'url' => 'voyah', 'image' => 'voyah.png'),
49 => array('id' => 49, 'name' => 'Zeekr','url' => 'zeekr', 'image' => 'Zeekr.png'),
50 => array('id' => 50, 'name' => 'ГАЗ', 'url' => 'gaz', 'image' => 'gaz.png'),
51 => array('id' => 51, 'name' => 'Лада (ВАЗ)', 'url' => 'lada-vaz', 'image' => 'lada-vaz.png'),
52 => array('id' => 52, 'name' => 'Мототехника', 'url' => 'mototehnika', 'image' => 'moto.png'),
//53 => array('id' => 53, 'name' => 'УАЗ','url' => 'uaz', 'image' => ''),
);
private $_root_url = 'tuning-centr/';
private $_tree;
/**
* @var array
*/
private $_services;
public function count($filters)
{
$filter = $this->_prepare_filters($filters);
$this->db->query("SELECT COUNT(DISTINCT p.id) as count FROM __pages p" .
$filter->where);
return (int)$this->db->result('count');
}
public function all($filters)
{
$filter = $this->_prepare_filters($filters);
$this->db->query(
"SELECT *" .
" FROM __pages p" .
$filter->where .
$filter->order .
$filter->limit
);
return $this->db->results();
}
/**
* Возвращает данные страницы услуг по её id или url
*
* @param string|int $id ID или url страницы данные которой необходимо получить
* @return object
*/
public function get($id)
{
if (empty($id)) {
//главная страница услуг
$id = $this->root_id;
$conditions = '1';
} else {
$conditions = 'menu_id=' . $this->menu_id;
}
if (is_string($id)) {
$conditions .= $this->db->placehold(' AND url=?', $id);
} else {
$conditions .= $this->db->placehold(' AND id=?', intval($id));
}
$query = "SELECT * FROM __pages WHERE $conditions LIMIT 1";
$this->db->query($query);
return $this->db->result();
}
public function get_root_url() {
return $this->_root_url;
}
/**
* Возвращает краткие данные "брендовых" страниц услуги
* @param int $id ID услуги
* @param array $filter Фильтры получаемых данных, в виде колонка=>значение
* @return array
*/
public function get_brands_pages($id, $filter = array())
{
$this->_build_tree();
if (!isset($this->_services[$id]))
return array();
$conditions = $this->db->placehold('parent=? AND brand_id>0', intval($id));
foreach ($filter as $col => $val) {
$conditions .= $this->db->placehold(" AND $col=?", $val);
}
$this->db->query("SELECT `id`, `brand_id`, `url`, `parent`, `visible`, `name` FROM __pages WHERE $conditions ORDER BY `position`");
return $this->db->results();
}
/**
* Возвращает данные всех предков услуги.
* Url каждой услуги включает корень.
* @param int $id ID услуги
* @return array
*/
public function get_path_to($id)
{
$this->_build_tree();
$results = array();
if(array_key_exists($id, $this->_services)) {
$breadcrumbs = $this->_services[$id]->path;
foreach ($breadcrumbs as $breadcrumb) {
$results[] = (object)array(
'id' => $breadcrumb->id,
'parent' => $breadcrumb->parent,
'name' => $breadcrumb->name,
'url' => intval($breadcrumb->id) !== $this->root_id ? $this->_root_url . $breadcrumb->url : trim($this->_root_url, '/'),
);
}
}
return $results;
}
public function get_all_brands()
{
$results = array();
foreach ($this->services_brands as $brand) {
$results[] = (object)$brand;
}
return $results;
}
/**
* Возвращает дерево всех страниц услуг
* @return array
*/
public function get_tree()
{
$this->_build_tree();
return $this->_tree;
}
public function get_all_services()
{
$this->_build_tree();
return $this->_services;
}
/**
* Возвращает услуги привязанные к главной странице.
* Форматирование возвращаемых данных зависит от параметра $with_roots.
* @param $visible_only
* @param bool $with_roots Флаг определяющий будут ли услуги возвращены как дети их корневых услуг или просто списком
* @return array
*/
public function get_home_services($visible_only = false, $with_roots = false)
{
$results = array();
$items = $this->services->all(array('show_home' => 1, 'visible' => 1));
foreach ($items as $item) {
if ($visible_only && !$this->is_visible($item->id))
continue;
if ($with_roots) {
$root = $this->_services[$item->id]->path[1];
if (!isset($results[$root->id])) {
$results[$root->id] = $this->get(intval($root->id));
$results[$root->id]->children = array();
}
if(!array_key_exists($item->id, $results))
$results[$root->id]->children[] = $item;
} else
$results[] = $item;
}
return $results;
}
/**
* Возвращает услуги главной страницы услуг (отмеченные как "в услугах").
* Форматирование возвращаемых данных зависит от параметра $with_roots.
* @param $visible_only
* @param bool $with_roots Флаг определяющий будут ли услуги возвращены как дети их корневых услуг или просто списком
* @return array
*/
public function get_main_services($visible_only = false, $with_roots = false)
{
$results = array();
$items = $this->services->all(array('show_service' => 1, 'visible' => 1));
foreach ($items as $item) {
if ($visible_only && !$this->is_visible($item->id))
continue;
if ($with_roots) {
$root = $this->_services[$item->id]->path[1];
if (!isset($results[$root->id])) {
$results[$root->id] = $this->get(intval($root->id));
$results[$root->id]->children = array();
}
if(!array_key_exists($item->id, $results))
$results[$root->id]->children[] = $item;
} else
$results[] = $item;
}
return $results;
}
public function get_brand($brand_id)
{
if (array_key_exists($brand_id, $this->services_brands))
return (object)$this->services_brands[$brand_id];
return false;
}
/**
* Возвращает данные брендов привязанных к странице услуги
* @param int $id ID услуги
* @return array
*/
public function get_service_brands($id)
{
$conditions = $this->db->placehold('p.parent=? AND p.brand_id>0', intval($id));
$this->db->query("SELECT * FROM __pages p WHERE $conditions ");
$results = array();
foreach ($this->db->results() as $page) {
if (array_key_exists($page->brand_id, $this->services_brands)) {
$brand = (object)$this->services_brands[$page->brand_id];
$brand->page_id = $page->id;
$brand->page_url = $page->url;
$brand->page_visible = $page->visible;
$results[] = $brand;
}
}
return $results;
}
/**
* Создаёт новые или удаляет существующие "брендовые" страницы услуги.
* К услуге будут привязаны только бренды ID которых перечислены в $brands.
* Если массив $brands не содержит элементов, то будут удалены все "брендовые" страницы услуги.
* @param int $id ID страницы услуги
* @param array $brands ID брендов, для которых должны быть сгенерированы страницы.
* @return void
*/
public function create_brands_pages($id, $brands)
{
$delete_conditions = $this->db->placehold('menu_id=? AND parent=? AND brand_id>0', $this->menu_id, intval($id));
if (is_array($brands) && !empty($brands)) {
$ids = array();
foreach ($brands as $brand_id) {
$ids[] = intval($brand_id);
$this->create_brand_page($id, intval($brand_id));
}
$delete_conditions .= $this->db->placehold(' AND brand_id NOT IN (?@)', $ids);
}
//Удаляем все брендовые страницы, которые не были перечислены в $brands
$this->db->query("DELETE FROM __pages WHERE $delete_conditions");
}
public function create_brand_page($id, $brand_id)
{
// страница услуги
if (!($page = $this->services->get(intval($id))))
return;
//проверяем существует ли "брендовая" страница услуги
$conditions = $this->db->placehold('parent=? AND brand_id=?', intval($id), intval($brand_id));
if ($this->count(array('where' => $conditions)) === 0) {// страницы не существует
if (array_key_exists($brand_id, $this->services_brands)) {
$brand = (object)$this->services_brands[$brand_id];
$service = array(
'parent' => $id,
'brand_id' => $brand_id,
'menu_id' => $this->menu_id,
'url' => $page->url . '/' . $brand->url,
'name' => $brand->name,
'header' => $page->name . ' ' . $brand->name,
'meta_title' => $page->name . ' ' . $brand->name . ' в Санкт-Петербурге | Тюнинг центр'
);
$this->pages->add_page($service);
}
}
}
public function update($id, $service)
{
$old_service = $this->get(intval($id));
$query = $this->db->placehold("UPDATE __pages SET ?% WHERE id=? LIMIT 1", $service, intval($id));
$this->db->query($query);
$service = (object)$service;
//был изменён родитель или позиция
if((isset($service->parent) && intval($old_service->parent) !== intval($service->parent))
|| (isset($service->position)) && intval($old_service->position) !== intval($service->position))
$this->fix_positions();
//была изменен статус видимости
if(isset($service->visible) && intval($old_service->visible) !== intval($service->visible))
$this->set_visible($id, $service->visible);
return $id;
}
/**
* Удаляет все услуги с указанными id, а также всех их потомков
* @param $ids
* @param bool $recursive Разрешено ли удалять узлы имеющие детей (по умолчанию - запрещено)
* @return void
*/
public function delete($ids, $recursive = false)
{
$ids = (array)$ids;
foreach ($ids as $id) {
$service = $this->get(intval($id));
if (!empty($service)) {
// получаем ID детей
$this->db->query('SELECT id FROM __pages WHERE parent=' . $service->id);
$children = $this->db->results('id');
$has_children = count($children) > 0;
// если есть дети и удаление не рекурсивное - пропускаем узел
if (!$recursive && $has_children)
continue;
if ($has_children) {
// рекурсивно удаляем потомков
$this->delete($children, $recursive);
} else {
// узел без детей - удаляем
$this->_delete_internal(intval($id));
$this->_unset_tree();
}
}
}
}
public function move($id, $options)
{
$this->_build_tree();
$id = intval($id);
$new_parent = intval($options['parent']);
$relative_position = intval($options['position']);
if (isset($id, $this->_services) && isset($id, $this->_services[$new_parent])) {
$service = $this->_services[$id];
// новый родитель
$parent = $this->_services[$new_parent];
// нод место которого должен занять перемещаемый
if (isset($parent->children[$relative_position])) {
$target_node = $parent->children[$relative_position];
$insert_position = intval($target_node->position);
} else {
// добавление в самую нижнюю позицию
$target_node = null;
$insert_position = $parent->position + (isset($parent->descendants) ? count($parent->descendants) : 1);
}
if (intval($service->parent) !== $new_parent) {
// у нода будет другой родитель
$conditions = $this->db->placehold('parent=?, position=? WHERE id=?', $new_parent, $insert_position, intval($service->id));
$this->db->query('UPDATE __pages SET ' . $conditions);
if ($target_node)
$this->db->query('UPDATE __pages SET position=' . $insert_position + 1 . ' WHERE id=' . intval($target_node->id));
} else {
// родитель не меняется
$i = 0;
foreach ($parent->children as $node) {
//$this->db->query('UPDATE __pages SET position=position+? WHERE id=?');
if ($node->id !== $service->id) {
$i = ($i === $relative_position) ? $relative_position + 1 : $i;
$this->db->query('UPDATE __pages SET position=? WHERE id=?', $i, intval($node->id));
++$i;
} else {
$this->db->query('UPDATE __pages SET position=? WHERE id=?', $relative_position, intval($node->id));
}
}
}
$this->fix_positions();
$this->_unset_tree();
return true;
}
return false;
}
/**
* Возвращает реальный статус видимости услуги, в зависимости от статуса её родителей
* @param $id
* @return bool
*/
public function is_visible($id)
{
$this->_build_tree();
if (!array_key_exists($id, $this->_services) || !$this->_services[$id]->visible)
return false;
foreach ($this->_services[intval($id)]->path as $serv) {
if (!$serv->visible)
return false;
}
return true;
}
/**
* Есть ли дети у указанной услуги
* @param int $id
* @return bool
*/
public function has_children($id)
{
$this->_build_tree();
return array_key_exists($id, $this->_services) && !empty($this->_services[$id]->children);
}
/**
* Включает и отключает услугу
* @param $id
* @param $status
* @return void
*/
public function set_visible($id, $status) {
$this->_build_tree();
$visible = intval(boolval($status));
$service = $this->get(intval($id));
if($service) {
$query = 'UPDATE __pages SET visible=' . $visible . ' WHERE id=';
//если услуга не брендовая, включаем/отключаем всех её родителей/потомков
if(!$service->brand_id) {
$target_id = intval($service->id);
if ($visible) { //включение услуги
foreach ($this->_services[$target_id]->path as $serv)
$this->db->query($query . $serv->id);
} else { //отключение услуги
foreach ($this->_services[$target_id]->descendants as $s_id)
$this->db->query($query . $s_id);
}
} else { //брендовая услуга
$target_id = intval($service->parent);
if ($visible) { //включение предков родителя
foreach ($this->_services[$target_id]->path as $serv)
$this->db->query($query . $serv->id);
//включение самого родителя
$this->db->query($query . $target_id);
}
}
// обновляем статус самой услуги
$this->db->query( $query . $service->id);
}
$this->_unset_tree();
}
public function fix_positions($tree = null, &$pos = 0, $level=1)
{
if ($tree === null) {
$this->_unset_tree();
$tree = $this->_build_tree();
$pos = 0;
$level = 1;
}
foreach ($tree as $node) {
$this->db->query('UPDATE __pages SET level='. $level .', position=' . ++$pos . ' WHERE id=' . intval($node->id));
if ($node->children) {
$this->fix_positions($node->children, $pos, $level+1);
}
}
}
private function _delete_internal($id)
{
//удаляем связанные объекты
$this->db->query('DELETE FROM __pages_objects WHERE page_id=' . $id);
//удаляем саму страницу
$this->db->query('DELETE FROM __pages WHERE id=' . $id);
}
private function _build_tree()
{
if (!is_null($this->_tree))
return $this->_tree;
$this->db->query(
"SELECT p.id, p.parent, p.brand_id, p.name, p.url, p.visible, p.position" .
" FROM __pages p" .
" WHERE (menu_id=" . $this->menu_id . " OR p.id=" . $this->root_id . ") AND p.brand_id=0" .
" ORDER BY p.parent, p.position"
);
$services = $this->db->results();
if (empty($services)) {
return array();
}
// Дерево категорий
$tree = $services[0];
unset($services[0]);
$tree->children = array();
$pointers = array();
$pointers[$this->root_id] = &$tree;
$pointers[$this->root_id]->path = array($tree);
$finish = false;
// строим дерево
while (!empty($services) && !$finish) {
$flag = false;
foreach ($services as $k => $service) {
if (isset($pointers[$service->parent])) {
$pointers[$service->parent]->children[] = ($pointers[$service->id] = $service);
$curr = $pointers[$service->id];
$pointers[$service->id]->path = array_merge((array)$pointers[$service->parent]->path, array($curr));
unset($services[$k]);
$flag = true;
}
}
if (!$flag) $finish = true;
}
// добавляем ID всех потомков к нодам
$ids = array_reverse(array_keys($pointers));
foreach ($ids as $id) {
if ($id != $this->root_id) {
$pointers[$id]->descendants[] = $id;
if (isset($pointers[$pointers[$id]->parent]->descendants))
$pointers[$pointers[$id]->parent]->descendants = array_merge($pointers[$id]->descendants, $pointers[$pointers[$id]->parent]->descendants);
else
$pointers[$pointers[$id]->parent]->descendants = $pointers[$id]->descendants;
}
}
unset($ids);
// получаем полный url к каждой странице попутно подчищая лишние ID и устанавливая реальный статус видимости элемента
foreach ($pointers as $service) {
if (!isset($service->children))
unset($service->descendants);
/*
$current_url = $service->url;
foreach ($service->path as $serv) {
if (substr($serv->url, -1) !== '/') {
$current_url .= $serv->url . '/';
} else {
$current_url = $serv->url;
}
}
$service->url = $current_url;*/
}
$this->_tree = $tree->children;
$this->_services = $pointers;
return $this->_tree;
}
private function _unset_tree()
{
unset($this->_tree);
unset($this->_services);
}
private function _prepare_filters($filter)
{
$filters = new stdClass();
$where = 'menu_id=' . $this->menu_id;
if (array_key_exists('where', $filter)) {
$where = $filter['where'];
} else {
if (array_key_exists('ids', $filter)) {
if (is_array($filter['ids']) && !empty($filter['ids']))
$where .= $this->db->placehold(' AND p.id IN (?@)', $filter['ids']);
else
$where .= $this->db->placehold(' AND p.id IN (NULL)');
}
if (array_key_exists('visible', $filter)) {// активные/архивные контракты
$where .= $this->db->placehold(' AND p.visible=?', intval($filter['visible']));
}
if (array_key_exists('branded', $filter)) {
$where .= ' AND p.brand_id>0';
}
if (array_key_exists('show_service', $filter)) {
$where .= ' AND p.show_service=' . intval($filter['show_service']);
}
if (array_key_exists('show_home', $filter)) {
$where .= ' AND p.show_home=' . intval($filter['show_home']);
}
if (array_key_exists('parent', $filter)) {
$where .= $this->db->placehold(' AND p.parent=?', intval($filter['parent']));
}
if (array_key_exists('brand_id', $filter)) {
$where .= $this->db->placehold(' AND p.brand_id=?', intval($filter['brand_id']));
}
// поисковый запрос
if (isset($filter['keyword'])) {
$keywords = explode(' ', $filter['keyword']);
foreach ($keywords as $keyword) {
$escaped_keyword = $this->db->escape(trim($keyword));
if (!empty($escaped_keyword)) {
$where .= ' AND (p.name LIKE "%' . $escaped_keyword . '%" OR p.header LIKE "%' . $escaped_keyword . '%")';
}
}
}
}
$filters->where = ' WHERE ' . $where;
if (isset($filter['order']) && is_string($filter['order'])) {
$order = $filter['order'];
} else{
// сортировка по-умолчанию
$order = 'level, position';
}
$filters->order = !empty($order) ? ' ORDER BY ' . $order : '';
// навигация
$filters->limit = '';
if (isset($filter['limit'])) {
$limit = max(1, intval($filter['limit']));
if (isset($filter['page'])) {
$page = max(1, intval($filter['page']));
$limit = $this->db->placehold('?, ? ', ($page - 1) * $limit, $limit);
}
$filters->limit = ' LIMIT ' . $limit;
}
return $filters;
}
}