Wednesday, 15 August 2012

Create Zip File for Multiple files to be downloadable in Codeigniter

define('ROOT_DOWNLOAD_FOLDER_PATH', $_SERVER['DOCUMENT_ROOT']."_files/_downloads/");

function CreateZipFile($zip_folder_name)
{
 $directoryToZip = ROOT_DOWNLOAD_FOLDER_PATH; // This will zip all the file(s) in this present working directory
 $outputDir = ROOT_DOWNLOAD_FOLDER_PATH; //Replace "/" with the name of the desired output directory.
 $this->load->library('ZipFile');
  
 //$this->createzipfile->get_files_from_folder($outputDir, $zip_folder_name.'-');
 $this->zipfile->get_files_from_folder($directoryToZip, '');
 
 //Code toZip a directory and all its files/subdirectories
 $this->zipfile->zipDirectory($directoryToZip, $outputDir);
 
 $fileName = $outputDir.$zip_folder_name.'.zip';

 $fd = fopen ($fileName, 'wb');
 $out = fwrite ($fd, $this->zipfile->getZippedfile());
  
 $this->zipfile->forceDownload($fileName);
 
 @unlink($fileName);
 fclose($fd);
 
 /* Empty directory and remove directory. */
 $directoryToZipPath = $directoryToZip.$zip_folder_name;
 unlinkFolderFiles($directoryToZipPath);
 removeDir($directoryToZipPath);

 exit;
}

$timestamp = date('Y.m.d.h.i.s');
$timestamp = '2012.08.15.12.45.46';
$zip_folder_name = 'Flubit.Inv.All.'.$timestamp;
// For the ZipFile.php, save the below ZipFile.php file content into application/libaries/ZipFile.php
/**
 * Class to dynamically create a zip file (archive) of file(s) and/or directory
 *
 * @author Rochak Chauhan  www.rochakchauhan.com
 * @package CreateZipFile
 * @see Distributed under "General Public License"
 * 
 * @version 1.0
 */

class ZipFile {

 public $compressedData = array();
 public $centralDirectory = array(); // central directory
 public $endOfCentralDirectory = "\x50\x4b\x05\x06\x00\x00\x00\x00"; //end of Central directory record
 public $oldOffset = 0;
 
 function get_files_from_folder($directory, $put_into) {
  if ($handle = opendir($directory)) {
   while (false !== ($file = readdir($handle))) {
    if (is_file($directory.$file)) {
     $fileContents = file_get_contents($directory.$file);
     $this->addFile($fileContents, $put_into.$file);
    } elseif ($file != '.' and $file != '..' and is_dir($directory.$file)) {
     $this->addDirectory($put_into.$file.'/');
     $this->get_files_from_folder($directory.$file.'/', $put_into.$file.'/');
    }
   }
  }
  closedir($handle);
 }
 
 /**
  * Function to create the directory where the file(s) will be unzipped
  *
  * @param string $directoryName
  * @access public
  * @return void
  */ 
 public function addDirectory($directoryName) {
  $directoryName = str_replace("\\", "/", $directoryName);
  $feedArrayRow = "\x50\x4b\x03\x04";
  $feedArrayRow .= "\x0a\x00";
  $feedArrayRow .= "\x00\x00";
  $feedArrayRow .= "\x00\x00";
  $feedArrayRow .= "\x00\x00\x00\x00";
  $feedArrayRow .= pack("V",0);
  $feedArrayRow .= pack("V",0);
  $feedArrayRow .= pack("V",0);
  $feedArrayRow .= pack("v", strlen($directoryName) );
  $feedArrayRow .= pack("v", 0 );
  $feedArrayRow .= $directoryName;
  $feedArrayRow .= pack("V",0);
  $feedArrayRow .= pack("V",0);
  $feedArrayRow .= pack("V",0);
  $this->compressedData[] = $feedArrayRow;
  $newOffset = strlen(implode("", $this->compressedData));
  $addCentralRecord = "\x50\x4b\x01\x02";
  $addCentralRecord .="\x00\x00";
  $addCentralRecord .="\x0a\x00";
  $addCentralRecord .="\x00\x00";
  $addCentralRecord .="\x00\x00";
  $addCentralRecord .="\x00\x00\x00\x00";
  $addCentralRecord .= pack("V",0);
  $addCentralRecord .= pack("V",0);
  $addCentralRecord .= pack("V",0);
  $addCentralRecord .= pack("v", strlen($directoryName) );
  $addCentralRecord .= pack("v", 0 );
  $addCentralRecord .= pack("v", 0 );
  $addCentralRecord .= pack("v", 0 );
  $addCentralRecord .= pack("v", 0 );
  $addCentralRecord .= pack("V", 16 );
  $addCentralRecord .= pack("V", $this->oldOffset );
  $this->oldOffset = $newOffset;
  $addCentralRecord .= $directoryName;
  $this->centralDirectory[] = $addCentralRecord;
 }

