Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: постраничный вывод файлов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
soundstorm
Отправлено: 03 Декабря, 2013 - 16:57:58
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Сент. 2013  


Помог: 0 раз(а)




Всем привет. Реализую постраничный вывод фотографий из сервера с возможностью выбора количества на страницу. Имеется также нумерация страниц. Все работает, но при выборе страницы выбор количества не сохраняется. Например: вывожу 15 фоток на страницу - выводит все нормально. Вывожу 25 - на первой странице все хорошо, только нажимаю на следующую страницу, как снова выводится количество 15.
Вот select:
PHP:
скопировать код в буфер обмена
  1. <form name="form" id="form" method="post" action="<?PHP echo $_SERVER["PHP_SELF"] ?>">
  2.                                         <select name="form" onchange="this.form.submit()">
  3.                                                     <option value="15"<?PHP if(isset($_POST['form'])){if($_POST['form']==15) echo ' selected="selected"';}?> >15</option>
  4.                                                     <option value="20"<?PHP if(isset($_POST['form'])){if($_POST['form']==20) echo ' selected="selected"';}?> >20</option>
  5.                                                     <option value="25"<?PHP if(isset($_POST['form'])){if($_POST['form']==25) echo ' selected="selected"';}?> >25</option>
  6.                                                     </select>

а вот обработчик:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $url = './photos/'; // Папка с изображениями
  3. $cols = 5; // Количество столбцов в будущей таблице с картинками      
  4.             if(isset($_POST['form'])){$n=$_POST['form'];}  // получаем кол-во изображений
  5.             else{$n="";}      
  6.      if($n==""){$max="15"; $n="15";}
  7.     elseif(($n)=="15") {$max="15";$n="15";}
  8.     elseif(($n)=="20"){$max="20";$n="20";}
  9.     elseif(($n)=="25"){$max="25";$n="25";}
  10.   /* делим общее кол-во изображений на максимальное
  11. округляем в большую сторону и тем самым получаем
  12. общее число страниц */
  13. $dir=opendir($url);
  14. while(($file=readdir($dir))!==false)
  15. {
  16.   if($file!="." && $file!="..")
  17.   {
  18.     $images[]=$file;
  19.   }
  20. }
  21. closedir($dir);
  22. // количество изображений
  23. $count=count(@$images);
  24. /* делим общее кол-во изображений на максимальное
  25. округляем в большую сторону и тем самым получаем
  26. общее число страниц */
  27. $pages=ceil($count/$max);
  28.  // вводим переменную, указывающую номер страницы
  29. if(empty($_GET["p"])){$_GET["p"]="1";}
  30. $p=$_GET["p"];
  31. // защита от ввода вместо номера страницы какой-нибудь ерунды
  32. if(preg_match("/[%a-z_@.,^=:;а-я\"*()&$#№+\-!?<>\~`|[{}\]]/i", $p))
  33. {die(header("Location:index.php"));}
  34. // если кто-то вводит номер страницы больше, чем всего у нас страниц
  35. if($pages>0 && $p>$pages){die(header("Location:index.php"));}
  36. $first=($p*$max)-$max ;
  37. $last=($p*$max)-1;
  38. print "Файлів на всього: $count <br><br>";
  39.     echo "<table width=\"100%\">"; // Начинаем таблицу
  40.     $k = 0; // Вспомогательный счётчик для перехода на новые строки
  41.       for($i=$first;$i<=$last;$i++)
  42.       {
  43.           if(@$images[$i])
  44.              {
  45.               if ($k % $cols == 0) echo "<tr>"; // Добавляем новую строку
  46.                 echo "<td>"; // Начинаем столбец
  47.                 $path = $url.$images[$i]; // Получаем путь к картинке
  48.                 echo "<a href='$path'>"; // Делаем ссылку на картинку
  49.                 echo "<img src='$path' alt='' width='100' />"; // Вывод превью картинки
  50.                 echo "</a>"; // Закрываем ссылку
  51.                 echo "</td>"; // Закрываем столбец
  52.                 /* Закрываем строку, если необходимое количество было выведено, либо данная итерация последняя */
  53.                 if ((($k + 1) % $cols == 0) || (($i + 1) == count($files))) echo "</tr>";
  54.                 $k++; // Увеличиваем вспомогательный счётчик
  55.              }
  56.          
  57.       }
  58.    print "<br><br>Страницы: ";
  59. for($u=1;$u<=$pages;$u++)
  60. {
  61.   if($p!=$u){print "<a href='demo_users.php?n=$n&p=$u'>$u</a> ";}
  62.   elseif($p==$u){print "<b>$u</b> ";}
  63.  
  64. }
  65. echo "n=".$n. "  u=".$u. "   pages=".$pages. "    p=".$p;
  66.         ?>

