Шаг 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

  1. Создайте папку для плагина:
    • Перейдите в папку plugins/vmcustom/ вашего сайта на Joomla.
    • Создайте новую папку, например, availabilityfilter.
  2. Создайте файл плагина:
    • Внутри папки 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) . ')';
              }
          }
      }
  3. Создайте 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: Установка плагина

  1. Заархивируйте папку availabilityfilter в ZIP-файл.
  2. Перейдите в админку Joomla: Расширения → Управление → Установка.
  3. Загрузите ZIP-файл и установите плагин.
  4. После установки перейдите в Расширения → Плагины, найдите плагин Availability Filter и включите его.

Шаг 4: Добавление формы для фильтра

  1. Откройте шаблон VirtueMart, который используется на вашем сайте (например, components/com_virtuemart/templates/default/templates.php).
  2. Добавьте форму для ввода даты заезда и выезда:
    <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: Тестирование

  1. Перейдите на страницу категории VirtueMart.
  2. Введите дату заезда и дату выезда в форму.
  3. Нажмите "Найти".
  4. Убедитесь, что отображаются только те квартиры, которые свободны в указанный период.

Шаг 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, которые заняты в указанный период. Затем мы исключим их из списка товаров.