Сортировка контента по категориям

InstantCMS 2.X

А не по ID DESC

#1 12 ноября 2017 в 15:02
Доброго дня!
Создал магазин на основе InstantCMS и addons.instantcms.ru/addons/instantcart.html
Замечательное дополнение, всем доволен. Кроме одного момента. Для вывода товаров создаётся и используется стандартный тип контента.
В нём предусмотрена система "последним опубликовал — показал первым".
Для статейных материалов самое то, просто идеально. Но в магазине есть товары, которые относятся к нескольким категориям одновременно. Т.е. при просмотре различных категорий вверху выводятся последнедобавленные товары, а, поскольку эти товары во многих категориях, то выглядит так, что во всех категориях одинаковые товары

У любого товара (контента) есть основная категория и дополнительные. Мне необходимо сделать так, что бы сортировка вывода была следующей:
сначала SORT (ID основной категории контента == ID текущей категории), а потом ID контента DESC (умолчательная сортировка).

Помогите, пожалуйста! Легко поправлю даже системные файлы, и буду править после каждого обновления. Но куда лезть, не знаю…
Или хотя бы скажите, какой запрос отвечает за этот вывод, и по какому пути его искать, буду сам пробовать...
Описание движка слишком скудное и неполное, что бы можно было выяснить через вики =-(

Заранее благодарен за любую помощь.
#3 12 ноября 2017 в 15:39
К сожалению, наборы не заменят категорий. А выборки — сортировки по КАТЕГОРИЯМ наборы не умеют
#4 12 ноября 2017 в 15:45
Погодите как не умеют, я конечно еще не пробовал, но обязательно в будущем попробую, там есть поля Показывать в Категориях: перечисляем, Не показывать в категории: перечисляем, просто если категории меняться не будут настроить раз и все.
#5 12 ноября 2017 в 15:59
Мне не надо, что бы не показывалось. Товары, у которых одна из дополнительных категорий равна текущей, тоже должны выводиться.
Но они должны идти после тех товаров, у которых текущая категория равна основной.
#6 13 ноября 2017 в 11:56
Нашёл куда нужно вставить сортировку.
  1. public function getContentItems($ctype_name, $callback = null){
  2.  
  3. $table_name = $this->table_prefix . $ctype_name;
  4.  
  5. $this->select('u.nickname', 'user_nickname');
  6. $this->select('f.title', 'folder_title');
  7. $this->join('cms_users', 'u FORCE INDEX (PRIMARY)', 'u.id = i.user_id');
  8. $this->joinLeft('content_folders', 'f', 'f.id = i.folder_id');
  9.  
  10. if (!$this->privacy_filter_disabled) { $this->filterPrivacy(); }
  11. if (!$this->approved_filter_disabled) { $this->filterApprovedOnly(); }
  12. if (!$this->delete_filter_disabled) { $this->filterAvailableOnly(); }
  13. if (!$this->pub_filter_disabled) { $this->filterPublishedOnly(); }
  14.  
  15. if (!$this->order_by){ $this->orderBy('date_pub', 'desc')->forceIndex('date_pub'); }
  16.  
  17. $this->useCache('content.list.'.$ctype_name);
  18.  
  19. $user = cmsUser::getInstance();
  20.  
  21. return $this->get($table_name, function($item, $model) use ($user, $callback, $ctype_name){
  22.  
  23. $item['user'] = array(
  24. 'id' => $item['user_id'],
  25. 'nickname' => $item['user_nickname'],
  26. 'is_friend' => $user->isFriend($item['user_id'])
  27. );
  28.  
  29. if (is_callable($callback)){
  30. $item = $callback($item, $model, $ctype_name, $user);
  31. }
  32.  
  33. return $item;
  34.  
  35. });
  36.  
  37. }
  38.  
Но так и не понял с наскока, откуда взять ID текущей категории. Гуру, прошу помощи…
#7 14 ноября 2017 в 12:06

В нём предусмотрена система "последним опубликовал — показал первым".

@AHgpeu
Может просто поменяете в админке эту сортировку в обратном порядке? zst

Нашёл куда нужно вставить сортировку.

@AHgpeu
Сомневаюсь что это то что надо. Или вы собрались менять сортировку всех типов контента?

Но так и не понял с наскока, откуда взять ID текущей категории.

@AHgpeu
Её, похоже тут и нету. glasses
Вывод же формируется не по совсем по категории, а по точке в дереве категорий, ведь ваша категория может содержать множество подкатегорий, а те еще кучу под-подкатегорий и т.д. и все эти вложения надо вывести.
#8 14 ноября 2017 в 13:42


Может просто поменяете в админке эту сортировку в обратном порядке? zst

Sonat
А смысл?) Меня устраивает порядок сортировки. Мне просто необходимо, что бы статьи, у которых выбранная категория основная, выводились первыми. А если эта же категория есть как дополнительная у другой статьи, она бы тоже выводилась, но после!

Сомневаюсь что это то что надо. Или вы собрались менять сортировку всех типов контента?

Sonat
Конечно. ИМХО так и должно быть.
Мало того, по логике сначала выводятся статьи этой категории, а потом, после заголовка "Так же на тему:" статьи, у которых текущая категория прописана в дополнительных.
Но я не разработчик, им виднее.

Её, похоже тут и нету. glasses
Вывод же формируется не по совсем по категории, а по точке в дереве категорий, ведь ваша категория может содержать множество подкатегорий, а те еще кучу под-подкатегорий и т.д. и все эти вложения надо вывести.

Sonat
разобрался в коде. поправил 2 системных файла: во frontend.php передаю в функцию getContentItems() дополнительный параметр $category_id.
в этой функции изменил сортировку на
  1. if (!$this->order_by){
  2. if ($category_id) {
  3. $ordering = array(
  4. array('by' => 'i.category_id='.$category_id, 'to' => 'desc'),
  5. array('by' => 'date_pub', 'to' => 'desc'),
  6. );
  7. $this->orderByList($ordering);
  8. }else{
  9. $this->orderBy('date_pub', 'desc')->forceIndex('date_pub');
  10. }
  11. }
  12.  
Вполне допускаю, что есть более красивые решения, знаю, что неправильно править системные файлы, но на моём уровне знаний движка считаю вполне приемлемым решением.
Может, пригодится кому-либо ещё…
#9 14 ноября 2017 в 17:39

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

@AHgpeu
Полностью согласен с данным предложением!
#10 14 ноября 2017 в 18:00


Полностью согласен с данным предложением!

AndroS
Осталось найти связь с разработчиками этого замечательного движка и предложить им сделать "галочку" типа вывода
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.