подскажите, что не так?
 
 Top
dXdYdZ
Отправлено: 03 Декабря, 2013 - 17:12:29
Post Id


Посетитель


Покинул форум
Сообщений всего: 271
Дата рег-ции: Нояб. 2013  


Помог: 11 раз(а)




Здравствуйте. Потому что у Вас число $n получается из $_POST, а при переходе по ссылке оно передаётся методом $_GET. Используйте $_REQUEST.
Вместо
PHP:
скопировать код в буфер обмена
  1. if(isset($_POST['form'])){$n=$_POST['form'];}

Используйте
PHP:
скопировать код в буфер обмена
  1. if(isset($_REQUEST['form'])){$n=$_REQUEST['form'];}

А, и ещё: в ссылке Вы назвали эту переменную уже не form, а n. Определитесь. Или и в форме, и в ссылке перехода на другую страницу назовите её n, или и там и там form.

(Отредактировано автором: 03 Декабря, 2013 - 17:12:51)

 
 Top
soundstorm
Отправлено: 04 Декабря, 2013 - 13:33:23
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Сент. 2013  


Помог: 0 раз(а)




Спасибо, но это не помогло. n - это количество фото на странице. Проблема заключается в том, что после нажатия на определенную страницу, значение n сбивается, не сохраняется

(Отредактировано автором: 04 Декабря, 2013 - 13:39:52)

 
 Top
alexforce2
Отправлено: 04 Декабря, 2013 - 16:05:11
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Сент. 2013  


Помог: 1 раз(а)




Может стоит хранить значение n в сессии?
 
 Top
soundstorm
Отправлено: 04 Декабря, 2013 - 16:25:27
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Сент. 2013  


Помог: 0 раз(а)




да, уже так и сделал. Вот в таком варианте все работает:
PHP:
скопировать код в буфер обмена
  1. if($n==""){$max=$_SESSION['m'];}
  2.     elseif(($n)=="15") {$max="15";$n="15";$_SESSION['n']=$n;$_SESSION['m']=$max;}
  3.     elseif(($n)=="20"){$max="20";$n="20";$_SESSION['n']=$n;$_SESSION['m']=$max;}
  4.     elseif(($n)=="25"){$max="25";$n="25";$_SESSION['n']=$n;$_SESSION['m']=$max;}

но когда страница открывается первый раз, то сессия пуста, и естественно ничего не выводит!
 
 Top
dXdYdZ
Отправлено: 04 Декабря, 2013 - 16:34:17
Post Id


Посетитель


Покинул форум
Сообщений всего: 271
Дата рег-ции: Нояб. 2013  


Помог: 11 раз(а)




Покажите код, который у Вас получился после исправления того, что я Вам подсказал.
(Добавление)
По-моему хранить это в сессии-не лучший вариант. В таком случае одна и та же ссылка на Вашу страницу будет возвращать разные результаты в зависимости от значения в сесии. Особенно если к этой странице имеет доступ поисковая система.
 
 Top
soundstorm
Отправлено: 04 Декабря, 2013 - 16:46:21
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Сент. 2013  


Помог: 0 раз(а)




