Как сделать пользовательский фильтр, с помощью Selectpicker от Bootstrap?


Добрый день, ребята. Я с проблемой с помощью Selectpicker, чтобы сделать поле со Списком продуктов, которые я приношу из бд с помощью PHP. Моя проблема заключается в следующем: мне Нужно сделать фильтр "пользовательский" потому что, когда я лежал в select все продукты, которые поставляются BD, дают более 800, и пользователь имеет возможность добавить больше "Продуктов" по запросу, что делает Сайт и select'ы были очень тяжелые. Короче говоря, мне нужен способ, чтобы все эти продукты из Базы Данных, но ограничивать максимальный объем, который будет отображаться в Select ( я знаю, что могу ограничить запрос ), но мне нужно, что когда пользователь введите в поле поиска имя, не появляясь там в Select, с помощью фильтра поиска все результаты, даже "скрытые" Select. Как я мог это сделать ?

я Попытался сделать что-то подобное, но это не сработало, я попробовал этот образом:

Главном.php:

<?php  // Parte que pesquiso os Produtos em um BD Interno.
include 'verifica_login.php';
include 'conexao.php';
include 'oracle.php';

if (!isset($_SESSION)) {
    session_start();
}

error_reporting(0);
header('Content-Type: text/html; charset=utf-8');


# Fornecedores
$query_fornecedores = "SELECT nome FROM fornecedores ORDER BY nome ASC LIMIT 40";
$result1 = mysqli_fetch_all(mysqli_query($connect, $query_fornecedores), MYSQLI_ASSOC);
mysqli_close($connect);
# Produtos

