Приветствую!
Необходимо написать несколько простых фильтров для mFilter2:
1) Фильтр для выбора дорогой и дешевой недвижимости по TV-полю «цена» (по-сути аналог boolean). При этом объекты, у которых цена не указана должны отображаться и там и там.
2) Фильтр кол-ва комнат. Задача, чтобы отображались значения «1», «2», «3», «4+». Т.е. все объекты со значением 4 и больше должны группироваться в один параметр «4+».
Цена договорная. При знании темы работы на час максимум.
Вот что имеется:
1) по дорогой и дешевой недвижимости фильтр есть, но он не отображает товары без цены:
<?php
class myCustomFilter extends mse2FiltersHandler {
public function buildClassFilter(array $values) {
if (count($values) < 2 && empty($this->config['showEmptyFilters'])) {
return array();
}
$results = array();
$this->modx->lexicon->load('aveo:default');
foreach ($values as $value => $ids) {
$chip = empty($value) || (is_numeric($value) && (int)$value <= 340000);
$title = $chip
? $this->modx->lexicon('affordable')
: $this->modx->lexicon('elite');
if (!isset($results[$title])) {
$results[$title] = array(
'title' => $title,
'value' => (int)!$chip,
'type' => 'class',
'resources' => $ids
);
}
else {
$results[$title]['resources'] = array_merge($results[$title]['resources'], $ids);
}
}
return $this->sortFilters($results, 'class', array('name' => $name));
}
public function filterClass(array $requested, array $values, array $ids) {
$matched = array();
$tmp = array_flip($ids);
foreach ($requested as $value) {
foreach ($values as $k => $resources) {
$chip = empty($k) || (is_numeric($k) && (int)$k <= 340000);
if ((empty($value) && !$chip) || (!empty($value) && $chip)) {
continue;
}
foreach ($resources as $id) {
if (isset($tmp[$id])) {
$matched[] = $id;
}
}
}
}
return $matched;
}
2) По фильтру кол-ва комнат сейчас группируются они так:
public function buildBedroomsFilter(array $values) {
if (count($values) < 2 && empty($this->config['showEmptyFilters'])) {
return array();
}
$results = array();
foreach ($values as $value => $ids) {
$many = (is_numeric($value) && (int)$value >= 4);
$title = !$many ? $value : '4+';
$value = !$many ? $value : '4';
if (!isset($results[$title])) {
$results[$title] = array(
'title' => $title,
'value' => $value,
'type' => 'bedrooms',
'resources' => $ids
);
}
else {
$results[$title]['resources'] = array_merge($results[$title]['resources'], $ids);
}
}
return $this->sortFilters($results, 'bedrooms', array('name' => $name));
}