[решено] tagManager 2.0 - не заводится, барахлит..

Здравствуйте!

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

tagManager 2.0 — отличное дополнение, которое не хочет работать (с и без шопкипера).




Всё отлично до момента попытки вывода фильтров, выводим:

[[tmFilters?
        &filterOuterTpl=`tpl.tm2.filter-outer`
        &filterTpl=`tpl.tm2.filter-outer-select`
        &filterNumericOuterTpl=`tpl.tm2.filter-outer`
        &filterNumericTpl=`tm2_filterNumericTpl`
        &jsMap=`1`
        &toPlaceholder=`filters`
        ]]
<div class="form-search" id="filters">
    <form action="[[~[[*id]]]]" method="get">
    	
	<input type="hidden" name="page_id" value="[[*id]]" disabled="disabled" />
        
    	[[+filters]]

	  <div class="line text_center">
		  <button type="submit" class="submit">Подобрать</button>
		  <button type="button" onclick="tmFilters.resetFilters(); return false;" class="submit clear">Очистить форму</button>
	  </div>
    </form>
</div><!-- .form-search -->

<div class="item-wrap">


<div id="products">
    [[!tmCatalog?
&tpl=`tpl.mini-cart`
&includeTVs=`1`
&includeTVList=`price,image`
]]
    <div class="clearfix"></div>
</div>

<ul class="pages" id="pages2">
    [[!+page.nav]]
</ul>
Выводим в шаблоне для раздела «поиска/фильтрации».
Сами же документы, которые необходимо фильтровать, находятся в другом контейнере.

Вот что имеем:



если я добавляю еще одно значение (они берутся с tv параметров указанных в документе), то результат огорчает:



он просто добавляет новый селект в список, но при этом все селекторы пусты и имеют лишь значение по умолчанию, которое указывается в шаблоне:

<div class="line">
		<div class="line-name">[[+caption]]</div>
		<div class="line-value">
		<select name="f_[[+name]]">
		<option value="">[[+caption]]</option>
		[[+inner]]
		</select>
		</div>
	</div>

по прежнему я не понимаю, нужно ли в именах tv параметров писать префикс "f_", думаю что это не требуется т.к. в шаблоне он статично введен.

Я в тупике т.к. это очень странно всё, или я что-то упускаю в инструкции:

tagManager 2.0

modx-shopkeeper.ru/

==================================================================

Компонент для фильтрации товаров в каталоге и управления фильтрами.

Функции:

— Управление фильтрами. Изменение порядка сортировки, переименование названий групп фильтров и др.
— Групповое изменение значений доп. параметров товаров.
— Простая фильтрация товаров в каталоге (без ajax).
— Ajax-фильтрация товаров в каталоге с выводом количества найденных товаров по каждому фильтру.
— Динамическое изменение вида вывода товаров (изменение шаблонов).
— Поддержка мультивалютности.

==================================================================

tmFilters — сниппет выводит фильтры. Вызывать кэшированным (без "!").

tmCatalog — сниппет выводит товары каталога и фильтрует. Вызывать не кэшированным (с "!").

