john pfeiffer
  • Home
  • Categories
  • Tags
  • Archives

index 2013 directory listing multi sort search find

<?php  /* 2013-07 johnpfeiffer  index pages Search Engine Optimized = title, etc. will be the current dir
  "bread crumb" listing for site navigation at the top, button for sort by name/date/size (and reverse sort), find (grep) form
*/

/* ############ FUNCTION DEFINITIONS  ########################################### */
class SortingOption
{
    const SORTASCENDINGNAME = 'SORTASCENDINGNAME';
    const SORTDESCENDINGNAME = 'SORTDESCENDINGNAME';
    const SORTASCENDINGSIZE = 'SORTASCENDINGSIZE';
    const SORTDESCENDINGSIZE = 'SORTDESCENDINGSIZE';
    const SORTASCENDINGLASTMODIFIEDTIMESTAMP = 'SORTASCENDINGLASTMODIFIEDTIMESTAMP';
    const SORTDESCENDINGLASTMODIFIEDTIMESTAMP = 'SORTDESCENDINGLASTMODIFIEDTIMESTAMP';
}

class FileSystemObjectType
{
    const OBJECTISDIRECTORY = 0;
    const OBJECTISFILE = 1;
}


function displayFindForm()
{
    print "<form style='display:inline' action=\"" . $_SERVER['PHP_SELF'] . "\"" . " method=\"post\"> \n" ;
    print '<input type="submit" value="find text"> &nbsp;' ;
    print '<input type="text" name="keyword">';
    print '</form>';
}


function displayBreadcrumbLinks( $servername , $directories )
{
  $path = 'http://' . $servername;
  print '<a href="' . $path . '/">' . $servername . "</a>";
  print "\n";

  $directory_array = explode( "/" , $directories );

  for( $i = 1 ; $i < count( $directory_array ) ; $i++ )
  {
    $path .= '/';
    $path .= $directory_array[ $i ];
    print " / ";
    print '<a href="' . $path . '/">' .  $directory_array[$i] . "</a>" ;
    print "\n";
  }
}


function displayInfoAsTableRow( $name , $size , $lastmodifiedtimestamp )
{
  if( !is_null( $name ) && !is_null( $size ) && !is_null( $lastmodifiedtimestamp ) )
  {
    print "<tr>";
    print "<td><a href='$name'>$name</a></td>";
    print "<td>" .  number_format( $size ) . " bytes</td>";
    print "<td>" . date( "Y-m-d H:i T", $lastmodifiedtimestamp ) . "</td>";
    print "</tr>\n";
  }
}


function displayListingAsTable( $sortingoption , $arraylist )
{
  print "<form action=\"" . $_SERVER['PHP_SELF'] . "\"" . " method=\"post\"> \n" ;
  print "<table>\n";
  print "<tr>";

  //buttons allow the next sorting choices, should be refactored
  switch( $sortingoption )
  {
    case SortingOption::SORTASCENDINGNAME:
      print '<td><input type="submit" name="' . SortingOption::SORTDESCENDINGNAME . '" value="SORT BY NAME" /> </td>' ;
      print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGSIZE . '" value="SORT BY SIZE" /> </td>' ;
      print '<td><input type="submit" name="' . SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP . '" value="SORT BY MODIFIED" /> </td>' ;
    break;
    case SortingOption::SORTDESCENDINGNAME:
      print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGNAME . '" value="SORT BY NAME" /> </td>' ;
      print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGSIZE . '" value="SORT BY SIZE" /> </td>' ;
      print '<td><input type="submit" name="' . SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP . '" value="SORT BY MODIFIED" /> </td>' ;
    break;
    case SortingOption::SORTASCENDINGSIZE:
      print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGNAME . '" value="SORT BY NAME" /> </td>' ;
      print '<td><input type="submit" name="' . SortingOption::SORTDESCENDINGSIZE . '" value="SORT BY SIZE" /> </td>' ;
      print '<td><input type="submit" name="' . SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP . '" value="SORT BY MODIFIED" /> </td>' ;
    break;
    case SortingOption::SORTDESCENDINGSIZE:
      print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGNAME . '" value="SORT BY NAME" /> </td>' ;
      print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGSIZE . '" value="SORT BY SIZE" /> </td>' ;
      print '<td><input type="submit" name="' . SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP . '" value="SORT BY MODIFIED" /> </td>' ;
    break;
    case SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP:
      print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGNAME . '" value="SORT BY NAME" /> </td>' ;
      print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGSIZE . '" value="SORT BY SIZE" /> </td>' ;
      print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGLASTMODIFIEDTIMESTAMP . '" value="SORT BY MODIFIED" /> </td>' ;
    break;
    case SortingOption::SORTASCENDINGLASTMODIFIEDTIMESTAMP:
      print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGNAME . '" value="SORT BY NAME" /> </td>' ;
      print '<td><input type="submit" name="' . SortingOption::SORTASCENDINGSIZE . '" value="SORT BY SIZE" /> </td>' ;
      print '<td><input type="submit" name="' . SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP . '" value="SORT BY MODIFIED" /> </td>' ;
    break;

    default:
    break;
  }

  print "</tr> \n";

  if( !empty( $arraylist ) )
  {
    foreach( $arraylist as $key => $value )
    {
      displayInfoAsTableRow( $arraylist[ $key ]['name'] , $arraylist[ $key ]['size'] , $arraylist[ $key ]['lastmodifiedtimestamp'] );
    }
  }
  print "</table>";
  print "\n</form> \n" ;

} // end displayListingAsTable()