 /**
  * Function to add file(s) to the specified directory in the archive 
  *
  * @param string $directoryName
  * @param string $data
  * @return void
  * @access public
  */ 
 public function addFile($data, $directoryName)   {
  $directoryName = str_replace("\\", "/", $directoryName);
  $feedArrayRow = "\x50\x4b\x03\x04";
  $feedArrayRow .= "\x14\x00";
  $feedArrayRow .= "\x00\x00";
  $feedArrayRow .= "\x08\x00";
  $feedArrayRow .= "\x00\x00\x00\x00";
  $uncompressedLength = strlen($data);
  $compression = crc32($data);
  $gzCompressedData = gzcompress($data);
  $gzCompressedData = substr( substr($gzCompressedData, 0, strlen($gzCompressedData) - 4), 2);
  $compressedLength = strlen($gzCompressedData);
  $feedArrayRow .= pack("V",$compression);
  $feedArrayRow .= pack("V",$compressedLength);
  $feedArrayRow .= pack("V",$uncompressedLength);
  $feedArrayRow .= pack("v", strlen($directoryName) );
  $feedArrayRow .= pack("v", 0 );
  $feedArrayRow .= $directoryName;
  $feedArrayRow .= $gzCompressedData;
  $feedArrayRow .= pack("V",$compression);
  $feedArrayRow .= pack("V",$compressedLength);
  $feedArrayRow .= pack("V",$uncompressedLength);
  $this->compressedData[] = $feedArrayRow;
  $newOffset = strlen(implode("", $this->compressedData));
  $addCentralRecord = "\x50\x4b\x01\x02";
  $addCentralRecord .="\x00\x00";
  $addCentralRecord .="\x14\x00";
  $addCentralRecord .="\x00\x00";
  $addCentralRecord .="\x08\x00";
  $addCentralRecord .="\x00\x00\x00\x00";
  $addCentralRecord .= pack("V",$compression);
  $addCentralRecord .= pack("V",$compressedLength);
  $addCentralRecord .= pack("V",$uncompressedLength);
  $addCentralRecord .= pack("v", strlen($directoryName) );
  $addCentralRecord .= pack("v", 0 );
  $addCentralRecord .= pack("v", 0 );
  $addCentralRecord .= pack("v", 0 );
  $addCentralRecord .= pack("v", 0 );
  $addCentralRecord .= pack("V", 32 );
  $addCentralRecord .= pack("V", $this->oldOffset );
  $this->oldOffset = $newOffset;
  $addCentralRecord .= $directoryName;
  $this->centralDirectory[] = $addCentralRecord;
 }

 /**
  * Function to return the zip file
  *
  * @return zipfile (archive)
  * @access public
  * @return void
  */
 public function getZippedfile() {
  $data = implode("", $this->compressedData);
  $controlDirectory = implode("", $this->centralDirectory);
  return
  $data.
  $controlDirectory.
  $this->endOfCentralDirectory.
  pack("v", sizeof($this->centralDirectory)).
  pack("v", sizeof($this->centralDirectory)).
  pack("V", strlen($controlDirectory)).
  pack("V", strlen($data)).
  "\x00\x00";
 }

