Вход • Регистрация

Быстрый поиск Доп. характеристик в огромном списке.

  • Сегодня, 04:41
  • Здравствуйте, хочу реализовать такое самостоятельно https://user.diafan.ru/wishlist/show4220/ т.е. по сути можно сделать простой jS поиск/фитрацию по списку доп. характеристик, чтоб оставлял только нужное для выбора, ато если честно запарился с проектом с миллионом товаров и еще ищи есть эта характеристика или нет.
    Подскажите где можно найти вывод данных полей, по идее должно быть где-то в /modules/service/ но не могу найти.
    т.е. мне нужен путь к файлу который править?
  • 48 минут назад
  • Все нашел, реализовал.
    Думаю кому-нибудь будет интересно.
    Правим файл /modules/shop/admin/shop.admin.express.fields.element.php

    Находим блок
    Код
    // дополнительная характеристика
    $param_select_type = $type == 'param' && ! empty($params["select_type"]) ? $params["select_type"] : '';
    echo '
    <div id="param_id" class="unit params param_param">
    <div class="infofield dophar">'.$this->diafan->_('Укажите характеристику').'</div>';
    $rows = DB::query_fetch_all("SELECT id, [name], type FROM {shop_param} WHERE trash='0' ORDER BY sort ASC, id ASC");
    if ($rows)
    {
    echo '<select name="param_id">';
    echo '<option value="0">Создать автоматически</option>';
    foreach ($rows as $row)
    {
    echo '<option value="'.$row["id"].'"'
    .($type == 'param' && ! empty($params["id"]) && $params["id"] == $row["id"] ? ' selected="selected" ' : '' )
    .' type="'.$row["type"].'">'.$row["name"].'</option>';
    }
    echo '</select>';
    }

    заменяем на
    Код
    // дополнительная характеристика
    $param_select_type = $type == 'param' && ! empty($params["select_type"]) ? $params["select_type"] : '';
    echo '<div id="param_id" class="unit params param_param">
    <div class="infofield">'.$this->diafan->_('Укажите характеристику').'</div>';

    echo '<div class="search-container">
    <input type="text" id="param_search" placeholder="Поиск..." class="search-input">';
    echo '<div id="param_results" style="display:none; position:absolute; width:428px; max-height:200px; overflow-y:auto; border:1px solid #ccc; background:white; z-index:1;"></div>';

    $rows = DB::query_fetch_all("SELECT id, [name], type FROM {shop_param} WHERE trash='0' ORDER BY sort ASC, id ASC");
    if ($rows)
    {

    echo '<select name="param_id" id="param_select">';
    echo '<option value="0">Создать автоматически</option>';
    foreach ($rows as $row)
    {
    echo '<option value="'.$row["id"].'"'
    .($type == 'param' && ! empty($params["id"]) && $params["id"] == $row["id"] ? ' selected="selected" ' : '' )
    .' type="'.$row["type"].'">'.$row["name"].'</option>';
    }
    echo '</select>';
    echo '</div>';

    echo '<style>
    .result-item { padding:8px; cursor:pointer; }
    .result-item:hover { background-color:#f0f0f0; max-width: 428px; }
    #param_search { margin-right: 10px; }
    </style>';

    echo "<script>
    document.addEventListener('DOMContentLoaded', function() {
    // Получаем элементы
    const searchInput = document.getElementById('param_search');
    const select = document.getElementById('param_select');
    const resultsContainer = document.getElementById('param_results'); // Добавьте этот div в HTML

    // Функция для обновления списка результатов
    function updateResults(searchTerm) {
    const options = Array.from(select.options);
    const filtered = options.filter(option => {
    return option.text.toLowerCase().includes(searchTerm.toLowerCase());
    });

    // Очищаем контейнер
    resultsContainer.innerHTML = '';

    // Если нет результатов — показываем сообщение
    if (filtered.length === 0) {
    resultsContainer.innerHTML = '<div>Ничего не найдено</div>';
    return;
    }

    // Создаем элементы списка
    filtered.forEach(option => {
    const item = document.createElement('div');
    item.className = 'result-item';
    item.textContent = option.text;
    item.dataset.value = option.value;

    // Обработчик клика по элементу
    item.addEventListener('click', () => {
    select.value = item.dataset.value;
    searchInput.value = item.textContent;
    resultsContainer.style.display = 'none'; // Скрываем список
    });

    resultsContainer.appendChild(item);
    });

    // Показываем контейнер с результатами
    resultsContainer.style.display = 'block';
    }

    // Обработчик ввода в поле поиска
    searchInput.addEventListener('input', function() {
    const searchTerm = this.value;
    if (searchTerm.trim() === '') {
    resultsContainer.style.display = 'none';
    return;
    }
    updateResults(searchTerm);
    });

    // Показываем список при фокусе на поле
    searchInput.addEventListener('focus', function() {
    if (this.value.trim() !== '') {
    updateResults(this.value);
    }
    });

    // Скрываем список при потере фокуса
    searchInput.addEventListener('blur', function() {
    setTimeout(() => {
    resultsContainer.style.display = 'none';
    }, 200);
    });
    });
    </script>";

    }


    Получаем поле поиска с выбором выпадающих результатов. При выборе характеристика выбирается и в поле по умолчанию.
    Делал на коленке, так что прошу не пинать - можно оптимизировать, вынести JS и CSS в отдельные файлы, но это уже лень разбираться было.
  • 25 минут назад , редакция: 23 минуты назад
  • Дополню, если нужен ID напротив характеристики, то меняем
    Код
    item.textContent = option.text;

    на
    Код
    item.textContent = option.text + ' [' + option.value + ']';

Новости

  • 25 марта
  • Мы обновили систему тарифов, учитывая опыт работы с клиентами и современные рыночные условия. Новая тарифная сетка разработана специально для того, чтобы лучше отвечать вашим потребностям. Резкого повышения цен не произошло. Более того, некоторые тарифы даже стали выгоднее и доступнее. 
  • 17 января
  • В преддверии 2025 года была выпущена сборка 7.2.5, которая не приносит радикальных изменений в функциональности, но способствует повышению стабильности работы системы и расширению возможностей облачного сервиса для создания сайтов.
  • 18 июня 2024 г.
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.

Форум