На время проведения реконструкции сайт переведён в режим "ТОЛЬКО ЧТЕНИЕ" (Read only). Приносим свои извинения!
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 многим интересна, но далеко не каждый к ней подход может найти. Поэтому свой код с пояснениями привел.