Категория + метка, как реализовать?

/ Просмотров: 2584

Простая, по идее, задача, но что-то я не соображу, как ее реализовать. Требуется: Вывести страницы с определенной меткой, принадлежащие к определенной категории.

Т.е. нам нужно сделать выборку сначала по категории, а затем из выбранного выбрать страницы с требуемой меткой.

Стандартные возможности mso_get_pages() позволяют нам либо вывести страницы категорий (без учета меток в выборке), либо страницы меток (без учета категорий в выборке). А нужно, чтобы учитывались оба параметра, и принадлежность страниц к категории, и наличие у страниц метки.

Как лучше реализовать на практике?

Комментариев: 4 RSS

Михаил, думаю, что просто за счёт передачи определённого набора значений параметров в функцию mso_get_pages() не получится сделать выборку.

Посмотрел \application\maxsite\common\page.php (думаю, что ты и сам его видел) и там видно, что при варианте выборки для custom_type = 'category' или custom_type = 'tag' там выполняются специальные процедуры с соответствующими (заточенными под конкретные задачи) запросами к базе.

Если и есть вариант как то объединить запросы, то только если попробовать воспользоваться параметром function_add_custom_sql, который задаёт название специальной функции. Эта функция должна добавлять параметры выборки (т.е. нужна работа с экземпляром $CI).

Если и есть вариант как то объединить запросы, то только если попробовать воспользоваться параметром function_add_custom_sql, который задаёт название специальной функции. Эта функция должна добавлять параметры выборки (т.е. нужна работа с экземпляром $CI).

Собственно, я и реализовал таким образом. Проблема моя была в том, что я ранее ни разу не использовал этот параметр, а рабочих примеров в Сети найти не мог. Методом тыка надыбал искомое.

В моем случае я брал за основу tag, получал таким образом в mso_get_pages() выборку по тегу, а затем с помощью function_add_custom_sql из полученной выборки отбирал уже страницы, относящиеся к той или иной нужной мне рубрике.\

Сама фунцкия такая:

function plus_cat() {
   $CI = &get;_instance();
   $cat_id = АЙДИ_НУЖНОЙ_КАТЕГОРИИ;
  if ($cat_id) // указаны рубрики
  {
   $CI->db->join('cat2obj', 'cat2obj.page_id = page.page_id', 'left');
   $CI->db->join('category', 'cat2obj.category_id = category.category_id');
   $CI->db->where_in('category.category_id', $cat_id);
  }
}

И, соответственно, mso_get_pages() получила вид:

// параметры для получения страниц
$par = array(
  'limit' => mso_get_option('limit_post', 'templates', '7'),
  'cut' => mso_get_option('more', 'templates', tf('Читать полностью »')),
  'cat_order' => 'category_name', 
  'cat_order_asc' => 'asc', 
  'type' => false,
                'custom_type'=>'tag',
                'meta_key'=>'tags', 
                'slug'=>mso_segment(3),
  'content' => $full_posts,
                'function_add_custom_sql' => 'plus_cat'
 );

Я использовал в качестве слага для выборки по тегу mso_segment(3), у других это может быть что-то другое.

Михаил, в коде всё выглядит именно так, как я теоретизировал smile

Проблема моя была в том, что я ранее ни разу не использовал этот параметр, а рабочих примеров в Сети найти не мог. Методом тыка надыбал искомое.

Потребность явно нестандартная, поэтому примеров особо нет в сети. Но теперь есть smile Михаил, спасибо, что поделился наработкой! smile

Пожалуйста. Думаю, что function_add_custom_sql многим интересна, но далеко не каждый к ней подход может найти. Поэтому свой код с пояснениями привел.