Solved

Setting conditional regions on PHP slideshow

Posted on 2004-09-23
13
259 Views
Last Modified: 2013-12-12
The following thread contains a neat little PHP function that will allow a slide show of pictures contained within a directory. The problem is that the first picture displays the "previous" link as well as the last picture displaying "next" The thread is located at http://www.experts-exchange.com/Web/Web_Languages/PHP/PHP_Databases/Q_20860190.html?query=php+slide+show&clearTAFilter=true

My question is how to get those links to create either a loop, so that clicking "previous" while viewing the first pic will take you to the last one OR how to set a conditional region on those links if they happen to be on the first or last picture.

Here's my current code:

$dir = @opendir("./slideshow");

$x = 0;
while( $file = @readdir($dir) )
{
     if( preg_match("/^\.$/", $file) || preg_match("/^\.\.$/", $file) )
     {
          //do nothing :)
     }
     else
     {
          $image[$x] = $file;
          $x++;
     }
}

@closedir($dir);

$key = ( isset($_GET['next']) ) ? $_GET['next'] : 0;
$prev_id = $key - 1;
$next_id = $key + 1;

echo "<center><img src=\"slideshow/" . $image[$key] . "\">\n<br>\n<br>\n";
echo "<a href=\"" . $PHP_SELF . "?next=" . $prev_id . "\" class=mainlink>Previous Image</a>\n";
echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n";
echo "<a href=\"" . $PHP_SELF . "?next=" . $next_id . "\" class=mainlink>Next Image</a>\n";
echo "</center>\n";
0
Comment
Question by:cbeaudry1
  • 7
  • 4
  • 2
13 Comments
 
LVL 6

Expert Comment

by:peyox
ID: 12139883
$key - actual picture
$x - number of pictures

INIFINITE LOOP:
Simple coditional statements will do the job:

$prev_id = $key>1 ? $key-1 : $x;
$next_id = $key<$x ? $key+1 : 1;

BLOCKING PREVIOUS/NEXT LINKS:

if ($prev_id>0) // added line
      echo "<a href=\"" . $PHP_SELF . "?next=" . $prev_id . "\" class=mainlink>Previous Image</a>\n";
echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n";
if ($next_id<=$x)  // added line
      echo "<a href=\"" . $PHP_SELF . "?next=" . $next_id . "\" class=mainlink>Next Image</a>\n";
echo "</center>\n";
0
 
LVL 6

Expert Comment

by:peyox
ID: 12139891
Also you may want to add code for FIRST/LAST image:

echo "<a href=\"" . $PHP_SELF . "?next=1\" class=mainlink>First Image</a>\n";

echo "<a href=\"" . $PHP_SELF . "?next=" . $x . "\" class=mainlink>Last Image</a>\n";
0
 

Author Comment

by:cbeaudry1
ID: 12140141
I'm more of a newbie at PHP. I usually program in ASP...

I'm running into a problem where the first image will only show up when there's no querystring at the end of the URL. Otherwise, I get a broken link that doesn't have an image file name when I hit the first image.

The loop works fine except when it gets to that first image.

Do I need to assign specific values to $key and $x?
0
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
LVL 6

Accepted Solution

by:
peyox earned 100 total points
ID: 12140216
Ok, here's the complete script (revised, reubilded):

<?
      $dir = @opendir("./slideshow");
      $noOfImages = 0;

      while( $file = @readdir($dir) )
            if( !preg_match("/^\.$/", $file) && !preg_match("/^\.\.$/", $file) )
                  $image[++$noOfImages] = $file;
      
      @closedir($dir);
      
      $imageid = ( isset($_GET['image']) ) ? $_GET['image'] : 1;


      echo "<center>";

      if ($imageid>1)
      {
            echo "| <a href=\"" . $PHP_SELF . "?image=1\" class=mainlink>First Image</a> | ";
            echo "<a href=\"" . $PHP_SELF . "?image=" . ($imageid-1) . "\" class=mainlink>Previous Image</a> | ";
      }
      else
      {
         echo "First Image | ";
         echo "Previous Image | ";
      }
        
      if ($imageid<$noOfImages)
      {
            echo "<a href=\"" . $PHP_SELF . "?image=" . ($imageid+1) . "\" class=mainlink>Next Image</a> | ";
            echo "<a href=\"" . $PHP_SELF . "?image=" . $noOfImages . "\" class=mainlink>Last Image</a> |";
      }
      else
      {
         echo "Next Image | ";
         echo "Last Image |";
      }

      echo "<br><br>";
      echo "<img src=\"slideshow/" . $image[$imageid] . "\">\n<br>\n<br>";
      echo "</center>";

?>
0
 

Author Comment

by:cbeaudry1
ID: 12141952
Works like a charm. Thanks!
0
 
LVL 3

Expert Comment

by:danomatic
ID: 12156537
peyox:

 I have this working but after the second image, all I get are broken image icons.

I know this question is closed so I am willing to open a new question to trouble shoot this.

here is my URL:

http://www.akersdesignrender.com/photoscript.php 

I have all the images in a folder call "slideshow"

-- Dan
0
 
LVL 6

Expert Comment

by:peyox
ID: 12156554
Hi Dan,

How does your directory structure looks like?
You probably have folder(s) in it.

Try to put all images in one folder, without subfolder, because that simple function doesn't check whenever "file" is a folder or not.

Let me know if you have any problems.

Cheers,
peyox
0
 
LVL 3

Expert Comment

by:danomatic
ID: 12156699
This is what I have:

/slideshow/name_of_image.jpg (no sub folders here)

/photoscript.php/slideshow/name_of_image.jpg

/ = root of site
0
 
LVL 6

Expert Comment

by:peyox
ID: 12156906
Add this line
   print_r ($image);

after
  @closedir($dir);

I want to see have these files' names look like.

What is "C" in your folder?
http://www.akersdesignrender.com/slideshow/C

Let me know when ready
0
 
LVL 3

Expert Comment

by:danomatic
ID: 12157117
ok, try it now.  I am not sure what you mean by "C"

http://akersdesignrender.com/photoscript.php

-- dan
0
 
LVL 6

Expert Comment

by:peyox
ID: 12157200
Ok, I see....
You have register globals ON in your php.ini file. When entering to the script $image variable is already set... this couses the problem.

Change the variable name $image[] to $image_list[] in the following lines:

$image_list[++$noOfImages] = $file;
echo "<img src=\"slideshow/" . $image_list[$imageid] . "\">\n<br>\n<br>";



This will solve the problem.
I would also recommend you to turn off register global in php.ini!

Cheers,
peyox
0
 
LVL 6

Expert Comment

by:peyox
ID: 12157208
Article about register globals... and related problems :)

http://us4.php.net/register_globals

--
peyox
0
 
LVL 3

Expert Comment

by:danomatic
ID: 12157282
yes that works!

I have no control over the php.ini file, it's hosted at a commercial hosting company.

thanks!
0

Featured Post

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Popularity Can Be Measured Sometimes we deal with questions of popularity, and we need a way to collect opinions from our clients.  This article shows a simple teaching example of how we might elect a favorite color by letting our clients vote for …
3 proven steps to speed up Magento powered sites. The article focus is on optimizing time to first byte (TTFB), full page caching and configuring server for optimal performance.
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…

828 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question