 /**
  *
  * Function to force the download of the archive as soon as it is created
  *
  * @param archiveName string - name of the created archive file
  * @access public
  * @return ZipFile via Header
  */
 public function forceDownload($archiveName) {
  if(ini_get('zlib.output_compression')) {
   ini_set('zlib.output_compression', 'Off');
  }

  // Security checks
  if( $archiveName == "" ) {
   echo "Public Photo Directory - Download 
ERROR: The download file was NOT SPECIFIED."; exit; } elseif ( ! file_exists( $archiveName ) ) { echo "Public Photo Directory - Download
ERROR: File not found."; exit; } header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: private",false); header("Content-Type: application/zip"); header("Content-Disposition: attachment; filename=".basename($archiveName).";" ); header("Content-Transfer-Encoding: binary"); header("Content-Length: ".filesize($archiveName)); readfile("$archiveName"); } /** * Function to parse a directory to return all its files and sub directories as array * * @param string $dir * @access protected * @return array */ protected function parseDirectory($rootPath, $seperator="/"){ $fileArray=array(); $handle = opendir($rootPath); while( ($file = @readdir($handle))!==false) { if($file !='.' && $file !='..'){ if (is_dir($rootPath.$seperator.$file)){ $array=$this->parseDirectory($rootPath.$seperator.$file); $fileArray=array_merge($array,$fileArray); } else { $fileArray[]=$rootPath.$seperator.$file; } } } return $fileArray; } /** * Function to Zip entire directory with all its files and subdirectories * * @param string $dirName * @access public * @return void */ public function zipDirectory($dirName, $outputDir) { if (!is_dir($dirName)){ trigger_error("CreateZipFile FATAL ERROR: Could not locate the specified directory $dirName", E_USER_ERROR); } $tmp=$this->parseDirectory($dirName); $count=count($tmp); $this->addDirectory($outputDir); for ($i=0;$i<$count;$i++){ $fileToZip=trim($tmp[$i]); $newOutputDir=substr($fileToZip,0,(strrpos($fileToZip,'/')+1)); $outputDir=$outputDir.$newOutputDir; $fileContents=file_get_contents($fileToZip); $this->addFile($fileContents,$fileToZip); } } }
// The below are the basic File and Directory Related functions.
function createFile($filePath='')
{
 try {
  if (!empty($filePath))
  { 
   $ourFileHandle = fopen($filePath, 'w');
   fclose($ourFileHandle);
  }
  return true;
 }
 Catch(Exception $e){ return false; }
}

function unlinkFolderFiles($dir)
{
 $files = getFolderFiles($dir);

 foreach ($files as $file)
 {
  if(file_exists($dir.'/'.$file)) @unlink($dir.'/'.$file);
 }

 return true;
}

function getFolderFiles($dir)
{
 $files = '';
 $ffs = scandir($dir);

 foreach($ffs as $ff)
 {
  if($ff != '.' && $ff != '..')
  {
   $files[] = $ff;
  }
 }

 return $files;
}

function createDir($dir)
{
 if (!is_dir($dir)) {
  mkdir($dir);
 }

 return true;
}

function removeDir($dir)
{
 if (is_dir($dir)) {
  rmdir($dir);
 }
 
 return true;
}

Monday, 6 August 2012

Convert the date time to timestamp and Compare the two datetime (dates) functions in Javascript.

Convert the date time to timestamp in Javascript. similar to strototime() function in php.
// Convert the date time to timestamp in Javascript. similar to strototime() function in php.
function convert_datetime_to_timestamp(date)
{
 var datetime = date.split(" ");
 date = datetime[0];
 time = datetime[1];

 d1 = date.split("-");
 y = d1[0];
 m = d1[1];
 d = d1[2];

 t1 = time.split(":");
 h = t1[0];
 i = t1[1];
 s = t1[2];

 //datetime = m + ' ' + d + ',' + y + ' ' + h + ':' + i + ':'+s;
var date = new Date(y, m, d, h, i, s, '0'); (works both on FireFox and Chrome Browers).
 
 return date.getTime();
}
// Compare the two datetime (dates) in Javascript.
/*  This below function compares two dates with a gap time as 6 Hours.
 @param date1 = '2012-08-06 14:9:19'
 @param date2 = '2012-08-06 20:9:19' 
 @return If errors found, return errors else null (if no errors) found. 
*/
function compare_two_dates(date1, date2)
{
 var error = '';
 
 if ( (date1 != "") || (date2 != "") )
 {
  // Check the dates time here;
  var minutes=1000*60;
  var hours=minutes*60;
  var days=hours*24;
  var years=days*365;
  
  now = new Date();
  current_time= now.getTime();
  
  // Check the dates time here;
  start_time= convert_datetime_to_timestamp(date1);
  expiry_time= convert_datetime_to_timestamp(date2);
  
  gap_hr = 6; // Minimum Gap between two dates is set as 6 Hrs. 
  gap_time= gap_hr*hours;
  diff_time= expiry_time - start_time;
  diff_mm= (diff_time)/minutes;
  diff_hr= Math.round(diff_time/hours);
  
  if ( (current_time >= start_time) && (current_time >= expiry_time))
   error = 'Date Available AND/OR Expiry time should be greater than current time.';

  else if ( (diff_time == 0) || (gap_time > diff_time) )
   error = 'Date Expires should be at least ' + gap_hr + ' hours greater than Date Available time.';
  
  //error = error + ' NowT: '+current_time+' DS: ' + start_time + ' DE: '+ expiry_time+' Diff: ' +diff_time+ ' DMM: ' + diff_mm+ ' DHR: '+diff_hr+' TG: '+gap_time;  
 }
 else {
  error =  'Enter both dates';
 }
 
 return error;
}

