[Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 265
  • Last Modified:

Setting conditional regions on PHP slideshow

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
cbeaudry1
Asked:
cbeaudry1
  • 7
  • 4
  • 2
1 Solution
 
peyoxCommented:
$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
 
peyoxCommented:
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
 
cbeaudry1Author Commented:
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
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
peyoxCommented:
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
 
cbeaudry1Author Commented:
Works like a charm. Thanks!
0
 
danomaticCommented:
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
 
peyoxCommented:
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
 
danomaticCommented:
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
 
peyoxCommented:
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
 
danomaticCommented:
ok, try it now.  I am not sure what you mean by "C"

http://akersdesignrender.com/photoscript.php

-- dan
0
 
peyoxCommented:
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
 
peyoxCommented:
Article about register globals... and related problems :)

http://us4.php.net/register_globals

--
peyox
0
 
danomaticCommented:
yes that works!

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

thanks!
0

Featured Post

How to Use the Help Bell

Need to boost the visibility of your question for solutions? Use the Experts Exchange Help Bell to confirm priority levels and contact subject-matter experts for question attention.  Check out this how-to article for more information.

  • 7
  • 4
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now