MaxHub
Служба Заботы MaxSite CMS

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

Вопросы-ответы / 7 декабря 2015

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

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

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

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

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

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

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

  2. Если и есть вариант как то объединить запросы, то только если попробовать воспользоваться параметром 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), у других это может быть что-то другое.

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

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

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

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

Оставьте комментарий!

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

Вход / регистрация или войти без комментирования
  Имя и сайт используются только при регистрации

Авторизация MaxSiteAuth. Войти через loginza

(обязательно)