<MyRusakov.ru />

Создание Интернет-магазина на OpenCart 2.0

Создание Интернет-магазина на OpenCart 2.0

Видеокурс "Создание Интернет-магазина на OpenCart 2.0" обучит Вас созданию любых Интернет-магазинов на OpenCart 2. В первом разделе курса разбираются абсолютно все возможности данного движка с примерами.

Во втором разделе создаётся полноценный Интернет-магазин, где Вы уже всё увидите своими глазами.

И, наконец, в третьем разделе курса созданный Интернет-магазин будет размещён в Интернете.

К курсу так же идут бесплатные и очень ценные Бонусы сопоставимые с самим курсом: "Как сэкономить на Яндекс.Директ до 50%", "Дропшиппинг" и "Как раскрутить Интернет-магазин".

Подробнее
Подписка

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Каким движком Вы предпочитаете пользоваться?

Форум сайта MyRusakov.ru

Пагинация и фильтр поиска
07.12.2014 21:48:38 Пагинация и фильтр поиска Сообщение #1
artyomweb

artyomweb

Освоившийся

Освоившийся

Дата регистрации:
23.09.2014 22:48:11

Сообщений: 26

       Здравствуйте, у меня проблема есть постраничный вывод информации из базы данных,
который всё нормально работает и есть форма фильтра поиска из этой базы данных для отфильтровывания
результата вывода информации (например по бренду). После отфильтровывания т.е. после нажатия на 'submit'
формы информация отфильтровывается (показывается нужная), но при перелистываниии страниц (пагинация)
информация вновь становится какая была изначальная. Как сделать чтобы после использования фильтра поиска
пагинация тоже подстраивалась под результат формы поиска?  Подскажите пожалуйста всё перепробывал ничего не получается!!!
       Вот скрипты:
<?php
function page()
    if(empty($_GET["page"])){
        $page = 1;
    } else {
if(!is_numeric($_GET["page"])) die("Неправильный формат номера страницы!";
        $page = $_GET["page"];
    }
        return $page;
}

function sql_query($onpage, $page, $table)
{
    $begin = $page*$onpage; // откуда начинать
        $sql = "SELECT * FROM $table LIMIT ".$begin.", ".$onpage;
        $result = mysql_query($sql) or die(mysql_error());
        return $result;
}