$stid = oci_parse($ora_conexao,"SELECT a.desccompleta
from map_produto a, map_prodcodigo b, mrl_produtoempresa d, mrl_departamento f, map_famdivcateg ff, map_categoria cc
where a.seqproduto = b.seqproduto
and   a.seqproduto = d.seqproduto
and   a.seqfamilia = ff.seqfamilia
and   ff.seqcategoria = cc.seqcategoria
and   ff.nrodivisao   = cc.nrodivisao
and   d.nroempresa = f.nroempresa(+)
and   cc.tipcategoria = 'M'
and   ff.status = 'A'
and   cc.nivelhierarquia = 2
and   d.nrodepartamento = f.nrodepartamento(+)
and   a.seqfamilia = ff.seqfamilia
and   b.indutilvenda = 'S'
and   ff.nrodivisao = 1
and   b.tipcodigo in ('E','B')
and   d.nrodepartamento = 4
and   d.nroempresa = 1
and   ROWNUM <= 100
and   f.descricao = 'HORTIFRUTI'
ORDER BY a.desccompleta ASC");
oci_execute($stid);

$result2 = oci_fetch_all($stid, $res, null, null, OCI_FETCHSTATEMENT_BY_ROW);

oci_free_statement($stid);
oci_close($ora_conexao);
?>

// HTML da Div Produtos 

div class="container" id="produtos">
                        <div class="separator"></div>

                        <div class="title-padrao">
                            <h1 class="text-center">
                                Produtos
                            </h1>
                        </div>

                        <div id="allProducts">
                            <section id="all-section">

                                <div class="inform-produtos">

                                    <div class="primeira">
                                        <b>Item:</b>
                                    </div>

                                    <div class="segunda">
                                        <b>Cod.:</b>
                                    </div>

                                    <div class="terceira">
                                        <b>Selecione um produto:</b>
                                    </div>

                                    <div class="quarta">
                                        <b>Embalagem:</b>
                                    </div>

                                    <div class="quinta">
                                        <b>Preço:</b>
                                    </div>

                                    <div class="sexta">
                                        <b>Quantidade:</b>
                                    </div>

                                    <div class="setima">
                                        <b>Preço do Produto:</b>
                                    </div>
                                </div>

                                <div class="clone-prod" name="clone-prod[]">

                                    <div class="wrap-prod" name="wrap-prod[]">

                                        <div class="produtos-wrap" name="produtos-wrap[]">
                                            <div class="text-center select_height produto-padrao" id="primeiro-produto">
                                                <input type="text" class="index font-pop input-div" id="index_produto"
                                                    name="index_produto[]" value="1" readonly="true">
                                            </div>

                                            <div class="text-center select_height produto-padrao" id="segundo-produto">
                                                <input class="font-pop number_id_produto input-div" value=""
                                                    readonly="true" name="id_produto[]" required>
                                            </div>

                                            <div class="text-center select_height produto-padrao terceiro-produto"
                                                id="terceiro-produto">
                                                <select class="selectpicker form-control" data-show-subtext="false"
                                                    data-live-search="true" name="select_produtos[]"
                                                    id="select_produtos" onchange="initProdutos(this)" required>
                                                    <?php
                                                    echo '<option disabled selected hidden
                                                    value="Selecione um produto..."
                                                    data-subtext="Selecione um produto...">Selecione um produto...
                                                    </option>';
                                                    foreach ($res as $item_produtos) {
                                                        echo '<option data-subtext="' . $item_produtos['DESCCOMPLETA'] . '" value="'
                                                    . $item_produtos['DESCCOMPLETA'] . '">' . $item_produtos['DESCCOMPLETA'] . '</option>';
                                                    }
                                                    ?>
                                                </select>
                                            </div>

                                            <div class="text-center select_height produto-padrao" id="quarto-produto">
                                                <input type="text" maxlength="2" class="edit-input font-pop"
                                                    name="embalagem[]" value="" required>
                                            </div>

                                            <div class="text-center select_height produto-padrao" id="quinto-produto">
                                                <input type="number" id="preco-input" name="preco[]" step="0.01" min="0"
                                                    class="edit-input font-pop" required>
                                            </div>

                                            <div class="text-center select_height produto-padrao" id="sexto-produto">
                                                <input type="number" id="qtd-input" step="0.01" min="0"
                                                    class="edit-input font-pop" value="" name="quantidade-produto[]"
                                                    required>
                                            </div>

                                            <div class="text-center select_height produto-padrao" id="setimo-produto">
                                                <input class="font-pop preco-produto input-div" readonly="true"
                                                    name="preco-produto[]" required>
                                            </div>
                                        </div>

                                        <div class="text-center select_height produto-padrao oitavo-produto"
                                            id="div-remove">
                                            <button type="button"
                                                class="remover glyphicon glyphicon-remove button-produto"></button>
                                        </div>

                                    </div>

                                </div>

                            </section>
                            <div id="wrap-addbutton">
                                <button type="button" id="add-button"
                                    class="glyphicon glyphicon-plus-sign button-produto"></button>
                                <b>Adicione um produto...</b>
                            </div>
                        </div>

                    </div>

                    <div class="container" id="produto-total">
                        <div class="col-lg-12">
                            <div class="assinatura col-lg-9">
                                <div id="wrap-assinatura" class="text-center">
                                    <div id="assinatura"></div>
                                    <b>Assinatura</b>
                                </div>
                            </div>

                            <div class="preco-final col-lg-12 text-right">
                                <b>Preço Total:</b>
                                <br>
                                <input id="total" readonly="true" name="total_pedido" class="text-right input-div"
                                    value="R$ 0.00">
                            </div>
                        </div>
                    </div>

API.php:

switch ($_GET['mode']) {
    case 'fornecedores':
        $letras = $_GET['letras_fornecedores'];
        $query = "SELECT * FROM fornecedores WHERE nome LIKE '{$letras}%' ORDER BY nome ASC LIMIT 20";
        $result = mysqli_fetch_all(mysqli_query($connect, $query), MYSQLI_ASSOC);
        break;

    case 'ultimoPedido':
        $query = "SELECT id_pedido as ultimoPedido FROM pedido ORDER BY id_pedido DESC LIMIT 1";
        $result = mysqli_fetch_all(mysqli_query($connect, $query), MYSQLI_ASSOC);
        break;

    default:
        $letras = $_GET['letras_produtos'];
        $stid = oci_parse($ora_conexao,"SELECT b.codacesso, c.embalagem, c.qtdembalagem FROM map_produto a, map_prodcodigo b, Map_Famembalagem c, MAP_Familia d  
        WHERE a.desccompleta LIKE '{$letras}%'
        AND a.seqproduto = b.seqproduto
        AND b.tipcodigo in ('B', 'E')
        AND a.seqfamilia = d.seqfamilia
        AND d.seqfamilia = c.seqfamilia
        ORDER BY c.embalagem, a.desccompleta, c.qtdembalagem");
        oci_execute($stid);
        $res = oci_fetch_all($stid, $result, null, null, OCI_FETCHSTATEMENT_BY_ROW);
        oci_free_statement($stid);
        oci_close($ora_conexao);
        //$query = "SELECT * FROM produto WHERE desc_produto LIKE '{$letras}%' ORDER BY desc_produto ASC LIMIT 20";
        break;
}

mysqli_close($connect);

if($result == NULL)
    die('Nenhum resultado encontrado');

header('Content-Type: application/json');
echo json_encode($result, JSON_PRETTY_PRINT);

Сценария.js :

function filterProdutos(letras_produtos) {
    console.log(letras_produtos);
    $.ajax({
        type: "GET",
        url: "API.php",
        data: {
            "mode": "produtos",
            "letras_produtos": letras_produtos,
        },
        dataType: "JSON",
        //CASO DÊ TUDO CERTO
        success: function (data) {
            console.log(data);
            console.log(letras_produtos);
            var options = '';
            options = '<option disabled selected hidden value="Selecione um produto..." data-subtext="Selecione um produto...">Selecione um produto...</option>';
            for (var i in data) {
                options = options + '<option value="' + data[i]['desc_produto'] 
                    + '" data-subtext="' + data[i]['desc_produto'] + '">' 
                    + data[i]['desc_produto'] + '</option>';
            }
            $("[name='select_produtos[]']").html(options);
            $("[name='select_produtos[]']").selectpicker('refresh');
        },
        error: function (request, error) {
            console.log("Request: " + JSON.stringify(request));;
        }
    });
}


function filtragem_valores(div, valor) {
    if (div == 'div_fornecedores') {
        filterFornecedores(valor);
    } else {
        filterProdutos(valor);
    }
}

что происходит в том, что значение, которое я ввожу в selectpicker, не идет и в этом мой фильтр. Кто может дать мне свет ?

Author: Leo, 2019-10-08

3 answers

Мне Удалось решить эту проблему реорганизация мои functions фильтра принадлежности, спасибо всем, кто пытался помочь.

 1
Author: Leo, 2019-10-15 13:42:18

В моем intendimento на этот вопрос, вы должны использовать Ajax, чтобы запрос базы данных, так что вы могли бы сделать запрос с LIKE и выбрать определенное количество элементов стандарта с ЛИМИТОМ pra обновления экрана клиента.

Взгляните: Ajax Приступая к работе/Руководство

Таким образом, вы можете избежать загрузки всех данных с select, делаете запрос только тогда, когда пользователь вводит в поле поиска, которое ativara событие js делает запрос на ajax, которая делает соединение с базой данных через php, возвращая данные.

Выхватил?

 0
Author: Gabriel Gleyser, 2019-10-12 12:08:53

, Лео, как ты имеешь здесь решение, которое, возможно, будет работать в вашем случае.

, JS:

    document.getElementById("Id_do_campo_de_pesquisa").addEventListener("keyup",function() {
                            getInfo(this.value);
});



function getInfo(letras){

  $.get("url_do_api.php?letrasProdutos="+letras,function(data){
    var select = document.getElementById('Id_do_Seu_select');
    var info = JSON.parse(data);
    var len = info.length;
    var options = "";

    for(var i = 0; i<len ; i++){
      options += "<option value='"+info[i]+"'>"+info[i]+"</option>";
      //aqui podes simplesmente recuperar os teus produtos e colocar dentro do teu select 
    }

    select.innerHTML = "";
    select.innerHTML = options;
  })

}

, Как в PHP, просто construires твой запрос с Like и отправить ответ с помощью json_encode(); , тем не менее, было бы хорошо у твоей таблица проиндексирована, кто это и более быстрая в исследовании

Edit: если ты думаешь, что твоя функция фильтрации ja делает это, вызывает ее вместо того, чтобы вызвать getInfo ();, который был только мой пример же я Надеюсь, что помог

Edit 2 я не вижу отсутствие упоминания в свой файл также

 0
Author: ScrapBench, 2019-10-14 13:45:53