<MyRusakov.ru />

Фреймворк Yii 2.0 с нуля. Пример создания сайта

Фреймворк Yii 2.0 с нуля. Пример создания сайта

Видеокурс "Фреймворк Yii 2.0 с нуля. Пример создания сайта" обучит Вас созданию профессиональных сайтов с использованием фреймворка Yii. В курсе есть 2 раздела: теоретический и практический. В теоретическом разделе будут разобраны возможности фреймворка Yii с примерами их использования, а в практической части будет создан сайт Blog.MyRusakov.ru с помощью полученных знаний из теоретического раздела.

Так же почти ко всем урокам идут упражнения для закрепления материала из урока на практике.

После прохождения курса Вы без труда сможете создавать любые сайты с использованием фреймворка Yii, причём делать это будете быстро и качественно.

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

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

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

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

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

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

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

Пагинация и фильтр поиска
13.12.2014 15:20:42 Пагинация и фильтр поиска Сообщение #1
artyomweb

artyomweb

Освоившийся

Освоившийся

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

Сообщений: 26

<?php
$onpage = 15; // записей на страницу
$page = page(); // определяем страницу
[code][/code]
Профиль Ответить
13.12.2014 15:21:57 Пагинация и фильтр поиска Сообщение #2
artyomweb

artyomweb

Освоившийся

Освоившийся

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

Сообщений: 26

<?php
$onpage = 15; // записей на страницу
$page = page(); // определяем страницу
Профиль Ответить
13.12.2014 15:25:02 Пагинация и фильтр поиска Сообщение #3
artyomweb

artyomweb

Освоившийся

Освоившийся

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

Сообщений: 26