Необходимо установить сниппет getProducts (http://modx.com/extras/package/getproducts).

==================================================================

Сниппет tmFilters

Параметры сниппета:

filterOuterTpl — Чанк блоки с фильтрами. По умолчанию — tm2_filterOuterTpl.
filterTpl — Чанк одного фильтра. По умолчанию — tm2_filterTpl.
filterNumericOuterTpl — Чанк блока с фильтрами с числовыми значениями. По умолчанию — tm2_filterOuterTpl.
filterNumericTpl — Чанк фильтра с числовыми значениями. По умолчанию — tm2_filterNumericTpl.
jsMap — Генерация JS-карты данных товаров для возможности вывода количества найденных товаров по каждому фильтру ( 1 — да, 0 — нет). По умолчанию: 0.
toPlaceholder — Имя плейсхолдера для вывода. Если не задано, выводится в месте вызова сниппета.
style — Подключить CSS-файл стилей ( 1 — да, 0 — нет). По умолчанию: 1.
jsScript — Подключить все необходимые JS-скрипты ( 1 — да, 0 — нет). По умолчанию: 1.
filtersType — Тип фильтрации. Возможные значения: filters, filters_simple. По умолчанию: filters.

Используется библиотека jQuery.
Если у вас на сайте уже используется jQuery, повторно она подключаться не будет (сделана автоматическая проверка).

Для тонкой настройки открыть в текстовом редакторе файл
/assets/components/tag_manager2/js/web/filters.js
или
/assets/components/tag_manager2/js/web/filters_simple.js
Настройки вверху, в коде есть комментарии.

Если используется ajax-фильтрация (filtersType = filters), в форму фильтрации добавить скрытое поле (см. пример 3):

/>

Параметр «filters_type» в filters.js
Для «filters_type» = «default» (показ числа товаров по каждому фильтру и блокирование пустых вариантов)
или «only_block» (только блокирование пустых париантов) необходимо включить параметр «jsMap» у сниппета «tmFilters».
Если «filters_type» = «none», «jsMap» рекомендуется выключить.

==================================================================

Сниппет tmCatalog

Сниппет не имеет параметров, т.к. является оберточным сниппетом для «getPage» и «getProducts».
Используются параметры из набора параметров для сниппета «getPage», указанного в настройках системы — tag_mgr2.propertySetName.
Можно указывать параметры для «getPage» и «getProducts».

Пример:

[[!tmCatalog?
&parents=`-1`
&resources=`110,111,112`
&tpl=`product`
]]

В данном случае будут выводиться только товары с ID = 110,111,112.
Можно использовать для поиска, выводить найденные ID товаров с помощью отдельного сниппета и фильтровать найденные товары.

==================================================================

Вывод товаров из таблицы, созданной в MIGXDB (http://modx.com/extras/package/migx)

Если для хранения товаров импользуется отдельная таблица в БД, созданная с помощью MIGXDB,
в настройках компонента «tagManager2» в параметрах «tag_mgr2.className» и «tag_mgr2.packageName» указать
название класса и название компонента вашей таблицы в БД.

Настройки «className» и «packageName» можно указать в параметрах шаблона категории товаров:

1. Открыть шаблон категории товаров.
2. Перейти на вкладку «Параметры».
3. Разблокировать параметры по умолчанию и добавить параметры:
prodClassName — Имя класса таблицы БД (например «ShopContent»).
prodPackageName — Имя пакета таблицы БД (например «shop»).
prodPropertySetName — имя набора параметров для сниппета getPage, который нужно использовать для фильтрации для текущего шаблона (не обязателный параметр).
4. Сохранить изменения.

==================================================================
==================================================================

Множественные значения фильтров

Если нужно сделать возможность задавать множественные значения для параметра, нужно создать TV параметр с типом ввода «Флажки (checkbox)» или «Список (множественный выбор)».
Поле «Возможные значения» заполнить по такому принципу:

акция==#акция#||лидер продаж==#лидер продаж#||новинка==#новинка#

Разделитель "#" можно изменить в конфигурации компонента — tag_mgr2.guard_key.

Имена таких TV нужно указать в скрипте filters.js в массиве
'multitags': ['tag']

— Для множественных значений, созданных через тип ввода «param-edit», если используется MIGX для создания таблицы БД товаров,
в настройках поля (в MIGX) указать:
Input TV = param1 (param1 — название TV с типом ввода «param-edit»)
Input TV type = param-edit

Для MIGX 2.5.8 указание «Input TV» при использовании не стандартных типов ввода обязательно. Возможно в будущих версиях это будет исправлено.

==================================================================
==================================================================

Динамическое изменение шаблона вывода списка товаров

На данный момент сделана готовая возможность изменения шаблона с помошью JS-скрипта /assets/components/tag_manager/js/web/view_switch.js.
Скрипт ставит куку и обновляет вывод.

1. Добавить скрипт на страницу

2. В набор параметров «getPage», который используется для вывода товаров, добавить параметр «tpl_list» со списком шаблонов (чанков) через запятую.
Например: «product,product_list».

3. В тело страницы вставить ссылки для изменения вида. У элемента-контейнера должен быть id=«viewSwitch».

Пример:

Показывать:
 
картинками
 
списком

==================================================================
==================================================================

Мультивалютность

Поддерживается мультивалютность, используемая Shopkeeper. По настройке мультивалютности читать документацию Shopkeeper.

Для работы tagManager с мультивалютностью необходимо выполнить:

1. Если используется аякс-фильтрация, открыть в текстовом редакторе /assets/components/tag_manager2/js/web/filters.js
и включить мультивалютность — multi_currency = true.
2. В этом же файле указать правильное название TV параметра или поля с ценой — price_field.
3. В настройках системы в параметре tag_mgr2.priceName нужно указать название TV параметра или поля с ценой (по умолчанию «price»).
4. Версия Shopkeeper должна быть не меньше 2.3.4.

==================================================================
==================================================================

Стилизация селектов

Для стилизации селектов рекомендуется использовать jQuery-плагин SelectBoxIt — gregfranko.com/jquery.selectBoxIt.js/index.html.
Данный плагин поддерживается tagManager.

Пример подключение стиля и скриптов SelectBoxIt:

/>

==================================================================
==================================================================

Пример 1. Простая фильтрация с чекбоксами (множественный выбор).

[[tmFilters?
&filterOuterTpl=`tm2_filterOuterTpl`
&filterTpl=`tm2_filterTpl`
&filterNumericOuterTpl=`tm2_filterOuterTpl`
&filterNumericTpl=`tm2_filterNumericTpl`
&filtersType=`filters_simple`
&toPlaceholder=`filters`
]]


Сортировать по:
названию
цене
дате

В порядке:
возрастания
убывания

Выводить по:
10
20
40



[[+filters]]

Подобрать
Сбросить


==================================================================

[[!tmCatalog]]


    [[!+page.nav]]
==================================================================
==================================================================

Пример 2. Сортировка отдельно от формы фильтров. Простая фильтрация с фильтрами в виде выпадающих списков (одиночный выбор).


/>
/>
/>

[[tmFilters?
&filterOuterTpl=`tm2_filterOuterTpl_select`
&filterTpl=`tm2_filterTpl_select`
&filterNumericOuterTpl=`tm2_filterOuterTpl`
&filterNumericTpl=`tm2_filterNumericTpl`
&filtersType=`filters_simple`
]]

Подобрать
Сбросить


==================================================================


по названию
по цене
по дате

 
по возростанию
по убыванию

 
10
20
40




[[!tmCatalog]]


    [[!+page.nav]]
==================================================================
==================================================================

Пример 3. Ajax-фильтрация, сортировка отдельно от формы фильтров.

[[tmFilters?
&filterOuterTpl=`tm2_filterOuterTpl`
&filterTpl=`tm2_filterTpl`
&filterNumericOuterTpl=`tm2_filterOuterTpl`
&filterNumericTpl=`tm2_filterNumericTpl`
&jsMap=`1`
&toPlaceholder=`filters`
]]


/>

[[+filters]]

Сбросить


==================================================================


по названию
по цене
по дате

 
по возростанию
по убыванию

 
4
10
20
40




[[!tmCatalog]]


    [[!+page.nav]]
— Вопрос на офф форуме: без ответа (на данный момент)
Павел Левин
24 июня 2014, 19:07
modx.pro
8 123
+1

Комментарии: 17

Василий Наумкин
25 июня 2014, 05:23
0
Тут, наверное, только автор дополнения сможет помочь — компонент вроде бы еще в разработке.

Я могу только посоветовать потестировать mSearch2 — он умеет работать с ТВ и, соответственно, с Shopkeeper.
    Павел Левин
    25 июня 2014, 12:11
    0
    Я думал о нем, но там не понятно на сколько он удобен для конечного пользователя, сможет ли заказчик контролировать выводимые значения и возможно ли выводить все доступные значения в select… пожалуй нужно зайти на тестовый сайт глянуть возможности.

    По сути это простой сайт, где есть каталог техники и возможность фильтрации.
    tagManager 2.0 — как раз узкопрофильно подходит к этой задаче без перегрузки функционала.

    Буду ждать помощи на офф форму, мне показалось меня там не любят с первого поста =) или вопрос на столько туп, что на него не хотят обращать внимание. Перекопал весь форму, аналогичного вопроса нет.
      Василий Наумкин
      25 июня 2014, 21:24
      +1
      mSearch2 нужно настроить один раз, а дальше он генерирует все фильтры динамически, исходя из параметров выводимых ресурсов.
      То есть, что выводит — так и строит фильтры, в админке ничего делать не нужно.

      Учитывая, что компонент осуществляет морфологический поиск и фильтрацию найденного, заранее создавать фильтры в принципе нельзя — никто не знает, что будет найдено.

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

      Документация — docs.modx.pro/components/msearch2/
        Павел Левин
        25 июня 2014, 23:11
        0
        Глянул mFilter2 и не увидел возможности выводить данные в select ну, а остальные возможности плагина не требуются.

        Попытался запустить его на тестовом… повозился, потыкал, не получилось и успокоился.
        Возможно придется мудрить что-то своё или ковырять дальше tagManager.

        Спасибо.
          Игорь
          25 июня 2014, 23:20
          0
          На самом деле если надо примерно так, как у меня вот тут, то проще руками написать. tagManager2 хорош для фасетного поиска (это когда ajax и с циферками по количеству возможных вариантов для каждого значения параметра), а если планируется выводить ТВ в селекты, то, как я понимаю, никакого фасетного поиска не требуется.
      Игорь
      25 июня 2014, 19:02
      0
      Недавно как раз разбирался с этим компонентом.
      Насколько я понял, выводить фильтр в документе можно только для тех товаров, которые физически вложены в него. В вашем случае надо весь каталог перенести в документ Поиск техники, чтобы все фильтруемые товары были вложены именно в него. А фильтровать в одном документе товары из другого контейнера нельзя. Опять таки, это мои догадки, но их подтверждают факты.
        Павел Левин
        25 июня 2014, 20:53
        0
        Да, я так же думал, но оказалось, что и это не помогает, я попросту перекинул шаблоны с вызовом данного фильтра в основной каталог, результата не дало никакого. Всё 1 в 1, два региона 0 данных в селекторе.

        Сверх странности)
          Игорь
          25 июня 2014, 21:17
          0
          Я буквально в понедельник настраивал у себя, все работало, ajax-фильтрация функционировала.
          Правда я в последствии отказался от использования компонента, ибо он не подходит по ряду критериев, но его корректную работу я у себя настраивал.
          А в файле assets/components/tag_manager2/js/web/filters.js или assets/components/tag_manager2/js/web/filters_simple.js и в настройках системы параметры настраивали?
        Павел Левин
        25 июня 2014, 21:25
        0
        Залез в код, вывел массив:

        Array
        (
            [id] => 1
            [tvid] => 1
            [tvname] => mark
            [tvcaption] => Марка
            [tags] => Array
                (
                    [0] => Array
                        (
                            [value] => Камаз
                            [active] => 1
                        )
        
                )
        
            [index] => 0
        )
        Array
        (
            [id] => 2
            [tvid] => 2
            [tvname] => capacity
            [tvcaption] => Грузоподъемность
            [tags] => Array
                (
                    [0] => Array
                        (
                            [value] => 3000
                            [active] => 1
                        )
        
                )
        
            [index] => 1
        )
        Array
        (
            [id] => 3
            [tvid] => 3
            [tvname] => lease
            [tvcaption] => Срок аренды
            [tags] => Array
                (
                    [0] => Array
                        (
                            [value] => 90
                            [active] => 1
                        )
        
                )
        
            [index] => 2
        )
        Array
        (
            [id] => 4
            [tvid] => 4
            [tvname] => kind
            [tvcaption] => Вид техники
            [tags] => Array
                (
                    [0] => Array
                        (
                            [value] => 7
                            [active] => 1
                        )
        
                )
        
            [index] => 3
        )
        Array
        (
            [id] => 6
            [tvid] => 6
            [tvname] => region
            [tvcaption] => Регионы
            [tags] => Array
                (
                    [0] => Array
                        (
                            [value] => Москва||Московская область
                            [active] => 1
                        )
        
                    [1] => Array
                        (
                            [value] => Тюмень
                            [active] => 1
                        )
        
                )
        
            [index] => 4
        )
        Array
        (
            [id] => 9
            [tvid] => 9
            [tvname] => model
            [tvcaption] => Модель
            [tags] => Array
                (
                    [0] => Array
                        (
                            [value] => 5050
                            [active] => 1
                        )
        
                )
        
            [index] => 5
        )
        Array
        (
            [id] => 10
            [tvid] => 10
            [tvname] => year
            [tvcaption] => Год выпуска
            [tags] => Array
                (
                    [0] => Array
                        (
                            [value] => 2010
                            [active] => 1
                        )
        
                )
        
            [index] => 6
        )
        т.е. значения там имеются, просто не хотят выводиться, кусок кода который отправляет значения в чанк:

        /**
             * getFiltersOutput
             *
             */
            public function getFiltersOutput(){
                
                $output = '';
                
                $tags_names_arr = array();
                $c_ids = $this->getCateroryIds();
                
                //Если для текущей категории нет сохраненных фильтров, ищем сохраненные в родительских
                if(!in_array($this->config['categoryId'], $c_ids)){
                    
                    $this->getParentSiblingId($c_ids);
                    
                }
                
                $c = $this->modx->newQuery('tagManager');
                $c->where(array(
                    'category' => $this->config['categoryId']
                ));
                $c->sortby('`index`','ASC');
                $c->select(array('id','tvid','tvname','tvcaption','tags','index'));
                if ($c->prepare() && $c->stmt->execute()) {
                    
                    while ($row = $c->stmt->fetch(PDO::FETCH_ASSOC)) {
                        
                        $inner_out = '';
                        $row['tags'] = $row['tags'] ? json_decode($row['tags'],true) : array();
                        
                        $is_numeric = in_array( $row['tvname'], $this->config['numericFields'] ) && count($row['tags']) >= 2;
                        $is_multitag = in_array( $row['tvname'], $this->config['multitagsFields'] );
                        $flt_field_name = $is_multitag ? 'f_'.$row['tvname'].'[like][]' : 'f_'.$row['tvname'].'[]';
                        
                        if(!in_array( $row['tvname'], $tags_names_arr )) array_push( $tags_names_arr, $row['tvname'] );
                        
                        //if is numeric
                        if( $is_numeric ){
                            
                            $chunk_name_outer = $this->config['filterNumericOuterTpl'];
                            $chunk_name = $this->config['filterNumericTpl'];
                            
                            $chunkArr = array(
                                'name' => $row['tvname'],
                                'min' => ( $row['tags'][0]['active'] ? $row['tags'][0]['value'] : '0' ),
                                'max' => ( $row['tags'][1]['active'] ? $row['tags'][1]['value'] : '0' ),
                                'idx' => $key
                            );
                            
                            $inner_out .= $this->modx->getChunk( $chunk_name, $chunkArr );
                            $inner_out .= "\n";
                            
                        }else{
                            
                            $chunk_name_outer = $this->config['filterOuterTpl'];
                            $chunk_name = $this->config['filterTpl'];
                            
                            foreach($row['tags'] as $key => $val){
                                
                                if($val['active']){
                                    $chunkArr = array(
                                        'name' => $row['tvname'],
                                        'flt_name' => $flt_field_name,
                                        'value' => str_replace('&','_n_',$val['value']),
                                        'value_name' => htmlspecialchars($val['value']),
                                        'idx' => $key
                                    );
                                    
                                    $inner_out .= $this->modx->getChunk( $chunk_name, $chunkArr );
                                    $inner_out .= "\n";
                                }
                                
                            }
                        }
                        
                        $chunkArr = array(
                            'name' => $row['tvname'],
                            'flt_name' => $flt_field_name,
                            'caption' => $row['tvcaption'],
                            'inner' => $inner_out
                        );
                        
                        $output .= $this->modx->getChunk( $chunk_name_outer, $chunkArr );
                        $output .= "\n";
                        
                        //echo '<pre>'.print_r($row, true).'</pre>';
                        
                    }
                    
                }
                
                if( $this->config['jsMap'] ) $output .= $this->generateJSMap($tags_names_arr);
                
                return $output;
                
            }
          Игорь
          25 июня 2014, 21:34
          0
          Даже не знаю, что сказать, я так глубоко компонент не копал :)
          Просто настроил все необходимые параметры в .js файлах filters и в настройках системы.
          Все tpl для вывода фильтров я оставлял по умолчанию. Вы свои подставляете или тоже по умолчанию берете? Может в них какой-нибудь плейсхолдер не указан?
            Павел Левин
            25 июня 2014, 21:42
            0
            Настройки системы? Я ничего не настраивал нигде т.к. настройка требуется только для работы с шопкипером, я же не использую его.
              Игорь
              25 июня 2014, 21:53
              0
              Думаю, что все-таки стоит туда заглянуть. В моем случае настройки выглядели вот так


              Настройки
              В принципе их назначение понятно из названий
                Павел Левин
                25 июня 2014, 23:08
                0
                Да, ради интереса поставил данные туда, думаю это не критичные параметры.

                Результат не изменился. Вся надежда на разработчика.

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

                  Игорь
                  25 июня 2014, 23:14
                  0
                  На Салютлэнде, как я и писал, я потестировал компонент и отказался от него, написав фильтр руками, ибо кое-что не подходило под нужды сайта. Но компонент работал, и селекты как раз у меня и использовались. Фильтр был тут ссылка, в блоке слева.
                  Если завтра будет время, то с утра создам тестовый раздел и прикручу туда tagManager2 для демонстрации.
                    Павел Левин
                    25 июня 2014, 23:34
                    0
                    Всё! Разобрался, косяк был мой т.к. я неверное подставил мои шаблоны для фильтров tm2_filterTpl_select.tpl и tm2_filterOuterTpl_select.tpl я там намудрил в чанках и неправильно подставил новые шаблоны в параметры, от сюда такой разрыв мозга =) жесть.

                    Помогла наблюдательность, смотрел дефолтные шаблоны и заподозрил косяк).

                    Здорово! Круть.
                      Игорь
                      25 июня 2014, 23:42
                      0
                      Вот и хорошо! ;)
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          17