галерея из папки на PHP

Enigma_man

Здравствуйте, я в php вроде как не «бум-бум», но слепил что то вроде того:

PHP:
  1. <?php  
  2.    
  3.             $file3d = »; // переменная для цикла с HTML
  4.             $newArr3d = array();
  5.             $file_parts_3d = array();
  6.             $ext_3d=»;
  7.             $title_3d=»;
  8.             $ar_title_3d = array();
  9.             $dir3d = ‘3d’;
  10.             $allowed_types_3d=array(‘iv3d’);
  11.            
  12.            
  13.             $fileico = »; // переменная для цикла с HTML
  14.             $newArrIco = array();
  15.             $file_parts_ico = array();
  16.             $ext_ico=»;
  17.             $title_ico=»;
  18.             $ar_title_ico = array();
  19.             $dirico=‘ico’;
  20.             $allowed_types_ico=array(‘jpg’);
  21.             $i=1;
  22.             $ii=0;
  23.            
  24. $iter3d = new FilesystemIterator($dir3d, FilesystemIterator::KEY_AS_FILENAME);
  25. $iterico = new FilesystemIterator($dirico,FilesystemIterator::KEY_AS_FILENAME);
  26.  
  27. //—————————————————————————————-
  28. //————цикл для картинок——————————————————-
  29. foreach($iterico as $filePathico):
  30. $infileico = $iterico;
  31. $ar_title_ico[] = $filePathico;
  32.     endforeach;  
  33.    
  34. //———— массив картинов в строку ———————
  35. //$fileico_ar = $ar_title_ico;
  36. $n_fileico_ar = implode(‘ ‘,$ar_title_ico);
  37. $new_fileico_ar = explode(‘ico\’,$n_fileico_ar);
  38. $newArrIco = array_diff($new_fileico_ar,array(»));
  39.  
  40. var_dump($n_fileico_ar);
  41. echo «<br>»;
  42. var_dump($new_fileico_ar);
  43. echo «<br>»;
  44. var_dump($newArrIco);
  45.  
  46.  
  47. //————цикл для 3d——————————————————-
  48. foreach($iter3d as $filePath3d):
  49. $infile3d = $iter3d;
  50. $ar_title_3d[] = $filePath3d;
  51.     endforeach;  
  52. //———— массив 3d в строку ———————
  53. $n_file3d_ar = implode(‘ ‘,$ar_title_3d);
  54. $new_file3d_ar = explode(‘3d\’,$n_file3d_ar);
  55. $newArr3d = array_diff($new_file3d_ar,array(»));
  56.  
  57.  
  58.  
  59.  
  60. //————-тестовый вывод————
  61.  
  62. /*
  63. echo»$fileico»;
  64. echo»<br>»;
  65. echo»$file3d»;
  66. echo»<br>»;
  67. */
  68. //—————————————————-
  69. while ($ii<count($newArr3d)):
  70.  
  71.         $file3d = $newArr3d[$i];
  72.         $fileico = $newArrIco[$i];
  73.  
  74.  
  75.         $file_parts_ico = explode(‘.’,$fileico);
  76.         $ext_ico = strtolower(array_pop($file_parts_ico));
  77.         $title_ico = implode(‘.’,$file_parts_ico);
  78.         $title_ico = htmlspecialchars($title_ico);
  79.  
  80.         $file_parts_3d = explode(‘.’,$file3d);
  81.         $ext_3d = strtolower(array_pop($file_parts_3d));
  82.         $title_3d = implode(‘.’,$file_parts_3d);
  83.         $title_3d = htmlspecialchars($title_3d);              
  84.  
  85.                 echo ‘<div id=»div’.$title_3d.‘» class=»white-popup mfp-hide»>
  86.                       <canvas id=»‘.$title_3d.‘»    class=»can3d» > </canvas>
  87.                      </div>
  88.                  
  89.                    <div class=»col-md-4 col-sm-6″>
  90.                        <div class=»box-work»>
  91.                            <div class=»work-preview»>
  92.                                    <a href=»#div’.$title_3d.‘» title=»‘.$title_ico.‘» class=»open-popup-link»><img src=»‘.$dirico.«https://php.ru/».$fileico.‘» class=»imgsmall» alt=»»></a>
  93.                                <div class=»hover»>
  94.                                    <div class=»link-btns»>
  95.                                        <a href=»#div’.$title_3d.‘» title=»‘.$title_ico.‘» class=»open-popup-link»><i class=»fa fa-search-plus»></i></a>
  96.                                    </div>
  97.                                </div>
  98.                            </div>
  99.                        </div>
  100.                    </div>
  101.                    ‘;
  102.    
  103.             $i++;
  104.             $ii++;
  105. endwhile;
  106.  
  107. ?>