<?php
$onpage = 15; // записей на страницу
$page = page(); // определяем страницу
function page()
{
    if(empty($_GET["page"])){
        $page = 1;
    }
 else {
if(!is_numeric($_GET["page"])) die("Неправильный формат номера страницы!";
        $page = $_GET["page"];
    }
 return $page;
}
function navigation($onpage, $page, $where, $log)
{
        $return = null;
  $count = mysql_query("SELECT COUNT(*) FROM $where" or die(mysql_error());
        $count = mysql_fetch_array($count);
        $count = $count[0];
        $pages = ceil($count/$onpage);
       
  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 ="WHERE ".$start." AND ".$end;
  
  if ($_GET['price_start']){
  $count = mysql_query("SELECT COUNT(*) FROM $where $log" or die(mysql_error());
  $count = mysql_fetch_array($count);
        $count = $count[0];
        $pages = ceil($count/$onpage);
        }
  
  if ($_GET['price_end']){
     $count = mysql_query("SELECT COUNT(*) FROM $where $log" or die(mysql_error());
  $count = mysql_fetch_array($count);
        $count = $count[0];
        $pages = ceil($count/$onpage);
  }
  
  $con="&price_start=".$_GET['price_start']."&price_end=".$_GET['price_end']."";//Тут я много на мудрил но работает)))
  $getr=(($_GET['price_start'])||($_GET['price_end']));
  if ($page > 1) $pervpage = '<a href=?page=1>Первая</a>|<a href=?page='.($page - 1).'>Предыдущая</a>|';
  if (($page > 1)&&$getr) $pervpage = '<a href=?page=1'.$con.'>Первая</a>|<a href=?page='.($page - 1).$con.'>Предыдущая</a>|';
  
  if (($page != $onpage)&&($page < $pages)) $nextpage = '|<a href=?page='.($page + 1).'>Следующая</a>|<a href=?page='.floor($pages).'>Последняя</a>';
  if (($page != $onpage)&&($page < $pages)&&$getr) $nextpage = '|<a href=?page='.($page + 1).$con.'>Следующая</a>|<a href=?page='.floor($pages).$con.'>Последняя</a>';
  
  if($page - 5 > 0) $page5left = '<a href=?page='.($page - 5).'>'.($page - 5).'</a>|';
  if(($page - 5 > 0)&&$getr) $page5left = '<a href=?page='.($page - 5).$con.'>'.($page - 5).'</a>|'; if($page - 4 > 0) $page4left = '<a href=?page='.($page - 4).'>'.($page - 4).'</a>|';
  if(($page - 4 > 0)&&$getr) $page4left = '<a href=?page='.($page - 4).$con.'>'.($page - 4).'</a>|'; if($page - 3 > 0) $page3left = '<a href=?page='.($page - 3).'>'.($page - 3).'</a>|';
  if(($page - 3 > 0)&&$getr) $page3left = '<a href=?page='.($page - 3).$con.'>'.($page - 3).'</a>|'; if($page - 2 > 0) $page2left = '<a href=?page='.($page - 2).'>'.($page - 2).'</a>|';
  if(($page - 2 > 0)&&$getr) $page2left = '<a href=?page='.($page - 2).$con.'>'.($page - 2).'</a>|'; if($page - 1 > 1) $page1left = '<a href=?page='.($page - 1).'>'.($page - 1).'</a>|';
  if(($page - 1 > 1)&&$getr) $page1left = '<a href=?page='.($page - 1).$con.'>'.($page - 1).'</a>|';if($page + 5 <= $pages) $page5right = '|<a href=?page='.($page + 5).'>'.($page + 5).'</a>';
if(($page + 5 <= $pages)&&$getr) $page5right = '|<a href=?page='.($page + 5).$con.'>'.($page + 5).'</a>';if($page + 4 <= $pages) $page4right = '|<a href=?page='.($page + 4).'>'.($page + 4).'</a>';
if(($page + 4 <= $pages)&&$getr) $page4right = '|<a href=?page='.($page + 4).$con.'>'.($page + 4).'</a>';if($page + 3 <= $pages) $page3right = '|<a href=?page='.($page + 3).'>'.($page + 3).'</a>';
if(($page + 3 <= $pages)&&$getr) $page3right = '|<a href=?page='.($page + 3).$con.'>'.($page + 3).'</a>';if($page + 2 <= $pages) $page2right = '|<a href=?page='.($page + 2).'>'.($page + 2).'</a>';
if(($page + 2 <= $pages)&&$getr) $page2right = '|<a href=?page='.($page + 2).$con.'>'.($page + 2).'</a>';if($page + 1 <= $pages) $page1right = '|<a href=?page='.($page + 1).'>'.($page + 1).'</a>';
if(($page + 1 <= $pages)&&$getr) $page1right = '|<a href=?page='.($page + 1).$con.'>'.($page + 1).'</a>';if ($page > 1)
{
Error_Reporting(E_ALL & ~E_NOTICE);
echo "<div class=\"pagin_1\">";
echo '<i>Найдено <b>'.$count.'</b> тов. </i>'.$pervpage.$page5left.$page4left.$page3left.$page2left.$page1left.'<span>'.$page.'</span>'.$page1right.$page2right.$page3right.$page4right.$page5right.$nextpage."<i> Всего <b>".$pages."</b> стр.</i>";
echo "</div>";
}
elseif ($page = 1)
{
Error_Reporting(E_ALL & ~E_NOTICE);
echo "<div class=\"pagin\">";
echo '<i>Найдено <b>'.$count.'</b> тов. </i><span>'.$page.'</span>'.$page1right.$page2right.$page3right.$page4right.$page5right.$nextpage."<i> Всего <b>".$pages."</b> стр.</i>";
echo "</div>";
}
}
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;
}
include "sql_connect.php";
 $result = sql_query($onpage, $page, $where, $log);
    $row = mysql_fetch_array ($result);
if ($row['currencyId']='RUR'$money='руб.';
$i=0;
$w=3;
$navigation = navigation($onpage, $page, $where, $log); // определим навигацию
echo $navigation;echo "<div id=\"conttov\"><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['url']);
if(!($i%$w)||(mysql_num_rows($result)==$i))echo"</tr>";
}while ($row = mysql_fetch_array ($result));
echo "</table></div>";
$navigation = navigation($onpage, $page, $where, $log); // определим навигацию
echo $navigation;
mysql_close(); // отключение от БД
?>
Профиль Ответить
13.12.2014 21:04:57 Пагинация и фильтр поиска Сообщение #4
Jey-Val-Star

Jey-Val-Star

Освоившийся

Освоившийся

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

Сообщений: 27

А что у тебя происходит если фильтры не используются?

Сделай так, переменную $log определи до всех функций, причем задай ей сначала пустое значение, а при выполнении условий - значение с where
$log = '';
if (($_GET["price_start"]) && ($_GET["price_end"])) 
    $log = "WHERE `price` >= " . (int)$_GET["price_start"] . "AND `price` <= " .  (int)$_GET["price_end"];

elseif ($_GET["price_start"])
    $log = "WHERE `price` >= " . (int)$_GET["price_start"];

elseif ($_GET["price_end"])
    $log = "WHERE `price` <= " . (int)$_GET["price_end"];
И все, больше проверок на фильтр не нужно. Если нет фильтров то лог будет пустой, иначе с  параметром.
А то неразбериха получается вот здесь
    $count = mysql_query("SELECT COUNT(*) FROM $where" or die(mysql_error()); 
    $count = mysql_fetch_array($count); 
    $count = $count[0]; 
    $pages = ceil($count/$onpage); 
             
    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 ="WHERE ".$start." AND ".$end; 
       
    if ($_GET['price_start'])
    { 
        $count = mysql_query("SELECT COUNT(*) FROM $where $log" or die(mysql_error()); 
        $count = mysql_fetch_array($count); 
        $count = $count[0]; 
        $pages = ceil($count/$onpage); 
    } 
       
    if ($_GET['price_end'])
    { 
        $count = mysql_query("SELECT COUNT(*) FROM $where $log" or die(mysql_error()); 
        $count = mysql_fetch_array($count); 
        $count = $count[0]; 
        $pages = ceil($count/$onpage); 
    } 

Далее перед выводом вот этого
$con="&price_start=".$_GET['price_start']."&price_end=".$_GET['price_end']."";Проверь значения GET.
(можно засунуть в проверку на $log, тем самым уменьшить код и избежать повторений).
$log = '';
$con = '';
if (($_GET["price_start"]) && ($_GET["price_end"])) {
    $log = "WHERE `price` >= " . (int)$_GET["price_start"] . "AND `price` <= " .  (int)$_GET["price_end"];
    $con="&price_start=".(int)$_GET['price_start']."&price_end=".(int)$_GET['price_end']."";
}

elseif ($_GET["price_start"]){
    $log = "WHERE `price` >= " . (int)$_GET["price_start"];
    $con="&price_start=".(int)$_GET['price_start'];
}

elseif ($_GET["price_end"]){
    $log = "WHERE `price` <= " . (int)$_GET["price_end"];
    $con="&price_end=".(int)$_GET['price_end']."";
}
Такую строку можно не использовать
if(!is_numeric($_GET["page"])) die("Неправильный формат номера страницы!"Просто привести к integer и все, или $page = 1;

Такие проверки даром не нужны если определишь заранее $con
if (($page > 1)&&$getr)...
Как-то так...)
Профиль Ответить
14.12.2014 05:41:32 Пагинация и фильтр поиска Сообщение #5
artyomweb

artyomweb

Освоившийся

Освоившийся

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

Сообщений: 26

      Jey-Val-Star, спасибо за то что помог разобраться с этим безумным
кодом))) и со всякими мелкими недостатками!!! Сейчас всё работает.
 Я твой должник)))
Профиль Ответить
15.12.2014 13:02:29 Пагинация и фильтр поиска Сообщение #6
artyomweb

artyomweb

Освоившийся

Освоившийся

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

Сообщений: 26

        А как писать ссылки в пагинации для переменных из формы
с checkbox(ом),  в которой можно выбирать сразу несколько флажков.
Вот такого типа:
<input type="checkbox" name="manufacturers[]" value="Hammer" />
<input type="checkbox" name="manufacturers[]" value="Makita" />
<input type="checkbox" name="manufacturers[]" value="Hitachi" />
Как прописывать здесь ссылки:
if ($_GET['manufacturers']){
    $con = '&manufacturers='.........?//Тут я не знаю что писать в ссылке для страниц
}
Профиль Ответить
15.12.2014 20:03:45 Пагинация и фильтр поиска Сообщение #7
Jey-Val-Star

Jey-Val-Star

Освоившийся

Освоившийся

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

Сообщений: 27

А ты залай фильтр с этими параметрами и смотри на юрл браузера
Но дело в том что manufactured у тебя будет в виде массива 
поэтому просто GET['manufactured'] не пойдет
нужно будет масситв на элементы разбивать
GET['manufactured'] [0], GET['manufactured'] [1], GET['manufactured'] [3]
(Вроде так)
Но лучше использовать цикл foreach, для динамичности (а вдруг у тебя не 3 а больше производителей будет)
Профиль Ответить
15.12.2014 21:24:35 Пагинация и фильтр поиска Сообщение #8
artyomweb

artyomweb

Освоившийся

Освоившийся

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

Сообщений: 26

         Jey-Val-Star, вот сделал так:
if ($_GET['manufacturers']){
    $manuf=array($_GET['manufacturers']);
    foreach ($manuf as $k => $v); 
    $log = "AND vendor = '"......'";//Как дальше заполнять запрос $log не понимаю??
}
          А потом ещё и в ссылку для пагинаций??
    $con = '&manufacturers='.$manuf;//Сам понимаю что-то не то... ???
Профиль Ответить
15.12.2014 22:08:02 Пагинация и фильтр поиска Сообщение #9
Jey-Val-Star

Jey-Val-Star

Освоившийся

Освоившийся

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

Сообщений: 27

Ну, тогда смотри
$manuf=array($_GET['manufacturers']);это неверно в корне, у тебя уже есть массив
$_GET['manufacturers']он не ассоциативный, просто по индексу (0,1,2)
вот его и нужно прогнать через foreach
foreach ($_GET['manufacturers'] as $value)

    /*код в теле цикла*/
Далее, для запроса в бд просто перечисление WHERE через AND не пойдет
SELECT * FROM table WHERE manuf = manuf1 AND manuf = manuf2...Для таких вещей существует классная штука как "Выбрать записи по таким значениям" (это мой дословный перевод)))
В SQL выгладит она как IN
SELECT * FROM table WHERE manuf IN (manuf1, manuf2,...)Но выполнять ее надо перед твоими AND (я имею в виду фильтр по ценам)

Общий вид примерно такой
$log = '';
foreach ($_GET['manufacturers'] as $value)

    if($log != '' $log .= ',';
    $log .= $value;

// и на выходе получим $log = manuf1,manuf2,manuf3
$log = 'manuf IN (' . $log .'
(Я думаю понятно что manuf1,manuf2,manuf3 и manuf IN - это для примера)
После этого функция проверки и добавление в условие WHERE фильтра цен (от до)
В общем при включенных фильтрах производитель и цены (от до) $log у тебя должен получиться таким
WHERE manuf IN(manuf1,manuf2, manuf3) AND price >= 1 AND price <= 10

Кстати совсем забыл
В цикл foreach параллельно добавь  $con
$con = '';
foreach ($_GET['manufacturers'] as $value)

    if($log != '' $log .= ',';
    $log .= $value;
    if($con != '' $con .= '&';
    $con = 'manuf[]=' . $value;
Вроде так
Профиль Ответить
15.12.2014 22:13:00 Пагинация и фильтр поиска Сообщение #10
Jey-Val-Star

Jey-Val-Star

Освоившийся

Освоившийся

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

Сообщений: 27

Ах да, самое главное -
Включай в тело программы вывод некоторых переменных, чтобы понимать что с ними происходит
echo $log;
exit(); // это для остановки программы (тебе ведь только результат нужно увидеть)
Посмотрел понял ошибку, увидел что значение переменной должно быть другим, подправил и закоментировал
//echo $log;
//exit(); // это для остановки программы (тебе ведь только результат нужно увидеть)
Или удалил)))
Профиль Ответить