Все, работает. Правда извращенский получился код...
Просто добавил дополнительную переменную при наличии пустой сессии:
PHP:
скопировать код в буфер обмена
  1. $m="15";
  2.         if(isset($_SESSION['m']))
  3.            { $m='';}
  4.      if($n==""){$max=$_SESSION['m'];}
  5.     elseif(($n)=="15") {$max="15";$n="15";$_SESSION['n']=$n;$_SESSION['m']=$max;}
  6.     elseif(($n)=="20"){$max="20";$n="20";$_SESSION['n']=$n;$_SESSION['m']=$max;}
  7.     elseif(($n)=="25"){$max="25";$n="25";$_SESSION['n']=$n;$_SESSION['m']=$max;}

и при поиске страниц делаем соответствующую проверку.
PHP:
скопировать код в буфер обмена
  1. if ($m == '')
  2. {
  3.   $pages=ceil($count/$max);
  4. }
  5. elseif ($m="15") {$max="15"; $pages=ceil($count/$max);}

Работает, но наверное надо будет переделать с аяксом, уж больно мне не нравится эта постоянная перезагрузка страниц.
Всем спасибо за сотрудничество)
 
 Top
alexforce2
Отправлено: 04 Декабря, 2013 - 18:13:14
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Сент. 2013  


Помог: 1 раз(а)




dXdYdZ пишет:
По-моему хранить это в сессии-не лучший вариант. В таком случае одна и та же ссылка на Вашу страницу будет возвращать разные результаты в зависимости от значения в сесии. Особенно если к этой странице имеет доступ поисковая система.

Может ошибаюсь, но по-моему, для каждого клиента создаётся уникальная сессия.
 
 Top
dXdYdZ
Отправлено: 04 Декабря, 2013 - 18:18:09
Post Id


Посетитель


Покинул форум
Сообщений всего: 271
Дата рег-ции: Нояб. 2013  


Помог: 11 раз(а)




alexforce2 пишет:
Может ошибаюсь, но по-моему, для каждого клиента создаётся уникальная сессия.

В том-то и дело, что сессия у каждого уникальная и количество записей на странице у всех будет разное (кто сколько выбрал). И одна и та же ссылка на эту страницу будет на самом деле указывать на разные страницы, в зависимости от сессии. Если, например, кто-то выставит 25 записей на странице и поделится ссылкой, то тот, с кем поделились, увидит только 15 записей на странице, так как он ещё не выставлял это значение. И может возникнуть путаница.
 
 Top
soundstorm
Отправлено: 05 Декабря, 2013 - 08:57:30
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Сент. 2013  


Помог: 0 раз(а)




Да, здесь вы правы. Но по-другому тут никак. Постараюсь переделать на java, тогда никаких проблем не возникнет))
 
 Top
dXdYdZ
Отправлено: 05 Декабря, 2013 - 11:41:57
Post Id


Посетитель


Покинул форум
Сообщений всего: 271
Дата рег-ции: Нояб. 2013  


Помог: 11 раз(а)




Почему же никак? Можно передавать количество файлов на странице в виде GET-параметра ссылки, как Вы и пытались сделать с самого начала.

(Отредактировано автором: 05 Декабря, 2013 - 12:03:27)

 
 Top
soundstorm
Отправлено: 09 Января, 2014 - 14:01:18
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Сент. 2013  


Помог: 0 раз(а)




