Павел Левин

Павел Левин

Был в сети 23 августа 2022, 00:55
Заказы не принимаю
Та не вопрос. Простой сниппет, код поймет любой.

Имя сниппета: linkGen

Код сниппета:

<?php
if (!isset($input)) {return;}
if (!isset($resource)) {$resource = '/poisk-tehniki.html';}

$array = explode(", ", $input);

$result = '';

if ($array == false) {
    $result = '<a href="'.$resource.'?f_'.$name.'='.$input.'">'.$input.'</a>';
} else {
   foreach ($array as $key => $value) {
        $result .= ($key==0?'':', ').'<a href="'.$resource.'?f_'.$name.'='.$value.'">'.$value.'</a>';
   } 
}

return $result;

Пример вызова:
[[*region:linkGen]]

До:
Москва, Краснодар

В modx хранится так:
Москва||Краснодар
параметр вывода tv, «Разделитель» где значение ", "

После:
<a href="/poisk-tehniki.html?f_region=Москва">Москва</a>, <a href="/poisk-tehniki.html?f_region=Краснодар">Краснодар</a>


или

Пример вызова:
[[*year:linkGen]]

До:
2009

После:
<a href="/poisk-tehniki.html?f_year=2009">2009</a>
Всё! Разобрался, косяк был мой т.к. я неверное подставил мои шаблоны для фильтров tm2_filterTpl_select.tpl и tm2_filterOuterTpl_select.tpl я там намудрил в чанках и неправильно подставил новые шаблоны в параметры, от сюда такой разрыв мозга =) жесть.

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

Здорово! Круть.
Глянул mFilter2 и не увидел возможности выводить данные в select ну, а остальные возможности плагина не требуются.

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

Спасибо.
Да, ради интереса поставил данные туда, думаю это не критичные параметры.

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

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

Залез в код, вывел массив:

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;
        
    }
Да, я так же думал, но оказалось, что и это не помогает, я попросту перекинул шаблоны с вызовом данного фильтра в основной каталог, результата не дало никакого. Всё 1 в 1, два региона 0 данных в селекторе.

Сверх странности)
Я думал о нем, но там не понятно на сколько он удобен для конечного пользователя, сможет ли заказчик контролировать выводимые значения и возможно ли выводить все доступные значения в select… пожалуй нужно зайти на тестовый сайт глянуть возможности.

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

Буду ждать помощи на офф форму, мне показалось меня там не любят с первого поста =) или вопрос на столько туп, что на него не хотят обращать внимание. Перекопал весь форму, аналогичного вопроса нет.