For more information about dates, please, check: JavaScript Date Object, JavaScript setDate() Method

Friday, 27 July 2012

Increase Memory Limit to resolve Server error while generating PDF using third party library like TCPDF

When generating a PDF using TCPDF or any of the third party PDF libraries, and if you find the following issues while generating pdf;

------------------------------------------------------------------------------
Server error The website encountered an error while retrieving http://admincentre.flubstage.info/fcc/reporting/download_pdf_chain_report/01. It may be down for maintenance or configured incorrectly. Here are some suggestions: Reload this web page later. HTTP Error 500 (Internal Server Error): An unexpected condition was encountered while the server was attempting to fulfil the request.
------------------------------------------------------------------------------

Solution: In that case, most probably, it would be memory limitation issue. So, you should increase the memory limit by adding the following code before the pdf generate code(the very beginning of the code).
/* Set the memory limit for the PDF. */
ini_set('memory_limit', '256M'); 

Tuesday, 24 July 2012

Calculating the Standard Deviation using PHP

// Calculating the Standard Deviation.
private function standard_deviation($aValues, $bSample = false)
{
 $fMean = array_sum($aValues) / count($aValues);
 $fVariance = 0.0;
 foreach ($aValues as $i)
 {
  $fVariance += pow($i - $fMean, 2);
 }
 $fVariance /= ( $bSample ? count($aValues) - 1 : count($aValues) );
 return (float) sqrt($fVariance);
}

Friday, 20 July 2012

Resize the image in various sizes using PHP

This is the mail resizing image function which actually resized the image based on provided parameter.
/**
 * This will resize the image into specific image sizes.
 * @param array $data:  'old_image_path' = full path of the old image which to be reszied;
 *  'new_image_path' = full path the new image to be created;
 *  'width' = New Width of the image;
 *  'height' = New Height of the image;
 *  (just for orignal) 'copy_original' = set 'true' if you like to just copy original image and you don't need to provide above 'width' and 'height', otherwise just ignore this.;
 *   
 * @return void;
 */
private function resizing_image($data)
{
 // Set copy_original=true, if you like to create original image.
 $create_original = isset($data['copy_original']) && ($data['copy_original']) ? true : false;
 
 //Set target path
 $target_path = $data['new_image_path'];
  
 //Get the width and height of upload image
 list($width, $height) = getimagesize($data['old_image_path']);
 
 if ($create_original) 
 {
  $bigwidth = $width;
  $bigheight = $height;
 }
 else 
 {
  $n_wight = $data['width'];
  $n_height = $data['height'];
  
  if ($width > $n_wight) {
   //If the width is greater than our maximum width preference, use the maximum width
   $newwidth = $n_wight;
   //Set new ratios for width and height
   $newheight = ($newwidth/$width) * $height;
   $bigwidth = $newwidth;
   $bigheight = $newheight;
  } else {
   //If width is less than our maximum, use that value (so as not to pixelate the image)
   $bigwidth = $width;
   $bigheight = $height;
  }
   
  if ($bigheight > $n_height) {
   //If the height is greater than our maximum height preference, use the maximum height
   $newheight = $n_height;
   //Set new ratios for width and height
   $newwidth = ($newheight/$bigheight) * $bigwidth;
   $bigwidth = $newwidth;
   $bigheight = $newheight;
  }
 }
 
 //Initiate image magick class
 $im = new Imagick();
 //Get image
 $im->readImage( $data['old_image_path'] );
 //Create thumbnail image
 $im->thumbnailImage( $bigwidth, $bigheight );
 //Write to file
 $im->writeImage( $target_path );
 /*
 echo '

Original Image Size: Width-'. $width. ' Height:-'.$height;
 echo '
New Image Size: Width-'. $bigwidth. ' Height:-'.$bigheight;
 echo '
'.$target_path;
 */
 //Destroy temp
 $im->destroy();
}