function getFileListing( $directorylist )
{
  clearstatcache();
  $mycurrentdirectory = getcwd();
  $mycurrentdirectoryhandle = opendir( $mycurrentdirectory );
  $name = readdir( $mycurrentdirectoryhandle );

  while( $name !== false )
  {
    if( $name != "." && $name != ".." )
    {
        $lastmodifiedtimestamp = filemtime( $name );

        if( is_file( $name ) )
        {
          $filesystemobjecttype = FileSystemObjectType::OBJECTISFILE;
          $size = filesize( $name ) ;
        }
        else if( is_dir( $name ) )
        {
          $filesystemobjecttype = FileSystemObjectType::OBJECTISDIRECTORY;
          $name = $name . "/";
          $size = 0;
        }
        else
        { } //object is probably a sym link

      $directorylist[] = array( "filesystemobjecttype" => $filesystemobjecttype , "name" => $name , "size" => $size , "lastmodifiedtimestamp" => $lastmodifiedtimestamp );
    }

    $name = readdir( $mycurrentdirectoryhandle );
  }
  closedir( $mycurrentdirectoryhandle );

  return $directorylist;
} //end getFileListing()


function countDirectories( $directorylist )
{
  $counter = 0 ;
  foreach( $directorylist as $key => $value )
  {
    if( ($directorylist[ $key ][ "filesystemobjecttype" ] == FileSystemObjectType::OBJECTISDIRECTORY ) )
    {  $counter++ ;
    }
  }
  return $counter ;
}

function countFiles( $directorylist )
{
  $counter = 0 ;
  foreach( $directorylist as $key => $value )
  {
    if( ($directorylist[ $key ][ "filesystemobjecttype" ] == FileSystemObjectType::OBJECTISFILE ) )
    {  $counter++ ;
    }
  }
  return $counter ;
}


function findInDir( $targetDirectory, $pattern, $result )
{
    $files = scandir( $targetDirectory );
    foreach( $files as $f )
    {
        $contents = file_get_contents( $f );
        $pos = strpos( $contents, $pattern );
        if( $pos !== false )
        {    $result[] = $f;
        }
    }
    return $result;
}


function getFindQuery()
{
  $result = '';
  if( isset( $_REQUEST[ "keyword" ] ) && !empty( $_REQUEST[ "keyword" ]) )
  {  $result = $_REQUEST[ "keyword" ];
  }
  return $result;
}


function getSortingOption( )
{
  $result = SortingOption::SORTASCENDINGNAME ;

  if( isset( $_REQUEST[ SortingOption::SORTDESCENDINGNAME ] ) && !empty( $_REQUEST[ SortingOption::SORTDESCENDINGNAME ]) )
  {  $result = SortingOption::SORTDESCENDINGNAME ;
  }
  else if( isset( $_REQUEST[ SortingOption::SORTASCENDINGSIZE ] ) && !empty( $_REQUEST[ SortingOption::SORTASCENDINGSIZE ]) )
  {  $result = SortingOption::SORTASCENDINGSIZE ;
  }
  else if( isset( $_REQUEST[ SortingOption::SORTDESCENDINGSIZE ] ) && !empty( $_REQUEST[ SortingOption::SORTDESCENDINGSIZE ]) )
  {  $result = SortingOption::SORTDESCENDINGSIZE ;
  }
  else if( isset( $_REQUEST[ SortingOption::SORTASCENDINGLASTMODIFIEDTIMESTAMP ] ) && !empty( $_REQUEST[ SortingOption::SORTASCENDINGLASTMODIFIEDTIMESTAMP ]) )
  {  $result = SortingOption::SORTASCENDINGLASTMODIFIEDTIMESTAMP ;
  }
  else if( isset( $_REQUEST[ SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP ] ) && !empty( $_REQUEST[ SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP ]) )
  {  $result = SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP ;
  }

  return $result ;
}

