Наверх

mFilter2. принцип OR поменять на AND

В разделе «Репосты» расположены чужие статьи, которые мне понравились или показались полезными.

1. Меняем класс обработчик фильтров. Идем в настройки системы и в настройках mSearch2 меняем параметр mse2_filters_handler_class на CustomFilter

2. Теперь нам нужно создать сам класс. Для этого создаем файл core/components/msearch2/custom/filters/custom.class.php с содержимым

<?php
class CustomFilter extends mse2FiltersHandler {

    public function getMsOptionMyValues(array $keys, array $ids) {
		$filters = array();
		$q = $this->modx->newQuery('msProductOption');
		$q->where(array('product_id:IN' => $ids, 'key:IN' => $keys));
		$q->select('`product_id`,`key`,`value`');
		$tstart = microtime(true);
		if ($q->prepare() && $q->stmt->execute()) {
			$this->modx->queryTime += microtime(true) - $tstart;
			$this->modx->executedQueries++;
			while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
				$value = trim($row['value']);
				if ($value == '') {continue;}
				$key = $row['key'];
				// Get ready for the special options in "key==value" format
				if (strpos($value, '==')) {
					list($key, $value) = explode('==', $value);
					$key = preg_replace('/\s+/', '_', $key);
				}
				// --
				if (isset($filters[$key][$value])) {
					$filters[$key][$value][] = $row['product_id'];
				}
				else {
					$filters[$key][$value] = array($row['product_id']);
				}
			}
		}
		else {
			$this->modx->log(modX::LOG_LEVEL_ERROR, "[mSearch2] Error on get filter params.\nQuery: ".$q->toSql()."\nResponse: ".print_r($q->stmt->errorInfo(),1));
		}
		return $filters;
	}

	public function buildDefaultMyFilter(array $values, $name = '') {
		if (count($values) < 2 && empty($this->config['showEmptyFilters'])) {
			return array();
		}
		$results = array();
		foreach ($values as $value => $ids) {
			$results[$value] = array(
				'title' => $value
				,'value' => $value
				,'type' => 'default'
				,'resources' => $ids
			);
		}
		ksort($results);
		return $results;
	}
	

    public function filterDefaultMy(array $requested, array $values, array $ids) {
		$matched = array();
		$tmp = array_flip($ids);
		foreach ($requested as $value) {
			if (isset($values[$value])) {
				$resources = $values[$value];
				foreach ($resources as $id) {
					if (isset($tmp[$id])) {
						$matched[] = $id;
					}
				}
			}
		}
		
	    $match = $matched;
		$matched = array();
		$count = count($requested);
		$count_values = array_count_values($match);
		foreach ($count_values as $id => $value) {
		    if ($value >= $count) {
		        $matched[] = $id;
		    }
		    else {
		        $matched[] = 0;
		    }
		}
		return $matched;
	}
	
}
осталось добавить в чанк вызова мфильтра строчку

&filters=`
		msoption|tags:DefaultMy`

вуаля — фильтр работает как нужно ;)

Источник: https://modx.pro/work/6040-mfilter2-principle-or-change-to-and-3000r/#comment-42967


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

  1. Сергей 30 мая 2018, 10:56 # 0
    Спасибо!
    1. Андрей 08 июля 2019, 22:25 # 0
      Илья, подскажите, каким образом у вас реализована подсветка кода на фронте? Пытался prism подключить — ничего не получается. В редакторе TinyMCE RTE код подсвечивается отлично, на фронте все в одну строку и без подсветки.
      1. Илья Уткин 09 июля 2019, 09:42 # 0
        Я статьи без редактора пишу — у меня редактор MarkItUp. А на фронте подсветка с помощью prettify.
      2. @extrabash 29 августа 2022, 15:18 # 0
        Если оставить suggestions, работать будет неправильно.
        Логику подсчета товаров нужно будет изменить.

        github.com/Extrabash/modx_msearch2_filters_custom/blob/main/public_html/core/components/msearch2/custom/filters/custom.class.php
        1. Илья Уткин 05 сентября 2022, 08:58(Комментарий был изменён) # 0
          Спасибо за дополнение

        Авторизация

        через сервис Loginza:


        Шаблоны MODX

        1 2 Дальше »

        Объектная
        модель
        MODX