Всего 125 947 комментариев

Сергей Лим
03 ноября 2022, 21:47
0
Через другой селектор сделал и получилось. С меня лайки, большое спасибо
А как вы изменили их? Через aliases не помогло
Василий Наумкин
03 ноября 2022, 21:26
0
Чтоб найти что-то в интернете нужно знать нужные слова :-). Проблема фильтрации в интернет-магазинах называется фасетный поиск. И yandex.ru/search/?text=Фасетный поиск дает уже кучу информации как его организовывать.
Я честно не знал, что это такое, когда писал. И не гуглил =)

В основном применяются специальные базы данных Sphinx/ElasticSearch/etc.
Которые так просто на любом PHP хостинге не запустишь. А это необходимо, если ты поставляешь дополнение для работы в MODX.

Тонкости фасетного поиска на массивах, таких же как применил @Василий Наумкин в mFilter2, описаны в статье История разработки фасетного поиска средствами PHP. И текущему автору mSearch2 стоит ее прочитать :-).
Текущему автору — возможно. А я писал mFilter2 в 2013 году и прочитать эту заметку не мог. Теперь могу, так что сохранил ссылку в закладках на будущее, спасибо!

P.S. Кстати, я продолжаю писать фасетный поиск, но уже на Vue и не универсально, а под проект. Самый свежий можно потыкать вот здесь — lehre.lu/map
Артур Шевченко
03 ноября 2022, 21:08
+2
Потому что #mse2_tv|withinstallation_0 невалидный селектор
Сергей Лим
03 ноября 2022, 21:05
0
<script>
$(document).ready(function() {
$("#mse2_tv|withinstallation_0").prop("checked",true);
$("#mse2_tv|withinstallation_0").trigger("change");

};
</script>
Не срабатывает почему то
Артур Шевченко
03 ноября 2022, 20:44
+1
Я только что проверил. всё работает.
1. Выбираем фильтр
$('#mse2_ms-room_0').prop('checked', true);
2. Триггерим изменение
$('#mse2_ms-room_0').trigger('change');
Артур Шевченко
03 ноября 2022, 20:32
+1
Сдаётся мне, вы что-то делаете не так.
Сергей Лим
03 ноября 2022, 20:30
0
Вот так я пытался сделать, но страница тоже начинает бесконечно перезагружаться от того, что меняется url
Загрузка страницы->смена url->загрузка страницы и тд
Артур Шевченко
03 ноября 2022, 20:27
+1
Ну ок, если не получается через ссылку, можно вывести параметры в скрытый инпут, при загрузке страницы получать м помощью JS эти параметры и активировать соответствующие фильтры
Сергей Лим
03 ноября 2022, 20:17
0
Не очень понял, мне надо, чтобы не по одной ссылке открывалась страница с нужными параметрами, а в принципе. И у каждой страницы где есть фильтр, по умолчанию выбираться будут разные фильтры
Артур Шевченко
03 ноября 2022, 20:13
+1
А зачем в замороженном url? Что мешает передать параметры в шаблон через TV например и добавить к ссылке?
Сергей Лим
03 ноября 2022, 20:04
0
Я пробовал в замороженном url добавить параметры, но страница при открытии уходит в бесконечный редирект
Артур Шевченко
03 ноября 2022, 20:00
+1
Если используете mFilter2, то просто передайте нужные фильтры в get параметрах должно сработать.
Артур Шевченко
03 ноября 2022, 19:59
0
а как имеено получит массив
Получить массив где?
Алексей Смирнов
03 ноября 2022, 16:05
0
Ну array показывается если вы переменную не верно выводите. попробуйте так:
$title=$_POST['title'];
<pre>
print_r($title);
</pre>
ВитОс
03 ноября 2022, 15:26
0
спасибо за ответ сделал так
....
<input type="text" value="[[!+title]]" class="form-control" id="title" name="title[]" placeholder="79991112233">
...
сниппет
...
<?
$title=$_POST['title'];

$title=implode(",",$title);
..
в таком примере пр выводе $title выводяться все значения поля перез замятую, а как имеено получит массив (вида Array([0] => 1 [1] => 2))
потому что сейчас в $title=$_POST['title']; показывается просто Array?
Alexey
03 ноября 2022, 14:19
0
Чтобы совсем было красиво, добавил в сниппет сортировку после $q->where(['id:IN' => $arr]);:

$q->sortby('FIELD(modResource.id, ' . implode(',', $arr) . ' )');
Максим
03 ноября 2022, 14:16
0
Странно что у вас получились цифры под 39 сек для 11к товаров. — у вас что-то не то с БД.
Может просто проиндексировать БД надо? Там вроде в настройках mFilter что-то такое было.
Возможно, из-за этого такая цифра.
Артур Шевченко
03 ноября 2022, 14:10
0
$modifications = $modx->getObject('msopModification', array('article'=> $cellY[0] );
foreach($modifications as $modification){
// тут остальное
}
Алексей Смирнов
03 ноября 2022, 13:13
0
Лимит искать? Сомневаюсь что в поле накликают больше 50 категорий. Но если надо можно и до 100ки.
Этот лимит только для одного поля ввода. Так что должно хватить с лихвой.
Alexey
03 ноября 2022, 13:00
+1
Алексей, прямо в точку, ещё раз спасибо, что помогли разобраться с «большим и страшным»©. Про доп параметр сниппета я протупил, конечно, мог бы и сам догадаться.

В итоге, сниппет для вывода названий ресурсов вместо id у меня получился такой:

if (strpos($data,'[[+') === false){
    $titles = [];
    $q = $modx->newQuery('modResource');
    $q->where(['id' => $data]);
    $q->select('pagetitle');
    if ($q->prepare() && $q->stmt->execute()) {
    	$titles = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
    }
    return $titles[0];
} else {
    $out = '';
    
    $limit = 50;
    $namex = str_ireplace([ '[[+',']]' ], '', $data);
    for($i = 0; $i < $limit; $i++){
        if ($modx->getPlaceholder($namex . '.' . $i) != '') {
            $arr[] = $modx->getPlaceholder($namex . '.' . $i);
        }
    }
    if(count($arr)) {
        $q = $modx->newQuery('modResource');
        $q->where(['id:IN' => $arr]);
        $q->select('pagetitle');
        if ($q->prepare() && $q->stmt->execute()) {
        	$titles = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
        }
        if(count($titles)) {
            $out = implode(', ', $titles);
        }
    }
    return $out;
}

Остается лишь переменную $limit как-то динамически найти. У меня получилось только доп запросом к БД по нужным параметрам выборки, других вариантов не увидел. Ну, или если заведомо количество категорий ограничено, то — возможно — проще захардкодить так