Добро пожаловать на сайт SEDBY

[Plugin] Catlist

Главная / Форумы / Форумы сообщества / Расширения / [Plugin] Catlist

Как работает функция sedby_catlist?

Автор Сообщение
admin
Аватар

Администратор
Сообщения: 77

[Plugin] Catlist
  • #162
  • 26.08.2024 09:28

Я в этом плагине (в отличие от Pagelist) не использовал функцию sedby_compilecats() – как-то не понадобилось. Со структурой возможны следующие варианты:

Глобальный плагин

В "проектном" плагине создаем (или используем уже созданную) часть с хуком global. В ней размещаем PHP-код, который формирует массивы и / или строковые переменные с необходимыми нам разделами. Плюс данные вносим в кэш. Примерно так:

<?php
/* ====================
[BEGIN_COT_EXT]
Hooks=global
[END_COT_EXT]
==================== */

defined('COT_CODE') or die('Wrong URL');

if ($cache && $cache->db->exists('tovary', 'shop')) {
	$tovary = $cache->db->get('tovary', 'shop');
	$tovary_str = $cache->db->get('tovary_str', 'shop');
	$tovary_str_cats = $cache->db->get('tovary_str_cats', 'shop');
	$net_tovarov = $cache->db->get('net_tovarov', 'shop');
	$net_tovarov_str = $cache->db->get('net_tovarov_str', 'shop');
} else {
	$res_phones = $db->query("SELECT structure_code FROM $db_structure 
          WHERE structure_path > '100' AND structure_path < '199' ORDER BY structure_path")->fetchAll(PDO::FETCH_COLUMN);
	$res_tablets = $db->query("SELECT structure_code FROM $db_structure 
          WHERE structure_path > '200' AND structure_path < '300' ORDER BY structure_path")->fetchAll(PDO::FETCH_COLUMN);

	$tovary = [
		"phones" => $res_phones,
		"tablets" => $res_tablets,
	];

	$tovary_str = [
		implode(';', $tovary['phones']),
		implode(';', $tovary['tablets']),
	];

	$tovary_str_cats = [
		'"'.implode('","', $tovary['phones']).'"',
		'"'.implode('","', $tovary['tablets']).'"',
	];

	$net_tovarov = $db->query("SELECT structure_code FROM $db_structure 
          WHERE structure_path > '700' ORDER BY structure_path")->fetchAll(PDO::FETCH_COLUMN);

	$net_tovarov_str = '"'.implode('","', $net_tovarov).'"';
	$net_tovarov_str_cats = '"'.implode('","', $net_tovarov).'"';

	$cache && $cache->db->store('tovary', $tovary, 'shop', 604800);
	$cache && $cache->db->store('tovary_str', $tovary_str, 'shop', 604800);
	$cache && $cache->db->store('tovary_str_cats', $tovary_str_cats, 'shop', 604800);
	$cache && $cache->db->store('net_tovarov', $net_tovarov, 'shop', 604800);
	$cache && $cache->db->store('net_tovarov_str', $net_tovarov_str, 'shop', 604800);
}

В результате у нас всегда под рукой кэшированные массивы и строки для необходимых разделов. Обычно я их использую не только с catlist. С ним же это работает так:

{PHP.tovary_str_cats|sedby_catlist('catlist', 36, 'structure_path ASC', 'structure_code IN $this')}

Обрати внимание на то, что в SQL-запросе строковые данные должны быть в кавычках.

Переменные в виде ресурсов в PHP-файле темы

Прмиерно то же самое, но попроще можно сделать во frontend-теме. В PHP-файле (например, nemesis.php) определим строковый ресурс:

$R['tovary_str_cats'] = '"phones", "tablets"';

А дальше уже просто:

{PHP.R.tovary_str_cats|sedby_catlist('catlist', 36, 'structure_path ASC', 'structure_code IN $this')}

Явное указание в TPL-шаблоне

Можно и просто:

{PHP|sedby_catlist('catlist', 36, 'structure_path ASC', 'structure_code IN ""phones", "tablets""')}

Кому как подходит.

P. S. Опять же, необязательно привязываться к коду или названию раздела если можно использовать путь. Например, если у тебя необходимые разделы имеют пути вида 100.1, 100.2, 100.3 и т. д., то можно просто использовать MySQL-условие LIKE:

{PHP|sedby_catlist('catlist', 36, 'structure_path ASC', 'structure_path LIKE "100.%"')}
Отредактировано: admin (26.08.2024 13:04, 1 год назад)
Благодарности отсутствуют
Блок пользователя
Регистрация на нашем сайте позволит вам общаться на форумах и получить доступ к другому полезному функционалу
Вы вошли как Гость