function navigation($onpage, $page, $table)
{
        $return = null;
        $count = mysql_query("SELECT COUNT(*) FROM $table" or die(mysql_error());
        $count = mysql_fetch_array($count);
        $count = $count[0];
        $pages = $count/$onpage;
  if ($page != 1) $pervpage = '<a href=?page=1>Первая</a> | <a href=?page='. ($page - 1) .'>Предыдущая</a> | ';
  if ($page != $onpage) $nextpage = ' | <a href=?page='. ($page + 1) .'>Следующая</a> | <a href=?page=' .floor($pages). '>Последняя</a>';
  if($page - 5 > 0) $page5left = ' <a href=?page='. ($page - 5) .'>'. ($page - 5) .'</a> | ';
if($page - 4 > 0) $page4left = ' <a href=?page='. ($page - 4) .'>'. ($page - 4) .'</a> | ';
if($page - 3 > 0) $page3left = ' <a href=?page='. ($page - 3) .'>'. ($page - 3) .'</a> | ';
if($page - 2 > 0) $page2left = ' <a href=?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href=?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';

if($page + 5 <= $pages) $page5right = ' | <a href=?page='. ($page + 5) .'>'. ($page + 5) .'</a>';
if($page + 4 <= $pages) $page4right = ' | <a href=?page='. ($page + 4) .'>'. ($page + 4) .'</a>';
if($page + 3 <= $pages) $page3right = ' | <a href=?page='. ($page + 3) .'>'. ($page + 3) .'</a>';
if($page + 2 <= $pages) $page2right = ' | <a href=?page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $pages) $page1right = ' | <a href=?page='. ($page + 1) .'>'. ($page + 1) .'</a>';
if ($page > 1)
{

Error_Reporting(E_ALL & ~E_NOTICE);
echo "<div class=\"pagin\">";
echo $pervpage.$page5left.$page4left.$page3left.$page2left.$page1left.'<span>'.$page.'</span>'.$page1right.$page2right.$page3right.$page4right.$page5right.$nextpage." Всего <b>".floor($pages)."</b> стр.";
echo "</div>";
}
elseif ($page = 1)
{

Error_Reporting(E_ALL & ~E_NOTICE);
echo "<div class=\"pagin\">";
echo '<span>'.$page.'</span>'.$page1right.$page2right.$page3right.$page4right.$page5right.$nextpage." Всего <b>".floor($pages)."</b> стр.";
echo "</div>";
}
}

include "sql_connect.php";
$onpage = 15; // записей на страницу
$page = page(); // определяем страницу
 $result = sql_query($onpage, $page, $table);
$row = mysql_fetch_array ($result);
if ($row['currencyId']='RUR'$money='руб.';
$i=0;
$w=3;

$navigation = navigation($onpage, $page, $table); // определим навигацию
echo $navigation;
echo "<table id=\"table_tovars\">";
do{
if(($i==0)||!($i%$w))echo"<tr>";
$i++;
printf ("
<td align=\"center\">
<h4>%s</h4>
<h5>%s</h5>
<img src=\"%s\"/>
<h3>Цена: <span>%s</span> $money</h3>
<a target=\"_blank\" href=\"%s\">Купить</a>
</td>
",$row['vendor'],$row['model'],$row['picture'],$row['price'],$row['currencyId'],$row['url']);
if(!($i%$w)||(mysql_num_rows($result)==$i))echo"</tr>";
}while ($row = mysql_fetch_array ($result));
echo "</table>";
$navigation = navigation($onpage, $page, $table); // определим навигацию
echo $navigation;
mysql_close(); // отключение от БД
?>
Профиль Ответить
08.12.2014 12:28:42 Пагинация и фильтр поиска Сообщение #2
tikkiwiki

tikkiwiki

Модератор

Модератор

Дата регистрации:
15.11.2013 15:36:59

Сообщений: 194

Здравствуйте.  Вы хотите, чтобы пагинация работала при выводе результатов поиска?
Профиль Ответить
08.12.2014 13:21:55 Пагинация и фильтр поиска Сообщение #3
artyomweb

artyomweb

Освоившийся

Освоившийся

Дата регистрации:
23.09.2014 22:48:11

Сообщений: 26

      Да она у меня работает при загрузке данной страницы с отображаемой на
ней данными из базы данных, т.е. переходы по страницам работают, но после фильтрации
с помощью установленной на данной странице формы (<form><input.....></form> контент на
странице меняется согласно запросу из формы, а вот при переходе на другую страницу
(1,2,3,следующая,предыдущая и т.д.) контент вновь становится какой был изначально
при загрузке страницы. Мне же нужно чтобы после фильтра поиска т.е. после нажатия на
кнопку <submit> в форме пагинация также сохранялась согласно заданным критериям поиска.
     Для обработки формы у меня на этой же странице есть:
if ($_POST["price_start"]) $start = "`price` >= '".htmlspecialchars($_POST["price_start"])."'";
if ($_POST["price_end"]) $end = "`price` <= '".htmlspecialchars($_POST["price_end"])."'";
if ($start) $log = "WHERE ".$start;
if ($end) $log = "WHERE ".$end;
if ($start && $end) $log ="WHERE ".$start." AND ".$end;

//$log находится изначально в sql запросе в функции

function sql_query($onpage, $page, $table, $log)
{
    $begin = $page*$onpage; // откуда начинать
        $sql = "SELECT * FROM $table $log LIMIT ".$begin.", ".$onpage;
        $result = mysql_query($sql) or die(mysql_error());
        return $result;
}
      Дальше идёт код для пагинации, result и вывод данных из sql-запроса. Я думаю что пагинация
после фильтрации формой у меня сбивается на начальный запрос при переходе на другие страницы пагинации
из-за того что result и собственно вывод контента расположены на этой же странице изначально при загрузке,
но как сделать иначе не знаю. Подскажите что-нибудь пожалуйста или в чём-нибудь другом причина не понимаю?
Профиль Ответить
08.12.2014 16:00:54 Пагинация и фильтр поиска Сообщение #4
artyomweb

artyomweb

Освоившийся

Освоившийся

Дата регистрации:
23.09.2014 22:48:11

Сообщений: 26

       Вот форма:
<form id="search_form" name="form" action="" method="post">
  <table>
    <tr>
      <td class="text">Цена от:<input type="text" name="price_start" /> рублей</td>
    </tr>
    <tr>
      <td class="text">Цена до:<input type="text" name="price_end" /> рублей</td>
    </tr>
<tr>
      <td colspan="2">
        <input type="submit" name="filter" value="Кнопка" />
      </td>
    </tr>
  </table>
</form>
        Или как-то делать с помощью Аякса? В общем  хоть что-нибудь всё встало из-за
этого!
Профиль Ответить
11.12.2014 15:45:12 Пагинация и фильтр поиска Сообщение #5
Jey-Val-Star

Jey-Val-Star

Освоившийся

Освоившийся

Дата регистрации:
30.11.2014 21:33:11

Сообщений: 27

Вам нужно переделать функцию навигации - в адрес ссылок навигации добавлять (если есть ) параметры фильтра
т.е у вас идет get вида page=2 а должен стать вида page=2&price_start=2&price_end=10
Но параметры фильтра передавать через get, через post работать не будет (или придумайте как передать post гиперссылкой))))

И еще заметил, у вас грубая ошибка в выводе записей, а конкретно с какой позиции начинать. Формула для $begin не верна в корне. 
Пример: вы находитесь на первой странице ($page=1), количество записей на страницу у вас 15, а 1×15=15.
Т.е. находясь на первой странице вы получите записи начиная с 15 позиции, а должны с первой.
правильная формула для этого - текущая_страница×количество_записей_на_страницу+1-количество_записей_на_страницу.
и получаем 1×15+1-15=1
Для второй страницы 2×15+1-15=16
и тд
Профиль Ответить
12.12.2014 14:11:18 Пагинация и фильтр поиска Сообщение #6
artyomweb

artyomweb

Освоившийся

Освоившийся

Дата регистрации:
23.09.2014 22:48:11

Сообщений: 26

        Огромное спасибо за ответ буду пробывать! Я уж думал никто не ответит,
 а так вроде стало ясно! Ещё раз спасибо за помощь!!!
Профиль Ответить
12.12.2014 14:32:48 Пагинация и фильтр поиска Сообщение #7
Jey-Val-Star

Jey-Val-Star

Освоившийся

Освоившийся

Дата регистрации:
30.11.2014 21:33:11

Сообщений: 27

Не за что - обращайся))) Сам когда-то мучил пагинацию
Кстати - вместо кучи if

  if($page - 5 > 0) $page5left = ' <a href=?page='. ($page - 5) .'>'. ($page - 5).'</a> | '; 