код работает отлично на win10 Open Server 5.3.8 и если грузит на хостинг с linux, то стоит поменять

PHP:
  1. $new_fileico_ar = explode(‘ico\’,$n_fileico_ar);

и

PHP:
  1. $new_file3d_ar = explode(‘3d\’,$n_file3d_ar);

на

PHP:
  1. $new_fileico_ar = explode(‘ico/’,$n_fileico_ar);

и

PHP:
  1. $new_file3d_ar = explode(‘3d/’,$n_file3d_ar);

соответственно.
Начал писать пост как раз таки по проблеме того что на хостинге почему-то не работает, но пока оформлял тему, сам заметил данную проблему.

PS: вопрос к специалистам, по содержанию кода. Можно ли его как то упростить?
И как много косяков я допустил? Делал так чтобы код прежде всего работал.
Время потраченное на написание вместе с изучение заняло 3 недели!!!

 

Drunkenmunky

Попробуйте описать что делает ваш скрипт своими словами.
Если нужно вывести изображения из какой-то конкретной директории, то зачем вы там что-то разбиваете и т.д.

 

don.bidon

Пардон, анализировать код ломы, хардкодный прямой и обратный слэши замените на константу DIRECTORY_SEPARATOR
Хотя действительно непонятно, зачем там такие извращения.

 

Enigma_man

замена на константу — учтем, Спасибо
Мне нужно было сделать галерею со скриншотами 3d моделей, и уже последующий показ самой 3d модели в сплывающем окне, при размере скриншота 200кб и размер модели 15-25мб, логично не выпихивать все модели на странице, иначе пользователь не дождется загрузки.
Извращения в коде, из за того что я не знаю как токовой php, а explode в моем случае удаляет путь к файлу оставляя только его имя и расширение. Из примера обычной галереи из папки лепил. Сначала делал с использованием openDir, потом по мере ковыряний нашел SPL, как то он мне больше понравился.

У меня применяется js с выводом в canvas 3D модели *.iv3d.
на примере этого же кода php в <head> образуется:

Код (Javascript):
  1. <script type=«text/javascript»>
  2.                     var view3d;
  3.                     function ivCommonInit3d()
  4.                     {var canvas=document.getElementById(«bark1»);
  5.             canvas.width = window.innerWidth;
  6.             canvas.height = window.innerHeight;
  7.             view3d=new iv.window({canvas:canvas,file:«3d/bark1.iv3d»,color:0x777777});
  8.             var canvas=document.getElementById(«rol_boston2»);
  9.             canvas.width = window.innerWidth;
  10.             canvas.height = window.innerHeight;
  11.             view3d=new iv.window({canvas:canvas,file:«3d/rol_boston2.iv3d»,color:0x777777});
  12.             }
  13.             window.onresize = function(){view3d.setViewSize(window.innerWidth,window.innerHeight);}
  14.          
  15.                     </script>

а в <body> образуется:

HTML:
  1. <div id=«divrol_boston2» class=«white-popup mfp-hide»>
  2.                        <canvas id=«rol_boston2» class=«can3d» width=«1280» height=«978»> </canvas>
  3.                       </div>
  4.                  
  5.                     <div class=«col-md-4 col-sm-6»>
  6.                         <div class=«box-work»>
  7.                             <div class=«work-preview»>
  8.                                     <a href=«#divrol_boston2» title=«bark1» class=«open-popup-link»><img src=«ico/bark1.jpg « class=«imgsmall» alt=«»></a>
  9.                                 <div class=«hover»>
  10.                                     <div class=«link-btns»>
  11.                                         <a href=«#divrol_boston2» title=«bark1» class=«open-popup-link»><i class=«fa fa-search-plus»></i></a>
  12.                                     </div>
  13.                                 </div>
  14.                             </div>
  15.                         </div>
  16.                     </div>
  17.                     <div>
 

Drunkenmunky

Создайте список путей к директориям со скриншотами, например в текстовом файле или базе данных присвоив им уникальный ID.
И извлекайте их по ID передавая в GET в виде числа.
Так же можно поступить и с самими скринами. Хотя не обязательно — список файлов в директории можно получать с помощью glob() в массив, разбивая его на части для постраничной навигации.

 

Enigma_man

много страниц не требуется. Я планирую показывать только свои работы. По этому я решил изначально отказаться от идеи с базой данных, да и + ко всему, это еще недели 3 на изучение вопроса работы с базой данных!!!

зы: как я могу изменить тему чтобы добавить описание?

 

Drunkenmunky

Она вовсе не обязательна.
Текстовый файл, массив в переменной и т.д.

 

Enigma_man

А интересно при множественных запросах, как массив работает? Это динамический элемент для каждого запроса свой, или же он генерируется в структуре страницы на сервере?
И кстати собственно так и происходит. у меня генерируется массив с картинками, и массив с моделями, счетчик считает количество элементов массива и проводит итерации цикла while. Картинки выводятся в виде «превью» иконки, а модель открывается при вызове canvas хранящемся в скрытом div’е. Если конечно захотеть, можно сделать и генерацию отдельно страниц при превышении например 9 элементов. И добавить кнопку для пользователя — сколько элементов ему выводить. и т. д но это уже отдельный вопрос. если кому то надо — пусть делает. Я же выложил свой код на обзор и оценки, ну и соответственно идеи Ваши могут кого то навести на мысль.

 

Drunkenmunky

Ну, если работает, то оценка «удовлетворительно».
Слегка растянуто.
Поэтому кто-то вникать особо не будет. Так как эту задачу можно решить в несколько строк.

 

Enigma_man

Спасибо!!!
Хотелось бы увидеть по возможности эти несколько строк!!! Для самообразования!!!

 

Drunkenmunky

PHP:
  1. <pre>
  2. <?php
  3. $path = array(
  4. ‘123’ => ‘/path/to/dir/’,
  5. ‘124’ => ‘/path/to/dir2/’
  6. );
  7.  
  8. $key = 0;
  9.  
  10. if(isset($_GET[‘did’]))
  11. {
  12. $key = (int)$_GET[‘did’];
  13. }
  14.  
  15. if(isset($path[$key]))
  16. {
  17. print_r(glob($path[$key].‘*.png’))
  18. }
  19. ?>
  20. <br>
  21. <a href=»?did=123″>123</a>
  22. <br>
  23. <a href=»?did=124″>124</a>
 

miketomlin

https://gency.ru/g-drive-dbe-3
https://gency.ru/comment/127
https://gency.ru/comment/130

P.S. Если работ не много, пагинация не нужна. Вместо всплывающих окон можно использовать отдельные страницы. Скрипт сам выберет данные из БД для них. Обращаетесь к полям, как показано тут: https://gency.ru/comment/125

 

Enigma_man

За это спасибо большое. почитаю, изучу!!!
— Добавлено —

Для меня это будет вообще удобно. Так как я смогу сделать к примеру более подробное описание работы. Неже ли просто галерею.
Спасибо!!!

 

don.bidon

https://www.php.net/manual/ru/function.basename.php

 

Enigma_man

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

Да так собственно и пытался сделать, но почему то при выходе из цикла var_damp выводил объект с лишней инфой.
Я ж говорю. я 3 недели как изучаю php, и только из за того что нужно было вот такое вот получить!!!

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *