Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z foreach
Forum PHP.pl > Forum > PHP
mb83
witam,
poniżej przedstawiam kod który ma wyświetlić pojedyncze zdjęcie z galerii.
  1. $zapytanie = "SELECT id, tytul, galeriaduze, galeriamale FROM `newsy` WHERE id='$id' ";
  2.  
  3. $wynik = mysql_query($zapytanie);
  4. while ( $dane = mysql_fetch_row($wynik) ) {
  5. $tytul = $dane[1];
  6. $gd = $dane[2];
  7. $gm = $dane[3];
  8. class PaginateDirectory{
  9. var $sDirectoryPath;
  10. var $iCurrentPage;
  11. var $iNumberResources;
  12. var $iNumberPerPage;
  13. var $aImages;
  14.  
  15. function PaginateDirectory($path, $page){
  16. $this->resetVars();
  17. $this->_setPath($path);
  18. $this->_setCurrentPage($page);
  19. $this->aImages = $this->getResources($path);
  20. } # end constructor
  21.  
  22. function resetVars(){
  23. $this->sDirectoryPath = NULL;
  24. $this->iCurrentPage = 0;
  25. $this->iNumberResources = 0;
  26. $this->iNumberPerPage = NUMBER_PER_PAGE;
  27. $this->aImages = array();
  28. return;
  29. }
  30.  
  31. function _setPath($path){
  32. $this->sDirectoryPath = $path;
  33. return;
  34. }
  35.  
  36. function _setCurrentPage($page){
  37. if( (int)$page < 1 ){
  38. $page = 1;
  39. }
  40. $this->iCurrentPage = (int)$page;
  41. return;
  42. }
  43.  
  44. function getResources($path){
  45. $container = array();
  46. $total = 0;
  47. if (is_dir($path)){
  48. if ($handle = opendir($path)){
  49.  
  50. $begin = ($this->iCurrentPage > 1)
  51. ? (($this->iCurrentPage - 1) * NUMBER_PER_PAGE)
  52. : 0;
  53. $end = $begin + NUMBER_PER_PAGE - 1;
  54.  
  55. while (false !== ($file = readdir($handle))){
  56. if ($file != '.' && $file != '..' && !is_dir($path . $file)){
  57. if( ($total > $begin) && ($total < $end) ){
  58. $size = @getimagesize($path . $file);
  59. $container[$total] = array('file' => $file,
  60. 'dimensions' => $size[3]
  61. );
  62. }
  63. $total++;
  64. }
  65. }
  66. }
  67. }
  68. $this->iNumberResources = $total;
  69. return $container;
  70. }
  71.  
  72. function getImages(){
  73. return $this->aImages;
  74. }
  75.  
  76. function displayCount(){
  77. $fromNumber = ($this->iCurrentPage > 1)
  78. ? (($this->iCurrentPage - 1) * NUMBER_PER_PAGE) + 1
  79. : $this->iCurrentPage;
  80.  
  81. $toNumber = $fromNumber + NUMBER_PER_PAGE - 1;
  82. if ($toNumber > $this->iNumberResources){
  83. $toNumber = $this->iNumberResources;
  84. }
  85.  
  86. return 'Zdjęcie <b>' . $fromNumber . '</b> / <b> <b>' . $this->iNumberResources . '</b>';
  87. }
  88.  
  89. function displayLinks(){
  90. $numberPages = ceil($this->iNumberResources / NUMBER_PER_PAGE);
  91. $output = array();
  92. $previousPage = $this->iCurrentPage - 1;
  93. $nextPage = $this->iCurrentPage + 1;
  94.  
  95. if( $previousPage !== 0 ){
  96. $output[] = '<a href="/photo.php?id='.$_GET['id'].'&amp;page='.$previousPage.'">[<< Poprzednie]</a>';
  97. }
  98.  
  99.  
  100. if ( $nextPage <= $numberPages ){
  101. $output[] = '<a href="/photo.php?id='.$_GET['id'].'&amp;page='.$nextPage.'">[Następne >>]</a>';
  102. }
  103.  
  104. return implode('&nbsp;', $output);
  105. }
  106.  
  107. } # end class
  108. define('NUMBER_PER_PAGE', 1);
  109. define('PATH_TO_DIR', ''.$dane[2].'');
  110. $page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
  111. $list = new PaginateDirectory(PATH_TO_DIR, $page);
  112.  
  113. ?>
  114. <table width="100%">
  115. <tr>
  116. <td><?php echo $list->displayCount(); ?></td>
  117. <td><?php echo $list->displayLinks(); ?></td>
  118. </tr>
  119. <tr>
  120. <td colspan="2">
  121. <? foreach( $list->getImages() as $index => $image ): ?>
  122. <fieldset>
  123. <legend><?php echo basename($image['file']); ?></legend>
  124. <img src="<?php echo basename($image['file']); ?>" <?php echo $image['dimensions']; ?> style='max-wdth: 600px;' />
  125. </fieldset>
  126. <br />
  127. <? endforeach; ?>
  128. </td>
  129. </tr>
  130. <tr>
  131. <td><?php echo $list->displayCount(); ?></td>
  132. <td><?php echo $list->displayLinks(); ?></td>
  133. </tr>
  134. </table>
  135.  
  136. <?php } ?>


