За последние 24 часа нас посетили 36684 программиста и 1707 роботов. Сейчас ищет 1121 программист ...

Простенький фильтр

Тема в разделе "PHP для новичков", создана пользователем smartCreate, 11 фев 2017.

  1. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Доброго времени суток, уже третьи сутки бьюсь над казалось бы просто задачей, но разобраться все не как не получается..

    И так, по порядку:
    1) Есть таблица которая содержит в себе информацию для 2 разделов "Товары", "Новости" (определяется различие между разделами, с помощью столбца type в таблице);
    2) Есть страница на которую, при загрузке выводятся вся информация из вышеописанной таблицы;
    3) На странице выпадающий список с 2 пунктами "Товары", "Новости". Нажимаем на "Новости", выводятся только новости, нажимаем на "Товары" выводятся только товары.

    РЕАЛИЗАЦИЯ (работаю на Godignaiter):

    1) Выводим информацию на страницу так:

    HTML:
    1.  
    2. <div id="content">
    3.         <!-- ФОРЫЧЬ --->
    4.         <?php $group = $post_array[1]; foreach ($group as $group): ?>
    5.                  <?=$group['img']?>
    6.                  <?=$group['name']?>
    7.                  <?=$group['url_g']?>
    8.                  <?=$group['id']?>
    9.                  <?=$group['visible']?>
    10.         <?php endforeach?>
    11.         <!--/  --->
    12. </div>
    13.  
    14. <!-- ПЕЙДЖЕР --->
    15. <?php echo $this->pagination->create_links();?>
    16. <!--/  --->
    17.  
    2) Разметка самого фильтра (выпадающего списка):
    HTML:
    1.  
    2. <div class="dropdown">
    3.        <span class="selLabel">Выберите рубрику</span>
    4.        <input type="hidden" name="cd-dropdown">
    5.        <ul class="dropdown-list">
    6.              <li>
    7.                    <span>Товары</span>
    8.              </li>
    9.              <li>
    10.                    <span>Новости</span>
    11.              </li>
    12.       </ul>
    13. </div>
    14.  
    3) Информацию о выбранном пункте передаем серверу так:
    Код (Javascript):
    1. var url_edit = document.location.pathname.split('/')[2];
    2.  
    3. $(".selLabel").click(function () {
    4.       $('.dropdown').toggleClass('active');
    5. });
    6. $(".dropdown-list li").click(function() {
    7.       $('.selLabel').text($(this).text());
    8.       $('.dropdown').removeClass('active');
    9.      
    10.       $.ajax({
    11.             type: "post",
    12.             url: "../admin_c/load_heading",
    13.             data: {
    14.                  'type': $.trim( $('.selLabel').text() ),
    15.             },
    16.             success: function(data){
    17.                   $('#content').load(''+url_edit+' #content');
    18.             }
    19.      });
    20. });
    4) Обработка алгоритма на сервере:
    PHP:
    1. // КОНТРОЛЛЕР
    2. function load_heading() {
    3.         if (isset($_POST['type'])) {
    4.            
    5.             $this->load->library('pagination');
    6.             $config['base_url'] = base_url().'admin_c/load_heading/';
    7.        
    8.             $config['type'] = $_POST['type'];
    9.            
    10.             $this->db->where('type', $_POST['type']);
    11.             $this->db->from('group');
    12.             $config['total_rows'] = $this->db->count_all_results();
    13.            
    14.             $config['per_page'] = '10';
    15.             $config['first_link'] = '<span class="first_last">ПЕРВАЯ</span>';
    16.             $config['last_link'] = '<span class="first_last">ПОСЛЕДНЯЯ</span>';
    17.             $config['next_link'] = '<span class="first_last"><i class="fa fa-chevron-right" aria-hidden="true"></i></span>';
    18.             $config['prev_link'] = '<span class="first_last"><i class="fa fa-chevron-left" aria-hidden="true"></i></span>';
    19.  
    20.             $this->pagination->initialize($config);
    21.            
    22.             $this->data['post_array'][1] = $this->admin_model->get_group($config, $this->uri->segment(3));
    23.            
    24.             $this->load->view('pages/admin/head');
    25.             $this->load->view('pages/admin/heading', $this->data);
    26.             $this->load->view('pages/admin/footer');
    27.            
    28.         }else{
    29.             $this->load->library('pagination');
    30.             $config['base_url'] = base_url().'admin_c/load_heading/';
    31.        
    32.             $config['total_rows'] = $this->db->count_all('group');
    33.            
    34.             $config['per_page'] = '10';
    35.             $config['first_link'] = '<span class="first_last">ПЕРВАЯ</span>';
    36.             $config['last_link'] = '<span class="first_last">ПОСЛЕДНЯЯ</span>';
    37.             $config['next_link'] = '<span class="first_last"><i class="fa fa-chevron-right" aria-hidden="true"></i></span>';
    38.             $config['prev_link'] = '<span class="first_last"><i class="fa fa-chevron-left" aria-hidden="true"></i></span>';
    39.  
    40.             $this->pagination->initialize($config);
    41.            
    42.             $this->data['post_array'][1] = $this->admin_model->get_group($config, $this->uri->segment(3));
    43.            
    44.             $this->load->view('pages/admin/head');
    45.             $this->load->view('pages/admin/heading', $this->data);
    46.             $this->load->view('pages/admin/footer');
    47.         }
    48.     }
    49.  
    50. // МОДЕЛЬ
    51.  
    52. function get_group($config, $offset){
    53.         $this->db->order_by("id", "desc");
    54.        
    55.         if (isset($config['type'])) {
    56.             $query = $this->db->get_where('group', array('type' => $config['type']), $config['per_page'], $offset);
    57.         }else{
    58.             $query = $this->db->get('group', $config['per_page'], $offset);
    59.         }
    60.         return $query->result_array();
    61.     }
    ПРОБЛЕМА: фильтрация не срабатывает..., аякс успешно передает значение серверу, сервер его принимает, ошибок в работе скрипта тоже не наблюдается, но результата нет, все записи из таблица как выводились, так и выводятся.
    Очень прошу свежих взглядов и любых советов, как хороших так и плохих, потому как сам в тупике, и уже сломал голову(
     
  2. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @smartCreate смотри в этих функциях
    $this->db->where('type', $_POST['type']);
    $this->db->from('group');
    что там не так. ну и можно попробовать явно указать типа $this->db->where('type', 'news'); ну и проверить наличие и соответствие столбцов типа и значений. если всё ок то ошибка наверно в классах
    --- Добавлено ---
    ошибся нужна эта функция $this->db->get_where( или тупо впендюрить свой запрос Ы
     
  3. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4

    Я уже пробовал все о чем ты говоришь, тут понимаешь в чем штука, если бы было что-то не так вот здесь:
    $this->db->where('type', $_POST['type']);
    $this->db->from('group');

    то и в модель, которая делает выборку из БД, это "не так" передавалось бы, и в итоге из БД не выводилось бы нечего, а в итоге выводиться все..., такое ощущения что после того как страница загрузилась, контроллеру уже по барабану что там я в него передаю, он тупо юзает то что было актуально при загрузке страницы, подтверждение этому можно найти в следующем - делаю так как ты говоришь, отключаю условие "если установлено значение POST['type']" и вместо POST['type'] задаю значение на прямую, вот так:
    PHP:
    1. // КОНТРОЛЛЕР
    2. function load_heading() {
    3.             $this->load->library('pagination');
    4.             $config['base_url'] = base_url().'admin_c/load_heading/';
    5.        
    6.             $config['type'] = 'news';
    7.            
    8.             $this->db->where('type', $config['type']);
    9.             $this->db->from('group');
    10.             $config['total_rows'] = $this->db->count_all_results();
    11.            
    12.             $config['per_page'] = '10';
    13.             $config['first_link'] = '<span class="first_last">ПЕРВАЯ</span>';
    14.             $config['last_link'] = '<span class="first_last">ПОСЛЕДНЯЯ</span>';
    15.             $config['next_link'] = '<span class="first_last"><i class="fa fa-chevron-right" aria-hidden="true"></i></span>';
    16.             $config['prev_link'] = '<span class="first_last"><i class="fa fa-chevron-left" aria-hidden="true"></i></span>';
    17.  
    18.             $this->pagination->initialize($config);
    19.            
    20.             $this->data['post_array'][1] = $this->admin_model->get_group($config, $this->uri->segment(3));
    21.            
    22.             $this->load->view('pages/admin/head');
    23.             $this->load->view('pages/admin/heading', $this->data);
    24.             $this->load->view('pages/admin/footer');
    25.     }
    26.  
    27. // МОДЕЛЬ
    28.  
    29. function get_group($config, $offset){
    30.         $this->db->order_by("id", "desc");
    31.         $query = $this->db->get_where('group', array('type' => $config['type']), $config['per_page'], $offset);
    32.         return $query->result_array();
    33.     }
    РЕЗУЛЬТАТ - все загружается как нужно, просто песня, а вот если передаю аяксом значение type в качестве переменной, то не черта не работает, и ошибка в аяксе исключена, все проверил + (повторюсь), если бы аякс передавал "битое" или пустое значение, то и в запросе к БД оно было бы пустое, то есть БД не вернула бы нечего, а она на оборот возвращает все(

    Мне кажется тут дело в том что страница загружается и контроллер принимает для выборки из БД те значение которые были у него в момент загрузки, а потом что бы в него не передавали, он на них забивает, вернее не то что бы забивает, он просто не перезапускает выборку из БД с новыми значениям, я даже уверен что причина именно в этом, но разобраться с ней я покуда не как не могу понять(
    --- Добавлено ---
    Вот для наглядности
    --- Добавлено ---
    как я и говорю если в условия выборки сразу передать значение то все будет ок, а если сначала загрузить страницу без ограничений на выборку, а потом передавать аяксом значения для ограничений выборки, то нечего не выйдет. Еще раз повторюсь, варинт с ошибкой при передаче по средствам аякса исключена, все проверенно и перепроверено 1000 раз
     

    Вложения:

    • scrin1.jpg
      scrin1.jpg
      Размер файла:
      745,6 КБ
      Просмотров:
      4
    • scrin2.jpg
      scrin2.jpg
      Размер файла:
      399,7 КБ
      Просмотров:
      3
  4. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @smartCreate сделай в оригинале print_r($_POST) ну те проверка существует ли переменная $post[type]
     
  5. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    делал уже) существует переменная, и равна тому чему должна быть равна, то есть, если выбираю новости то $post[type] == новости, если товар то $post[type] == товар

    в таблице поля type тоже соответствуют
     
  6. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @smartCreate может где кирилица вкралась? непоможет скорее всего но как на счёт empty
    --- Добавлено ---
    ну если вырезать проверку и скрипт выполняет сортировку то гдето баг с проверкой условия
    --- Добавлено ---
    есть предположение что гдето напутано с порядком вызова функций попробуй $config['type'] = $_POST['type']; вынести в первую строку скрипта
     
  7. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    не, кирилицы нету

    сделал как ты говоришь, пофиг..

    и еще одно доказательство тому что скрипт выполняет проверку правильно, вот скрин, на нем видно что $config['type'] = $_POST['type'] я вынес в самый верх, а print_r($config['type']) сделал в конце условия, в итоге скрипт мне показал значение news, то есть все ок
    --- Добавлено ---
    Мне правда кажется что дело в самой "политике" загрузки, то есть скрипт мой делает следующее (при первой загрузке):
    1) конектится к базе;
    2) выбирает от туда все;
    3) считай количество строк что бы создать пейджер;

    всю эту инфу передает во вьювер вот здесь:
    PHP:
    1. $this->data['post_array'][1] = $this->admin_model->get_group($config, $this->uri->segment(3));
    2.            
    3. $this->load->view('pages/admin/head');
    4. this->load->view('pages/admin/heading', $this->data);
    5. $this->load->view('pages/admin/footer');
    А потом когда я передаю контролеру переменную для выборки, он все проделывает, но вот как раз эту часть:
    PHP:
    1. $this->data['post_array'][1] = $this->admin_model->get_group($config, $this->uri->segment(3));
    2.            
    3. $this->load->view('pages/admin/head');
    4. this->load->view('pages/admin/heading', $this->data);
    5. $this->load->view('pages/admin/footer');
    уже не трогает, потому что это часть отвечающая за загрузку страницы, а мне получается нужно что бы он её как раз трогал..., может есть какие то идеи на этот счет?
     

    Вложения:

    • scrin3.jpg
      scrin3.jpg
      Размер файла:
      726,9 КБ
      Просмотров:
      3
  8. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @smartCreate не пойму как так-то здесь вижу только такой шаг,- в каждом условии каждой функции написать $res=."1...9" и вывести результат, поможет отсечь логическую ошибку от синтаксичесской оплошности
    --- Добавлено ---
    не думаю, на столько грубая ошибка должна была быть выявлена ещё на этапе проектирования, хотя пхп мир безграничных возможностей)))))))
     
  9. smartCreate

    smartCreate Новичок

    С нами с:
    4 ноя 2016
    Сообщения:
    122
    Симпатии:
    4
    Про безграничные возможности это конечно правда))

    Не совсем понял тебя про $res..., можешь обьяснить?
     
  10. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @smartCreate ну сделать типа дебага, в помещать в переменную последовательность выполнения функций и условий затем её вывод. типа
    Код (Text):
    1. function load_heading() {
    2.         if (isset($_POST['type'])) {
    3. echo 'load_haed,условие истинно';
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Как говорила наша учительница математики в школе, "Если смешать клубнику и сапоги, получится рвотный порошок". Новости - это новости, товары - товары, зачем мешать в одной таблице?

    По сабжу - надо выводить запросы, которая составляет программа, и смотреть, как они отрабатывают в phpmyadmin. Судя по коду, для этого заглянуть под капот фреймворка (я не работал с ним, поэтому не знаю точно, как получить запрос, который он составил, но SQL-запросы всегда отлаживаются одинаково)