MultiCategories - плагин для добавления документов сразу в несколько категорий

Разработку проспонсировал mmv2809
Компонент работает без TV-параметров, выглядит примерно так:


Устанавливать отсюда: github.com/Pathologic/MultiCategories
Настраивается примерно как SimpleGallery:
  • Tab name — название вкладки;
  • Controller class — имя доступного класса-контроллера;
  • Templates — id шаблонов с которыми будет работать плагин;
  • Documents — аналогично Templates, но для отдельных документов;
  • Ignore Documents — для указанных документов плагин будет отключен;
  • Roles — id разрешенных ролей;
  • Parents — id категорий, от которых строится дерево категорий.

Для вывода нужно обновить DocLister, тогда появится возможность при вызове использовать параметр:

&multiCategories=`1`

18 комментариев

avatar
На скриншоте категории, это имеется ввиду дерево документов? То есть документ физически лежит в одной папке, а через плагин будет засчитано что в двух? Я правильно понял?
avatar
Да. На картинке документ физически в папке «Автосервис», но при выводе будет показан и в «Автозапчасти», «Станции ТО». Чаще всего это для магазинов нужно.
avatar
Еще раз уточню, пока не пробовал — а в категории «Авто и мото» для нашего примера тоже будет показываться? :)
avatar
Зависит от параметра depth.
avatar
Круто, то что нужно в магазах.
Порекомендуйте еще что с магазинов можно использовать, кроме шопкипера.
Немного отошел от modx evo
avatar
А как на счет дублей страниц для SEO? Или в каталоге показывается в разных разделах, а ссылка на товар всегда в одно место? Или используется — rel=«canonical»?
avatar
Ссылка в одно место.
avatar
А как хранится — отдельная таблица, и в ней отдельная строка на каждую связку «категория — ресурс», или опять какой-нибудь «json в одной ячейке»?
avatar
Отдельная таблица, конечно (:
avatar
А хлебные крошки и меню как будут строиться?
avatar
Без учета дополнительных категорий.
avatar
В названии встречается перенос строки тегом br, по этому названия категорий в админке налазят друг на друга, пытался в multicategories/lib/controller.php в вывозе load() добавить $data['pagetitle'] = strip_tags($data['pagetitle']); но не чего не выходит не подскажите как можно решить данный вопрос.

Получилось решить так:
public function load() {
        $id = isset($_POST['id']) ? (int)$_POST['id'] : 0;
        $rid = isset($_POST['rid']) ? (int)$_POST['rid'] : 0;
        $openIds = $this->data->getCategories($rid);
        if (!$id && $openIds) {
            $this->dlParams['openIds'] = implode(',', $openIds);
        }
        if ($id) {
            $this->dlParams['parents'] = $id;
            $this->dlParams['showParent'] = 0;
        }
        $this->dlParams['prepare'] = function(array $data = array()) use ($openIds) {
            $data['state'] = $data['isfolder'] == 1 && !isset($data['children']) ? 'closed' : 'open';
            if (in_array($data['id'], $openIds)) $data['checked'] = true;
            
            $data['pagetitle'] = strip_tags($data['pagetitle']);
            $data['text'] = strip_tags($data['pagetitle']);
            
            return $data;
        };
        $out = json_decode($this->modx->runSnippet('DLMenu', $this->dlParams), true);
        return $out[0];
    }
Комментарий отредактирован 2018-06-18 10:03:51 пользователем shden
avatar
Исправил.
avatar
Здравствуйте!
Подскажите пожалуйста, а что прописать в поле «Controller class» в настройках плагина.
У меня получилось пустое поле во вкладке КАТЕГОРИИ в нужном шаблоне.
Версия DocLister 2.3.16, система Evolution 1.4.5
  • tmih
  • 0
avatar
Может быть что проблема в том, что хостинг, который мне дали для работы с такой версией?
PHP Version = 5.4
Комментарий отредактирован 2018-08-16 16:30:15 пользователем tmih
avatar
Отличная вещь, респект автору!
avatar
Непонятно, как вывести id категорий в одной карточке товара. Нужно для isotope, например
avatar
Как я реализовал вывод категорий в одном элементе:
Резонно предположить, что дергать запрос для каждого элемента — бессмысленно и расточительно.
Поэтому я засунул все связи в массив и в объект modx перед соответствующим вызовом DocLister
$table = $modx->getFullTableName('site_content_categories'); 
$result = $modx->db->select( 'doc, category', $table);
if( $modx->db->getRecordCount( $result ) >= 1 ) {
	$catArr = array();
	while( $row = $modx->db->getRow( $result ) ) { 
		$catArr[$row['doc']][] = $row['category'];
	} 
}
$modx->allcategories = $catArr;


Потом нужен prepare-сниппет, который для каждого документа их оттуда заберет:
$catArr = $modx->allcategories;
$id = $data['id'];
if($catArr[$id]){
	$cats = "cat" . implode(" cat", $catArr[$id]); //это было проще всего
	$data['categories'] = $cats;
}
return serialize($data);


В шаблон одного документа вставил плейсхолдер родителя и категорий


Таким образом добавились классы категорий к элементам, по которым можно сортировать на фронтенде


Код, естественно, немного развернутый и не такой как у меня дословно, но это чтобы было понятно, что откуда берется.
Правки и фиксы приветствуются
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.