I wszystko fajnie działa, pokazuje się paginacja dolna i górna, tylko nie wyświetla się zdjęcie czyli pętla foreach.
  1. <? foreach( $list->getImages() as $index => $image ): ?>
  2. <fieldset>
  3. <legend><?php echo basename($image['file']); ?></legend>
  4. <img src="<?php echo basename($image['file']); ?>" <?php echo $image['dimensions']; ?> style='max-wdth: 600px;' />
  5. </fieldset>
  6. <br />
  7. <? endforeach; ?>


bardzo proszę o pomoc co może być nie tak że nie wykonuje się ta pętla.
PATH_TO_DIR jest ścieżką do pliku gdzie są duże zdjęcia.
KsaR
A gdzieś dodajesz do własności $aImages elementy? Bo nie widze.
Poza tym używaj <?php zamiast samego <?.
mb83
a możesz napisać jak dodawać te elementy?
skrypt znalazłem na jakimś zagranicznym forum, nie za bardzo wiem jak te elementy tam dodać.
Bo chodzi pewnie o to że $aImages nic nie zwraca tak?
KsaR
Cytat(mb83 @ 15.08.2015, 21:35:07 ) *
a możesz napisać jak dodawać te elementy?
skrypt znalazłem na jakimś zagranicznym forum, nie za bardzo wiem jak te elementy tam dodać.
Bo chodzi pewnie o to że $aImages nic nie zwraca tak?

Wywołujesz metode getImages(); ktora zwraca wlasnosc $this->aImages.

Jednak to jest puste bo nigdzie do tej tablicy nie dodajesz..

Mozesz np. Tak:

$this->aImages['klucz']='wartość';

Jak się nie myle.
mb83
super, ale co jest kluczem a co wartością?
czy to ma być coś na zasadzie:
$this->aImages['file']
w którym miejscu to ma być?

skrypt jest stąd:
http://forums.devshed.com/php-development/...tml#post1279792
MESSIAH :)
Cytat(mb83 @ 15.08.2015, 21:35:07 ) *
a możesz napisać jak dodawać te elementy?
skrypt znalazłem na jakimś zagranicznym forum, nie za bardzo wiem jak te elementy tam dodać.
Bo chodzi pewnie o to że $aImages nic nie zwraca tak?

Jak Ty to robisz? Znalazłeś kod z 2005 roku i chcesz go teraz odpalić? Będziesz musiał go trochę zmodyfikować aby zadziałał i nie zapomnij zastąpić metodę mysql na nowszą.
mb83
Cytat(MESSIAH :) @ 15.08.2015, 21:52:14 ) *
Jak Ty to robisz? Znalazłeś kod z 2005 roku i chcesz go teraz odpalić? Będziesz musiał go trochę zmodyfikować aby zadziałał i nie zapomnij zastąpić metodę mysql na nowszą.

ale kod działa tylko nie działa jedna pętla.
może inaczej: da się ten kod odpalić nie uwzględniając przepisania wszystkiego od nowa?
czy jest to napisane tak, że kompletnie się nie da?



trochę łopatologicznie ale działa :-)
  1. <img src="/img/galerie/<?php echo $_GET['id']; ?>/d/<?php echo basename($image['file']); ?>" <?php echo $image['dimensions']; ?>/>


problem jest gdy chcę wyświetlić jedno zdjęcie a nie 20:
  1. define('NUMBER_PER_PAGE', 1);


gdy wyświetlam 10, 12 czy 20 zdjęć to jest tak jak ma być ale gdy chcę jedną albo dwie to już nie działa ta pętla.

pomożecie?
wasyllinio
przy jednym albo dwóch zdjęciach nie wyświetlisz nic. Kod który Ci sprawdza zadziała dopiero od ilości 3.
Przeanalizuj sobie metodę getResources

  1. function getResources($path){
  2. $container = array();
  3. $total = 0;
  4. if (is_dir($path)){
  5. if ($handle = opendir($path)){
  6.  
  7. $begin = ($this->iCurrentPage > 1)
  8. ? (($this->iCurrentPage - 1) * NUMBER_PER_PAGE)
  9. : 0;
  10. $end = $begin + NUMBER_PER_PAGE - 1;
  11.  
  12. while (false !== ($file = readdir($handle))){
  13. if ($file != '.' && $file != '..' && !is_dir($path . $file)){
  14. if( ($total > $begin) && ($total < $end) ){
  15. $size = @getimagesize($path . $file);
  16. $container[$total] = array('file' => $file,
  17. 'dimensions' => $size[3]
  18. );
  19. }
  20. $total++;
  21. }
  22. }
  23. }
  24. }
  25. $this->iNumberResources = $total;
  26. return $container;
  27. }


Załóżmy, że
  1. $begin = 0;
  2. define('NUMBER_PER_PAGE', 1);

wtedy
  1. $end = 0;

a potem spójrz na if'a w linii 57.
  1. if( ($total > 0) && ($total < 0))


Identycznie będzie wyglądać przy
  1. define('NUMBER_PER_PAGE', 2);

wtedy
  1. $end = 1;
  2. if( ($total > 0) && ($total < 1))

W obu przypadkach warunek nie jest spełniony.

Zmień może warunek na >= i <=
  1. if( ($total >= $begin) && ($total <= $end) )



p.s.
jak to ogarniesz, to popraw trochę kod, bo definujesz klasę w pętli while od głównego zapytania...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.