Шаг 1: Подготовка базы данных
Убедитесь, что у вас есть таблица sukko_virtuemart_apartment_availabilities
с данными о занятости квартир. Структура таблицы должна быть такой:
CREATE TABLE sukko_virtuemart_apartment_availabilities (
id INT PRIMARY KEY AUTO_INCREMENT,
apartment_id INT NOT NULL,
dtstart DATETIME NOT NULL,
dtend DATETIME NOT NULL,
event_id VARCHAR(255),
status VARCHAR(50) DEFAULT 'confirmed',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Шаг 2: Создание плагина для VirtueMart
- Создайте папку для плагина:
- Перейдите в папку
plugins/vmcustom/
вашего сайта на Joomla. - Создайте новую папку, например,
availabilityfilter
.
- Перейдите в папку
- Создайте файл плагина:
- Внутри папки
availabilityfilter
создайте файлavailabilityfilter.php
. - Вставьте следующий код:
<?php defined('_JEXEC') or die; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\CMSPlugin; class plgVmCustomAvailabilityFilter extends CMSPlugin { public function __construct(&$subject, $config) { parent::__construct($subject, $config); } public function onVmSearchFilter(&$filters, &$params) { // Получаем даты из запроса $app = Factory::getApplication(); $input = $app->input; $dtstart = $input->getString('dtstart', ''); $dtend = $input->getString('dtend', ''); if (empty($dtstart) || empty($dtend)) { return; } // Подключаемся к базе данных $db = Factory::getDbo(); $query = $db->getQuery(true); // Находим занятые квартиры $query->select('DISTINCT apartment_id') ->from($db->quoteName('sukko_virtuemart_apartment_availabilities')) ->where($db->quoteName('dtstart') . ' <= ' . $db->quote($dtend)) ->where($db->quoteName('dtend') . ' >= ' . $db->quote($dtstart)); $db->setQuery($query); $occupiedApartments = $db->loadColumn(); // Исключаем занятые квартиры из списка if (!empty($occupiedApartments)) { $filters[] = $db->quoteName('virtuemart_product_id') . ' NOT IN (' . implode(',', $occupiedApartments) . ')'; } } }
- Внутри папки
- Создайте XML-файл для плагина:
- В той же папке создайте файл
availabilityfilter.xml
. - Вставьте следующий код:
<?xml version="1.0" encoding="utf-8"?> <extension type="plugin" version="5.0" method="upgrade" group="vmcustom"> <name>Availability Filter</name> <author>Your Name</author> <creationDate>2023-10-01</creationDate> <version>1.0</version> <description>Фильтр для подбора квартир по датам заезда и выезда.</description> <files> <filename plugin="availabilityfilter">availabilityfilter.php</filename> </files> </extension>
- В той же папке создайте файл
Шаг 3: Установка плагина
- Заархивируйте папку
availabilityfilter
в ZIP-файл. - Перейдите в админку Joomla: Расширения → Управление → Установка.
- Загрузите ZIP-файл и установите плагин.
- После установки перейдите в Расширения → Плагины, найдите плагин
Availability Filter
и включите его.
Шаг 4: Добавление формы для фильтра
- Откройте шаблон VirtueMart, который используется на вашем сайте (например,
components/com_virtuemart/templates/default/templates.php
). - Добавьте форму для ввода даты заезда и выезда:
<form action="<?php echo JRoute::_('index.php?option=com_virtuemart&view=category'); ?>" method="get"> <input type="hidden" name="option" value="com_virtuemart"> <input type="hidden" name="view" value="category"> <label for="dtstart">Дата заезда:</label> <input type="date" name="dtstart" id="dtstart" required> <label for="dtend">Дата выезда:</label> <input type="date" name="dtend" id="dtend" required> <button type="submit">Найти</button> </form>
Шаг 5: Тестирование
- Перейдите на страницу категории VirtueMart.
- Введите дату заезда и дату выезда в форму.
- Нажмите "Найти".
- Убедитесь, что отображаются только те квартиры, которые свободны в указанный период.
Шаг 6: Дополнительные улучшения
- Кэширование: Добавьте кэширование результатов фильтрации для повышения производительности.
- Валидация дат: Убедитесь, что дата выезда больше даты заезда.
- Обработка ошибок: Добавьте сообщения об ошибках, если данные введены некорректно.
Пример SQL-запроса для фильтрации
Если пользователь ввел дату заезда 2023-10-01
и дату выезда 2023-10-10
, запрос будет выглядеть так:
SELECT DISTINCT apartment_id
FROM sukko_virtuemart_apartment_availabilities
WHERE (
(dtstart <= '2023-10-10' AND dtend >= '2023-10-01')
OR
(dtstart BETWEEN '2023-10-01' AND '2023-10-10')
OR
(dtend BETWEEN '2023-10-01' AND '2023-10-10')
)
Этот запрос вернет все apartment_id
, которые заняты в указанный период. Затем мы исключим их из списка товаров.