mFilter2 - из метода boolean убрать значение "нет"

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

Помогите, пожалуйста, доработать метод фильтрации. У товара есть поле ms|favorite. У некоторых товаров это поле отмечено (чекбокс). Нужно в фильтре вывести только одну галочку, по клику на которую бы фильтровались товары. Можно выводить методом boolean, но тогда будет выбор «да» и «нет».

Нашел направление, куда копать.

Создал новый метод Positive, присвоил:

&filters=`ms|favorite:positive`
Но дальше эксперименты-правки не увенчались успехом.

Грубо говоря, из метода boolean, который я взял за основу, нужно убрать те варианты, где поле не отмечено (нулевое?). Далее чистый boolean с исправленными названиями на positive.

<?php
class myCustomFilter extends mse2FiltersHandler {
	public function buildPositiveFilter(array $values, $name = '') {
		if (count($values) < 2 && empty($this->config['showEmptyFilters'])) {
			return array();
		}
		$results = array();
		foreach ($values as $value => $ids) {
			$empty = empty($value) || (is_numeric($value) && (int)$value === 0);
			$title = $empty
				? $this->modx->lexicon('mse2_filter_positive_no')
				: $this->modx->lexicon('mse2_filter_positive_yes');
			if (!isset($results[$title])) {
				$results[$title] = array(
					'title' => $title,
					'value' => (int)!$empty,
					'type' => '<b>positive</b>',
					'resources' => $ids,
				);
			}
			else {
				$results[$title]['resources'] = array_merge($results[$title]['resources'], $ids);
			}
		}
		ksort($results);

		return $results;
	}
 	public function filterPositive(array $requested, array $values, array $ids) {
		$matched = array();

		$tmp = array_flip($ids);
		foreach ($requested as $value) {
			foreach ($values as $k => $resources) {
				$empty = empty($k) || (is_numeric($k) && (int)$k === 0);
				if ((empty($value) && !$empty) || (!empty($value) && $empty)) {
					continue;
				}
				foreach ($resources as $id) {
					if (isset($tmp[$id])) {
						$matched[] = $id;
					}
				}
			}
		}

		return $matched;
	}
}
Мартин Очоа
30 октября 2017, 20:06
modx.pro
2
1 597
0

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

Илья Уткин
31 октября 2017, 11:17
2
+4
Я делал так:

Чанк outer для фильтра:
<div id="mse2_[[+table]][[+delimeter]][[+filter]]">
    [[+rows]]
</div>

Чанк rows для фильтра:
{if $idx == 0}
      <label for="mse2_[[+table]][[+delimeter]][[+filter]]_[[+idx]]">
        <input type="checkbox" name="[[+filter_key]]"
          id="mse2_[[+table]][[+delimeter]][[+filter]]_[[+idx]]"
          value="[[+value]]" [[+checked]] [[+disabled]]/> [[+title]] <sup>[[+num]]</sup>
      </label>
{/if}

То есть, тупо не показываю вторую галочку.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
2