if($page - 4 > 0) $page4left = ' <a href=?page='. ($page - 4) .'>'. ($page - 4).'</a> | '; 
if($page - 3 > 0) $page3left = ' <a href=?page='. ($page - 3) .'>'. ($page - 3).'</a> | '; 
if($page - 2 > 0) $page2left = ' <a href=?page='. ($page - 2) .'>'. ($page - 2).'</a> | '; 
if($page - 1 > 0) $page1left = '<a href=?page='. ($page - 1) .'>'. ($page - 1).'</a> | '; 

if($page + 5 <= $pages) $page5right = ' | <a href=?page='. ($page + 5) .'>'. ($page+ 5) .'</a>'; 
if($page + 4 <= $pages) $page4right = ' | <a href=?page='. ($page + 4) .'>'. ($page+ 4) .'</a>'; 
if($page + 3 <= $pages) $page3right = ' | <a href=?page='. ($page + 3) .'>'. ($page+ 3) .'</a>'; 
if($page + 2 <= $pages) $page2right = ' | <a href=?page='. ($page + 2) .'>'. ($page+ 2) .'</a>'; 
if($page + 1 <= $pages) $page1right = ' | <a href=?page='. ($page + 1) .'>'. ($page+ 1) .'</a>'; 
Лучше 2 цикла)
Профиль Ответить
12.12.2014 15:00:02 Пагинация и фильтр поиска Сообщение #8
artyomweb

artyomweb

Освоившийся

Освоившийся

Дата регистрации:
23.09.2014 22:48:11

Сообщений: 26

    Jey-Val-Star спасибо за подсказку с $begin действительно была
серьёзная ошибка всё исправил работает, но вот с самой пагинацией
пока что не получается. Я вроде понял что надо в самой функции
а именно в ссылках по страницам надо что доделывать, но пока только на
уровне догадок))). Подскажи примерно что добавлять в ($page + 1) или
же нужно в функции page() что делать? Что то кручусь вокруг а не выходит.
Профиль Ответить
12.12.2014 15:12:03 Пагинация и фильтр поиска Сообщение #9
Jey-Val-Star

Jey-Val-Star

Освоившийся

Освоившийся

Дата регистрации:
30.11.2014 21:33:11

Сообщений: 27

добавить параметр фильтра в виде GET запрса к URL (если есть)
Там много чего переписывать нужно...
В идеале для выбора из БД - один запрос перед которым проверяется значение фильтра
(если есть значения - то выбираем те которые подходят по это значение)
И точно такой же запрос для пагинации. С одним но вытащить на записи а информацию об их количестве
Профиль Ответить
12.12.2014 15:51:37 Пагинация и фильтр поиска Сообщение #10
artyomweb

artyomweb

Освоившийся

Освоившийся

Дата регистрации:
23.09.2014 22:48:11

Сообщений: 26

        Я сделал условие на проверку GET-запроса в функции выборки из базы:
function sql_query($onpage, $page, $where, $log)
{
    if ($_GET["price_start"]){$start = "`price` >= '".htmlspecialchars($_GET["price_start"])."'";}
    if ($_GET["price_end"]){$end = "`price` >= '".htmlspecialchars($_GET["price_end"])."'";}
    if ($start) $log = "AND ".$start;
 if ($end) $log = "AND ".$end;
 if ($start && $end) $log ="AND ".$start." AND ".$end;
 
$begin = $page*$onpage+1-$onpage; // откуда начинать
 $sql = "SELECT * FROM $where $log LIMIT ".$begin.", ".$onpage;
        $result = mysql_query($sql) or die(mysql_error());
        return $result;
}
       Такую же и в пагинации:
function navigation($onpage, $page, $where, $log)
{
        $return = null;
    if ($_GET["price_start"]){$start = "`price` >= '".htmlspecialchars($_GET["price_start"])."'";}
    if ($_GET["price_end"]){$end = "`price` >= '".htmlspecialchars($_GET["price_end"])."'";}
    if ($start) $log = "AND ".$start;
 if ($end) $log = "AND ".$end;
 if ($start && $end) $log ="AND ".$start." AND ".$end;
  
  $count = mysql_query("SELECT COUNT(*) FROM $where $log" or die(mysql_error());
        $count = mysql_fetch_array($count);
        $count = $count[0];
        $pages = $count/$onpage;
//Дальше идут if(ы)
      Запрос из фильтра работает и выводится информация но пагинация всё равно работает
по старому запросу. C вставкой GET параметра из фильтра в URL я не совсем понял.
В URL который значится в if(ах) в функции пагинации или в URL который идёт изначально при
загрузке страницы до фильтра.
Профиль Ответить