This function is to resize image in various sizes
// This function is to resize image in various sizes
private function resize_image($product_id, $old_image_path)
{
 define('PATH_RESIZED_PRODUCT_IMAGE', "/home/admin/assets/products/");
 $new_path = PATH_RESIZED_PRODUCT_IMAGE; //"";
  
 $product_id = 23;
 $old_image_path = 'http://ecx.images-amazon.com/images/I/81RXp-hIaNL._AA1500_.jpg';
 //$old_image_path = 'http://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/280px-PNG_transparency_demonstration_1.png';
 
 /** Get File Extension. */
 $path_info = pathinfo($old_image_path);
 $ext = $path_info['extension'];
 
 // Create Thumbnail (max 40px by 40px)
 $new_image_path = $new_path.'t_'.$product_id.'.'.$ext; // building the new targeted file path including new filename ("";) 
 $data = array('old_image_path'=>$old_image_path, 'new_image_path'=>$new_image_path, 'width'=>40, 'height'=>40);
 $this->resizing_image($data);
 
 // Create Standard (max 310px by 235px)
 $new_image_path = $new_path.'s_'.$product_id.'.'.$ext; // building the new targeted file path including new filename ("";)
 $data = array('old_image_path'=>$old_image_path, 'new_image_path'=>$new_image_path, 'width'=>310, 'height'=>235);
 $this->resizing_image($data);
 
 // Large (max 500px by 500px)
 $new_image_path = $new_path.'l_'.$product_id.'.'.$ext; // building the new targeted file path including new filename ("";)
 $data = array('old_image_path'=>$old_image_path, 'new_image_path'=>$new_image_path, 'width'=>500, 'height'=>500);
 $this->resizing_image($data);
 
 // For Copying Original Image.
 $new_image_path = $new_path.'orig_'.$product_id.'.'.$ext; // building the new targeted file path including new filename ("";)
 $data = array('old_image_path'=>$old_image_path, 'new_image_path'=>$new_image_path, 'copy_original'=>true);
 $this->resizing_image($data);
 
 echo 'All sizes: 
- t_'.$product_id.'.'.$ext.' = Thumbnail (max 40px by 40px); 
- s_'.$product_id.'.'.$ext.' = Standard (max 310px by 235px); 
     
- l_'.$product_id.'.'.$ext.' = Large (max 500px by 500px); and 
- orig_'.$product_id.'.'.$ext.' = Copying Original Image, 
 are copied into '.PATH_RESIZED_PRODUCT_IMAGE.' path.';
 die;
 
}

Call the above function to create different sizes image;
// Call the above function to create different sizes image;
$product_id = 18;
$old_image_path= 'http://ecx.images-amazon.com/images/I/81RXp-hIaNL._AA1500_.jpg';
resize_image($product_id, $old_image_path);

Thursday, 19 July 2012

Validation of URL (Website Address) and Email using PHP

//Validation of URL (Website Address) and Email using PHP
$post = $_POST;

// Validation of URL or Website Address
if (!isset($post['api_user']) || empty($post['api_user']))
 $errors[] = 'Enter Website name';  
else if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $post['website']))
 $errors[] = ''.$post['website'].' website name is not valid.';

//Validation of Email Address
if (!isset($post['paypal_address']) || empty($post['paypal_address']))
 $errors[] = 'Enter valid Paypal Email Address.';
else if (!(filter_var($post['paypal_address'], FILTER_VALIDATE_EMAIL)))
 $errors[] = 'Enter valid PayPal email address.';

Monday, 9 July 2012

Usage of preg_replace, search and replace {variable}


Regular Expression: Usage of preg_replace, search and replace {variable}, {variable_one} and join{string_var_able}.
$string = "This {variable} will be {variable_with_underscore}  and {variable}with will be replaced";
$pattern = array('/($|\{(\w+))\}/'); 
$replace = array('...'); 
$string = preg_replace($pattern, $replace, $string);