// this function depends a lot on the data model implementation     http://us3.php.net/strnatcmp
function sortFileListing( $sortingoption , $arraylist )
{
  if( !empty( $arraylist ) )
  {
    foreach ( $arraylist as $key => $row )
    {
      $objecttypecolumn[ $key ] = $row[ "filesystemobjecttype" ];
      $filenamecolumn[ $key ] = $row[ "name" ];
      $filesizecolumn[ $key ] = $row[ "size" ];
      $filelastmodifiedtimestampcolumn[ $key ] = $row[ "lastmodifiedtimestamp" ];
    }

    switch( $sortingoption )
    {
      case SortingOption::SORTASCENDINGNAME:
        array_multisort( $objecttypecolumn , SORT_ASC , $filenamecolumn , SORT_ASC , $filesizecolumn , SORT_ASC , $arraylist );
      break;
      case SortingOption::SORTDESCENDINGNAME:
        array_multisort( $objecttypecolumn , SORT_ASC , $filenamecolumn , SORT_DESC , $filesizecolumn , SORT_ASC , $arraylist );
      break;
      case SortingOption::SORTASCENDINGSIZE:
        array_multisort( $objecttypecolumn , SORT_ASC , $filesizecolumn , SORT_ASC , $filenamecolumn , SORT_ASC , $arraylist );
      break;
      case SortingOption::SORTDESCENDINGSIZE:
        array_multisort( $objecttypecolumn , SORT_ASC , $filesizecolumn , SORT_DESC , $filenamecolumn , SORT_ASC , $arraylist );
      break;
      case SortingOption::SORTASCENDINGLASTMODIFIEDTIMESTAMP:
        array_multisort( $objecttypecolumn , SORT_ASC , $filelastmodifiedtimestampcolumn , SORT_ASC , $filenamecolumn , SORT_ASC , $arraylist );
      break;
      case SortingOption::SORTDESCENDINGLASTMODIFIEDTIMESTAMP:
        array_multisort( $objecttypecolumn , SORT_ASC , $filelastmodifiedtimestampcolumn , SORT_DESC , $filenamecolumn , SORT_ASC , $arraylist );
      break;
      default:
      break;
    }
  }
  return $arraylist ;

} //end sortFileListing()


/* ############ BUILD PAGE  ########################################### */

  $servername = $_SERVER['SERVER_NAME'];
  $page = $_SERVER['PHP_SELF'];             //get the url of the resource (webpage)
  $dirs = dirname( $page );                 //get the dirs that lead to the urls
  $querystring = $_SERVER['QUERY_STRING'];

  //HEAD SETUP
  $title = explode( "/" , $page );             //break the url into pieces
  $currentfile = end( $title );               //the name of the current file (last piece)
  $currentdirectory = prev( $title );         //find the current directory
  $currentdirectory = explode( "-" , $currentdirectory );  //the directory name into array of words
  $seocontent = implode( " " , $currentdirectory );        //create a string from words (with spaces)

  date_default_timezone_set( 'UTC' );

  include( $_SERVER["DOCUMENT_ROOT"] . "/head-doctype-xhtml-transitional.txt");
  include( $_SERVER["DOCUMENT_ROOT"] . "/head-favicon.txt");

  print "<title> $seocontent </title>" .
    "\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>" .
    "\n<meta name=\"description\" content=\"$seocontent\"/>" .
    "\n<meta name=\"keywords\" content=\"$seocontent\"/>";
  print "\n";

  include( $_SERVER["DOCUMENT_ROOT"] . "/john-css.txt");

  print "\n</head><body>\n" ;
  displayBreadcrumbLinks( $servername , $dirs );


  $directorylisting = array();
  $directorylisting = getFileListing( $directorylisting );
  $directorycount = countDirectories( $directorylisting );
  $filecount = countFiles( $directorylisting );

  print "&nbsp; &nbsp; &nbsp; &nbsp; \n" ;

  if( $directorycount != 0 )
  {  print $directorycount . " directories \n" ;
  }
  if( $filecount !=0 )
  {  print $filecount . " files \n" ;
  }

  print "&nbsp; &nbsp; &nbsp; &nbsp; \n" ;
  displayFindForm();

  $keyword = getFindQuery();
  $result = array();
  $result = findInDir( getcwd() , $keyword, $result );
  if( $keyword != '' )
  {  print "&nbsp; Searched for: " . htmlspecialchars( $keyword );
  }
  if( count( $result ) > 0 )
  {  print "&nbsp; Found in: ";
     foreach( $result as $name )
     {  print "$name, ";
     }
  }

  print "<br /> \n" ;
  print "<br /> \n" ;

  if( !empty( $directorylisting ) )
  {
    $currentsort = getSortingOption() ;
    $directorylisting =  sortFileListing( $currentsort , $directorylisting ) ;
    displayListingAsTable( $currentsort , $directorylisting ) ;
  }

  print '<br />';
  include( $_SERVER["DOCUMENT_ROOT"] . "/foot.txt");
  include( $_SERVER["DOCUMENT_ROOT"] . "/google-code.htm");
  print "<br />\n";
  print "</body>";
  print "</html>";
?>

  • « google app engine webapp2 extras session
  • google app engine boto s3 import error boto.pyami.config »

Published

Jul 8, 2013

Category

php

~932 words

Tags

  • 2013 1
  • directory 13
  • find 13
  • index 8
  • listing 9
  • multi 8
  • php 82
  • search 8
  • sort 11