Как обещал, выкладываю очень красивый постраничный вывод на jquery, может кому пригодится:
CODE (javascript):
скопировать код в буфер обмена
  1. (function ($){  
  2. // Создаем плагин jQuery sweetPages:
  3. $.fn.sweetPages = function(opts){
  4.        
  5.         // Если не было передано никаких опций, создаем пустой объект opts
  6.         if(!opts) opts = {};   
  7.         var resultsPerPage = opts.perPage || 3;
  8.         // Плагин лучше всего работает с неупорядоченным списком, хотя ol тоже будет обработан:
  9.         var ul = this;
  10.         var li = ul.find('li');
  11.         li.each(function(){
  12.                 // Вычисление высоты каждого элемента li, и запоминание значения с помощью метода data:
  13.                 var ul = $(this);
  14.                 ul.data('height',ul.outerHeight(true));
  15.         });    
  16.         // Вычисление общего количества страниц:
  17.         var pagesNumber = Math.ceil(li.length/resultsPerPage); 
  18.         // Если страниц меньше, чем две, то ничего не делаем:
  19.         if(pagesNumber<2) return this;
  20.         // Создаем управляющий div:
  21.         var swControls = $('<div class="swControls">');
  22.         for(var i=0;i<pagesNumber;i++)
  23.         {
  24.                 // Разделяем части li, и заключаем их в div swPage:
  25.                 li.slice(i*resultsPerPage,(i+1)*resultsPerPage).wrapAll('<div class="swPage" />');             
  26.                 // Добавляем ссылку на div swControls:
  27.                 swControls.append('<a href="" class="swShowPage">'+(i+1)+'</a>');
  28.         }
  29.         ul.append(swControls); 
  30.         var maxHeight = 0;
  31.         var totalWidth = 0;    
  32.         var swPage = ul.find('.swPage');
  33.         swPage.each(function(){        
  34.                 // Цикл по всем созданным страницам:           
  35.                 var elem = $(this);
  36.                 var tmpHeight = 0;
  37.                 elem.find('li').each(function(){tmpHeight=$(this).data('height');}); //{tmpHeight+=$(this).data('height');});
  38.                 if(tmpHeight>maxHeight)
  39.                         maxHeight = (tmpHeight*3)+10; //высота ul
  40.                 totalWidth+=elem.outerWidth();         
  41.                 elem.css('float','left').width(ul.width());
  42.         });    
  43.         swPage.wrapAll('<div class="swSlider" />');    
  44.         // Установка высоты ul в значение самой высокой страницы:
  45.         ul.height(maxHeight);  
  46.         var swSlider = ul.find('.swSlider');
  47.         swSlider.append('<div class="clear" />').width(totalWidth);
  48.         var hyperLinks = ul.find('a.swShowPage');      
  49.         hyperLinks.click(function(e){          
  50.                 // Если управляющая ссылка нажата, прокручиваем div swSlider
  51.                 // (который содержит все страницы) и отмечаем ее как активную:
  52.                 $(this).addClass('active').siblings().removeClass('active');           
  53.                 swSlider.stop().animate({'margin-left':-(parseInt($(this).text())-1)*ul.width()},'slow');
  54.                 e.preventDefault();
  55.         });    
  56.         // Отмечаем первую ссылку как активную при первом запуске кода:
  57.         hyperLinks.eq(0).addClass('active');   
  58.         // Центрируем управляющий div:
  59.         swControls.css({
  60.                 'left':'50%',
  61.                 'margin-left':-swControls.width()*0.5  //положение нумерации страниц
  62.         });    
  63.         return this;   
  64. }})(jQuery);
  65.  
  66. $(document).ready(function (){
  67.         /* Следующий код выполняется единожды сразу после загрузки DOM */      
  68.         // Вызов плагина jQuery и разделение списка-контейнера UL
  69.         // на страницы по 3 li на каждой:      
  70.         $('#gallery').sweetPages({perPage:12}); //количество ел-в на страницу (связь строка55) 
  71.         // По умлочанию плагин вставляет ссылки на страницы в ul,
  72.         // но нам нужно вставить их в основной контейнер:
  73.         var controls = $('.swControls').detach();
  74.         controls.appendTo('#gallery'); 
  75. });

