Оптимальный метод для фильтрации ссылок, которые имеют родительско-дочерние зависимости и фиксированные позиции URL - PullRequest
0 голосов
/ 22 октября 2018

В настоящее время я создаю сайт по недвижимости с использованием CodeIgniter.Из-за планирования цифрового маркетинга у меня есть фиксированная структура для URL, которая следует этому набору правил:

root            /properties/
region name     (all-regions|region-1|...|region-n)/
operation       (all-operations|sale|rent|transfer|vacational-rent)/
property type   (all-property-types|house|apartment|...)/
price range     from-(:num)-to-(:num)/
city            (:any)/
neighborhood    (:any)

Итак, так я обрабатываю свои маршруты для CodeIgniter, и это работает.

Правила таковы:

  • Region является родительским для City, а City является родительским для Neighborhood, идея состоит в том,что если Region не выбрано City не отображается и если City не выбрано Neighborhood не отображается.
  • Иерархия для этого выглядит примерно так: Region -> City -> Neighborhood так что, если, скажем,Neighborhood был выбран, как только я удаляю City окрестности также удаляются, и если я удаляю Region, удаляются и City, и Neighborhood.
  • Operation является родительским для Price rangeТаким образом, он работает так же, как и выше, если не выбран Operation, не отображается Price range, и если я удаляю Operation в качестве фильтра, если был активен Price range, он также удаляется.

Мои начальные параметры фильтра:

  • Регион
  • Операция
  • Тип свойства

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

Дополнительные данные о том, как создаются ссылки:

  • Состояние по умолчанию: /properties
  • Если я выберу регион: /properties/region-1
  • Если я выберу регион и операцию: /properties/region-1/sale

НО также может случиться так, что пользователь сразу перейдет к операции или типу свойства, и тогда у меня будетчто-то вроде этого:

  • Нет региона, операция: /properties/all-regions/sale
  • Нет региона, нет операции, тип свойства: /properties/all-regions/all-operations/house

ЭТО также может произойти так:

  • Регион, без операции, без типа собственности, без ценового диапазона, город: /properties/region-1/all-operations/from-0-to-1000000000/all-property-types/city-1

Что я испытываю трудности, так это то, что процесс генерации ссылок и генерации ссылок удаления параметров становится достаточно динамичным, не возвращаясь к множеству условий на основе активных и неактивных фильтров.Я также ищу оптимальный способ загрузки содержимого фильтра и условия для его правильного отображения и с правильно сформированными ссылками.

В настоящее время у меня есть таблица базы данных Filters, которая содержит следующие поля:

  • ID фильтра
  • Имя фильтра
  • Slug фильтра
  • Id Parent Filter (0 для основного фильтра, ID фильтра родителя для дочерних фильтров)
  • Наименование процедуры (на данный момент функции моей модели фильтров в CodeIgniter
  • Порядок появления (только для визуального заказа фильтров)

У меня сейчас есть функциякоторый получает параметры фильтра функции и классифицирует их, что-то вроде этого:

public function index($region_slug = null, $operation_slug = null, $property_type_slug = null, $price_range_min = null, $price_range_max = null, $city_slug = null, $neighborhood_slug = null) {
    $this->data->filters = $this->filters_m->get_filter_data($region_slug, $operation_slug, $property_type_slug, $price_range_min, $price_range_max, $city_slug, $neighborhood_slug);
    ........
}

In Filters_m.php:

public function get_filter_data(........ // parameters mentioned above)
{
if($region_slug == 'all-regions') {
    $region_slug = null;
}

if($operation_slug == 'all-operations') {
    $operation_slug = null;
}

if($property_type_slug == 'all-property-types') {
    $property_type_slug = null;
}

$filter_data = array(
    array('reach' => 'region', 'value' => $region_slug, 'show' => ($region_slug ? false : true)),
    array('reach' => 'operation', 'value' => $operation_slug, 'show' => ($operation_slug ? false : true)),
    array('reach' => 'property_type', 'value' => $property_type_slug, 'show' => ($property_type_slug ? false : true)),
    array('reach' => 'price_range_min', 'value' => $price_range_min, 'show' => (($operation_slug && !$price_range_min && !$price_range_max) ? true : false), 'parent' => 'operation'),
    array('reach' => 'price_range_max', 'value' => $price_range_max, 'show' => (($operation_slug && !$price_range_min && !$price_range_max) ? true : false), 'parent' => 'operation'),
    array('reach' => 'city', 'value' => $city_slug, 'show' => (($region_slug && !$city_slug) ? true : false), 'parent' => 'state'),
    array('reach' => 'neighborhood', 'value' => $neighborhood_slug, 'show' => (($region_slug && $city_slug && !$neighborhood_slug) ? true : false), 'parent' => 'city', 'top_parent' => 'region')
);
......
}

После этого (.....), я сканирую массив с помощью foreach и разделяю их в массиве, который имеет два основных индекса: active и inactive в зависимости от значения фильтров.

Я создалфункция, которая получает какой параметр тo удалить из активных фильтров на основе параметра досягаемости и переместить индекс в неактивные фильтры и сбросить активный индекс.

Какие-либо рекомендации по улучшению этого или некоторого метода, чтобы сделать его более динамичным?Я думал о подготовке специальной структуры данных для этого, но я не уверен, что это решит мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...