css:
CODE (htmlphp):
скопировать код в буфер обмена
  1. &#65279;*{
  2.         /* Универсальные установки страницы */
  3.         margin:0;
  4.         padding:0;
  5. }
  6.  
  7. body{
  8.         /* Установка цвета текста, фон и набора шрифтов */
  9.         font-size:0.825em;
  10.         color:#666;
  11. /*      background:url('img/page_bg.jpg') repeat-x #383b3f;*/
  12.         font-family:Arial, Helvetica, sans-serif;
  13. }
  14.  
  15. #main{
  16.         /* Основной контейнер div */
  17.         position:relative;     
  18.         width:100%;
  19.         border: 2px #000000;
  20. }
  21.  
  22. #gallery{
  23.         /* Неупорядоченный список, который разбивается на страницы */
  24.         overflow:hidden;
  25.         position:relative;
  26.         background:url('img/dark_bg.jpg') repeat #4e5355;
  27.         padding-bottom:10px;
  28.         /*      Внутренние тени CSS3 (webkit закоментирован, поому что Google Chrome
  29.                 не поддерживает скругленные углы скомбинированные с внутренними тенями): */
  30.         -moz-box-shadow:0 0 10px #222 inset;
  31.         /*-webkit-box-shadow:0 0 10px #222 inset;*/
  32.         box-shadow:0 0 10px #222 inset;
  33. }
  34.  
  35. .swControls{
  36.         position:absolute;
  37.         margin-top:10px;
  38. }
  39.  
  40. a.swShowPage{
  41.         /* Сыылки, которые инициируют проскальзывание страниц*/
  42.         background-color:#444444;
  43.         float:left;
  44.         height:15px;
  45.         margin:4px 3px;
  46.         text-indent:-9999px;
  47.         width:15px;
  48.         /*border:1px solid #ccc;*/
  49.        
  50.         /* Скругленные углы CSS3 */
  51.        
  52.         -moz-border-radius:7px;
  53.         -webkit-border-radius:7px;
  54.         border-radius:7px;
  55. }
  56.  
  57. a.swShowPage:hover,
  58. a.swShowPage.active{
  59.         background-color:#2993dd;
  60.        
  61.         /*      Внутренние тени CSS3 */
  62.        
  63.         -moz-box-shadow:0 0 7px #1e435d inset;
  64.         /*-webkit-box-shadow:0 0 7px #1e435d inset;*/
  65.         box-shadow:0 0 7px #1e435d inset;
  66. }
  67.  
  68. #gallery li{
  69.         background-color:#F4F4F4;
  70.         list-style:none outside none;
  71.         margin:10px 20px 0;
  72.         padding:20px;
  73.         float:left;
  74.  
  75.         /* Обычные тени CSS3: */
  76.  
  77.         -moz-box-shadow:0 0 6px #111111;
  78.         -webkit-box-shadow:0 0 6px #111111;
  79.         box-shadow:0 0 6px #111111;
  80. }
  81.  
  82. #gallery,
  83. #gallery li{
  84.         /* Применение скругленных углов к внешнему контейнеру и контейнерам li */
  85.         -moz-border-radius:8px;
  86.         -webkit-border-radius:8px;
  87.         border-radius:8px;
  88. }
  89.  
  90. .clear{
  91.         /* Данный класс удаляет плавающие элементы */
  92.         clear:both;
  93. }
  94.  
  95.  
  96. /* Стили, приведенные ниже нужны только для демонстрационной страницы */
  97.  
  98. h1{
  99.         background-color:#272B2C;
  100.         border-bottom:1px solid #000000;
  101.         color:#EEEEEE;
  102.         font-size:32px;
  103.         font-weight:normal;
  104.         margin-bottom:30px;
  105.         padding:30px 0;
  106.         text-align:center;
  107.        
  108.         -moz-box-shadow:0 1px 0 #444444;
  109.         -webkit-box-shadow:0 1px 0 #444444;
  110.         box-shadow:0 1px 0 #444444;
  111. }
  112.  
  113. h1,h2{
  114.         font-family:"Myriad Pro",Arial,Helvetica,sans-serif;
  115. }
  116.  
  117. h2{
  118.         font-size:14px;
  119.         font-weight:normal;
  120.         text-align:center;
  121.        
  122.         position:absolute;
  123.         right:40px;
  124.         top:73px;
  125. }
  126.  
  127. a, a:visited {
  128.         color:#0196e3;
  129.         text-decoration:none;
  130.         outline:none;
  131. }
  132.  
  133. a:hover{
  134.         text-decoration:underline;
  135. }
  136.  
  137. a img{
  138.         border:none;
  139. }

а вызывать ф-ю в нужном месте примерно так: $.getScript("js/script.js");
все хорошо работает)
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB